From 437a5c529e3207a42b44e353adeff3aaca5e6d22 Mon Sep 17 00:00:00 2001 From: Prophesi Date: Thu, 21 Sep 2017 10:56:54 -0400 Subject: [PATCH 1/6] add python instructions for Sierra, fix renamed import --- deploy/index.html | 493 +++++++++++++++++++++++++++++++++++++ deploy/index.html.gz | Bin 86596 -> 0 bytes server/INSTALL.txt | 5 + server/websocket-kinect.py | 2 +- 4 files changed, 499 insertions(+), 1 deletion(-) create mode 100644 deploy/index.html delete mode 100644 deploy/index.html.gz diff --git a/deploy/index.html b/deploy/index.html new file mode 100644 index 0000000..251f66b --- /dev/null +++ b/deploy/index.html @@ -0,0 +1,493 @@ + + + + + + +webkinect + + + + + + + + + + +
+ for this you need: (1) a recent, decent Mac or PC + and (2) Chrome, Firefox 11.0b, or another web browser that has WebGL and binary WebSockets +
+
+ responds to: + click + drag + — scroll-wheel + — made by: + George MacKerron + of CASA + – blog post + – GitHub + – HN +
+ + + \ No newline at end of file diff --git a/deploy/index.html.gz b/deploy/index.html.gz deleted file mode 100644 index 91cc4d1dbd8b7b0f247457a5fb50523a91056dd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86596 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 Date: Thu, 21 Sep 2017 10:59:11 -0400 Subject: [PATCH 2/6] update threejs --- client-webgl/js.libs/ThreeWebGL-old.min.js | 387 ++++++ client-webgl/js.libs/ThreeWebGL.min.js | 1271 ++++++++++++++------ 2 files changed, 1271 insertions(+), 387 deletions(-) create mode 100644 client-webgl/js.libs/ThreeWebGL-old.min.js diff --git a/client-webgl/js.libs/ThreeWebGL-old.min.js b/client-webgl/js.libs/ThreeWebGL-old.min.js new file mode 100644 index 0000000..64ad139 --- /dev/null +++ b/client-webgl/js.libs/ThreeWebGL-old.min.js @@ -0,0 +1,387 @@ +// ThreeWebGL.js r47 - http://github.com/mrdoob/three.js +'use strict';var THREE=THREE||{};if(!self.Int32Array)self.Int32Array=Array,self.Float32Array=Array; +(function(){for(var a=0,b=["ms","moz","webkit","o"],c=0;c>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},getHex:function(){return Math.floor(255*this.r)<<16^Math.floor(255*this.g)<<8^Math.floor(255*this.b)},getContextStyle:function(){return"rgb("+Math.floor(255*this.r)+","+Math.floor(255*this.g)+","+Math.floor(255*this.b)+")"},clone:function(){return(new THREE.Color).setRGB(this.r,this.g,this.b)}};THREE.Vector2=function(a,b){this.x=a||0;this.y=b||0}; +THREE.Vector2.prototype={constructor:THREE.Vector2,set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.x=a.x;this.y=a.y;return this},clone:function(){return new THREE.Vector2(this.x,this.y)},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this}, +divideScalar:function(a){a?(this.x/=a,this.y/=a):this.set(0,0);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.lengthSq())},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,a=this.y-a.y;return b*b+a*a},setLength:function(a){return this.normalize().multiplyScalar(a)}, +equals:function(a){return a.x===this.x&&a.y===this.y}};THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}; +THREE.Vector3.prototype={constructor:THREE.Vector3,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;this.z+=a.z;return this}, +addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},multiply:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},multiplySelf:function(a){this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},divideSelf:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this}, +divideScalar:function(a){a?(this.x/=a,this.y/=a,this.z/=a):this.z=this.y=this.x=0;return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.lengthSq())},lengthManhattan:function(){return this.x+this.y+this.z},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.normalize().multiplyScalar(a)}, +cross:function(a,b){this.x=a.y*b.z-a.z*b.y;this.y=a.z*b.x-a.x*b.z;this.z=a.x*b.y-a.y*b.x;return this},crossSelf:function(a){var b=this.x,c=this.y,d=this.z;this.x=c*a.z-d*a.y;this.y=d*a.x-b*a.z;this.z=b*a.y-c*a.x;return this},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){return(new THREE.Vector3).sub(this,a).lengthSq()},setPositionFromMatrix:function(a){this.x=a.n14;this.y=a.n24;this.z=a.n34},setRotationFromMatrix:function(a){var b=Math.cos(this.y); +this.y=Math.asin(a.n13);1.0E-5this.lengthSq()}};THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}; +THREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z- +b.z;this.w=a.w-b.w;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},divideScalar:function(a){a?(this.x/=a,this.y/=a,this.z/=a,this.w/=a):(this.z=this.y=this.x=0,this.w=1);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.dot(this)},length:function(){return Math.sqrt(this.lengthSq())}, +normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this}};THREE.Frustum=function(){this.planes=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4]}; +THREE.Frustum.prototype.setFromMatrix=function(a){var b,c=this.planes;c[0].set(a.n41-a.n11,a.n42-a.n12,a.n43-a.n13,a.n44-a.n14);c[1].set(a.n41+a.n11,a.n42+a.n12,a.n43+a.n13,a.n44+a.n14);c[2].set(a.n41+a.n21,a.n42+a.n22,a.n43+a.n23,a.n44+a.n24);c[3].set(a.n41-a.n21,a.n42-a.n22,a.n43-a.n23,a.n44-a.n24);c[4].set(a.n41-a.n31,a.n42-a.n32,a.n43-a.n33,a.n44-a.n34);c[5].set(a.n41+a.n31,a.n42+a.n32,a.n43+a.n33,a.n44+a.n34);for(a=0;6>a;a++)b=c[a],b.divideScalar(Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z))}; +THREE.Frustum.prototype.contains=function(a){for(var b=this.planes,c=a.matrixWorld,d=THREE.Frustum.__v1.set(c.getColumnX().length(),c.getColumnY().length(),c.getColumnZ().length()),d=-a.geometry.boundingSphere.radius*Math.max(d.x,Math.max(d.y,d.z)),e=0;6>e;e++)if(a=b[e].x*c.n14+b[e].y*c.n24+b[e].z*c.n34+b[e].w,a<=d)return!1;return!0};THREE.Frustum.__v1=new THREE.Vector3; +THREE.Ray=function(a,b){function c(a,b,c){o.sub(c,a);t=o.dot(b);z=m.add(a,r.copy(b).multiplyScalar(t));return y=c.distanceTo(z)}function d(a,b,c,d){o.sub(d,b);m.sub(c,b);r.sub(a,b);J=o.dot(o);K=o.dot(m);u=o.dot(r);B=m.dot(m);H=m.dot(r);A=1/(J*B-K*K);M=(B*u-K*H)*A;N=(J*H-K*u)*A;return 0<=M&&0<=N&&1>M+N}this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3;this.intersectScene=function(a){return this.intersectObjects(a.children)};this.intersectObjects=function(a){var b,c,d=[];for(b=0, +c=a.length;ba.scale.x)return[];b={distance:o,point:a.position,face:null,object:a};m.push(b)}else if(a instanceof THREE.Mesh){o=c(this.origin,this.direction,a.matrixWorld.getPosition());r=THREE.Frustum.__v1.set(a.matrixWorld.getColumnX().length(),a.matrixWorld.getColumnY().length(),a.matrixWorld.getColumnZ().length());if(o>a.geometry.boundingSphere.radius*Math.max(r.x,Math.max(r.y,r.z)))return m;var t,u,g=a.geometry,z=g.vertices,y;a.matrixRotationWorld.extractRotation(a.matrixWorld); +for(o=0,r=g.faces.length;oMath.abs(t))&&(u=n.dot(j)/t,!(0>u)&&(a.doubleSided||(a.flipSided?0t))))if(p.add(k,l.multiplyScalar(u)),b instanceof THREE.Face3)e=y.multiplyVector3(e.copy(z[b.a].position)),f=y.multiplyVector3(f.copy(z[b.b].position)),h=y.multiplyVector3(h.copy(z[b.c].position)), +d(p,e,f,h)&&(b={distance:k.distanceTo(p),point:p.clone(),face:b,object:a},m.push(b));else if(b instanceof THREE.Face4&&(e=y.multiplyVector3(e.copy(z[b.a].position)),f=y.multiplyVector3(f.copy(z[b.b].position)),h=y.multiplyVector3(h.copy(z[b.c].position)),i=y.multiplyVector3(i.copy(z[b.d].position)),d(p,e,f,i)||d(p,f,h,i)))b={distance:k.distanceTo(p),point:p.clone(),face:b,object:a},m.push(b)}return m};var o=new THREE.Vector3,m=new THREE.Vector3,r=new THREE.Vector3,t,z,y,J,K,u,B,H,A,M,N}; +THREE.Rectangle=function(){function a(){f=d-b;h=e-c}var b,c,d,e,f,h,i=!0;this.getX=function(){return b};this.getY=function(){return c};this.getWidth=function(){return f};this.getHeight=function(){return h};this.getLeft=function(){return b};this.getTop=function(){return c};this.getRight=function(){return d};this.getBottom=function(){return e};this.set=function(f,h,j,n){i=!1;b=f;c=h;d=j;e=n;a()};this.addPoint=function(f,h){i?(i=!1,b=f,c=h,d=f,e=h):(b=bf?d:f,e=e>h?e:h);a()};this.add3Points= +function(f,h,j,n,p,o){i?(i=!1,b=fj?f>p?f:p:j>p?j:p,e=h>n?h>o?h:o:n>o?n:o):(b=fj?f>p?f>d?f:d:p>d?p:d:j>p?j>d?j:d:p>d?p:d,e=h>n?h>o?h>e?h:e:o>e?o:e:n>o?n>e?n:e:o>e?o:e);a()};this.addRectangle=function(f){i?(i=!1,b=f.getLeft(),c=f.getTop(),d=f.getRight(),e=f.getBottom()):(b=bf.getRight()?d:f.getRight(),e=e> +f.getBottom()?e:f.getBottom());a()};this.inflate=function(f){b-=f;c-=f;d+=f;e+=f;a()};this.minSelf=function(f){b=b>f.getLeft()?b:f.getLeft();c=c>f.getTop()?c:f.getTop();d=da.getRight()||ea.getBottom()?!1:!0};this.empty=function(){i=!0;e=d=c=b=0;a()};this.isEmpty=function(){return i}}; +THREE.Math={clamp:function(a,b,c){return ac?c:a},clampBottom:function(a,b){return ae&&0>g||0>f&&0>h)return!1;0>e?c=Math.max(c,e/(e-g)):0>g&&(d=Math.min(d,e/(e-g)));0>f?c=Math.max(c,f/(f-h)):0>h&&(d=Math.min(d,f/(f-h)));if(dh&&i.positionScreen.z(W.positionScreen.x-Q.positionScreen.x)*(L.positionScreen.y-Q.positionScreen.y)-(W.positionScreen.y- +Q.positionScreen.y)*(L.positionScreen.x-Q.positionScreen.x)))ya=p[n]=p[n]||new THREE.RenderableFace3,n++,j=ya,j.v1.copy(Q),j.v2.copy(L),j.v3.copy(W);else continue;else if(ba instanceof THREE.Face4)if(Q=l[ba.a],L=l[ba.b],W=l[ba.c],ya=l[ba.d],Q.visible&&L.visible&&W.visible&&ya.visible&&(ca.doubleSided||ca.flipSided!=(0>(ya.positionScreen.x-Q.positionScreen.x)*(L.positionScreen.y-Q.positionScreen.y)-(ya.positionScreen.y-Q.positionScreen.y)*(L.positionScreen.x-Q.positionScreen.x)||0>(L.positionScreen.x- +W.positionScreen.x)*(ya.positionScreen.y-W.positionScreen.y)-(L.positionScreen.y-W.positionScreen.y)*(ya.positionScreen.x-W.positionScreen.x))))Ua=m[o]=m[o]||new THREE.RenderableFace4,o++,j=Ua,j.v1.copy(Q),j.v2.copy(L),j.v3.copy(W),j.v4.copy(ya);else continue;j.normalWorld.copy(ba.normal);Ba.multiplyVector3(j.normalWorld);j.centroidWorld.copy(ba.centroid);Ea.multiplyVector3(j.centroidWorld);j.centroidScreen.copy(j.centroidWorld);A.multiplyVector3(j.centroidScreen);W=ba.vertexNormals;for(Q=0,L=W.length;Q< +L;Q++)ya=j.vertexNormalsWorld[Q],ya.copy(W[Q]),Ba.multiplyVector3(ya);for(Q=0,L=Ta.length;QH.z))h=K[J]=K[J]|| +new THREE.RenderableParticle,J++,y=h,y.x=H.x/H.w,y.y=H.y/H.w,y.z=H.z,y.rotation=ca.rotation.z,y.scale.x=ca.scale.x*Math.abs(y.x-(H.x+e.projectionMatrix.n11)/(H.w+e.projectionMatrix.n14)),y.scale.y=ca.scale.y*Math.abs(y.y-(H.y+e.projectionMatrix.n22)/(H.w+e.projectionMatrix.n24)),y.material=ca.material,u.elements.push(y);f&&u.elements.sort(c);return u}};THREE.Quaternion=function(a,b,c,d){this.set(a||0,b||0,c||0,void 0!==d?d:1)}; +THREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a){var b=Math.PI/360,c=a.x*b,d=a.y*b,e=a.z*b,a=Math.cos(d),d=Math.sin(d),b=Math.cos(-e),e=Math.sin(-e),f=Math.cos(c),c=Math.sin(c),h=a*b,i=d*e;this.w=h*f-i*c;this.x=h*c+i*f;this.y=d*b*f+a*e*c;this.z=a*e*f-d*b*c;return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c); +this.x=a.x*d;this.y=a.y*d;this.z=a.z*d;this.w=Math.cos(c);return this},setFromRotationMatrix:function(a){var b=Math.pow(a.determinant(),1/3);this.w=Math.sqrt(Math.max(0,b+a.n11+a.n22+a.n33))/2;this.x=Math.sqrt(Math.max(0,b+a.n11-a.n22-a.n33))/2;this.y=Math.sqrt(Math.max(0,b-a.n11+a.n22-a.n33))/2;this.z=Math.sqrt(Math.max(0,b-a.n11-a.n22+a.n33))/2;this.x=0>a.n32-a.n23?-Math.abs(this.x):Math.abs(this.x);this.y=0>a.n13-a.n31?-Math.abs(this.y):Math.abs(this.y);this.z=0>a.n21-a.n12?-Math.abs(this.z):Math.abs(this.z); +this.normalize();return this},calculateW:function(){this.w=-Math.sqrt(Math.abs(1-this.x*this.x-this.y*this.y-this.z*this.z));return this},inverse:function(){this.x*=-1;this.y*=-1;this.z*=-1;return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);0===a?this.w=this.z=this.y=this.x=0:(a=1/a,this.x*=a,this.y*=a,this.z*=a,this.w*=a);return this},multiplySelf:function(a){var b= +this.x,c=this.y,d=this.z,e=this.w,f=a.x,h=a.y,i=a.z,a=a.w;this.x=b*a+e*f+c*i-d*h;this.y=c*a+e*h+d*f-b*i;this.z=d*a+e*i+b*h-c*f;this.w=e*a-b*f-c*h-d*i;return this},multiply:function(a,b){this.x=a.x*b.w+a.y*b.z-a.z*b.y+a.w*b.x;this.y=-a.x*b.z+a.y*b.w+a.z*b.x+a.w*b.y;this.z=a.x*b.y-a.y*b.x+a.z*b.w+a.w*b.z;this.w=-a.x*b.x-a.y*b.y-a.z*b.z+a.w*b.w;return this},multiplyVector3:function(a,b){b||(b=a);var c=a.x,d=a.y,e=a.z,f=this.x,h=this.y,i=this.z,k=this.w,l=k*c+h*e-i*d,j=k*d+i*c-f*e,n=k*e+f*d-h*c,c=-f* +c-h*d-i*e;b.x=l*k+c*-f+j*-i-n*-h;b.y=j*k+c*-h+n*-f-l*-i;b.z=n*k+c*-i+l*-h-j*-f;return b}}; +THREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;0>e?(c.w=-b.w,c.x=-b.x,c.y=-b.y,c.z=-b.z,e=-e):c.copy(b);if(1<=Math.abs(e))return c.w=a.w,c.x=a.x,c.y=a.y,c.z=a.z,c;var f=Math.acos(e),e=Math.sqrt(1-e*e);if(0.001>Math.abs(e))return c.w=0.5*(a.w+b.w),c.x=0.5*(a.x+b.x),c.y=0.5*(a.y+b.y),c.z=0.5*(a.z+b.z),c;b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3}; +THREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=f;this.centroid=new THREE.Vector3}; +THREE.Face4=function(a,b,c,d,e,f,h){this.a=a;this.b=b;this.c=c;this.d=d;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materialIndex=h;this.centroid=new THREE.Vector3};THREE.UV=function(a,b){this.u=a||0;this.v=b||0}; +THREE.UV.prototype={constructor:THREE.UV,set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.u=a.u;this.v=a.v;return this},clone:function(){return new THREE.UV(this.u,this.v)}}; +THREE.Geometry=function(){this.id=THREE.GeometryCount++;this.vertices=[];this.colors=[];this.materials=[];this.faces=[];this.faceUvs=[[]];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphColors=[];this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.dynamic=this.hasTangents=!1}; +THREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(a){var b=new THREE.Matrix4;b.extractRotation(a,new THREE.Vector3(1,1,1));for(var c=0,d=this.vertices.length;ce?-1:1,f.vertexTangents[d]=new THREE.Vector4(ua.x,ua.y,ua.z,e)}this.hasTangents=!0},computeBoundingBox:function(){if(0c.x)c.x=a.x;if(a.yc.y)c.y=a.y;if(a.zc.z)c.z=a.z}}},computeBoundingSphere:function(){for(var a,b=0,c=0,d=this.vertices.length;cb&&(b=a);this.boundingSphere={radius:b}},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,h;for(f=0,h=this.vertices.length;fthis.points.length-2?f:f+1;c[3]=f>this.points.length-3?f:f+2;l=this.points[c[0]];j=this.points[c[1]]; +n=this.points[c[2]];p=this.points[c[3]];i=h*h;k=h*i;d.x=b(l.x,j.x,n.x,p.x,h,i,k);d.y=b(l.y,j.y,n.y,p.y,h,i,k);d.z=b(l.z,j.z,n.z,p.z,h,i,k);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a=this.LODs[b].visibleAtDistance)this.LODs[b-1].object3D.visible=!1,this.LODs[b].object3D.visible=!0;else break;for(;b 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif", +lights_lambert_vertex:"vLightWeighting = vec3( 0.0 );\n#if MAX_DIR_LIGHTS > 0\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\n#ifdef WRAP_AROUND\nfloat directionalLightWeightingFull = max( dot( transformedNormal, dirVector ), 0.0 );\nfloat directionalLightWeightingHalf = max( 0.5 * dot( transformedNormal, dirVector ) + 0.5, 0.0 );\nvec3 directionalLightWeighting = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\n#else\nfloat directionalLightWeighting = max( dot( transformedNormal, dirVector ), 0.0 );\n#endif\nvLightWeighting += directionalLightColor[ i ] * directionalLightWeighting;\n}\n#endif\n#if MAX_POINT_LIGHTS > 0\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\n#ifdef WRAP_AROUND\nfloat pointLightWeightingFull = max( dot( transformedNormal, lVector ), 0.0 );\nfloat pointLightWeightingHalf = max( 0.5 * dot( transformedNormal, lVector ) + 0.5, 0.0 );\nvec3 pointLightWeighting = mix( vec3 ( pointLightWeightingFull ), vec3( pointLightWeightingHalf ), wrapRGB );\n#else\nfloat pointLightWeighting = max( dot( transformedNormal, lVector ), 0.0 );\n#endif\nvLightWeighting += pointLightColor[ i ] * pointLightWeighting * lDistance;\n}\n#endif\nvLightWeighting = vLightWeighting * diffuse + ambient * ambientLightColor;", +lights_phong_pars_vertex:"#if MAX_POINT_LIGHTS > 0\n#ifndef PHONG_PER_PIXEL\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\n#endif",lights_phong_vertex:"#if MAX_POINT_LIGHTS > 0\n#ifndef PHONG_PER_PIXEL\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nvPointLight[ i ] = vec4( lVector, lDistance );\n}\n#endif\n#endif", +lights_phong_pars_fragment:"uniform vec3 ambientLightColor;\n#if MAX_DIR_LIGHTS > 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n#ifdef PHONG_PER_PIXEL\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#else\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif\nvarying vec3 vViewPosition;\nvarying vec3 vNormal;", +lights_phong_fragment:"vec3 normal = normalize( vNormal );\nvec3 viewPosition = normalize( vViewPosition );\n#if MAX_POINT_LIGHTS > 0\nvec3 pointDiffuse = vec3( 0.0 );\nvec3 pointSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n#ifdef PHONG_PER_PIXEL\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\n#else\nvec3 lVector = normalize( vPointLight[ i ].xyz );\nfloat lDistance = vPointLight[ i ].w;\n#endif\n#ifdef WRAP_AROUND\nfloat pointDiffuseWeightFull = max( dot( normal, lVector ), 0.0 );\nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, lVector ) + 0.5, 0.0 );\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\n#else\nfloat pointDiffuseWeight = max( dot( normal, lVector ), 0.0 );\n#endif\npointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\nvec3 pointHalfVector = normalize( lVector + viewPosition );\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\nfloat pointSpecularWeight = max( pow( pointDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( dot( lVector, pointHalfVector ), 5.0 );\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\n#else\npointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\n#endif\n}\n#endif\n#if MAX_DIR_LIGHTS > 0\nvec3 dirDiffuse = vec3( 0.0 );\nvec3 dirSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\n#ifdef WRAP_AROUND\nfloat dirDiffuseWeightFull = max( dot( normal, dirVector ), 0.0 );\nfloat dirDiffuseWeightHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\n#else\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\n#endif\ndirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\nfloat dirSpecularWeight = max( pow( dirDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( dot( dirVector, dirHalfVector ), 5.0 );\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\n#else\ndirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\n#endif\n}\n#endif\nvec3 totalDiffuse = vec3( 0.0 );\nvec3 totalSpecular = vec3( 0.0 );\n#if MAX_DIR_LIGHTS > 0\ntotalDiffuse += dirDiffuse;\ntotalSpecular += dirSpecular;\n#endif\n#if MAX_POINT_LIGHTS > 0\ntotalDiffuse += pointDiffuse;\ntotalSpecular += pointSpecular;\n#endif\n#ifdef METAL\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * ambient + totalSpecular );\n#else\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\n#endif", +color_pars_fragment:"#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",color_fragment:"#ifdef USE_COLOR\ngl_FragColor = gl_FragColor * vec4( vColor, opacity );\n#endif",color_pars_vertex:"#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n#ifdef GAMMA_INPUT\nvColor = color * color;\n#else\nvColor = color;\n#endif\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\n#endif",skinning_vertex:"#ifdef USE_SKINNING\ngl_Position = ( boneGlobalMatrices[ int( skinIndex.x ) ] * skinVertexA ) * skinWeight.x;\ngl_Position += ( boneGlobalMatrices[ int( skinIndex.y ) ] * skinVertexB ) * skinWeight.y;\ngl_Position = projectionMatrix * viewMatrix * objectMatrix * gl_Position;\n#endif", +morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\nuniform float morphTargetInfluences[ 8 ];\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\nvec3 morphed = vec3( 0.0, 0.0, 0.0 );\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\nmorphed += position;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );\n#endif", +default_vertex:"#ifndef USE_MORPHTARGETS\n#ifndef USE_SKINNING\ngl_Position = projectionMatrix * mvPosition;\n#endif\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\nuniform sampler2D shadowMap[ MAX_SHADOWS ];\nuniform vec2 shadowMapSize[ MAX_SHADOWS ];\nuniform float shadowDarkness[ MAX_SHADOWS ];\nuniform float shadowBias[ MAX_SHADOWS ];\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\nfloat unpackDepth( const in vec4 rgba_depth ) {\nconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\nfloat depth = dot( rgba_depth, bit_shift );\nreturn depth;\n}\n#endif", +shadowmap_fragment:"#ifdef USE_SHADOWMAP\nvec3 shadowColor = vec3( 1.0 );\nfloat fDepth;\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\nif ( shadowCoord.z <= 1.0 ) {\nshadowCoord.z += shadowBias[ i ];\nbvec4 shadowTest = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\nif ( all( shadowTest ) ) {\n#ifdef SHADOWMAP_SOFT\nfloat shadow = 0.0;\nconst float shadowDelta = 1.0 / 9.0;\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\nfloat dx0 = -1.25 * xPixelOffset;\nfloat dy0 = -1.25 * yPixelOffset;\nfloat dx1 = 1.25 * xPixelOffset;\nfloat dy1 = 1.25 * yPixelOffset;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\n#else\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\nfloat fDepth = unpackDepth( rgbaDepth );\nif ( fDepth < shadowCoord.z )\nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\n#endif\n}\n}\n}\n#ifdef GAMMA_OUTPUT\nshadowColor *= shadowColor;\n#endif\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\n#endif", +shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\n#ifdef USE_MORPHTARGETS\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( morphed, 1.0 );\n#else\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( position, 1.0 );\n#endif\n}\n#endif",alphatest_fragment:"#ifdef ALPHATEST\nif ( gl_FragColor.a < ALPHATEST ) discard;\n#endif", +linear_to_gamma_fragment:"#ifdef GAMMA_OUTPUT\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\n#endif"}; +THREE.UniformsUtils={merge:function(a){var b,c,d,e={};for(b=0;bm;m++){k=n;t=m;if(D.autoScaleCubemaps){if(u=i.image[m],y=uc,!(u.width<=y&&u.height<=y))A=Math.max(u.width,u.height),z=Math.floor(u.width* +y/A),y=Math.floor(u.height*y/A),A=document.createElement("canvas"),A.width=z,A.height=y,A.getContext("2d").drawImage(u,0,0,u.width,u.height,0,0,z,y),u=A}else u=i.image[m];k[t]=u}m=n[0];k=0===(m.width&m.width-1)&&0===(m.height&m.height-1);t=B(i.format);u=B(i.type);J(g.TEXTURE_CUBE_MAP,i,k);for(m=0;6>m;m++)g.texImage2D(g.TEXTURE_CUBE_MAP_POSITIVE_X+m,0,t,t,u,n[m]);i.generateMipmaps&&k&&g.generateMipmap(g.TEXTURE_CUBE_MAP);i.needsUpdate=!1;if(i.onUpdated)i.onUpdated()}else g.activeTexture(g.TEXTURE0+ +n),g.bindTexture(g.TEXTURE_CUBE_MAP,i.image.__webglTextureCube)}else m instanceof THREE.WebGLRenderTargetCube?(i=m,g.activeTexture(g.TEXTURE0+n),g.bindTexture(g.TEXTURE_CUBE_MAP,i.__webglTexture)):D.setTexture(m,n)}else if("tv"===k){if(!i._array){i._array=[];for(k=0,t=i.texture.length;k +n&&(l=m,n=i[l]);g.bindBuffer(g.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[l]);g.vertexAttribPointer(c["morphTarget"+h],3,g.FLOAT,!1,0,0);f.__webglMorphTargetInfluences[h]=n;j[l]=1;n=-1;h++}}null!==d.program.uniforms.morphTargetInfluences&&g.uniform1fv(d.program.uniforms.morphTargetInfluences,f.__webglMorphTargetInfluences)}if(a){if(e.__webglCustomAttributesList)for(h=0,i=e.__webglCustomAttributesList.length;hT;T++)vb=Jb[T],La[va]=vb.x,La[va+1]=vb.y,La[va+2]=vb.z,va+=3;else for(T=0;3>T;T++)La[va]=ob.x,La[va+1]=ob.y,La[va+2]=ob.z,va+=3;for(v=0,C=V.length;vT;T++)vb=Jb[T],La[va]=vb.x,La[va+1]=vb.y,La[va+2]=vb.z,va+=3;else for(T=0;4>T;T++)La[va]=ob.x,La[va+1]=ob.y,La[va+2]=ob.z,va+=3; +g.bindBuffer(g.ARRAY_BUFFER,O.__webglNormalBuffer);g.bufferData(g.ARRAY_BUFFER,La,Ga)}if(Kc&&Bc&&Gc){for(v=0,C=U.length;vT;T++)Mb=Kb[T],Xb[kb]=Mb.u,Xb[kb+1]=Mb.v,kb+=2;for(v=0,C=V.length;vT;T++)Mb=Kb[T],Xb[kb]=Mb.u,Xb[kb+1]=Mb.v,kb+=2;0T;T++)Nb=Lb[T],Yb[lb]=Nb.u,Yb[lb+1]=Nb.v,lb+=2;for(v=0,C=V.length;vT;T++)Nb=Lb[T],Yb[lb]=Nb.u,Yb[lb+1]=Nb.v,lb+=2;0c;c++){a.__webglFramebuffer[c]=g.createFramebuffer();a.__webglRenderbuffer[c]=g.createRenderbuffer();g.texImage2D(g.TEXTURE_CUBE_MAP_POSITIVE_X+c,0,d,a.width,a.height,0,d,e,null);var f=a,h=g.TEXTURE_CUBE_MAP_POSITIVE_X+c;g.bindFramebuffer(g.FRAMEBUFFER,a.__webglFramebuffer[c]);g.framebufferTexture2D(g.FRAMEBUFFER,g.COLOR_ATTACHMENT0,h,f.__webglTexture,0);K(a.__webglRenderbuffer[c],a)}}else a.__webglFramebuffer= +g.createFramebuffer(),a.__webglRenderbuffer=g.createRenderbuffer(),g.bindTexture(g.TEXTURE_2D,a.__webglTexture),J(g.TEXTURE_2D,a,c),g.texImage2D(g.TEXTURE_2D,0,d,a.width,a.height,0,d,e,null),d=g.TEXTURE_2D,g.bindFramebuffer(g.FRAMEBUFFER,a.__webglFramebuffer),g.framebufferTexture2D(g.FRAMEBUFFER,g.COLOR_ATTACHMENT0,d,a.__webglTexture,0),K(a.__webglRenderbuffer,a);b?g.bindTexture(g.TEXTURE_CUBE_MAP,null):g.bindTexture(g.TEXTURE_2D,null);g.bindRenderbuffer(g.RENDERBUFFER,null);g.bindFramebuffer(g.FRAMEBUFFER, +null)}a?(b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer,d=a.width,a=a.height,c=e=0):(b=null,d=Ab,a=Gb,e=Fb,c=Pb);b!==pa&&(g.bindFramebuffer(g.FRAMEBUFFER,b),g.viewport(e,c,d,a),pa=b);cc=d;dc=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)}; +THREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=void 0!==c.wrapS?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=void 0!==c.wrapT?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=void 0!==c.magFilter?c.magFilter:THREE.LinearFilter;this.minFilter=void 0!==c.minFilter?c.minFilter:THREE.LinearMipMapLinearFilter;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=void 0!==c.format?c.format:THREE.RGBAFormat;this.type=void 0!==c.type?c.type: +THREE.UnsignedByteType;this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.generateMipmaps=!0}; +THREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;return a};THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0}; +THREE.WebGLRenderTargetCube.prototype=new THREE.WebGLRenderTarget;THREE.WebGLRenderTargetCube.prototype.constructor=THREE.WebGLRenderTargetCube;THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=!0};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)}; +THREE.RenderableFace3=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null}; +THREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.v4=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};THREE.RenderableObject=function(){this.z=this.object=null}; +THREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null}; +THREE.BufferGeometry=function(){this.id=THREE.GeometryCount++;this.vertexColorArray=this.vertexUvArray=this.vertexNormalArray=this.vertexPositionArray=this.vertexIndexArray=this.vertexColorBuffer=this.vertexUvBuffer=this.vertexNormalBuffer=this.vertexPositionBuffer=this.vertexIndexBuffer=null;this.dynamic=!1;this.boundingSphere=this.boundingBox=null;this.morphTargets=[]};THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,computeBoundingBox:function(){},computeBoundingSphere:function(){}}; +THREE.CameraHelper=function(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.lineGeometry.vertices.push(new THREE.Vertex(new THREE.Vector3));d.lineGeometry.colors.push(new THREE.Color(b));void 0===d.pointMap[a]&&(d.pointMap[a]=[]);d.pointMap[a].push(d.lineGeometry.vertices.length-1)}THREE.Object3D.call(this);var d=this;this.lineGeometry=new THREE.Geometry;this.lineMaterial=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors});this.pointMap={};b("n1","n2",16755200);b("n2", +"n4",16755200);b("n4","n3",16755200);b("n3","n1",16755200);b("f1","f2",16755200);b("f2","f4",16755200);b("f4","f3",16755200);b("f3","f1",16755200);b("n1","f1",16755200);b("n2","f2",16755200);b("n3","f3",16755200);b("n4","f4",16755200);b("p","n1",16711680);b("p","n2",16711680);b("p","n3",16711680);b("p","n4",16711680);b("u1","u2",43775);b("u2","u3",43775);b("u3","u1",43775);b("c","t",16777215);b("p","c",3355443);b("cn1","cn2",3355443);b("cn3","cn4",3355443);b("cf1","cf2",3355443);b("cf3","cf4",3355443); +this.update(a);this.lines=new THREE.Line(this.lineGeometry,this.lineMaterial,THREE.LinePieces);this.add(this.lines)};THREE.CameraHelper.prototype=new THREE.Object3D;THREE.CameraHelper.prototype.constructor=THREE.CameraHelper; +THREE.CameraHelper.prototype.update=function(a){function b(a,b,f,h){THREE.CameraHelper.__v.set(b,f,h);THREE.CameraHelper.__projector.unprojectVector(THREE.CameraHelper.__v,THREE.CameraHelper.__c);a=c.pointMap[a];if(void 0!==a){b=0;for(f=a.length;b=this.maxCount-3&&i(this)};this.begin=function(){this.count=0; +this.hasNormal=this.hasPos=!1};this.end=function(a){if(0!==this.count){for(var b=3*this.count;bn&&(n=1);k=Math.floor(k+i);k>this.size-1&&(k=this.size-1);var p=Math.floor(l-i);1>p&&(p=1);l=Math.floor(l+i);l>this.size-1&&(l=this.size-1);var o=Math.floor(j-i);1>o&&(o=1);i=Math.floor(j+i);i>this.size-1&&(i=this.size- +1);for(var m,r,t,z,y,J,K,j=n;jl&&(o=l);for(e=0;ej&&(m=j);for(f=0;fj&&(m=j);for(h=0;h=b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)?(l=!1,j=a(THREE.ShaderFlares.lensFlare)):(l=!0,j=a(THREE.ShaderFlares.lensFlareVertexTexture));n={};p={};n.vertex=b.getAttribLocation(j,"position");n.uv=b.getAttribLocation(j,"uv");p.renderType=b.getUniformLocation(j,"renderType");p.map=b.getUniformLocation(j,"map");p.occlusionMap=b.getUniformLocation(j,"occlusionMap");p.opacity=b.getUniformLocation(j,"opacity");p.color=b.getUniformLocation(j, +"color");p.scale=b.getUniformLocation(j,"scale");p.rotation=b.getUniformLocation(j,"rotation");p.screenPosition=b.getUniformLocation(j,"screenPosition");o=!1};this.render=function(a,d,e,z){var a=a.__webglFlares,y=a.length;if(y){var J=new THREE.Vector3,K=z/e,u=0.5*e,B=0.5*z,H=16/z,A=new THREE.Vector2(H*K,H),M=new THREE.Vector3(1,1,0),N=new THREE.Vector2(1,1),I=p,H=n;b.useProgram(j);o||(b.enableVertexAttribArray(n.vertex),b.enableVertexAttribArray(n.uv),o=!0);b.uniform1i(I.occlusionMap,0);b.uniform1i(I.map, +1);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(H.vertex,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(H.uv,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,h);b.disable(b.CULL_FACE);b.depthMask(!1);var S,ua,ka,$,Z;for(S=0;Sn-1?e-1:n-1,o=(n+1)%e,m=0>j-1?d-1:j-1,r=(j+1)%d,t=[],z=[0,0,i[4*(n*d+j)]/255*b];t.push([-1,0,i[4*(n*d+m)]/255*b]);t.push([-1,-1,i[4*(p*d+m)]/255*b]);t.push([0,-1,i[4*(p*d+j)]/255*b]);t.push([1, +-1,i[4*(p*d+r)]/255*b]);t.push([1,0,i[4*(n*d+r)]/255*b]);t.push([1,1,i[4*(o*d+r)]/255*b]);t.push([0,1,i[4*(o*d+j)]/255*b]);t.push([-1,1,i[4*(o*d+m)]/255*b]);p=[];m=t.length;for(o=0;o>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},getHex:function(){return Math.floor(255*this.r)<<16^Math.floor(255*this.g)<<8^Math.floor(255*this.b)},getContextStyle:function(){return"rgb("+Math.floor(255*this.r)+","+Math.floor(255*this.g)+","+Math.floor(255*this.b)+")"},clone:function(){return(new THREE.Color).setRGB(this.r,this.g,this.b)}};THREE.Vector2=function(a,b){this.x=a||0;this.y=b||0}; -THREE.Vector2.prototype={constructor:THREE.Vector2,set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.x=a.x;this.y=a.y;return this},clone:function(){return new THREE.Vector2(this.x,this.y)},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this}, -divideScalar:function(a){a?(this.x/=a,this.y/=a):this.set(0,0);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.lengthSq())},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,a=this.y-a.y;return b*b+a*a},setLength:function(a){return this.normalize().multiplyScalar(a)}, -equals:function(a){return a.x===this.x&&a.y===this.y}};THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}; -THREE.Vector3.prototype={constructor:THREE.Vector3,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;this.z+=a.z;return this}, -addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},multiply:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},multiplySelf:function(a){this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},divideSelf:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this}, -divideScalar:function(a){a?(this.x/=a,this.y/=a,this.z/=a):this.z=this.y=this.x=0;return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.lengthSq())},lengthManhattan:function(){return this.x+this.y+this.z},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.normalize().multiplyScalar(a)}, -cross:function(a,b){this.x=a.y*b.z-a.z*b.y;this.y=a.z*b.x-a.x*b.z;this.z=a.x*b.y-a.y*b.x;return this},crossSelf:function(a){var b=this.x,c=this.y,d=this.z;this.x=c*a.z-d*a.y;this.y=d*a.x-b*a.z;this.z=b*a.y-c*a.x;return this},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){return(new THREE.Vector3).sub(this,a).lengthSq()},setPositionFromMatrix:function(a){this.x=a.n14;this.y=a.n24;this.z=a.n34},setRotationFromMatrix:function(a){var b=Math.cos(this.y); -this.y=Math.asin(a.n13);1.0E-5this.lengthSq()}};THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}; -THREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z- -b.z;this.w=a.w-b.w;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},divideScalar:function(a){a?(this.x/=a,this.y/=a,this.z/=a,this.w/=a):(this.z=this.y=this.x=0,this.w=1);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.dot(this)},length:function(){return Math.sqrt(this.lengthSq())}, -normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this}};THREE.Frustum=function(){this.planes=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4]}; -THREE.Frustum.prototype.setFromMatrix=function(a){var b,c=this.planes;c[0].set(a.n41-a.n11,a.n42-a.n12,a.n43-a.n13,a.n44-a.n14);c[1].set(a.n41+a.n11,a.n42+a.n12,a.n43+a.n13,a.n44+a.n14);c[2].set(a.n41+a.n21,a.n42+a.n22,a.n43+a.n23,a.n44+a.n24);c[3].set(a.n41-a.n21,a.n42-a.n22,a.n43-a.n23,a.n44-a.n24);c[4].set(a.n41-a.n31,a.n42-a.n32,a.n43-a.n33,a.n44-a.n34);c[5].set(a.n41+a.n31,a.n42+a.n32,a.n43+a.n33,a.n44+a.n34);for(a=0;6>a;a++)b=c[a],b.divideScalar(Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z))}; -THREE.Frustum.prototype.contains=function(a){for(var b=this.planes,c=a.matrixWorld,d=THREE.Frustum.__v1.set(c.getColumnX().length(),c.getColumnY().length(),c.getColumnZ().length()),d=-a.geometry.boundingSphere.radius*Math.max(d.x,Math.max(d.y,d.z)),e=0;6>e;e++)if(a=b[e].x*c.n14+b[e].y*c.n24+b[e].z*c.n34+b[e].w,a<=d)return!1;return!0};THREE.Frustum.__v1=new THREE.Vector3; -THREE.Ray=function(a,b){function c(a,b,c){o.sub(c,a);t=o.dot(b);z=m.add(a,r.copy(b).multiplyScalar(t));return y=c.distanceTo(z)}function d(a,b,c,d){o.sub(d,b);m.sub(c,b);r.sub(a,b);J=o.dot(o);K=o.dot(m);u=o.dot(r);B=m.dot(m);H=m.dot(r);A=1/(J*B-K*K);M=(B*u-K*H)*A;N=(J*H-K*u)*A;return 0<=M&&0<=N&&1>M+N}this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3;this.intersectScene=function(a){return this.intersectObjects(a.children)};this.intersectObjects=function(a){var b,c,d=[];for(b=0, -c=a.length;ba.scale.x)return[];b={distance:o,point:a.position,face:null,object:a};m.push(b)}else if(a instanceof THREE.Mesh){o=c(this.origin,this.direction,a.matrixWorld.getPosition());r=THREE.Frustum.__v1.set(a.matrixWorld.getColumnX().length(),a.matrixWorld.getColumnY().length(),a.matrixWorld.getColumnZ().length());if(o>a.geometry.boundingSphere.radius*Math.max(r.x,Math.max(r.y,r.z)))return m;var t,u,g=a.geometry,z=g.vertices,y;a.matrixRotationWorld.extractRotation(a.matrixWorld); -for(o=0,r=g.faces.length;oMath.abs(t))&&(u=n.dot(j)/t,!(0>u)&&(a.doubleSided||(a.flipSided?0t))))if(p.add(k,l.multiplyScalar(u)),b instanceof THREE.Face3)e=y.multiplyVector3(e.copy(z[b.a].position)),f=y.multiplyVector3(f.copy(z[b.b].position)),h=y.multiplyVector3(h.copy(z[b.c].position)), -d(p,e,f,h)&&(b={distance:k.distanceTo(p),point:p.clone(),face:b,object:a},m.push(b));else if(b instanceof THREE.Face4&&(e=y.multiplyVector3(e.copy(z[b.a].position)),f=y.multiplyVector3(f.copy(z[b.b].position)),h=y.multiplyVector3(h.copy(z[b.c].position)),i=y.multiplyVector3(i.copy(z[b.d].position)),d(p,e,f,i)||d(p,f,h,i)))b={distance:k.distanceTo(p),point:p.clone(),face:b,object:a},m.push(b)}return m};var o=new THREE.Vector3,m=new THREE.Vector3,r=new THREE.Vector3,t,z,y,J,K,u,B,H,A,M,N}; -THREE.Rectangle=function(){function a(){f=d-b;h=e-c}var b,c,d,e,f,h,i=!0;this.getX=function(){return b};this.getY=function(){return c};this.getWidth=function(){return f};this.getHeight=function(){return h};this.getLeft=function(){return b};this.getTop=function(){return c};this.getRight=function(){return d};this.getBottom=function(){return e};this.set=function(f,h,j,n){i=!1;b=f;c=h;d=j;e=n;a()};this.addPoint=function(f,h){i?(i=!1,b=f,c=h,d=f,e=h):(b=bf?d:f,e=e>h?e:h);a()};this.add3Points= -function(f,h,j,n,p,o){i?(i=!1,b=fj?f>p?f:p:j>p?j:p,e=h>n?h>o?h:o:n>o?n:o):(b=fj?f>p?f>d?f:d:p>d?p:d:j>p?j>d?j:d:p>d?p:d,e=h>n?h>o?h>e?h:e:o>e?o:e:n>o?n>e?n:e:o>e?o:e);a()};this.addRectangle=function(f){i?(i=!1,b=f.getLeft(),c=f.getTop(),d=f.getRight(),e=f.getBottom()):(b=bf.getRight()?d:f.getRight(),e=e> -f.getBottom()?e:f.getBottom());a()};this.inflate=function(f){b-=f;c-=f;d+=f;e+=f;a()};this.minSelf=function(f){b=b>f.getLeft()?b:f.getLeft();c=c>f.getTop()?c:f.getTop();d=da.getRight()||ea.getBottom()?!1:!0};this.empty=function(){i=!0;e=d=c=b=0;a()};this.isEmpty=function(){return i}}; -THREE.Math={clamp:function(a,b,c){return ac?c:a},clampBottom:function(a,b){return ae&&0>g||0>f&&0>h)return!1;0>e?c=Math.max(c,e/(e-g)):0>g&&(d=Math.min(d,e/(e-g)));0>f?c=Math.max(c,f/(f-h)):0>h&&(d=Math.min(d,f/(f-h)));if(dh&&i.positionScreen.z(W.positionScreen.x-Q.positionScreen.x)*(L.positionScreen.y-Q.positionScreen.y)-(W.positionScreen.y- -Q.positionScreen.y)*(L.positionScreen.x-Q.positionScreen.x)))ya=p[n]=p[n]||new THREE.RenderableFace3,n++,j=ya,j.v1.copy(Q),j.v2.copy(L),j.v3.copy(W);else continue;else if(ba instanceof THREE.Face4)if(Q=l[ba.a],L=l[ba.b],W=l[ba.c],ya=l[ba.d],Q.visible&&L.visible&&W.visible&&ya.visible&&(ca.doubleSided||ca.flipSided!=(0>(ya.positionScreen.x-Q.positionScreen.x)*(L.positionScreen.y-Q.positionScreen.y)-(ya.positionScreen.y-Q.positionScreen.y)*(L.positionScreen.x-Q.positionScreen.x)||0>(L.positionScreen.x- -W.positionScreen.x)*(ya.positionScreen.y-W.positionScreen.y)-(L.positionScreen.y-W.positionScreen.y)*(ya.positionScreen.x-W.positionScreen.x))))Ua=m[o]=m[o]||new THREE.RenderableFace4,o++,j=Ua,j.v1.copy(Q),j.v2.copy(L),j.v3.copy(W),j.v4.copy(ya);else continue;j.normalWorld.copy(ba.normal);Ba.multiplyVector3(j.normalWorld);j.centroidWorld.copy(ba.centroid);Ea.multiplyVector3(j.centroidWorld);j.centroidScreen.copy(j.centroidWorld);A.multiplyVector3(j.centroidScreen);W=ba.vertexNormals;for(Q=0,L=W.length;Q< -L;Q++)ya=j.vertexNormalsWorld[Q],ya.copy(W[Q]),Ba.multiplyVector3(ya);for(Q=0,L=Ta.length;QH.z))h=K[J]=K[J]|| -new THREE.RenderableParticle,J++,y=h,y.x=H.x/H.w,y.y=H.y/H.w,y.z=H.z,y.rotation=ca.rotation.z,y.scale.x=ca.scale.x*Math.abs(y.x-(H.x+e.projectionMatrix.n11)/(H.w+e.projectionMatrix.n14)),y.scale.y=ca.scale.y*Math.abs(y.y-(H.y+e.projectionMatrix.n22)/(H.w+e.projectionMatrix.n24)),y.material=ca.material,u.elements.push(y);f&&u.elements.sort(c);return u}};THREE.Quaternion=function(a,b,c,d){this.set(a||0,b||0,c||0,void 0!==d?d:1)}; -THREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a){var b=Math.PI/360,c=a.x*b,d=a.y*b,e=a.z*b,a=Math.cos(d),d=Math.sin(d),b=Math.cos(-e),e=Math.sin(-e),f=Math.cos(c),c=Math.sin(c),h=a*b,i=d*e;this.w=h*f-i*c;this.x=h*c+i*f;this.y=d*b*f+a*e*c;this.z=a*e*f-d*b*c;return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c); -this.x=a.x*d;this.y=a.y*d;this.z=a.z*d;this.w=Math.cos(c);return this},setFromRotationMatrix:function(a){var b=Math.pow(a.determinant(),1/3);this.w=Math.sqrt(Math.max(0,b+a.n11+a.n22+a.n33))/2;this.x=Math.sqrt(Math.max(0,b+a.n11-a.n22-a.n33))/2;this.y=Math.sqrt(Math.max(0,b-a.n11+a.n22-a.n33))/2;this.z=Math.sqrt(Math.max(0,b-a.n11-a.n22+a.n33))/2;this.x=0>a.n32-a.n23?-Math.abs(this.x):Math.abs(this.x);this.y=0>a.n13-a.n31?-Math.abs(this.y):Math.abs(this.y);this.z=0>a.n21-a.n12?-Math.abs(this.z):Math.abs(this.z); -this.normalize();return this},calculateW:function(){this.w=-Math.sqrt(Math.abs(1-this.x*this.x-this.y*this.y-this.z*this.z));return this},inverse:function(){this.x*=-1;this.y*=-1;this.z*=-1;return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);0===a?this.w=this.z=this.y=this.x=0:(a=1/a,this.x*=a,this.y*=a,this.z*=a,this.w*=a);return this},multiplySelf:function(a){var b= -this.x,c=this.y,d=this.z,e=this.w,f=a.x,h=a.y,i=a.z,a=a.w;this.x=b*a+e*f+c*i-d*h;this.y=c*a+e*h+d*f-b*i;this.z=d*a+e*i+b*h-c*f;this.w=e*a-b*f-c*h-d*i;return this},multiply:function(a,b){this.x=a.x*b.w+a.y*b.z-a.z*b.y+a.w*b.x;this.y=-a.x*b.z+a.y*b.w+a.z*b.x+a.w*b.y;this.z=a.x*b.y-a.y*b.x+a.z*b.w+a.w*b.z;this.w=-a.x*b.x-a.y*b.y-a.z*b.z+a.w*b.w;return this},multiplyVector3:function(a,b){b||(b=a);var c=a.x,d=a.y,e=a.z,f=this.x,h=this.y,i=this.z,k=this.w,l=k*c+h*e-i*d,j=k*d+i*c-f*e,n=k*e+f*d-h*c,c=-f* -c-h*d-i*e;b.x=l*k+c*-f+j*-i-n*-h;b.y=j*k+c*-h+n*-f-l*-i;b.z=n*k+c*-i+l*-h-j*-f;return b}}; -THREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;0>e?(c.w=-b.w,c.x=-b.x,c.y=-b.y,c.z=-b.z,e=-e):c.copy(b);if(1<=Math.abs(e))return c.w=a.w,c.x=a.x,c.y=a.y,c.z=a.z,c;var f=Math.acos(e),e=Math.sqrt(1-e*e);if(0.001>Math.abs(e))return c.w=0.5*(a.w+b.w),c.x=0.5*(a.x+b.x),c.y=0.5*(a.y+b.y),c.z=0.5*(a.z+b.z),c;b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3}; -THREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=f;this.centroid=new THREE.Vector3}; -THREE.Face4=function(a,b,c,d,e,f,h){this.a=a;this.b=b;this.c=c;this.d=d;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materialIndex=h;this.centroid=new THREE.Vector3};THREE.UV=function(a,b){this.u=a||0;this.v=b||0}; -THREE.UV.prototype={constructor:THREE.UV,set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.u=a.u;this.v=a.v;return this},clone:function(){return new THREE.UV(this.u,this.v)}}; -THREE.Geometry=function(){this.id=THREE.GeometryCount++;this.vertices=[];this.colors=[];this.materials=[];this.faces=[];this.faceUvs=[[]];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphColors=[];this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.dynamic=this.hasTangents=!1}; -THREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(a){var b=new THREE.Matrix4;b.extractRotation(a,new THREE.Vector3(1,1,1));for(var c=0,d=this.vertices.length;ce?-1:1,f.vertexTangents[d]=new THREE.Vector4(ua.x,ua.y,ua.z,e)}this.hasTangents=!0},computeBoundingBox:function(){if(0c.x)c.x=a.x;if(a.yc.y)c.y=a.y;if(a.zc.z)c.z=a.z}}},computeBoundingSphere:function(){for(var a,b=0,c=0,d=this.vertices.length;cb&&(b=a);this.boundingSphere={radius:b}},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,h;for(f=0,h=this.vertices.length;fthis.points.length-2?f:f+1;c[3]=f>this.points.length-3?f:f+2;l=this.points[c[0]];j=this.points[c[1]]; -n=this.points[c[2]];p=this.points[c[3]];i=h*h;k=h*i;d.x=b(l.x,j.x,n.x,p.x,h,i,k);d.y=b(l.y,j.y,n.y,p.y,h,i,k);d.z=b(l.z,j.z,n.z,p.z,h,i,k);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a=this.LODs[b].visibleAtDistance)this.LODs[b-1].object3D.visible=!1,this.LODs[b].object3D.visible=!0;else break;for(;b 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif", -lights_lambert_vertex:"vLightWeighting = vec3( 0.0 );\n#if MAX_DIR_LIGHTS > 0\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\n#ifdef WRAP_AROUND\nfloat directionalLightWeightingFull = max( dot( transformedNormal, dirVector ), 0.0 );\nfloat directionalLightWeightingHalf = max( 0.5 * dot( transformedNormal, dirVector ) + 0.5, 0.0 );\nvec3 directionalLightWeighting = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\n#else\nfloat directionalLightWeighting = max( dot( transformedNormal, dirVector ), 0.0 );\n#endif\nvLightWeighting += directionalLightColor[ i ] * directionalLightWeighting;\n}\n#endif\n#if MAX_POINT_LIGHTS > 0\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\n#ifdef WRAP_AROUND\nfloat pointLightWeightingFull = max( dot( transformedNormal, lVector ), 0.0 );\nfloat pointLightWeightingHalf = max( 0.5 * dot( transformedNormal, lVector ) + 0.5, 0.0 );\nvec3 pointLightWeighting = mix( vec3 ( pointLightWeightingFull ), vec3( pointLightWeightingHalf ), wrapRGB );\n#else\nfloat pointLightWeighting = max( dot( transformedNormal, lVector ), 0.0 );\n#endif\nvLightWeighting += pointLightColor[ i ] * pointLightWeighting * lDistance;\n}\n#endif\nvLightWeighting = vLightWeighting * diffuse + ambient * ambientLightColor;", -lights_phong_pars_vertex:"#if MAX_POINT_LIGHTS > 0\n#ifndef PHONG_PER_PIXEL\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\n#endif",lights_phong_vertex:"#if MAX_POINT_LIGHTS > 0\n#ifndef PHONG_PER_PIXEL\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nvPointLight[ i ] = vec4( lVector, lDistance );\n}\n#endif\n#endif", -lights_phong_pars_fragment:"uniform vec3 ambientLightColor;\n#if MAX_DIR_LIGHTS > 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n#ifdef PHONG_PER_PIXEL\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#else\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif\nvarying vec3 vViewPosition;\nvarying vec3 vNormal;", -lights_phong_fragment:"vec3 normal = normalize( vNormal );\nvec3 viewPosition = normalize( vViewPosition );\n#if MAX_POINT_LIGHTS > 0\nvec3 pointDiffuse = vec3( 0.0 );\nvec3 pointSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n#ifdef PHONG_PER_PIXEL\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\n#else\nvec3 lVector = normalize( vPointLight[ i ].xyz );\nfloat lDistance = vPointLight[ i ].w;\n#endif\n#ifdef WRAP_AROUND\nfloat pointDiffuseWeightFull = max( dot( normal, lVector ), 0.0 );\nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, lVector ) + 0.5, 0.0 );\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\n#else\nfloat pointDiffuseWeight = max( dot( normal, lVector ), 0.0 );\n#endif\npointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\nvec3 pointHalfVector = normalize( lVector + viewPosition );\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\nfloat pointSpecularWeight = max( pow( pointDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( dot( lVector, pointHalfVector ), 5.0 );\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\n#else\npointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\n#endif\n}\n#endif\n#if MAX_DIR_LIGHTS > 0\nvec3 dirDiffuse = vec3( 0.0 );\nvec3 dirSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\n#ifdef WRAP_AROUND\nfloat dirDiffuseWeightFull = max( dot( normal, dirVector ), 0.0 );\nfloat dirDiffuseWeightHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\n#else\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\n#endif\ndirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\nfloat dirSpecularWeight = max( pow( dirDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( dot( dirVector, dirHalfVector ), 5.0 );\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\n#else\ndirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\n#endif\n}\n#endif\nvec3 totalDiffuse = vec3( 0.0 );\nvec3 totalSpecular = vec3( 0.0 );\n#if MAX_DIR_LIGHTS > 0\ntotalDiffuse += dirDiffuse;\ntotalSpecular += dirSpecular;\n#endif\n#if MAX_POINT_LIGHTS > 0\ntotalDiffuse += pointDiffuse;\ntotalSpecular += pointSpecular;\n#endif\n#ifdef METAL\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * ambient + totalSpecular );\n#else\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\n#endif", -color_pars_fragment:"#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",color_fragment:"#ifdef USE_COLOR\ngl_FragColor = gl_FragColor * vec4( vColor, opacity );\n#endif",color_pars_vertex:"#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n#ifdef GAMMA_INPUT\nvColor = color * color;\n#else\nvColor = color;\n#endif\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\n#endif",skinning_vertex:"#ifdef USE_SKINNING\ngl_Position = ( boneGlobalMatrices[ int( skinIndex.x ) ] * skinVertexA ) * skinWeight.x;\ngl_Position += ( boneGlobalMatrices[ int( skinIndex.y ) ] * skinVertexB ) * skinWeight.y;\ngl_Position = projectionMatrix * viewMatrix * objectMatrix * gl_Position;\n#endif", -morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\nuniform float morphTargetInfluences[ 8 ];\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\nvec3 morphed = vec3( 0.0, 0.0, 0.0 );\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\nmorphed += position;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );\n#endif", -default_vertex:"#ifndef USE_MORPHTARGETS\n#ifndef USE_SKINNING\ngl_Position = projectionMatrix * mvPosition;\n#endif\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\nuniform sampler2D shadowMap[ MAX_SHADOWS ];\nuniform vec2 shadowMapSize[ MAX_SHADOWS ];\nuniform float shadowDarkness[ MAX_SHADOWS ];\nuniform float shadowBias[ MAX_SHADOWS ];\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\nfloat unpackDepth( const in vec4 rgba_depth ) {\nconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\nfloat depth = dot( rgba_depth, bit_shift );\nreturn depth;\n}\n#endif", -shadowmap_fragment:"#ifdef USE_SHADOWMAP\nvec3 shadowColor = vec3( 1.0 );\nfloat fDepth;\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\nif ( shadowCoord.z <= 1.0 ) {\nshadowCoord.z += shadowBias[ i ];\nbvec4 shadowTest = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\nif ( all( shadowTest ) ) {\n#ifdef SHADOWMAP_SOFT\nfloat shadow = 0.0;\nconst float shadowDelta = 1.0 / 9.0;\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\nfloat dx0 = -1.25 * xPixelOffset;\nfloat dy0 = -1.25 * yPixelOffset;\nfloat dx1 = 1.25 * xPixelOffset;\nfloat dy1 = 1.25 * yPixelOffset;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\n#else\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\nfloat fDepth = unpackDepth( rgbaDepth );\nif ( fDepth < shadowCoord.z )\nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\n#endif\n}\n}\n}\n#ifdef GAMMA_OUTPUT\nshadowColor *= shadowColor;\n#endif\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\n#endif", -shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\n#ifdef USE_MORPHTARGETS\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( morphed, 1.0 );\n#else\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( position, 1.0 );\n#endif\n}\n#endif",alphatest_fragment:"#ifdef ALPHATEST\nif ( gl_FragColor.a < ALPHATEST ) discard;\n#endif", -linear_to_gamma_fragment:"#ifdef GAMMA_OUTPUT\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\n#endif"}; -THREE.UniformsUtils={merge:function(a){var b,c,d,e={};for(b=0;bm;m++){k=n;t=m;if(D.autoScaleCubemaps){if(u=i.image[m],y=uc,!(u.width<=y&&u.height<=y))A=Math.max(u.width,u.height),z=Math.floor(u.width* -y/A),y=Math.floor(u.height*y/A),A=document.createElement("canvas"),A.width=z,A.height=y,A.getContext("2d").drawImage(u,0,0,u.width,u.height,0,0,z,y),u=A}else u=i.image[m];k[t]=u}m=n[0];k=0===(m.width&m.width-1)&&0===(m.height&m.height-1);t=B(i.format);u=B(i.type);J(g.TEXTURE_CUBE_MAP,i,k);for(m=0;6>m;m++)g.texImage2D(g.TEXTURE_CUBE_MAP_POSITIVE_X+m,0,t,t,u,n[m]);i.generateMipmaps&&k&&g.generateMipmap(g.TEXTURE_CUBE_MAP);i.needsUpdate=!1;if(i.onUpdated)i.onUpdated()}else g.activeTexture(g.TEXTURE0+ -n),g.bindTexture(g.TEXTURE_CUBE_MAP,i.image.__webglTextureCube)}else m instanceof THREE.WebGLRenderTargetCube?(i=m,g.activeTexture(g.TEXTURE0+n),g.bindTexture(g.TEXTURE_CUBE_MAP,i.__webglTexture)):D.setTexture(m,n)}else if("tv"===k){if(!i._array){i._array=[];for(k=0,t=i.texture.length;k -n&&(l=m,n=i[l]);g.bindBuffer(g.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[l]);g.vertexAttribPointer(c["morphTarget"+h],3,g.FLOAT,!1,0,0);f.__webglMorphTargetInfluences[h]=n;j[l]=1;n=-1;h++}}null!==d.program.uniforms.morphTargetInfluences&&g.uniform1fv(d.program.uniforms.morphTargetInfluences,f.__webglMorphTargetInfluences)}if(a){if(e.__webglCustomAttributesList)for(h=0,i=e.__webglCustomAttributesList.length;hT;T++)vb=Jb[T],La[va]=vb.x,La[va+1]=vb.y,La[va+2]=vb.z,va+=3;else for(T=0;3>T;T++)La[va]=ob.x,La[va+1]=ob.y,La[va+2]=ob.z,va+=3;for(v=0,C=V.length;vT;T++)vb=Jb[T],La[va]=vb.x,La[va+1]=vb.y,La[va+2]=vb.z,va+=3;else for(T=0;4>T;T++)La[va]=ob.x,La[va+1]=ob.y,La[va+2]=ob.z,va+=3; -g.bindBuffer(g.ARRAY_BUFFER,O.__webglNormalBuffer);g.bufferData(g.ARRAY_BUFFER,La,Ga)}if(Kc&&Bc&&Gc){for(v=0,C=U.length;vT;T++)Mb=Kb[T],Xb[kb]=Mb.u,Xb[kb+1]=Mb.v,kb+=2;for(v=0,C=V.length;vT;T++)Mb=Kb[T],Xb[kb]=Mb.u,Xb[kb+1]=Mb.v,kb+=2;0T;T++)Nb=Lb[T],Yb[lb]=Nb.u,Yb[lb+1]=Nb.v,lb+=2;for(v=0,C=V.length;vT;T++)Nb=Lb[T],Yb[lb]=Nb.u,Yb[lb+1]=Nb.v,lb+=2;0c;c++){a.__webglFramebuffer[c]=g.createFramebuffer();a.__webglRenderbuffer[c]=g.createRenderbuffer();g.texImage2D(g.TEXTURE_CUBE_MAP_POSITIVE_X+c,0,d,a.width,a.height,0,d,e,null);var f=a,h=g.TEXTURE_CUBE_MAP_POSITIVE_X+c;g.bindFramebuffer(g.FRAMEBUFFER,a.__webglFramebuffer[c]);g.framebufferTexture2D(g.FRAMEBUFFER,g.COLOR_ATTACHMENT0,h,f.__webglTexture,0);K(a.__webglRenderbuffer[c],a)}}else a.__webglFramebuffer= -g.createFramebuffer(),a.__webglRenderbuffer=g.createRenderbuffer(),g.bindTexture(g.TEXTURE_2D,a.__webglTexture),J(g.TEXTURE_2D,a,c),g.texImage2D(g.TEXTURE_2D,0,d,a.width,a.height,0,d,e,null),d=g.TEXTURE_2D,g.bindFramebuffer(g.FRAMEBUFFER,a.__webglFramebuffer),g.framebufferTexture2D(g.FRAMEBUFFER,g.COLOR_ATTACHMENT0,d,a.__webglTexture,0),K(a.__webglRenderbuffer,a);b?g.bindTexture(g.TEXTURE_CUBE_MAP,null):g.bindTexture(g.TEXTURE_2D,null);g.bindRenderbuffer(g.RENDERBUFFER,null);g.bindFramebuffer(g.FRAMEBUFFER, -null)}a?(b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer,d=a.width,a=a.height,c=e=0):(b=null,d=Ab,a=Gb,e=Fb,c=Pb);b!==pa&&(g.bindFramebuffer(g.FRAMEBUFFER,b),g.viewport(e,c,d,a),pa=b);cc=d;dc=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)}; -THREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=void 0!==c.wrapS?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=void 0!==c.wrapT?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=void 0!==c.magFilter?c.magFilter:THREE.LinearFilter;this.minFilter=void 0!==c.minFilter?c.minFilter:THREE.LinearMipMapLinearFilter;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=void 0!==c.format?c.format:THREE.RGBAFormat;this.type=void 0!==c.type?c.type: -THREE.UnsignedByteType;this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.generateMipmaps=!0}; -THREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;return a};THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0}; -THREE.WebGLRenderTargetCube.prototype=new THREE.WebGLRenderTarget;THREE.WebGLRenderTargetCube.prototype.constructor=THREE.WebGLRenderTargetCube;THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=!0};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)}; -THREE.RenderableFace3=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null}; -THREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.v4=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};THREE.RenderableObject=function(){this.z=this.object=null}; -THREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null}; -THREE.BufferGeometry=function(){this.id=THREE.GeometryCount++;this.vertexColorArray=this.vertexUvArray=this.vertexNormalArray=this.vertexPositionArray=this.vertexIndexArray=this.vertexColorBuffer=this.vertexUvBuffer=this.vertexNormalBuffer=this.vertexPositionBuffer=this.vertexIndexBuffer=null;this.dynamic=!1;this.boundingSphere=this.boundingBox=null;this.morphTargets=[]};THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,computeBoundingBox:function(){},computeBoundingSphere:function(){}}; -THREE.CameraHelper=function(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.lineGeometry.vertices.push(new THREE.Vertex(new THREE.Vector3));d.lineGeometry.colors.push(new THREE.Color(b));void 0===d.pointMap[a]&&(d.pointMap[a]=[]);d.pointMap[a].push(d.lineGeometry.vertices.length-1)}THREE.Object3D.call(this);var d=this;this.lineGeometry=new THREE.Geometry;this.lineMaterial=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors});this.pointMap={};b("n1","n2",16755200);b("n2", -"n4",16755200);b("n4","n3",16755200);b("n3","n1",16755200);b("f1","f2",16755200);b("f2","f4",16755200);b("f4","f3",16755200);b("f3","f1",16755200);b("n1","f1",16755200);b("n2","f2",16755200);b("n3","f3",16755200);b("n4","f4",16755200);b("p","n1",16711680);b("p","n2",16711680);b("p","n3",16711680);b("p","n4",16711680);b("u1","u2",43775);b("u2","u3",43775);b("u3","u1",43775);b("c","t",16777215);b("p","c",3355443);b("cn1","cn2",3355443);b("cn3","cn4",3355443);b("cf1","cf2",3355443);b("cf3","cf4",3355443); -this.update(a);this.lines=new THREE.Line(this.lineGeometry,this.lineMaterial,THREE.LinePieces);this.add(this.lines)};THREE.CameraHelper.prototype=new THREE.Object3D;THREE.CameraHelper.prototype.constructor=THREE.CameraHelper; -THREE.CameraHelper.prototype.update=function(a){function b(a,b,f,h){THREE.CameraHelper.__v.set(b,f,h);THREE.CameraHelper.__projector.unprojectVector(THREE.CameraHelper.__v,THREE.CameraHelper.__c);a=c.pointMap[a];if(void 0!==a){b=0;for(f=a.length;b=this.maxCount-3&&i(this)};this.begin=function(){this.count=0; -this.hasNormal=this.hasPos=!1};this.end=function(a){if(0!==this.count){for(var b=3*this.count;bn&&(n=1);k=Math.floor(k+i);k>this.size-1&&(k=this.size-1);var p=Math.floor(l-i);1>p&&(p=1);l=Math.floor(l+i);l>this.size-1&&(l=this.size-1);var o=Math.floor(j-i);1>o&&(o=1);i=Math.floor(j+i);i>this.size-1&&(i=this.size- -1);for(var m,r,t,z,y,J,K,j=n;jl&&(o=l);for(e=0;ej&&(m=j);for(f=0;fj&&(m=j);for(h=0;h=b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)?(l=!1,j=a(THREE.ShaderFlares.lensFlare)):(l=!0,j=a(THREE.ShaderFlares.lensFlareVertexTexture));n={};p={};n.vertex=b.getAttribLocation(j,"position");n.uv=b.getAttribLocation(j,"uv");p.renderType=b.getUniformLocation(j,"renderType");p.map=b.getUniformLocation(j,"map");p.occlusionMap=b.getUniformLocation(j,"occlusionMap");p.opacity=b.getUniformLocation(j,"opacity");p.color=b.getUniformLocation(j, -"color");p.scale=b.getUniformLocation(j,"scale");p.rotation=b.getUniformLocation(j,"rotation");p.screenPosition=b.getUniformLocation(j,"screenPosition");o=!1};this.render=function(a,d,e,z){var a=a.__webglFlares,y=a.length;if(y){var J=new THREE.Vector3,K=z/e,u=0.5*e,B=0.5*z,H=16/z,A=new THREE.Vector2(H*K,H),M=new THREE.Vector3(1,1,0),N=new THREE.Vector2(1,1),I=p,H=n;b.useProgram(j);o||(b.enableVertexAttribArray(n.vertex),b.enableVertexAttribArray(n.uv),o=!0);b.uniform1i(I.occlusionMap,0);b.uniform1i(I.map, -1);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(H.vertex,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(H.uv,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,h);b.disable(b.CULL_FACE);b.depthMask(!1);var S,ua,ka,$,Z;for(S=0;Sn-1?e-1:n-1,o=(n+1)%e,m=0>j-1?d-1:j-1,r=(j+1)%d,t=[],z=[0,0,i[4*(n*d+j)]/255*b];t.push([-1,0,i[4*(n*d+m)]/255*b]);t.push([-1,-1,i[4*(p*d+m)]/255*b]);t.push([0,-1,i[4*(p*d+j)]/255*b]);t.push([1, --1,i[4*(p*d+r)]/255*b]);t.push([1,0,i[4*(n*d+r)]/255*b]);t.push([1,1,i[4*(o*d+r)]/255*b]);t.push([0,1,i[4*(o*d+j)]/255*b]);t.push([-1,1,i[4*(o*d+m)]/255*b]);p=[];m=t.length;for(o=0;o=d||0 0 ) {\n\t\tfloat fogFactor = 0.0;\n\t\tif ( fogType == 1 ) {\n\t\t\tfogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t\t} else {\n\t\t\tconst float LOG2 = 1.442695;\n\t\t\tfogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );\n\t\t\tfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n\t\t}\n\t\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n\t}\n}"].join("\n")); +b.compileShader(y);b.compileShader(O);b.attachShader(w,y);b.attachShader(w,O);b.linkProgram(w);N=w;I=b.getAttribLocation(N,"position");Ea=b.getAttribLocation(N,"uv");f=b.getUniformLocation(N,"uvOffset");g=b.getUniformLocation(N,"uvScale");h=b.getUniformLocation(N,"rotation");k=b.getUniformLocation(N,"scale");m=b.getUniformLocation(N,"color");q=b.getUniformLocation(N,"map");v=b.getUniformLocation(N,"opacity");p=b.getUniformLocation(N,"modelViewMatrix");t=b.getUniformLocation(N,"projectionMatrix"); +l=b.getUniformLocation(N,"fogType");r=b.getUniformLocation(N,"fogDensity");z=b.getUniformLocation(N,"fogNear");x=b.getUniformLocation(N,"fogFar");u=b.getUniformLocation(N,"fogColor");b.getUniformLocation(N,"fogDepth");D=b.getUniformLocation(N,"alphaTest");w=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");w.width=8;w.height=8;y=w.getContext("2d");y.fillStyle="white";y.fillRect(0,0,8,8);pc=new qc(w)}c.useProgram(N);c.initAttributes();c.enableAttribute(I);c.enableAttribute(Ea);c.disableUnusedAttributes(); +c.disable(b.CULL_FACE);c.enable(b.BLEND);b.bindBuffer(b.ARRAY_BUFFER,A);b.vertexAttribPointer(I,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(Ea,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,Q);b.uniformMatrix4fv(t,!1,V.projectionMatrix.elements);c.activeTexture(b.TEXTURE0);b.uniform1i(q,0);y=w=0;(O=B.fog)?(b.uniform3f(u,O.color.r,O.color.g,O.color.b),O.isFog?(b.uniform1f(z,O.near),b.uniform1f(x,O.far),b.uniform1i(l,1),y=w=1):O.isFogExp2&&(b.uniform1f(r,O.density),b.uniform1i(l,2),y=w=2)):(b.uniform1i(l, +0),y=w=0);for(var O=0,E=n.length;Ob&&(b=a[c]);return b}function w(){Object.defineProperty(this,"id",{value:Ud++});this.uuid=J.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups= +[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity}}function Fb(a,b,c,d,e,f){K.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};this.fromBufferGeometry(new gb(a,b,c,d,e,f));this.mergeVertices()}function gb(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,l,ma,A,Q){var N=f/ma,w=g/A,y=f/2,H=g/2,B=l/2;g=ma+1;var E=A+1,F=f=0,V,C,Z=new n;for(C=0;Cm;m++){if(v=d[m])if(h=v[0],k=v[1]){q&&e.addAttribute("morphTarget"+m,q[h]);f&&e.addAttribute("morphNormal"+m,f[h]);c[m]=k;continue}c[m]=0}g.getUniforms().setValue(a,"morphTargetInfluences", +c)}}}function Wf(a,b,c){var d,e,f;this.setMode=function(a){d=a};this.setIndex=function(a){e=a.type;f=a.bytesPerElement};this.render=function(b,h){a.drawElements(d,h,e,b*f);c.calls++;c.vertices+=h;d===a.TRIANGLES?c.faces+=h/3:d===a.POINTS&&(c.points+=h)};this.renderInstances=function(g,h,k){var m=b.get("ANGLE_instanced_arrays");null===m?console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."):(m.drawElementsInstancedANGLE(d, +k,e,h*f,g.maxInstancedCount),c.calls++,c.vertices+=k*g.maxInstancedCount,d===a.TRIANGLES?c.faces+=g.maxInstancedCount*k/3:d===a.POINTS&&(c.points+=g.maxInstancedCount*k))}}function Xf(a,b,c){var d;this.setMode=function(a){d=a};this.render=function(b,f){a.drawArrays(d,b,f);c.calls++;c.vertices+=f;d===a.TRIANGLES?c.faces+=f/3:d===a.POINTS&&(c.points+=f)};this.renderInstances=function(e,f,g){var h=b.get("ANGLE_instanced_arrays");if(null===h)console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."); +else{var k=e.attributes.position;k.isInterleavedBufferAttribute?(g=k.data.count,h.drawArraysInstancedANGLE(d,0,g,e.maxInstancedCount)):h.drawArraysInstancedANGLE(d,f,g,e.maxInstancedCount);c.calls++;c.vertices+=g*e.maxInstancedCount;d===a.TRIANGLES?c.faces+=e.maxInstancedCount*g/3:d===a.POINTS&&(c.points+=e.maxInstancedCount*g)}}}function Yf(a,b,c){function d(a){a=a.target;var h=e[a.id];null!==h.index&&b.remove(h.index);for(var k in h.attributes)b.remove(h.attributes[k]);a.removeEventListener("dispose", +d);delete e[a.id];if(k=f[a.id])b.remove(k),delete f[a.id];if(k=f[h.id])b.remove(k),delete f[h.id];c.geometries--}var e={},f={};return{get:function(a,b){var f=e[b.id];if(f)return f;b.addEventListener("dispose",d);b.isBufferGeometry?f=b:b.isGeometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new w).setFromObject(a)),f=b._bufferGeometry);e[b.id]=f;c.geometries++;return f},update:function(c){var d=c.index,e=c.attributes;null!==d&&b.update(d,a.ELEMENT_ARRAY_BUFFER);for(var f in e)b.update(e[f], +a.ARRAY_BUFFER);c=c.morphAttributes;for(f in c)for(var d=c[f],e=0,q=d.length;e/gm,function(a,c){var d=S[c];if(void 0===d)throw Error("Can not resolve #include <"+c+">");return Xd(d)})}function Pe(a){return a.replace(/for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g, +function(a,c,d,e){a="";for(c=parseInt(c);cb||a.height>b){var c=b/Math.max(a.width,a.height),d=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");d.width=Math.floor(a.width*c);d.height=Math.floor(a.height*c);d.getContext("2d").drawImage(a, +0,0,a.width,a.height,0,0,d.width,d.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+d.width+"x"+d.height,a);return d}return a}function k(a){return J.isPowerOfTwo(a.width)&&J.isPowerOfTwo(a.height)}function m(a,b){return a.generateMipmaps&&b&&1003!==a.minFilter&&1006!==a.minFilter}function q(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function v(b){b=b.target;b.removeEventListener("dispose",v);a:{var c=d.get(b);if(b.image&&c.__image__webglTextureCube)a.deleteTexture(c.__image__webglTextureCube); +else{if(void 0===c.__webglInit)break a;a.deleteTexture(c.__webglTexture)}d.remove(b)}g.textures--}function p(b){b=b.target;b.removeEventListener("dispose",p);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b.isWebGLRenderTargetCube)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer), +c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer);d.remove(b.texture);d.remove(b)}g.textures--}function t(b,q){var t=d.get(b);if(0z;z++)n[z]=t||r?r?b.image[z].image:b.image[z]:h(b.image[z],e.maxCubemapSize); +var x=k(n[0]),w=f.convert(b.format),y=f.convert(b.type);l(a.TEXTURE_CUBE_MAP,b,x);for(z=0;6>z;z++)if(t)for(var H,B=n[z].mipmaps,E=0,C=B.length;Ev;v++)e.__webglFramebuffer[v]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);l(a.TEXTURE_CUBE_MAP,b.texture,q);for(v=0;6>v;v++)r(e.__webglFramebuffer[v],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+v); +m(b.texture,q)&&a.generateMipmap(a.TEXTURE_CUBE_MAP);c.bindTexture(a.TEXTURE_CUBE_MAP,null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),l(a.TEXTURE_2D,b.texture,q),r(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),m(b.texture,q)&&a.generateMipmap(a.TEXTURE_2D),c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=!0===b.isWebGLRenderTargetCube;if(b.depthTexture){if(f)throw Error("target.depthTexture not supported in Cube render targets");if(b&&b.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported"); +a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate=!0);t(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER, +a.DEPTH_ATTACHMENT,a.TEXTURE_2D,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.TEXTURE_2D,e,0);else throw Error("Unknown depthTexture format");}else if(f)for(e.__webglDepthbuffer=[],f=0;6>f;f++)a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer[f]),e.__webglDepthbuffer[f]=a.createRenderbuffer(),n(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),n(e.__webglDepthbuffer, +b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture,f=k(b);m(e,f)&&(b=b.isWebGLRenderTargetCube?a.TEXTURE_CUBE_MAP:a.TEXTURE_2D,e=d.get(e).__webglTexture,c.bindTexture(b,e),a.generateMipmap(b),c.bindTexture(b,null))}}function kg(){var a={};return{get:function(b){b=b.uuid;var c=a[b];void 0===c&&(c={},a[b]=c);return c},remove:function(b){delete a[b.uuid]},clear:function(){a={}}}}function lg(a,b,c){function d(b,c,d){var e=new Uint8Array(4),f=a.createTexture(); +a.bindTexture(b,f);a.texParameteri(b,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(b,a.TEXTURE_MAG_FILTER,a.NEAREST);for(b=0;b=ba.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+a+" texture units while this GPU supports only "+ +ba.maxTextures);U+=1;return a};this.setTexture2D=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTarget&&(a||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);ga.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),a=!0);ga.setTexture2D(b,c)}}();this.setTextureCube=function(){var a= +!1;return function(b,c){b&&b.isWebGLRenderTargetCube&&(a||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&&6===b.image.length?ga.setTextureCube(b,c):ga.setTextureCubeDynamic(b,c)}}();this.getRenderTarget=function(){return sa};this.setRenderTarget=function(a){(sa=a)&&void 0===Y.get(a).__webglFramebuffer&&ga.setupRenderTarget(a);var b=null,c=!1;a?(b=Y.get(a).__webglFramebuffer, +a.isWebGLRenderTargetCube&&(b=b[a.activeCubeFace],c=!0),ua.copy(a.viewport),T.copy(a.scissor),W=a.scissorTest):(ua.copy(P).multiplyScalar(X),T.copy(aa).multiplyScalar(X),W=ea);K!==b&&(G.bindFramebuffer(G.FRAMEBUFFER,b),K=b);ca.viewport(ua);ca.scissor(T);ca.setScissorTest(W);c&&(c=Y.get(a.texture),G.framebufferTexture2D(G.FRAMEBUFFER,G.COLOR_ATTACHMENT0,G.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,c.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=function(a,b,c,d,e,f){if(a&&a.isWebGLRenderTarget){var g= +Y.get(a).__webglFramebuffer;if(g){var h=!1;g!==K&&(G.bindFramebuffer(G.FRAMEBUFFER,g),h=!0);try{var k=a.texture,m=k.format,q=k.type;1023!==m&&oa.convert(m)!==G.getParameter(G.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===q||oa.convert(q)===G.getParameter(G.IMPLEMENTATION_COLOR_READ_TYPE)||1015===q&&(ia.get("OES_texture_float")||ia.get("WEBGL_color_buffer_float"))||1016===q&&ia.get("EXT_color_buffer_half_float")? +G.checkFramebufferStatus(G.FRAMEBUFFER)===G.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&G.readPixels(b,c,d,e,oa.convert(m),oa.convert(q),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{h&&G.bindFramebuffer(G.FRAMEBUFFER,K)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")}} +function Ib(a,b){this.name="";this.color=new F(a);this.density=void 0!==b?b:2.5E-4}function Jb(a,b,c){this.name="";this.color=new F(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function qd(){y.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function $d(a,b,c,d,e){y.call(this);this.lensFlares=[];this.positionScreen=new n;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)}function ab(a){W.call(this);this.type="SpriteMaterial"; +this.color=new F(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}function zc(a){y.call(this);this.type="Sprite";this.material=void 0!==a?a:new ab}function Ac(){y.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function Bc(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else{console.warn("THREE.Skeleton boneInverses is the wrong length."); +this.boneInverses=[];for(var c=0,d=this.bones.length;c=a.HAVE_CURRENT_DATA&&(q.needsUpdate=!0);requestAnimationFrame(m)}ea.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1;var q=this;requestAnimationFrame(m)}function Lb(a, +b,c,d,e,f,g,h,k,m,q,v){ea.call(this,null,f,g,h,k,m,d,e,q,v);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function Dc(a,b,c,d,e,f,g,h,k,m){m=void 0!==m?m:1026;if(1026!==m&&1027!==m)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===c&&1026===m&&(c=1012);void 0===c&&1027===m&&(c=1020);ea.call(this,null,d,e,f,g,h,m,c,k);this.image={width:a,height:b};this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!==h?h:1003; +this.generateMipmaps=this.flipY=!1}function Mb(a){w.call(this);this.type="WireframeGeometry";var b=[],c,d,e,f,g=[0,0],h={},k,m,q=["a","b","c"];if(a&&a.isGeometry){var v=a.faces;c=0;for(e=v.length;cd;d++)k=p[q[d]],m=p[q[(d+1)%3]],g[0]=Math.min(k,m),g[1]=Math.max(k,m),k=g[0]+","+g[1],void 0===h[k]&&(h[k]={index1:g[0],index2:g[1]})}for(k in h)c=h[k],q=a.vertices[c.index1],b.push(q.x,q.y,q.z),q=a.vertices[c.index2],b.push(q.x,q.y,q.z)}else if(a&&a.isBufferGeometry){var t, +q=new n;if(null!==a.index){v=a.attributes.position;p=a.index;t=a.groups;0===t.length&&(t=[{start:0,count:p.count,materialIndex:0}]);a=0;for(f=t.length;ad;d++)k=p.getX(c+d),m=p.getX(c+(d+1)%3),g[0]=Math.min(k,m),g[1]=Math.max(k,m),k=g[0]+","+g[1],void 0===h[k]&&(h[k]={index1:g[0],index2:g[1]});for(k in h)c=h[k],q.fromBufferAttribute(v,c.index1),b.push(q.x,q.y,q.z),q.fromBufferAttribute(v,c.index2),b.push(q.x,q.y,q.z)}else for(v=a.attributes.position, +c=0,e=v.count/3;cd;d++)h=3*c+d,q.fromBufferAttribute(v,h),b.push(q.x,q.y,q.z),h=3*c+(d+1)%3,q.fromBufferAttribute(v,h),b.push(q.x,q.y,q.z)}this.addAttribute("position",new B(b,3))}function Ec(a,b,c){K.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Nb(a,b,c));this.mergeVertices()}function Nb(a,b,c){w.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h= +new n,k=new n,m=new n,q=new n,v=new n,p,t,l=b+1;for(p=0;p<=c;p++){var r=p/c;for(t=0;t<=b;t++){var z=t/b,k=a(z,r,k);e.push(k.x,k.y,k.z);0<=z-1E-5?(m=a(z-1E-5,r,m),q.subVectors(k,m)):(m=a(z+1E-5,r,m),q.subVectors(m,k));0<=r-1E-5?(m=a(z,r-1E-5,m),v.subVectors(k,m)):(m=a(z,r+1E-5,m),v.subVectors(m,k));h.crossVectors(q,v).normalize();f.push(h.x,h.y,h.z);g.push(z,r)}}for(p=0;pd&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}w.call(this);this.type="PolyhedronBufferGeometry"; +this.parameters={vertices:a,indices:b,radius:c,detail:d};c=c||1;d=d||0;var h=[],k=[];(function(a){for(var c=new n,d=new n,g=new n,h=0;he&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute("position",new B(h,3));this.addAttribute("normal",new B(h.slice(),3));this.addAttribute("uv",new B(k,2));0===d?this.computeVertexNormals(): +this.normalizeNormals()}function Gc(a,b){K.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ob(a,b));this.mergeVertices()}function Ob(a,b){qa.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b);this.type="TetrahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Hc(a,b){K.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new kb(a,b));this.mergeVertices()} +function kb(a,b){qa.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b);this.type="OctahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Ic(a,b){K.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Pb(a,b));this.mergeVertices()}function Pb(a,b){var c=(1+Math.sqrt(5))/2;qa.call(this,[-1,c,0,1,c,0,-1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11, +5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b);this.type="IcosahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Jc(a,b){K.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Qb(a,b));this.mergeVertices()}function Qb(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;qa.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0, +d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Kc(a,b,c,d,e,f){K.call(this);this.type="TubeGeometry";this.parameters={path:a, +tubularSegments:b,radius:c,radialSegments:d,closed:e};void 0!==f&&console.warn("THREE.TubeGeometry: taper has been removed.");a=new Rb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Rb(a,b,c,d,e){function f(e){var f=a.getPointAt(e/b),m=g.normals[e];e=g.binormals[e];for(v=0;v<=d;v++){var q=v/d*Math.PI*2,r=Math.sin(q),q=-Math.cos(q);k.x=q*m.x+r*e.x;k.y=q*m.y+r*e.y;k.z=q*m.z+r*e.z;k.normalize();l.push(k.x, +k.y,k.z);h.x=f.x+c*k.x;h.y=f.y+c*k.y;h.z=f.z+c*k.z;p.push(h.x,h.y,h.z)}}w.call(this);this.type="TubeBufferGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new n,k=new n,m=new E,q,v,p=[],l=[],M=[],r=[];for(q=0;qn;n++)g=t[k[n]],h=t[k[(n+1)%3]],e[0]=Math.min(g,h),e[1]=Math.max(g,h),g=e[0]+","+e[1],void 0===f[g]?f[g]={index1:e[0],index2:e[1],face1:v,face2:void 0}:f[g].face2=v;for(g in f)if(e=f[g],void 0===e.face2||m[e.face1].normal.dot(m[e.face2].normal)<=d)k=q[e.index1],c.push(k.x,k.y,k.z),k=q[e.index2],c.push(k.x,k.y,k.z);this.addAttribute("position", +new B(c,3))}function mb(a,b,c,d,e,f,g,h){K.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new Ua(a,b,c,d,e,f,g,h));this.mergeVertices()}function Ua(a,b,c,d,e,f,g,h){function k(c){var e,f,k,r=new E,A=new n,w=0,y=!0===c?a:b,B=!0===c?1:-1;f=M;for(e=1;e<=d;e++)v.push(0,z*B,0),l.push(0,B,0),t.push(.5,.5),M++;k=M;for(e=0;e<=d;e++){var C=e/d*h+g,H=Math.cos(C),C= +Math.sin(C);A.x=y*C;A.y=z*B;A.z=y*H;v.push(A.x,A.y,A.z);l.push(0,B,0);r.x=.5*H+.5;r.y=.5*C*B+.5;t.push(r.x,r.y);M++}for(e=0;ethis.duration&&this.resetDuration();this.optimize()}function Kd(a){this.manager=void 0!==a?a:wa;this.textures={}}function de(a){this.manager=void 0!==a?a:wa}function ec(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}function ee(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!== +a?a:wa;this.withCredentials=!1}function Se(a){this.manager=void 0!==a?a:wa;this.texturePath=""}function Te(a,b,c,d,e){b=.5*(d-b);e=.5*(e-c);var f=a*a;return(2*c-2*d+b+e)*a*f+(-3*c+3*d-2*b-e)*f+b*a+c}function vb(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function wb(a,b,c,d,e){var f=1-a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}function pa(){this.arcLengthDivisions=200}function Pa(a,b){this.arcLengthDivisions=200;this.v1=a;this.v2=b}function Xc(){this.arcLengthDivisions=200;this.curves= +[];this.autoClose=!1}function Va(a,b,c,d,e,f,g,h){this.arcLengthDivisions=200;this.aX=a;this.aY=b;this.xRadius=c;this.yRadius=d;this.aStartAngle=e;this.aEndAngle=f;this.aClockwise=g;this.aRotation=h||0}function xb(a){this.arcLengthDivisions=200;this.points=void 0===a?[]:a}function fc(a,b,c,d){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c;this.v3=d}function gc(a,b,c){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c}function Yc(a){Xc.call(this);this.currentPoint=new E;a&&this.fromPoints(a)} +function yb(){Yc.apply(this,arguments);this.holes=[]}function fe(){this.subPaths=[];this.currentPath=null}function ge(a){this.data=a}function Ue(a){this.manager=void 0!==a?a:wa}function he(a){this.manager=void 0!==a?a:wa}function Ve(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new ba;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new ba;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1}function Zc(a,b,c){y.call(this);this.type="CubeCamera"; +var d=new ba(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new n(1,0,0));this.add(d);var e=new ba(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new n(-1,0,0));this.add(e);var f=new ba(90,1,a,b);f.up.set(0,0,1);f.lookAt(new n(0,1,0));this.add(f);var g=new ba(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new n(0,-1,0));this.add(g);var h=new ba(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new n(0,0,1));this.add(h);var k=new ba(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new n(0,0,-1));this.add(k);this.renderTarget=new Cb(c,c,{format:1022,magFilter:1006, +minFilter:1006});this.renderTarget.texture.name="CubeCamera";this.update=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,l=c.texture.generateMipmaps;c.texture.generateMipmaps=!1;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.texture.generateMipmaps=l;c.activeCubeFace=5;a.render(b,k,c);a.setRenderTarget(null)};this.clear=function(a,b,c, +d){for(var e=this.renderTarget,f=0;6>f;f++)e.activeCubeFace=f,a.setRenderTarget(e),a.clear(b,c,d);a.setRenderTarget(null)}}function ie(){y.call(this);this.type="AudioListener";this.context=je.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function hc(a){y.call(this);this.type="Audio";this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.loop=!1;this.startTime= +0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function ke(a){hc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function le(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function me(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case "quaternion":b=this._slerp; +break;case "string":case "bool":a=Array;b=this._select;break;default:b=this._lerp}this.buffer=new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function We(a,b,c){c=c||ga.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function ga(a,b,c){this.path=b;this.parsedPath=c||ga.parseTrackName(b);this.node=ga.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function Xe(){this.uuid=J.generateUUID();this._objects=Array.prototype.slice.call(arguments); +this.nCachedObjects_=0;var a={};this._indicesByUUID=a;for(var b=0,c=arguments.length;b!==c;++b)a[arguments[b].uuid]=b;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var d=this;this.stats={objects:{get total(){return d._objects.length},get inUse(){return this.total-d.nCachedObjects_}},get bindingsPerObject(){return d._bindings.length}}}function Ye(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400, +endingEnd:2400},e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd= +this.zeroSlopeAtStart=!0}function Ze(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Ld(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function ne(){w.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function oe(a,b,c,d){this.uuid=J.generateUUID();this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function ic(a,b){this.uuid=J.generateUUID();this.array= +a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function pe(a,b,c){ic.call(this,a,b);this.meshPerAttribute=c||1}function qe(a,b,c){R.call(this,a,b);this.meshPerAttribute=c||1}function $e(a,b,c,d){this.ray=new ib(a,b);this.near=c||0;this.far=d||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points."); +return this.Points}}})}function af(a,b){return a.distance-b.distance}function re(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=a.length;de;e++,f++){var g=e/32*Math.PI*2,h=f/32*Math.PI*2;d.push(Math.cos(g),Math.sin(g),1,Math.cos(h),Math.sin(h),1)}c.addAttribute("position",new B(d,3));d=new X({fog:!1});this.cone=new aa(c,d);this.add(this.cone);this.update()}function ef(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;ca.length&&console.warn("THREE.CatmullRomCurve3: Points array needs at least two entries.");this.points=a||[];this.closed=!1}function gd(a,b,c,d){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2= +c;this.v3=d}function hd(a,b,c){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c}function id(a,b){this.arcLengthDivisions=200;this.v1=a;this.v2=b}function Pd(a,b,c,d,e,f){Va.call(this,a,b,c,c,d,e,f)}function ff(a){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");Ka.call(this,a);this.type="catmullrom";this.closed=!0}function gf(a){console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");Ka.call(this,a);this.type= +"catmullrom"}function ue(a){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.");Ka.call(this,a);this.type="catmullrom"}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52));void 0===Number.isInteger&&(Number.isInteger=function(a){return"number"===typeof a&&isFinite(a)&&Math.floor(a)===a});void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0e;e++)8===e||13===e||18===e||23===e?b[e]="-":14===e?b[e]="4":(2>=c&&(c=33554432+16777216*Math.random()|0),d=c&15,c>>=4,b[e]=a[19===e?d&3|8:d]);return b.join("")}}(),clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},lerp:function(a, +b,c){return(1-c)*a+c*b},smoothstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},degToRad:function(a){return a*J.DEG2RAD},radToDeg:function(a){return a*J.RAD2DEG},isPowerOfTwo:function(a){return 0=== +(a&a-1)&&0!==a},ceilPowerOfTwo:function(a){return Math.pow(2,Math.ceil(Math.log(a)/Math.LN2))},floorPowerOfTwo:function(a){return Math.pow(2,Math.floor(Math.log(a)/Math.LN2))}};Object.defineProperties(E.prototype,{width:{get:function(){return this.x},set:function(a){this.x=a}},height:{get:function(){return this.y},set:function(a){this.y=a}}});Object.assign(E.prototype,{isVector2:!0,set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y=this.x=a;return this},setX:function(a){this.x= +a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."), +this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this}, +subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},applyMatrix3:function(a){var b=this.x,c=this.y;a=a.elements;this.x=a[0]*b+a[3]*c+a[6];this.y=a[1]*b+a[4]*c+a[7];return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this}, +max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a=new E,b=new E;return function(c,d){a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y); +return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x* +this.x+this.y*this.y)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){var a=Math.atan2(this.y,this.x);0>a&&(a+=2*Math.PI);return a},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.normalize().multiplyScalar(a)}, +lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."); +this.x=a.getX(b);this.y=a.getY(b);return this},rotateAround:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=this.x-a.x,f=this.y-a.y;this.x=e*c-f*d+a.x;this.y=e*d+f*c+a.y;return this}});Object.assign(L.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,m,q,l,p,t,n,r){var z=this.elements;z[0]=a;z[4]=b;z[8]=c;z[12]=d;z[1]=e;z[5]=f;z[9]=g;z[13]=h;z[2]=k;z[6]=m;z[10]=q;z[14]=l;z[3]=p;z[7]=t;z[11]=n;z[15]=r;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new L).fromArray(this.elements)}, +copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x, +b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(){var a=new n;return function(b){var c=this.elements,d=b.elements,e=1/a.setFromMatrixColumn(b,0).length(),f=1/a.setFromMatrixColumn(b,1).length();b=1/a.setFromMatrixColumn(b,2).length();c[0]=d[0]*e;c[1]=d[1]*e;c[2]=d[2]*e;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*f;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;return this}}(),makeRotationFromEuler:function(a){a&&a.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order."); +var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c),c=Math.sin(c),g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e);if("XYZ"===a.order){a=f*h;var k=f*e,m=c*h,q=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=k+m*d;b[5]=a-q*d;b[9]=-c*g;b[2]=q-a*d;b[6]=m+k*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,k=g*e,m=d*h,q=d*e,b[0]=a+q*c,b[4]=m*c-k,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=k*c-m,b[6]=q+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,k=g*e,m=d*h,q=d*e,b[0]=a-q*c,b[4]=-f*e,b[8]=m+k*c,b[1]=k+m*c,b[5]=f*h,b[9]=q-a*c,b[2]= +-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,k=f*e,m=c*h,q=c*e,b[0]=g*h,b[4]=m*d-k,b[8]=a*d+q,b[1]=g*e,b[5]=q*d+a,b[9]=k*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,k=f*d,m=c*g,q=c*d,b[0]=g*h,b[4]=q-a*e,b[8]=m*e+k,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=k*e+m,b[10]=a-q*e):"XZY"===a.order&&(a=f*g,k=f*d,m=c*g,q=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+q,b[5]=f*h,b[9]=k*e-m,b[2]=m*e-k,b[6]=c*h,b[10]=q*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){var b= +this.elements,c=a._x,d=a._y,e=a._z,f=a._w,g=c+c,h=d+d,k=e+e;a=c*g;var m=c*h,c=c*k,q=d*h,d=d*k,e=e*k,g=f*g,h=f*h,f=f*k;b[0]=1-(q+e);b[4]=m-f;b[8]=c+h;b[1]=m+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+q);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},lookAt:function(){var a=new n,b=new n,c=new n;return function(d,e,f){var g=this.elements;c.subVectors(d,e);0===c.lengthSq()&&(c.z=1);c.normalize();a.crossVectors(f,c);0===a.lengthSq()&&(1===Math.abs(f.z)?c.x+=1E-4:c.z+=1E-4, +c.normalize(),a.crossVectors(f,c));a.normalize();b.crossVectors(c,a);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements, +e=this.elements,f=c[0],g=c[4],h=c[8],k=c[12],m=c[1],q=c[5],l=c[9],p=c[13],t=c[2],n=c[6],r=c[10],z=c[14],x=c[3],u=c[7],D=c[11],c=c[15],I=d[0],w=d[4],y=d[8],A=d[12],Q=d[1],N=d[5],B=d[9],E=d[13],H=d[2],C=d[6],F=d[10],K=d[14],V=d[3],L=d[7],Z=d[11],d=d[15];e[0]=f*I+g*Q+h*H+k*V;e[4]=f*w+g*N+h*C+k*L;e[8]=f*y+g*B+h*F+k*Z;e[12]=f*A+g*E+h*K+k*d;e[1]=m*I+q*Q+l*H+p*V;e[5]=m*w+q*N+l*C+p*L;e[9]=m*y+q*B+l*F+p*Z;e[13]=m*A+q*E+l*K+p*d;e[2]=t*I+n*Q+r*H+z*V;e[6]=t*w+n*N+r*C+z*L;e[10]=t*y+n*B+r*F+z*Z;e[14]=t*A+n*E+r* +K+z*d;e[3]=x*I+u*Q+D*H+c*V;e[7]=x*w+u*N+D*C+c*L;e[11]=x*y+u*B+D*F+c*Z;e[15]=x*A+u*E+D*K+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},applyToBufferAttribute:function(){var a=new n;return function(b){for(var c=0,d=b.count;cthis.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.copy(this);c=1/g;var f=1/h,m=1/k;b.elements[0]*=c;b.elements[1]*=c;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*=f;b.elements[6]*=f;b.elements[8]*=m;b.elements[9]*=m;b.elements[10]*=m;d.setFromRotationMatrix(b);e.x=g;e.y=h;e.z=k;return this}}(),makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs."); +var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(c-d);g[9]=(c+d)/(c-d);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),k=1/(c-d),m=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*k;g[9]=0;g[13]=-((c+d)*k);g[2]=0;g[6]=0;g[10]=-2*m;g[14]=-((f+e)*m);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements; +a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}});Object.assign(ha,{slerp:function(a,b,c,d){return c.copy(a).slerp(b, +d)},slerpFlat:function(a,b,c,d,e,f,g){var h=c[d+0],k=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var q=e[f+1],l=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==q||m!==l){f=1-g;var p=h*d+k*q+m*l+c*e,t=0<=p?1:-1,n=1-p*p;n>Number.EPSILON&&(n=Math.sqrt(n),p=Math.atan2(n,p*t),f=Math.sin(f*p)/n,g=Math.sin(g*p)/n);t*=g;h=h*f+d*t;k=k*f+q*t;m=m*f+l*t;c=c*f+e*t;f===1-g&&(g=1/Math.sqrt(h*h+k*k+m*m+c*c),h*=g,k*=g,m*=g,c*=g)}a[b]=h;a[b+1]=k;a[b+2]=m;a[b+3]=c}});Object.defineProperties(ha.prototype,{x:{get:function(){return this._x}, +set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=a;this.onChangeCallback()}}});Object.assign(ha.prototype,{set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z, +this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback();return this},setFromEuler:function(a,b){if(!a||!a.isEuler)throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var c=a._x,d=a._y,e=a._z,f=a.order,g=Math.cos,h=Math.sin,k=g(c/2),m=g(d/2),g=g(e/2),c=h(c/2),d=h(d/2),e=h(e/2);"XYZ"===f?(this._x=c*m*g+k*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g-c*d*e):"YXZ"===f?(this._x=c*m*g+k*d* +e,this._y=k*d*g-c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g+c*d*e):"ZXY"===f?(this._x=c*m*g-k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g-c*d*e):"ZYX"===f?(this._x=c*m*g-k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g+c*d*e):"YZX"===f?(this._x=c*m*g+k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g-c*d*e):"XZY"===f&&(this._x=c*m*g-k*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g+c*d*e);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a, +b){var c=b/2,d=Math.sin(c);this._x=a.x*d;this._y=a.y*d;this._z=a.z*d;this._w=Math.cos(c);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],k=b[6],b=b[10],m=c+f+b;0f&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(k-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y= +.25*c,this._z=(g+k)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+k)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a=new n,b;return function(c,d){void 0===a&&(a=new n);b=c.dot(d)+1;1E-6>b?(b=0,Math.abs(c.x)>Math.abs(c.z)?a.set(-c.y,c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=a.y;this._z=a.z;this._w=b;return this.normalize()}}(),inverse:function(){return this.conjugate().normalize()},conjugate:function(){this._x*= +-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this.onChangeCallback();return this}, +multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z,f=a._w,g=b._x,h=b._y,k=b._z,m=b._w;this._x=c*m+f*g+d*k-e*h;this._y=d*m+f*h+e*g-c*k;this._z=e*m+f*k+c*h-d*g;this._w=f*m-c*g-d*h-e*k;this.onChangeCallback(); +return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;var h=Math.sqrt(1-g*g);if(.001>Math.abs(h))return this._w=.5*(f+this._w),this._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;var k=Math.atan2(h,g),g=Math.sin((1-b)*k)/h,h=Math.sin(b* +k)/h;this._w=f*g+this._w*h;this._x=c*g+this._x*h;this._y=d*g+this._y*h;this._z=e*g+this._z*h;this.onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback= +a;return this},onChangeCallback:function(){}});Object.assign(n.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x; +case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this}, +addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z= +a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a=new ha;return function(b){b&&b.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."); +return this.applyQuaternion(a.setFromEuler(b))}}(),applyAxisAngle:function(){var a=new ha;return function(b,c){return this.applyQuaternion(a.setFromAxisAngle(b,c))}}(),applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+ +a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,k=a*c+g*b-e*d,m=a*d+e*c-f*b,b=-e*b-f*c-g*d;this.x=h*a+b*-e+k*-g-m*-f;this.y=k*a+b*-f+m*-e-h*-g;this.z=m*a+b*-g+h*-f-k*-e;return this},project:function(){var a=new L;return function(b){a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyMatrix4(a)}}(),unproject:function(){var a=new L;return function(b){a.multiplyMatrices(b.matrixWorld, +a.getInverse(b.projectionMatrix));return this.applyMatrix4(a)}}(),transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x= +Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},clampScalar:function(){var a=new n,b=new n;return function(c,d){a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x= +Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x= +-this.x;this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x- +this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},cross:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,b);var c=this.x,d=this.y,e=this.z;this.x=d*a.z-e*a.y;this.y=e*a.x-c*a.z;this.z=c*a.y-d*a.x;return this},crossVectors:function(a,b){var c=a.x,d=a.y,e=a.z,f=b.x,g=b.y,h=b.z;this.x=d*h-e* +g;this.y=e*f-c*h;this.z=c*g-d*f;return this},projectOnVector:function(a){var b=a.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a=new n;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=new n;return function(b){return this.sub(a.copy(b).multiplyScalar(2*this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*a.lengthSq());return Math.acos(J.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))}, +distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){var b=Math.sin(a.phi)*a.radius;this.x=b*Math.sin(a.theta);this.y=Math.cos(a.phi)*a.radius;this.z=b*Math.cos(a.theta);return this},setFromCylindrical:function(a){this.x=a.radius*Math.sin(a.theta);this.y=a.y;this.z=a.radius*Math.cos(a.theta);return this},setFromMatrixPosition:function(a){a= +a.elements;this.x=a[12];this.y=a[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,4*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a, +b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}});Object.assign(ra.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,k){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=k;return this},identity:function(){this.set(1,0,0,0,1,0,0,0, +1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},applyToBufferAttribute:function(){var a=new n;return function(b){for(var c=0,d=b.count;cc;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0=== +b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a}});var lf=0;ea.DEFAULT_IMAGE=void 0;ea.DEFAULT_MAPPING=300;Object.defineProperty(ea.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(ea.prototype,la.prototype,{constructor:ea,isTexture:!0,clone:function(){return(new this.constructor).copy(this)}, +copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.center.copy(a.center);this.rotation=a.rotation;this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrix.copy(a.matrix);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha= +a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){if(void 0!==a.textures[this.uuid])return a.textures[this.uuid];var b={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter, +magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(void 0!==this.image){var c=this.image;void 0===c.uuid&&(c.uuid=J.generateUUID());if(void 0===a.images[c.uuid]){var d=a.images,e=c.uuid,f=c.uuid,g;if(c instanceof HTMLCanvasElement)g=c;else{g=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");g.width=c.width;g.height=c.height;var h=g.getContext("2d");c instanceof ImageData?h.putImageData(c,0,0):h.drawImage(c,0,0,c.width,c.height)}g=2048a.x||1a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1 +a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y)}}});Object.assign(fa.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x= +b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!== +b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), +this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]* +c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/b);return this},setAxisAngleFromRotationMatrix:function(a){var b,c,d;a=a.elements;var e=a[0];d=a[4];var f=a[8],g=a[1],h=a[5],k=a[9];c=a[2];b=a[6];var m=a[10];if(.01>Math.abs(d-g)&&.01>Math.abs(f-c)&&.01>Math.abs(k- +b)){if(.1>Math.abs(d+g)&&.1>Math.abs(f+c)&&.1>Math.abs(k+b)&&.1>Math.abs(e+h+m-3))return this.set(1,0,0,0),this;a=Math.PI;e=(e+1)/2;h=(h+1)/2;m=(m+1)/2;d=(d+g)/4;f=(f+c)/4;k=(k+b)/4;e>h&&e>m?.01>e?(b=0,d=c=.707106781):(b=Math.sqrt(e),c=d/b,d=f/b):h>m?.01>h?(b=.707106781,c=0,d=.707106781):(c=Math.sqrt(h),b=d/c,d=k/c):.01>m?(c=b=.707106781,d=0):(d=Math.sqrt(m),b=f/d,c=k/d);this.set(b,c,d,a);return this}a=Math.sqrt((b-k)*(b-k)+(f-c)*(f-c)+(g-d)*(g-d));.001>Math.abs(a)&&(a=1);this.x=(b-k)/a;this.y=(f- +c)/a;this.z=(g-d)/a;this.w=Math.acos((e+h+m-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w, +Math.min(b.w,this.w));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new fa,b=new fa);a.set(c,c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z= +Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z; +this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)}, +lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]= +this.w;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}});Object.assign(Bb.prototype,la.prototype,{isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)}, +copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Cb.prototype=Object.create(Bb.prototype);Cb.prototype.constructor=Cb;Cb.prototype.isWebGLRenderTargetCube=!0;cb.prototype=Object.create(ea.prototype);cb.prototype.constructor=cb;cb.prototype.isDataTexture=!0;Xa.prototype= +Object.create(ea.prototype);Xa.prototype.constructor=Xa;Xa.prototype.isCubeTexture=!0;Object.defineProperty(Xa.prototype,"images",{get:function(){return this.image},set:function(a){this.image=a}});var Ee=new ea,Fe=new Xa,ze=[],Be=[],De=new Float32Array(16),Ce=new Float32Array(9);Je.prototype.setValue=function(a,b){for(var c=this.seq,d=0,e=c.length;d!==e;++d){var f=c[d];f.setValue(a,b[f.id])}};var Sd=/([\w\d_]+)(\])?(\[|\.)?/g;db.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a, +c,this.renderer)};db.prototype.setOptional=function(a,b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};db.upload=function(a,b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],h=c[g.id];!1!==h.needsUpdate&&g.setValue(a,h.value,d)}};db.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in b&&c.push(f)}return c};var rg={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255, +blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495, +darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885, +lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097, +mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736, +rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Object.assign(F.prototype, +{isColor:!0,r:1,g:1,b:1,set:function(a){a&&a.isColor?this.copy(a):"number"===typeof a?this.setHex(a):"string"===typeof a&&this.setStyle(a);return this},setScalar:function(a){this.b=this.g=this.r=a;return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(){function a(a,c,d){0>d&&(d+=1);1d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b, +c,d){b=J.euclideanModulo(b,1);c=J.clamp(c,0,1);d=J.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c=.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-1/3));return this}}(),setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r= +Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){var d=parseFloat(c[1])/ +360,e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^\#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0=h?k/(e+f): +k/(2-e-f);switch(e){case b:g=(c-d)/k+(c 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\n\tfloat b = 3.45068 + (4.18814 + y) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\n\treturn result;\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n", +bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n", +clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n", +clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n", +color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transpose( const in mat3 v ) {\n\tmat3 tmp;\n\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\n\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\n\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\n", +cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n", +defaultnormal_vertex:"vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n", +emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n",encodings_fragment:" gl_FragColor = linearToOutputTexel( gl_FragColor );\n",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n", +envmap_fragment:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n", +envmap_pars_fragment:"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n", +envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n",envmap_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n", +fog_vertex:"\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n varying float fogDepth;\n#endif\n",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n", +gradientmap_pars_fragment:"#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n", +lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n", +lights_pars:"uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltcMat;\tuniform sampler2D ltcMag;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n", +lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n", +lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n", +lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( 1, 0, t.y ),\n\t\t\tvec3( 0, t.z, 0 ),\n\t\t\tvec3( t.w, 0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n", +lights_template:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n", +logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif\n", +map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n",map_particle_fragment:"#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n", +metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n", +morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n", +normal_fragment:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n", +normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n", +packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n", +premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n",dithering_fragment:"#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n",dithering_pars_fragment:"#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n", +roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n", +shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n", +shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n", +shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n", +skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n", +skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n", +specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n",tonemapping_pars_fragment:"#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n", +uv_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\n", +uv_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif", +uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n", +cube_vert:"varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n", +depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n", +distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}\n", +equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n",equirect_vert:"varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n", +linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n", +meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphysical_frag:"#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n", +normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n", +normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n", +points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n}\n",shadow_vert:"#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"}, +jb={basic:{uniforms:Ba.merge([C.common,C.specularmap,C.envmap,C.aomap,C.lightmap,C.fog]),vertexShader:S.meshbasic_vert,fragmentShader:S.meshbasic_frag},lambert:{uniforms:Ba.merge([C.common,C.specularmap,C.envmap,C.aomap,C.lightmap,C.emissivemap,C.fog,C.lights,{emissive:{value:new F(0)}}]),vertexShader:S.meshlambert_vert,fragmentShader:S.meshlambert_frag},phong:{uniforms:Ba.merge([C.common,C.specularmap,C.envmap,C.aomap,C.lightmap,C.emissivemap,C.bumpmap,C.normalmap,C.displacementmap,C.gradientmap, +C.fog,C.lights,{emissive:{value:new F(0)},specular:{value:new F(1118481)},shininess:{value:30}}]),vertexShader:S.meshphong_vert,fragmentShader:S.meshphong_frag},standard:{uniforms:Ba.merge([C.common,C.envmap,C.aomap,C.lightmap,C.emissivemap,C.bumpmap,C.normalmap,C.displacementmap,C.roughnessmap,C.metalnessmap,C.fog,C.lights,{emissive:{value:new F(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:S.meshphysical_vert,fragmentShader:S.meshphysical_frag},points:{uniforms:Ba.merge([C.points, +C.fog]),vertexShader:S.points_vert,fragmentShader:S.points_frag},dashed:{uniforms:Ba.merge([C.common,C.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:S.linedashed_vert,fragmentShader:S.linedashed_frag},depth:{uniforms:Ba.merge([C.common,C.displacementmap]),vertexShader:S.depth_vert,fragmentShader:S.depth_frag},normal:{uniforms:Ba.merge([C.common,C.bumpmap,C.normalmap,C.displacementmap,{opacity:{value:1}}]),vertexShader:S.normal_vert,fragmentShader:S.normal_frag},cube:{uniforms:{tCube:{value:null}, +tFlip:{value:-1},opacity:{value:1}},vertexShader:S.cube_vert,fragmentShader:S.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:S.equirect_vert,fragmentShader:S.equirect_frag},distanceRGBA:{uniforms:Ba.merge([C.common,C.displacementmap,{referencePosition:{value:new n},nearDistance:{value:1},farDistance:{value:1E3}}]),vertexShader:S.distanceRGBA_vert,fragmentShader:S.distanceRGBA_frag},shadow:{uniforms:Ba.merge([C.lights,C.fog,{color:{value:new F(0)},opacity:{value:1}}]),vertexShader:S.shadow_vert, +fragmentShader:S.shadow_frag}};jb.physical={uniforms:Ba.merge([jb.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:S.meshphysical_vert,fragmentShader:S.meshphysical_frag};Object.assign(kd.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;bthis.max.x||a.ythis.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<= +this.max.y},getParameter:function(a,b){return(b||new E).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.xthis.max.x||a.max.ythis.max.y?!1:!0},clampPoint:function(a,b){return(b||new E).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new E;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min); +this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});qc.prototype=Object.create(ea.prototype);qc.prototype.constructor=qc;var Mf=0;Object.assign(W.prototype,la.prototype,{isMaterial:!0,onBeforeCompile:function(){},setValues:function(a){if(void 0!==a)for(var b in a){var c=a[b];if(void 0===c)console.warn("THREE.Material: '"+ +b+"' parameter is undefined.");else if("shading"===b)console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===c?!0:!1;else{var d=this[b];void 0===d?console.warn("THREE."+this.type+": '"+b+"' is not a property of this material."):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]="overdraw"===b?Number(c):c}}},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c= +void 0===a;c&&(a={textures:{},images:{}});var d={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};d.uuid=this.uuid;d.type=this.type;""!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());this.specular&&this.specular.isColor&&(d.specular=this.specular.getHex()); +void 0!==this.shininess&&(d.shininess=this.shininess);void 0!==this.clearCoat&&(d.clearCoat=this.clearCoat);void 0!==this.clearCoatRoughness&&(d.clearCoatRoughness=this.clearCoatRoughness);this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);this.alphaMap&&this.alphaMap.isTexture&&(d.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap&&this.lightMap.isTexture&&(d.lightMap=this.lightMap.toJSON(a).uuid);this.bumpMap&&this.bumpMap.isTexture&&(d.bumpMap=this.bumpMap.toJSON(a).uuid,d.bumpScale= +this.bumpScale);this.normalMap&&this.normalMap.isTexture&&(d.normalMap=this.normalMap.toJSON(a).uuid,d.normalScale=this.normalScale.toArray());this.displacementMap&&this.displacementMap.isTexture&&(d.displacementMap=this.displacementMap.toJSON(a).uuid,d.displacementScale=this.displacementScale,d.displacementBias=this.displacementBias);this.roughnessMap&&this.roughnessMap.isTexture&&(d.roughnessMap=this.roughnessMap.toJSON(a).uuid);this.metalnessMap&&this.metalnessMap.isTexture&&(d.metalnessMap=this.metalnessMap.toJSON(a).uuid); +this.emissiveMap&&this.emissiveMap.isTexture&&(d.emissiveMap=this.emissiveMap.toJSON(a).uuid);this.specularMap&&this.specularMap.isTexture&&(d.specularMap=this.specularMap.toJSON(a).uuid);this.envMap&&this.envMap.isTexture&&(d.envMap=this.envMap.toJSON(a).uuid,d.reflectivity=this.reflectivity);this.gradientMap&&this.gradientMap.isTexture&&(d.gradientMap=this.gradientMap.toJSON(a).uuid);void 0!==this.size&&(d.size=this.size);void 0!==this.sizeAttenuation&&(d.sizeAttenuation=this.sizeAttenuation);1!== +this.blending&&(d.blending=this.blending);!0===this.flatShading&&(d.flatShading=this.flatShading);0!==this.side&&(d.side=this.side);0!==this.vertexColors&&(d.vertexColors=this.vertexColors);1>this.opacity&&(d.opacity=this.opacity);!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;!0===this.dithering&&(d.dithering=!0);0e&&(e=m);q>f&&(f=q);l>g&&(g=l)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromBufferAttribute:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.count;he&&(e=m);q>f&&(f=q);l>g&&(g=l)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b< +c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new n;return function(b,c){var d=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),setFromObject:function(a){this.makeEmpty();return this.expandByObject(a)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z= +-Infinity;return this},isEmpty:function(){return this.max.xthis.max.x||a.ythis.max.y||a.zthis.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z},getParameter:function(a,b){return(b||new n).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.xthis.max.x|| +a.max.ythis.max.y||a.max.zthis.max.z?!1:!0},intersectsSphere:function(){var a=new n;return function(b){this.clampPoint(b.center,a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){var b,c;0=a.constant},clampPoint:function(a,b){return(b||new n).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new n;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new n;return function(b){b=b||new ja;this.getCenter(b.center);b.radius=.5*this.getSize(a).length();return b}}(),intersect:function(a){this.min.max(a.min); +this.max.min(a.max);this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a=[new n,new n,new n,new n,new n,new n,new n,new n];return function(b){if(this.isEmpty())return this;a[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b); +a[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(b);a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});Object.assign(ja.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this}, +setFromPoints:function(){var a=new Qa;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e=0,f=0,g=b.length;f=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius* +this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(a.distanceToPoint(this.center))<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a),d=b||new n;d.copy(a);c>this.radius*this.radius&&(d.sub(this.center).normalize(),d.multiplyScalar(this.radius).add(this.center)); +return d},getBoundingBox:function(a){a=a||new Qa;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}});Object.assign(ya.prototype,{set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a, +b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=new n,b=new n;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a= +1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){return(b||new n).copy(this.normal).multiplyScalar(-this.distanceToPoint(a)).add(a)},intersectLine:function(){var a=new n;return function(b,c){var d=c||new n,e=b.delta(a),f=this.normal.dot(e); +if(0===f){if(0===this.distanceToPoint(b.start))return d.copy(b.start)}else return f=-(b.start.dot(this.normal)+this.constant)/f,0>f||1b&&0a&&0c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],k=c[6],m=c[7],q=c[8],l=c[9],p=c[10],t=c[11],n=c[12],r=c[13],z=c[14],c=c[15];b[0].setComponents(f-a,m-g,t-q,c-n).normalize();b[1].setComponents(f+a,m+g,t+q,c+n).normalize();b[2].setComponents(f+d,m+h,t+l,c+r).normalize();b[3].setComponents(f- +d,m-h,t-l,c-r).normalize();b[4].setComponents(f-e,m-k,t-p,c-z).normalize();b[5].setComponents(f+e,m+k,t+p,c+z).normalize();return this},intersectsObject:function(){var a=new ja;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSprite:function(){var a=new ja;return function(b){a.center.set(0,0,0);a.radius=.7071067811865476;a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(), +intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)e;e++){var f=d[e];a.x=0 +g&&0>f)return!1}return!0}}(),containsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});$a.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");$a.DefaultOrder="XYZ";Object.defineProperties($a.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}}, +order:{get:function(){return this._order},set:function(a){this._order=a;this.onChangeCallback()}}});Object.assign($a.prototype,{isEuler:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=J.clamp, +e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],k=e[5],m=e[9],q=e[2],l=e[6],e=e[10];b=b||this._order;"XYZ"===b?(this._y=Math.asin(d(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(-m,e),this._z=Math.atan2(-f,a)):(this._x=Math.atan2(l,k),this._z=0)):"YXZ"===b?(this._x=Math.asin(-d(m,-1,1)),.99999>Math.abs(m)?(this._y=Math.atan2(g,e),this._z=Math.atan2(h,k)):(this._y=Math.atan2(-q,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(l,-1,1)),.99999>Math.abs(l)?(this._y=Math.atan2(-q,e),this._z=Math.atan2(-f, +k)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(q,-1,1)),.99999>Math.abs(q)?(this._x=Math.atan2(l,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,k))):"YZX"===b?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-m,k),this._y=Math.atan2(-q,a)):(this._x=0,this._y=Math.atan2(g,e))):"XZY"===b?(this._z=Math.asin(-d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(l,k),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-m,e),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+ +b);this._order=b;if(!1!==c)this.onChangeCallback();return this},setFromQuaternion:function(){var a=new L;return function(b,c,d){a.makeRotationFromQuaternion(b);return this.setFromRotationMatrix(a,c,d)}}(),setFromVector3:function(a,b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(){var a=new ha;return function(b){a.setFromEuler(this);return this.setFromQuaternion(a,b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x= +a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,this._y,this._z):new n(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(Td.prototype,{set:function(a){this.mask=1<d;d++)if(e[d]===e[(d+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(e=a[f],this.faces.splice(e,1),c=0,g=this.faceVertexUvs.length;cd?c.copy(this.origin):c.copy(this.direction).multiplyScalar(d).add(this.origin)},distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new n;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceToSquared(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceToSquared(b)}}(),distanceSqToSegment:function(){var a= +new n,b=new n,c=new n;return function(d,e,f,g){a.copy(d).add(e).multiplyScalar(.5);b.copy(e).sub(d).normalize();c.copy(this.origin).sub(a);var h=.5*d.distanceTo(e),k=-this.direction.dot(b),m=c.dot(this.direction),q=-c.dot(b),l=c.lengthSq(),p=Math.abs(1-k*k),n;0=-n?e<=n?(h=1/p,d*=h,e*=h,k=d*(d+k*e+2*m)+e*(k*d+e+2*q)+l):(e=h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*q)+l):(e=-h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*q)+l):e<=-n?(d=Math.max(0,-(-k*h+m)),e=0f)return null; +f=Math.sqrt(f-e);e=d-f;d+=f;return 0>e&&0>d?null:0>e?this.at(d,c):this.at(e,c)}}(),intersectsSphere:function(a){return this.distanceToPoint(a.center)<=a.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){var c=this.distanceToPlane(a);return null===c?null:this.at(c,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin); +return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},intersectBox:function(a,b){var c,d,e,f,g;d=1/this.direction.x;f=1/this.direction.y;g=1/this.direction.z;var h=this.origin;0<=d?(c=(a.min.x-h.x)*d,d*=a.max.x-h.x):(c=(a.max.x-h.x)*d,d*=a.min.x-h.x);0<=f?(e=(a.min.y-h.y)*f,f*=a.max.y-h.y):(e=(a.max.y-h.y)*f,f*=a.min.y-h.y);if(c>f||e>d)return null;if(e>c||c!==c)c=e;if(fg||e>d)return null;if(e>c||c!==c)c= +e;if(gd?null:this.at(0<=c?c:d,b)},intersectsBox:function(){var a=new n;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a=new n,b=new n,c=new n,d=new n;return function(e,f,g,h,k){b.subVectors(f,e);c.subVectors(g,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0f)h=-1,f=-f;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;g=h*this.direction.dot(b.cross(a)); +if(0>g||e+g>f)return null;e=-h*a.dot(d);return 0>e?null:this.at(e/f,k)}}(),applyMatrix4:function(a){this.origin.applyMatrix4(a);this.direction.transformDirection(a);return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});Object.assign(Gb.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this}, +getCenter:function(a){return(a||new n).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){return(a||new n).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(a,b){var c=b||new n;return this.delta(c).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new n,b=new n;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end, +this.start);var e=b.dot(b),e=b.dot(a)/e;d&&(e=J.clamp(e,0,1));return e}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new n;return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}});Object.assign(Sa,{normal:function(){var a=new n;return function(b,c,d,e){e=e||new n;e.subVectors(d,c);a.subVectors(b, +c);e.cross(a);b=e.lengthSq();return 0=b.x+b.y}}()});Object.assign(Sa.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},area:function(){var a=new n,b=new n;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b); +return.5*a.cross(b).length()}}(),midpoint:function(a){return(a||new n).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return Sa.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new ya).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return Sa.barycoordFromPoint(a,this.a,this.b,this.c,b)},containsPoint:function(a){return Sa.containsPoint(a,this.a,this.b,this.c)},closestPointToPoint:function(){var a=new ya,b=[new Gb,new Gb,new Gb], +c=new n,d=new n;return function(e,f){var g=f||new n,h=Infinity;a.setFromCoplanarPoints(this.a,this.b,this.c);a.projectPoint(e,c);if(!0===this.containsPoint(c))g.copy(c);else{b[0].set(this.a,this.b);b[1].set(this.b,this.c);b[2].set(this.c,this.a);for(var k=0;kc.far?null:{distance:b,point:x.clone(),object:a}}function c(c,d,e,f,m,l,q,n){g.fromBufferAttribute(f,l);h.fromBufferAttribute(f,q);k.fromBufferAttribute(f,n);if(c=b(c,c.material,d,e,g,h,k,z))m&&(p.fromBufferAttribute(m,l),t.fromBufferAttribute(m,q),M.fromBufferAttribute(m,n),c.uv=a(z,g,h,k,p,t,M)),c.face=new Ra(l,q,n,Sa.normal(g,h,k)),c.faceIndex=l;return c}var d=new L,e=new ib,f=new ja,g=new n,h=new n,k=new n, +m=new n,l=new n,v=new n,p=new E,t=new E,M=new E,r=new n,z=new n,x=new n;return function(n,r){var x=this.geometry,w=this.material,y=this.matrixWorld;if(void 0!==w&&(null===x.boundingSphere&&x.computeBoundingSphere(),f.copy(x.boundingSphere),f.applyMatrix4(y),!1!==n.ray.intersectsSphere(f)&&(d.getInverse(y),e.copy(n.ray).applyMatrix4(d),null===x.boundingBox||!1!==e.intersectsBox(x.boundingBox)))){var A;if(x.isBufferGeometry){var Q,B,w=x.index,E=x.attributes.position,y=x.attributes.uv,C,H;if(null!== +w)for(C=0,H=w.count;Cf|| +(f=d.ray.origin.distanceTo(a),fd.far||e.push({distance:f,point:a.clone(),face:null,object:this}))}}(),clone:function(){return(new this.constructor(this.material)).copy(this)}});Ac.prototype=Object.assign(Object.create(y.prototype),{constructor:Ac,copy:function(a){y.prototype.copy.call(this,a,!1);a=a.levels;for(var b=0,c=a.length;b=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break;for(;ef||(l.applyMatrix4(this.matrixWorld),r=d.ray.origin.distanceTo(l), +rd.far||e.push({distance:r,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else for(g=0,M=t.length/3-1;gf||(l.applyMatrix4(this.matrixWorld),r=d.ray.origin.distanceTo(l),rd.far||e.push({distance:r,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else if(g.isGeometry)for(k=g.vertices,m=k.length,g=0;gf||(l.applyMatrix4(this.matrixWorld),r=d.ray.origin.distanceTo(l),rd.far||e.push({distance:r,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});aa.prototype=Object.assign(Object.create(ka.prototype),{constructor:aa,isLineSegments:!0});td.prototype=Object.assign(Object.create(ka.prototype),{constructor:td, +isLineLoop:!0});Ca.prototype=Object.create(W.prototype);Ca.prototype.constructor=Ca;Ca.prototype.isPointsMaterial=!0;Ca.prototype.copy=function(a){W.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;return this};Kb.prototype=Object.assign(Object.create(y.prototype),{constructor:Kb,isPoints:!0,raycast:function(){var a=new L,b=new ib,c=new ja;return function(d,e){function f(a,c){var f=b.distanceSqToPoint(a);if(fd.far||e.push({distance:m,distanceToRay:Math.sqrt(f),point:h.clone(),index:c,face:null,object:g})}}var g=this,h=this.geometry,k=this.matrixWorld,m=d.params.Points.threshold;null===h.boundingSphere&&h.computeBoundingSphere();c.copy(h.boundingSphere);c.applyMatrix4(k);c.radius+=m;if(!1!==d.ray.intersectsSphere(c)){a.getInverse(k);b.copy(d.ray).applyMatrix4(a);var m=m/((this.scale.x+this.scale.y+this.scale.z)/3),l=m*m,m=new n;if(h.isBufferGeometry){var v= +h.index,h=h.attributes.position.array;if(null!==v)for(var p=v.array,v=0,t=p.length;vc)return null;var d=[],e=[],f=[],g,h,k;if(0=m--){console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()");break}g=h;c<=g&&(g=0);h=g+1;c<=h&&(h=0);k=h+1;c<=k&&(k=0);var l;a:{var n,p,t,M,r,z,x,u;n=a[e[g]].x;p=a[e[g]].y;t=a[e[h]].x;M=a[e[h]].y;r=a[e[k]].x;z=a[e[k]].y;if(0>=(t- +n)*(z-p)-(M-p)*(r-n))l=!1;else{var D,w,y,B,A,Q,E,C,F,H;D=r-t;w=z-M;y=n-r;B=p-z;A=t-n;Q=M-p;for(l=0;l=-Number.EPSILON&&C>=-Number.EPSILON&&E>=-Number.EPSILON)){l=!1;break a}l=!0}}if(l){d.push([a[e[g]],a[e[h]],a[e[k]]]);f.push([e[g],e[h],e[k]]);g=h;for(k=h+1;kNumber.EPSILON){if(0n||n>p)return[];k=m*l-k*q;if(0>k||k>p)return[]}else{if(0c?[]:k===c?f?[]:[g]:a<=c?[g,h]:[g,m]}function f(a,b,c,d){var e=b.x-a.x,f=b.y-a.y;b=c.x-a.x;c=c.y-a.y;var g=d.x-a.x;d=d.y-a.y;a=e*c-f*b;e=e*d-f*g;return Math.abs(a)>Number.EPSILON?(b=g*c-d*b,0e&&(e=d);var g=a+1;g>d&&(g=0);d=f(h[a],h[e],h[g],k[b]);if(!d)return!1;d=k.length-1;e=b-1;0>e&&(e=d);g=b+1;g>d&&(g=0);return(d=f(k[b],k[e],k[g],h[a]))?!0:!1}function d(a,b){var c,f;for(c=0;cF){console.log('THREE.ShapeUtils: Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!');break}for(q=y;qk;k++)l=m[k].x+":"+m[k].y,l=n[l],void 0!==l&&(m[k]=l);return p.concat()},isClockWise:function(a){return 0>Aa.area(a)}};bb.prototype=Object.create(K.prototype);bb.prototype.constructor=bb;Da.prototype=Object.create(w.prototype);Da.prototype.constructor=Da;Da.prototype.getArrays=function(){var a=this.getAttribute("position"),a=a?Array.prototype.slice.call(a.array):[],b=this.getAttribute("uv"),b=b?Array.prototype.slice.call(b.array): +[],c=this.index,c=c?Array.prototype.slice.call(c.array):[];return{position:a,uv:b,index:c}};Da.prototype.addShapeList=function(a,b){var c=a.length;b.arrays=this.getArrays();for(var d=0;dNumber.EPSILON){var k=Math.sqrt(h),m=Math.sqrt(d*d+g*g),h=b.x-f/k;b=b.y+e/k;g=((c.x-g/m-h)*g-(c.y+d/m-b)*d)/(e*g-f*d);d=h+e*g-a.x;e=b+f*g-a.y;f=d*d+e*e;if(2>=f)return new E(d,e);f=Math.sqrt(f/2)}else a=!1,e>Number.EPSILON?d>Number.EPSILON&&(a=!0):e<-Number.EPSILON?d<-Number.EPSILON&&(a=!0):Math.sign(f)===Math.sign(g)&&(a=!0),a?(d=-f,f=Math.sqrt(h)):(d=e,e=f,f=Math.sqrt(h/2));return new E(d/f,e/f)} +function e(a,b){var c,d;for(P=a.length;0<=--P;){c=P;d=P-1;0>d&&(d=a.length-1);var e,f=D+2*z;for(e=0;eMath.abs(g-k)?[new E(a,1-c),new E(h,1-d),new E(m,1-e),new E(n,1-b)]:[new E(g,1-c),new E(k,1-d),new E(l,1-e),new E(p,1-b)]}};Nc.prototype=Object.create(K.prototype);Nc.prototype.constructor=Nc;Ub.prototype=Object.create(Da.prototype);Ub.prototype.constructor=Ub;Oc.prototype=Object.create(K.prototype);Oc.prototype.constructor=Oc;lb.prototype=Object.create(w.prototype);lb.prototype.constructor=lb;Pc.prototype=Object.create(K.prototype); +Pc.prototype.constructor=Pc;Vb.prototype=Object.create(w.prototype);Vb.prototype.constructor=Vb;Qc.prototype=Object.create(K.prototype);Qc.prototype.constructor=Qc;Wb.prototype=Object.create(w.prototype);Wb.prototype.constructor=Wb;Xb.prototype=Object.create(K.prototype);Xb.prototype.constructor=Xb;Yb.prototype=Object.create(w.prototype);Yb.prototype.constructor=Yb;Zb.prototype=Object.create(w.prototype);Zb.prototype.constructor=Zb;mb.prototype=Object.create(K.prototype);mb.prototype.constructor= +mb;Ua.prototype=Object.create(w.prototype);Ua.prototype.constructor=Ua;Rc.prototype=Object.create(mb.prototype);Rc.prototype.constructor=Rc;Sc.prototype=Object.create(Ua.prototype);Sc.prototype.constructor=Sc;Tc.prototype=Object.create(K.prototype);Tc.prototype.constructor=Tc;$b.prototype=Object.create(w.prototype);$b.prototype.constructor=$b;var La=Object.freeze({WireframeGeometry:Mb,ParametricGeometry:Ec,ParametricBufferGeometry:Nb,TetrahedronGeometry:Gc,TetrahedronBufferGeometry:Ob,OctahedronGeometry:Hc, +OctahedronBufferGeometry:kb,IcosahedronGeometry:Ic,IcosahedronBufferGeometry:Pb,DodecahedronGeometry:Jc,DodecahedronBufferGeometry:Qb,PolyhedronGeometry:Fc,PolyhedronBufferGeometry:qa,TubeGeometry:Kc,TubeBufferGeometry:Rb,TorusKnotGeometry:Lc,TorusKnotBufferGeometry:Sb,TorusGeometry:Mc,TorusBufferGeometry:Tb,TextGeometry:Nc,TextBufferGeometry:Ub,SphereGeometry:Oc,SphereBufferGeometry:lb,RingGeometry:Pc,RingBufferGeometry:Vb,PlaneGeometry:xc,PlaneBufferGeometry:hb,LatheGeometry:Qc,LatheBufferGeometry:Wb, +ShapeGeometry:Xb,ShapeBufferGeometry:Yb,ExtrudeGeometry:bb,ExtrudeBufferGeometry:Da,EdgesGeometry:Zb,ConeGeometry:Rc,ConeBufferGeometry:Sc,CylinderGeometry:mb,CylinderBufferGeometry:Ua,CircleGeometry:Tc,CircleBufferGeometry:$b,BoxGeometry:Fb,BoxBufferGeometry:gb});ac.prototype=Object.create(W.prototype);ac.prototype.constructor=ac;ac.prototype.isShadowMaterial=!0;bc.prototype=Object.create(za.prototype);bc.prototype.constructor=bc;bc.prototype.isRawShaderMaterial=!0;Oa.prototype=Object.create(W.prototype); +Oa.prototype.constructor=Oa;Oa.prototype.isMeshStandardMaterial=!0;Oa.prototype.copy=function(a){W.prototype.copy.call(this,a);this.defines={STANDARD:""};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale= +a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap;this.metalnessMap=a.metalnessMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.envMapIntensity=a.envMapIntensity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap; +this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};nb.prototype=Object.create(Oa.prototype);nb.prototype.constructor=nb;nb.prototype.isMeshPhysicalMaterial=!0;nb.prototype.copy=function(a){Oa.prototype.copy.call(this,a);this.defines={PHYSICAL:""};this.reflectivity=a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};Ia.prototype=Object.create(W.prototype); +Ia.prototype.constructor=Ia;Ia.prototype.isMeshPhongMaterial=!0;Ia.prototype.copy=function(a){W.prototype.copy.call(this,a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale; +this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin; +this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};ob.prototype=Object.create(Ia.prototype);ob.prototype.constructor=ob;ob.prototype.isMeshToonMaterial=!0;ob.prototype.copy=function(a){Ia.prototype.copy.call(this,a);this.gradientMap=a.gradientMap;return this};pb.prototype=Object.create(W.prototype);pb.prototype.constructor=pb;pb.prototype.isMeshNormalMaterial=!0;pb.prototype.copy=function(a){W.prototype.copy.call(this,a);this.bumpMap=a.bumpMap; +this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};qb.prototype=Object.create(W.prototype);qb.prototype.constructor=qb;qb.prototype.isMeshLambertMaterial=!0;qb.prototype.copy= +function(a){W.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe; +this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};rb.prototype=Object.create(X.prototype);rb.prototype.constructor=rb;rb.prototype.isLineDashedMaterial=!0;rb.prototype.copy=function(a){X.prototype.copy.call(this,a);this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var sg=Object.freeze({ShadowMaterial:ac, +SpriteMaterial:ab,RawShaderMaterial:bc,ShaderMaterial:za,PointsMaterial:Ca,MeshPhysicalMaterial:nb,MeshStandardMaterial:Oa,MeshPhongMaterial:Ia,MeshToonMaterial:ob,MeshNormalMaterial:pb,MeshLambertMaterial:qb,MeshDepthMaterial:Ya,MeshDistanceMaterial:Za,MeshBasicMaterial:va,LineDashedMaterial:rb,LineBasicMaterial:X,Material:W}),jd={enabled:!1,files:{},add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]}, +clear:function(){this.files={}}},wa=new ae;Object.assign(Ja.prototype,{load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);var e=this,f=jd.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){var h=g[1],k=!!g[2],g=g[3],g=window.decodeURIComponent(g);k&&(g=window.atob(g));try{var m,l=(this.responseType||"").toLowerCase();switch(l){case "arraybuffer":case "blob":for(var n= +new Uint8Array(g.length),k=0;k=e)break a;else{f=b[1];a=e)break b}d=c;c=0}}for(;c>>1,ab;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f, +1),e=f-1),d=this.getValueSize(),this.times=Y.arraySlice(c,e,f),this.values=Y.arraySlice(this.values,e*d,f*d);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error("THREE.KeyframeTrackPrototype: Invalid value size in track.",this),a=!1);var c=this.times,b=this.values,d=c.length;0===d&&(console.error("THREE.KeyframeTrackPrototype: Track is empty.",this),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if("number"===typeof g&&isNaN(g)){console.error("THREE.KeyframeTrackPrototype: Time is not a valid number.", +this,f,g);a=!1;break}if(null!==e&&e>g){console.error("THREE.KeyframeTrackPrototype: Out of order keys.",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&Y.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error("THREE.KeyframeTrackPrototype: Value is not a valid number.",this,f,d);a=!1;break}return a},optimize:function(){for(var a=this.times,b=this.values,c=this.getValueSize(),d=2302===this.getInterpolation(),e=1,f=a.length-1,g=1;gm.opacity&&(m.transparent=!0);d.setTextures(k);return d.parse(m)}}()});Object.assign(ee.prototype,{load:function(a,b,c,d){var e=this,f=this.texturePath&&"string"===typeof this.texturePath?this.texturePath:ec.prototype.extractUrlBase(a),g=new Ja(this.manager);g.setWithCredentials(this.withCredentials);g.load(a,function(c){c=JSON.parse(c);var d=c.metadata;if(void 0!==d&&(d=d.type,void 0!==d)){if("object"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.ObjectLoader instead."); +return}if("scene"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.SceneLoader instead.");return}}c=e.parse(c,f);b(c.geometry,c.materials)},c,d)},setTexturePath:function(a){this.texturePath=a},parse:function(){return function(a,b){void 0!==a.data&&(a=a.data);a.scale=void 0!==a.scale?1/a.scale:1;var c=new K,d=a,e,f,g,h,k,m,l,v,p,t,w,r,z,x,u=d.faces;p=d.vertices;var y=d.normals,B=d.colors;m=d.scale;var C=0;if(void 0!==d.uvs){for(e=0;ef;f++)v=u[h++],x=z[2*v],v=z[2*v+1],x= +new E(x,v),2!==f&&c.faceVertexUvs[e][g].push(x),0!==f&&c.faceVertexUvs[e][g+1].push(x);l&&(l=3*u[h++],t.normal.set(y[l++],y[l++],y[l]),r.normal.copy(t.normal));if(w)for(e=0;4>e;e++)l=3*u[h++],w=new n(y[l++],y[l++],y[l]),2!==e&&t.vertexNormals.push(w),0!==e&&r.vertexNormals.push(w);m&&(m=u[h++],m=B[m],t.color.setHex(m),r.color.setHex(m));if(p)for(e=0;4>e;e++)m=u[h++],m=B[m],2!==e&&t.vertexColors.push(new F(m)),0!==e&&r.vertexColors.push(new F(m));c.faces.push(t);c.faces.push(r)}else{t=new Ra;t.a=u[h++]; +t.b=u[h++];t.c=u[h++];g&&(g=u[h++],t.materialIndex=g);g=c.faces.length;if(e)for(e=0;ef;f++)v=u[h++],x=z[2*v],v=z[2*v+1],x=new E(x,v),c.faceVertexUvs[e][g].push(x);l&&(l=3*u[h++],t.normal.set(y[l++],y[l++],y[l]));if(w)for(e=0;3>e;e++)l=3*u[h++],w=new n(y[l++],y[l++],y[l]),t.vertexNormals.push(w);m&&(m=u[h++],t.color.setHex(B[m]));if(p)for(e=0;3>e;e++)m=u[h++],t.vertexColors.push(new F(B[m]));c.faces.push(t)}d=a;h=void 0!==d.influencesPerVertex?d.influencesPerVertex: +2;if(d.skinWeights)for(k=0,u=d.skinWeights.length;kk)g=d+1;else if(0b&&(b=0);1Number.EPSILON&&(g.normalize(),c=Math.acos(J.clamp(d[k-1].dot(d[k]),-1,1)),e[k].applyMatrix4(h.makeRotationAxis(g,c))),f[k].crossVectors(d[k],e[k]);if(!0===b)for(c=Math.acos(J.clamp(e[0].dot(e[a]),-1,1)),c/=a,0=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();return a[a.length-1]},updateArcLengths:function(){this.needsUpdate= +!0;this.cacheLengths=null;this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var a=[],b=0,c=0,d=this.curves.length;cc;)c+=b;for(;c>b;)c-=b;cb.length-2?b.length-1:a+1],b=b[a>b.length-3?b.length-1:a+2];return new E(Te(c,d.x,e.x,f.x,b.x),Te(c,d.y,e.y,f.y,b.y))};fc.prototype=Object.create(pa.prototype);fc.prototype.constructor= +fc;fc.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2,e=this.v3;return new E(wb(a,b.x,c.x,d.x,e.x),wb(a,b.y,c.y,d.y,e.y))};gc.prototype=Object.create(pa.prototype);gc.prototype.constructor=gc;gc.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2;return new E(vb(a,b.x,c.x,d.x),vb(a,b.y,c.y,d.y))};var ve=Object.assign(Object.create(Xc.prototype),{fromPoints:function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;bNumber.EPSILON){if(0>m&&(g=b[f],k=-k,h=b[e],m=-m),!(a.yh.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=m*(a.x-g.x)-k*(a.y-g.y);if(0===e)return!0;0>e||(d=!d)}}else if(a.y===g.y&&(h.x<=a.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}var e=Aa.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);var g,h,k,m=[];if(1===f.length)return h=f[0],k=new yb,k.curves=h.curves,m.push(k),m;var l=!e(f[0].getPoints()),l=a?!l:l;k=[];var n= +[],p=[],t=0,w;n[t]=void 0;p[t]=[];for(var r=0,z=f.length;rd&&this._mixBufferRegion(c,a,3*b,1-d,b);for(var d=b,f=b+b;d!==f;++d)if(c[d]!==c[d+b]){e.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize, +c=3*b;this.binding.getValue(a,c);for(var d=b;d!==c;++d)a[d]=a[c+d%b];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_select:function(a,b,c,d,e){if(.5<=d)for(d=0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d){ha.slerpFlat(a,b,a,b,a,c,d)},_lerp:function(a,b,c,d,e){for(var f=1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}}});Object.assign(We.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_]; +void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].unbind()}});Object.assign(ga,{Composite:We,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new ga.Composite(a,b,c):new ga(a, +b,c)},sanitizeNodeName:function(a){return a.replace(/\s/g,"_").replace(/[^\w-]/g,"")},parseTrackName:function(){var a=new RegExp("^"+/((?:[\w-]+[\/:])*)/.source+/([\w-\.]+)?/.source+/(?:\.([\w-]+)(?:\[(.+)\])?)?/.source+/\.([\w-]+)(?:\[(.+)\])?/.source+"$"),b=["material","materials","bones"];return function(c){var d=a.exec(c);if(!d)throw Error("PropertyBinding: Cannot parse trackName: "+c);var d={nodeName:d[2],objectName:d[3],objectIndex:d[4],propertyName:d[5],propertyIndex:d[6]},e=d.nodeName&&d.nodeName.lastIndexOf("."); +if(void 0!==e&&-1!==e){var f=d.nodeName.substring(e+1);-1!==b.indexOf(f)&&(d.nodeName=d.nodeName.substring(0,e),d.objectName=f)}if(null===d.propertyName||0===d.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+c);return d}}(),findNode:function(a,b){if(!b||""===b||"root"===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;if(a.skeleton){var c=function(a){for(var c=0;c=b){var l=b++,n=a[l];c[n.uuid]=m;a[m]=n;c[k]=l;a[l]=h;h=0;for(k=e;h!==k;++h){var n=d[h],p=n[m];n[m]=n[l];n[l]=p}}}this.nCachedObjects_=b},uncache:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._bindings,f=e.length,g=0,h=arguments.length;g!==h;++g){var k=arguments[g].uuid,m=d[k]; +if(void 0!==m)if(delete d[k],mb||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0c.parameterPositions[1]&&(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){var b=this.timeScale,c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0],b=b*d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a;if(0===a)return b;var c=this._clip.duration,d=this.loop,e=this._loopCount;if(2200=== +d)a:{if(-1===e&&(this._loopCount=0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;this._mixer.dispatchEvent({type:"finished",action:this,direction:0>a?-1:1})}else{d=2202===d;-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,d)):this._setEndings(0===this.repetitions,!0,d));if(b>=c||0>b){var f=Math.floor(b/c),b=b-c*f,e=e+Math.abs(f),g=this.repetitions-e;0>g?(this.clampWhenFinished?this.paused=!0:this.enabled=!1,b=0a,this._setEndings(a,!a,d)):this._setEndings(!1,!1,d),this._loopCount=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:f}))}if(d&&1===(e&1))return this.time=b,c-b}return this.time=b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(a, +b,c){var d=this._mixer,e=d.time,f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}});Object.assign(Ze.prototype,la.prototype,{_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings,g=a._interpolants,h=c.uuid,k=this._bindingsByRootAndName,m=k[h];void 0===m&&(m={},k[h]=m);for(k=0;k!==e;++k){var l=d[k],n=l.name,p=m[n];if(void 0=== +p){p=f[k];if(void 0!==p){null===p._cacheIndex&&(++p.referenceCount,this._addInactiveBinding(p,h,n));continue}p=new me(ga.create(c,n,b&&b._propertyBindings[k].binding.parsedPath),l.ValueTypeName,l.getValueSize());++p.referenceCount;this._addInactiveBinding(p,h,n)}f[k]=p;g[k].resultBuffer=p.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,d=this._actionsByClip[c];this._bindAction(a,d&&d.knownActions[0]);this._addInactiveAction(a, +c,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}},_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b=a._propertyBindings,c=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=[];this._nActiveActions=0;this._actionsByClip={};this._bindings=[];this._nActiveBindings= +0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length},get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length},get inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},_isActiveAction:function(a){a=a._cacheIndex;return null!==a&&aMath.abs(b)&&(b=1E-8);this.scale.set(.5*this.size,.5*this.size,b);this.lookAt(this.plane.normal); +y.prototype.updateMatrixWorld.call(this,a)};var Nd,se;Ab.prototype=Object.create(y.prototype);Ab.prototype.constructor=Ab;Ab.prototype.setDirection=function(){var a=new n,b;return function(c){.99999c.y?this.quaternion.set(1,0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,b))}}();Ab.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(0,a-b),1);this.line.updateMatrix(); +this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};Ab.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)};Od.prototype=Object.create(aa.prototype);Od.prototype.constructor=Od;var Rd=new n,we=new te,xe=new te,ye=new te;Ka.prototype=Object.create(pa.prototype);Ka.prototype.constructor=Ka;Ka.prototype.getPoint=function(a){var b=this.points,c=b.length;a*=c-(this.closed?0:1);var d=Math.floor(a);a-=d;this.closed?d+=0d&&(d=1);1E-4>c&&(c=d);1E-4>h&&(h=d);we.initNonuniformCatmullRom(e.x, +f.x,g.x,b.x,c,d,h);xe.initNonuniformCatmullRom(e.y,f.y,g.y,b.y,c,d,h);ye.initNonuniformCatmullRom(e.z,f.z,g.z,b.z,c,d,h)}else"catmullrom"===this.type&&(c=void 0!==this.tension?this.tension:.5,we.initCatmullRom(e.x,f.x,g.x,b.x,c),xe.initCatmullRom(e.y,f.y,g.y,b.y,c),ye.initCatmullRom(e.z,f.z,g.z,b.z,c));return new n(we.calc(a),xe.calc(a),ye.calc(a))};gd.prototype=Object.create(pa.prototype);gd.prototype.constructor=gd;gd.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2,e=this.v3;return new n(wb(a, +b.x,c.x,d.x,e.x),wb(a,b.y,c.y,d.y,e.y),wb(a,b.z,c.z,d.z,e.z))};hd.prototype=Object.create(pa.prototype);hd.prototype.constructor=hd;hd.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2;return new n(vb(a,b.x,c.x,d.x),vb(a,b.y,c.y,d.y),vb(a,b.z,c.z,d.z))};id.prototype=Object.create(pa.prototype);id.prototype.constructor=id;id.prototype.getPoint=function(a){if(1===a)return this.v2.clone();var b=new n;b.subVectors(this.v2,this.v1);b.multiplyScalar(a);b.add(this.v1);return b};Pd.prototype= +Object.create(Va.prototype);Pd.prototype.constructor=Pd;pa.create=function(a,b){console.log("THREE.Curve.create() has been deprecated");a.prototype=Object.create(pa.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};ff.prototype=Object.create(Ka.prototype);gf.prototype=Object.create(Ka.prototype);ue.prototype=Object.create(Ka.prototype);Object.assign(ue.prototype,{initFromArray:function(){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(){console.error("THREE.Spline: .getControlPointsArray() has been removed.")}, +reparametrizeByArcLength:function(){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}});bd.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};kc.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")};Object.assign(kd.prototype,{center:function(a){console.warn("THREE.Box2: .center() has been renamed to .getCenter().");return this.getCenter(a)}, +empty:function(){console.warn("THREE.Box2: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},size:function(a){console.warn("THREE.Box2: .size() has been renamed to .getSize().");return this.getSize(a)}});Object.assign(Qa.prototype,{center:function(a){console.warn("THREE.Box3: .center() has been renamed to .getCenter().");return this.getCenter(a)}, +empty:function(){console.warn("THREE.Box3: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)},size:function(a){console.warn("THREE.Box3: .size() has been renamed to .getSize().");return this.getSize(a)}}); +Gb.prototype.center=function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");return this.getCenter(a)};Object.assign(J,{random16:function(){console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead.");return Math.random()},nearestPowerOfTwo:function(a){console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().");return J.floorPowerOfTwo(a)},nextPowerOfTwo:function(a){console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo()."); +return J.ceilPowerOfTwo(a)}});Object.assign(ra.prototype,{flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},multiplyVector3Array:function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBuffer:function(a){console.warn("THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead."); +return this.applyToBufferAttribute(a)},applyToVector3Array:function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}});Object.assign(L.prototype,{extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");return this.copyPosition(a)},flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},getPosition:function(){var a; +return function(){void 0===a&&(a=new n);console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");return a.setFromMatrixColumn(this,3)}}(),setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().");return this.makeRotationFromQuaternion(a)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."); +return a.applyMatrix4(this)},multiplyVector4:function(a){console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector3Array:function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},rotateAxis:function(a){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");a.transformDirection(this)},crossVector:function(a){console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."); +return a.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBuffer:function(a){console.warn("THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead."); +return this.applyToBufferAttribute(a)},applyToVector3Array:function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},makeFrustum:function(a,b,c,d,e,f){console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.");return this.makePerspective(a,b,d,c,e,f)}});ya.prototype.isIntersectionLine=function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");return this.intersectsLine(a)}; +ha.prototype.multiplyVector3=function(a){console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return a.applyQuaternion(this)};Object.assign(ib.prototype,{isIntersectionBox:function(a){console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionPlane:function(a){console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().");return this.intersectsPlane(a)}, +isIntersectionSphere:function(a){console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)}});Object.assign(yb.prototype,{extrude:function(a){console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");return new bb(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new Xb(this,a)}});Object.assign(E.prototype,{fromAttribute:function(a, +b,c){console.error("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)}});Object.assign(n.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(a){console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."); +return this.setFromMatrixPosition(a)},getScaleFromMatrix:function(a){console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().");return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,b){console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().");return this.setFromMatrixColumn(b,a)},applyProjection:function(a){console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.");return this.applyMatrix4(a)}, +fromAttribute:function(a,b,c){console.error("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)}});Object.assign(fa.prototype,{fromAttribute:function(a,b,c){console.error("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)}});K.prototype.computeTangents=function(){console.warn("THREE.Geometry: .computeTangents() has been removed.")};Object.assign(y.prototype,{getChildByName:function(a){console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."); +return this.getObjectByName(a)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(a,b){console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.");return this.translateOnAxis(b,a)}});Object.defineProperties(y.prototype,{eulerOrder:{get:function(){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");return this.rotation.order},set:function(a){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."); +this.rotation.order=a}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}});Object.defineProperties(Ac.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");return this.levels}}});Object.defineProperty(Bc.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}, +set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}});Object.defineProperty(pa.prototype,"__arcLengthDivisions",{get:function(){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");return this.arcLengthDivisions},set:function(a){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");this.arcLengthDivisions=a}});ba.prototype.setLens=function(a,b){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."); +void 0!==b&&(this.filmGauge=b);this.setFocalLength(a)};Object.defineProperties(da.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(a){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov.");this.shadow.camera.fov=a}},shadowCameraLeft:{set:function(a){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left.");this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."); +this.shadow.camera.right=a}},shadowCameraTop:{set:function(a){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top.");this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.");this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near.");this.shadow.camera.near=a}},shadowCameraFar:{set:function(a){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."); +this.shadow.camera.far=a}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(a){console.warn("THREE.Light: .shadowBias is now .shadow.bias.");this.shadow.bias=a}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(a){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."); +this.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.");this.shadow.mapSize.height=a}}});Object.defineProperties(R.prototype,{length:{get:function(){console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead.");return this.array.length}}});Object.assign(w.prototype,{addIndex:function(a){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");this.setIndex(a)},addDrawCall:function(a, +b,c){void 0!==c&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.");console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup().");this.addGroup(a,b)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().");this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")}}); +Object.defineProperties(w.prototype,{drawcalls:{get:function(){console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups.");return this.groups}},offsets:{get:function(){console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups.");return this.groups}}});Object.defineProperties(Ld.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."); +return this}}});Object.defineProperties(W.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},wrapRGB:{get:function(){console.warn("THREE.Material: .wrapRGB has been removed.");return new F}},shading:{get:function(){console.error("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(a){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."); +this.flatShading=1===a}}});Object.defineProperties(Ia.prototype,{metal:{get:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.");return!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}});Object.defineProperties(za.prototype,{derivatives:{get:function(){console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");return this.extensions.derivatives}, +set:function(a){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");this.extensions.derivatives=a}}});Object.assign(Zd.prototype,{getCurrentRenderTarget:function(){console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().");return this.getRenderTarget()},getMaxAnisotropy:function(){console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().");return this.capabilities.getMaxAnisotropy()},getPrecision:function(){console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."); +return this.capabilities.precision},resetGLState:function(){console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset().");return this.state.reset()},supportsFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' ).");return this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."); +return this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' ).");return this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' ).");return this.extensions.get("WEBGL_compressed_texture_s3tc")}, +supportsCompressedTexturePVRTC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).");return this.extensions.get("WEBGL_compressed_texture_pvrtc")},supportsBlendMinMax:function(){console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).");return this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."); +return this.capabilities.vertexTextures},supportsInstancedArrays:function(){console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' ).");return this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(a){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().");this.setScissorTest(a)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")}, +addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")}});Object.defineProperties(Zd.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."); +this.shadowMap.type=a}},shadowMapCullFace:{get:function(){return this.shadowMap.cullFace},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.");this.shadowMap.cullFace=a}}});Object.defineProperties(Ke.prototype,{cullFace:{get:function(){return this.renderReverseSided?2:1},set:function(a){a=1!==a;console.warn("WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to "+a+".");this.renderReverseSided=a}}});Object.defineProperties(Bb.prototype, +{wrapS:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");return this.texture.wrapS},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");this.texture.wrapS=a}},wrapT:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");return this.texture.wrapT},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");this.texture.wrapT=a}},magFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."); +return this.texture.magFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");this.texture.magFilter=a}},minFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");return this.texture.minFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");this.texture.minFilter=a}},anisotropy:{get:function(){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."); +return this.texture.anisotropy},set:function(a){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");this.texture.anisotropy=a}},offset:{get:function(){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");return this.texture.offset},set:function(a){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");this.texture.offset=a}},repeat:{get:function(){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");return this.texture.repeat}, +set:function(a){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");this.texture.repeat=a}},format:{get:function(){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");return this.texture.format},set:function(a){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");this.texture.format=a}},type:{get:function(){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");return this.texture.type},set:function(a){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."); +this.texture.type=a}},generateMipmaps:{get:function(){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");return this.texture.generateMipmaps},set:function(a){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");this.texture.generateMipmaps=a}}});hc.prototype.load=function(a){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var b=this;(new he).load(a,function(a){b.setBuffer(a)});return this}; +le.prototype.getData=function(){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");return this.getFrequencyData()};Zc.prototype.updateCubeMap=function(a,b){console.warn("THREE.CubeCamera: .updateCubeMap() is now .update().");return this.update(a,b)};l.WebGLRenderTargetCube=Cb;l.WebGLRenderTarget=Bb;l.WebGLRenderer=Zd;l.ShaderLib=jb;l.UniformsLib=C;l.UniformsUtils=Ba;l.ShaderChunk=S;l.FogExp2=Ib;l.Fog=Jb;l.Scene=qd;l.LensFlare=$d;l.Sprite=zc;l.LOD=Ac;l.SkinnedMesh=sd;l.Skeleton= +Bc;l.Bone=rd;l.Mesh=na;l.LineSegments=aa;l.LineLoop=td;l.Line=ka;l.Points=Kb;l.Group=Cc;l.VideoTexture=ud;l.DataTexture=cb;l.CompressedTexture=Lb;l.CubeTexture=Xa;l.CanvasTexture=qc;l.DepthTexture=Dc;l.Texture=ea;l.CompressedTextureLoader=Re;l.DataTextureLoader=be;l.CubeTextureLoader=ce;l.TextureLoader=vd;l.ObjectLoader=Se;l.MaterialLoader=Kd;l.BufferGeometryLoader=de;l.DefaultLoadingManager=wa;l.LoadingManager=ae;l.JSONLoader=ee;l.ImageLoader=Uc;l.FontLoader=Ue;l.FileLoader=Ja;l.Loader=ec;l.Cache= +jd;l.AudioLoader=he;l.SpotLightShadow=xd;l.SpotLight=yd;l.PointLight=zd;l.RectAreaLight=Dd;l.HemisphereLight=wd;l.DirectionalLightShadow=Ad;l.DirectionalLight=Bd;l.AmbientLight=Cd;l.LightShadow=sb;l.Light=da;l.StereoCamera=Ve;l.PerspectiveCamera=ba;l.OrthographicCamera=Eb;l.CubeCamera=Zc;l.ArrayCamera=pd;l.Camera=Na;l.AudioListener=ie;l.PositionalAudio=ke;l.AudioContext=je;l.AudioAnalyser=le;l.Audio=hc;l.VectorKeyframeTrack=cc;l.StringKeyframeTrack=Hd;l.QuaternionKeyframeTrack=Wc;l.NumberKeyframeTrack= +dc;l.ColorKeyframeTrack=Jd;l.BooleanKeyframeTrack=Id;l.PropertyMixer=me;l.PropertyBinding=ga;l.KeyframeTrack=ub;l.AnimationUtils=Y;l.AnimationObjectGroup=Xe;l.AnimationMixer=Ze;l.AnimationClip=oa;l.Uniform=Ld;l.InstancedBufferGeometry=ne;l.BufferGeometry=w;l.GeometryIdCount=function(){return Ud++};l.Geometry=K;l.InterleavedBufferAttribute=oe;l.InstancedInterleavedBuffer=pe;l.InterleavedBuffer=ic;l.InstancedBufferAttribute=qe;l.Face3=Ra;l.Object3D=y;l.Raycaster=$e;l.Layers=Td;l.EventDispatcher=la; +l.Clock=bf;l.QuaternionLinearInterpolant=Gd;l.LinearInterpolant=Vc;l.DiscreteInterpolant=Fd;l.CubicInterpolant=Ed;l.Interpolant=xa;l.Triangle=Sa;l.Math=J;l.Spherical=cf;l.Cylindrical=df;l.Plane=ya;l.Frustum=md;l.Sphere=ja;l.Ray=ib;l.Matrix4=L;l.Matrix3=ra;l.Box3=Qa;l.Box2=kd;l.Line3=Gb;l.Euler=$a;l.Vector4=fa;l.Vector3=n;l.Vector2=E;l.Quaternion=ha;l.Color=F;l.ImmediateRenderObject=$c;l.VertexNormalsHelper=ad;l.SpotLightHelper=jc;l.SkeletonHelper=kc;l.PointLightHelper=lc;l.RectAreaLightHelper=mc; +l.HemisphereLightHelper=nc;l.GridHelper=bd;l.PolarGridHelper=Md;l.FaceNormalsHelper=cd;l.DirectionalLightHelper=oc;l.CameraHelper=dd;l.BoxHelper=zb;l.Box3Helper=ed;l.PlaneHelper=fd;l.ArrowHelper=Ab;l.AxisHelper=Od;l.CatmullRomCurve3=Ka;l.CubicBezierCurve3=gd;l.QuadraticBezierCurve3=hd;l.LineCurve3=id;l.ArcCurve=Pd;l.EllipseCurve=Va;l.SplineCurve=xb;l.CubicBezierCurve=fc;l.QuadraticBezierCurve=gc;l.LineCurve=Pa;l.Shape=yb;l.Path=Yc;l.ShapePath=fe;l.Font=ge;l.CurvePath=Xc;l.Curve=pa;l.ShapeUtils=Aa; +l.SceneUtils={createMultiMaterialObject:function(a,b){for(var c=new Cc,d=0,e=b.length;d Date: Thu, 21 Sep 2017 11:01:38 -0400 Subject: [PATCH 3/6] take out gzipping temporarily --- client-webgl/inline-scripts.rb | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/client-webgl/inline-scripts.rb b/client-webgl/inline-scripts.rb index 05d69f5..83e25e3 100755 --- a/client-webgl/inline-scripts.rb +++ b/client-webgl/inline-scripts.rb @@ -4,13 +4,14 @@ html = open('source.html') { |f| f.read } html.gsub!(%r{}) do |tag| js = tag.match(/(?<=").+(?=")/)[0] - src = if js.match(/\.min\./) - open(js) { |f| f.read } - else - `java -jar ~/bin/closure-compiler.jar --compilation_level SIMPLE_OPTIMIZATIONS --js '#{js}'` - end + src = open(js) { |f| f.read } +# src = if js.match(/\.min\./) +# open(js) { |f| f.read } +# else +# `java -jar ~/bin/closure-compiler.jar --compilation_level SIMPLE_OPTIMIZATIONS --js '#{js}'` +# end "" end target = '../deploy/index.html' open(target, 'w') { |f| f.write(html) } -`gzip --best --no-name --force #{target}` +#`gzip --best --no-name --force #{target}` From 20d2b679c548c8c2bfe981165ec1cf04e9599b0a Mon Sep 17 00:00:00 2001 From: Prophesi Date: Thu, 21 Sep 2017 13:54:24 -0400 Subject: [PATCH 4/6] fix outdated threejs code --- client-webgl/js.libs/Projector.js | 1028 ++++++++++ client-webgl/source.html | 1 + client-webgl/websocket-kinect.coffee | 23 +- client-webgl/websocket-kinect.js | 90 +- deploy/index.html | 2783 ++++++++++++++++++++++---- server/INSTALL.txt | 2 + server/websocket-kinect.py | 2 +- 7 files changed, 3475 insertions(+), 454 deletions(-) create mode 100644 client-webgl/js.libs/Projector.js diff --git a/client-webgl/js.libs/Projector.js b/client-webgl/js.libs/Projector.js new file mode 100644 index 0000000..ebb915e --- /dev/null +++ b/client-webgl/js.libs/Projector.js @@ -0,0 +1,1028 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author julianwa / https://github.com/julianwa + */ + +THREE.RenderableObject = function () { + + this.id = 0; + + this.object = null; + this.z = 0; + this.renderOrder = 0; + +}; + +// + +THREE.RenderableFace = function () { + + this.id = 0; + + this.v1 = new THREE.RenderableVertex(); + this.v2 = new THREE.RenderableVertex(); + this.v3 = new THREE.RenderableVertex(); + + this.normalModel = new THREE.Vector3(); + + this.vertexNormalsModel = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ]; + this.vertexNormalsLength = 0; + + this.color = new THREE.Color(); + this.material = null; + this.uvs = [ new THREE.Vector2(), new THREE.Vector2(), new THREE.Vector2() ]; + + this.z = 0; + this.renderOrder = 0; + +}; + +// + +THREE.RenderableVertex = function () { + + this.position = new THREE.Vector3(); + this.positionWorld = new THREE.Vector3(); + this.positionScreen = new THREE.Vector4(); + + this.visible = true; + +}; + +THREE.RenderableVertex.prototype.copy = function ( vertex ) { + + this.positionWorld.copy( vertex.positionWorld ); + this.positionScreen.copy( vertex.positionScreen ); + +}; + +// + +THREE.RenderableLine = function () { + + this.id = 0; + + this.v1 = new THREE.RenderableVertex(); + this.v2 = new THREE.RenderableVertex(); + + this.vertexColors = [ new THREE.Color(), new THREE.Color() ]; + this.material = null; + + this.z = 0; + this.renderOrder = 0; + +}; + +// + +THREE.RenderableSprite = function () { + + this.id = 0; + + this.object = null; + + this.x = 0; + this.y = 0; + this.z = 0; + + this.rotation = 0; + this.scale = new THREE.Vector2(); + + this.material = null; + this.renderOrder = 0; + +}; + +// + +THREE.Projector = function () { + + var _object, _objectCount, _objectPool = [], _objectPoolLength = 0, + _vertex, _vertexCount, _vertexPool = [], _vertexPoolLength = 0, + _face, _faceCount, _facePool = [], _facePoolLength = 0, + _line, _lineCount, _linePool = [], _linePoolLength = 0, + _sprite, _spriteCount, _spritePool = [], _spritePoolLength = 0, + + _renderData = { objects: [], lights: [], elements: [] }, + + _vector3 = new THREE.Vector3(), + _vector4 = new THREE.Vector4(), + + _clipBox = new THREE.Box3( new THREE.Vector3( - 1, - 1, - 1 ), new THREE.Vector3( 1, 1, 1 ) ), + _boundingBox = new THREE.Box3(), + _points3 = new Array( 3 ), + + _viewMatrix = new THREE.Matrix4(), + _viewProjectionMatrix = new THREE.Matrix4(), + + _modelMatrix, + _modelViewProjectionMatrix = new THREE.Matrix4(), + + _normalMatrix = new THREE.Matrix3(), + + _frustum = new THREE.Frustum(), + + _clippedVertex1PositionScreen = new THREE.Vector4(), + _clippedVertex2PositionScreen = new THREE.Vector4(); + + // + + this.projectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .projectVector() is now vector.project().' ); + vector.project( camera ); + + }; + + this.unprojectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' ); + vector.unproject( camera ); + + }; + + this.pickingRay = function () { + + console.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' ); + + }; + + // + + var RenderList = function () { + + var normals = []; + var colors = []; + var uvs = []; + + var object = null; + var material = null; + + var normalMatrix = new THREE.Matrix3(); + + function setObject( value ) { + + object = value; + material = object.material; + + normalMatrix.getNormalMatrix( object.matrixWorld ); + + normals.length = 0; + colors.length = 0; + uvs.length = 0; + + } + + function projectVertex( vertex ) { + + var position = vertex.position; + var positionWorld = vertex.positionWorld; + var positionScreen = vertex.positionScreen; + + positionWorld.copy( position ).applyMatrix4( _modelMatrix ); + positionScreen.copy( positionWorld ).applyMatrix4( _viewProjectionMatrix ); + + var invW = 1 / positionScreen.w; + + positionScreen.x *= invW; + positionScreen.y *= invW; + positionScreen.z *= invW; + + vertex.visible = positionScreen.x >= - 1 && positionScreen.x <= 1 && + positionScreen.y >= - 1 && positionScreen.y <= 1 && + positionScreen.z >= - 1 && positionScreen.z <= 1; + + } + + function pushVertex( x, y, z ) { + + _vertex = getNextVertexInPool(); + _vertex.position.set( x, y, z ); + + projectVertex( _vertex ); + + } + + function pushNormal( x, y, z ) { + + normals.push( x, y, z ); + + } + + function pushColor( r, g, b ) { + + colors.push( r, g, b ); + + } + + function pushUv( x, y ) { + + uvs.push( x, y ); + + } + + function checkTriangleVisibility( v1, v2, v3 ) { + + if ( v1.visible === true || v2.visible === true || v3.visible === true ) return true; + + _points3[ 0 ] = v1.positionScreen; + _points3[ 1 ] = v2.positionScreen; + _points3[ 2 ] = v3.positionScreen; + + return _clipBox.intersectsBox( _boundingBox.setFromPoints( _points3 ) ); + + } + + function checkBackfaceCulling( v1, v2, v3 ) { + + return ( ( v3.positionScreen.x - v1.positionScreen.x ) * + ( v2.positionScreen.y - v1.positionScreen.y ) - + ( v3.positionScreen.y - v1.positionScreen.y ) * + ( v2.positionScreen.x - v1.positionScreen.x ) ) < 0; + + } + + function pushLine( a, b ) { + + var v1 = _vertexPool[ a ]; + var v2 = _vertexPool[ b ]; + + // Clip + + v1.positionScreen.copy( v1.position ).applyMatrix4( _modelViewProjectionMatrix ); + v2.positionScreen.copy( v2.position ).applyMatrix4( _modelViewProjectionMatrix ); + + if ( clipLine( v1.positionScreen, v2.positionScreen ) === true ) { + + // Perform the perspective divide + v1.positionScreen.multiplyScalar( 1 / v1.positionScreen.w ); + v2.positionScreen.multiplyScalar( 1 / v2.positionScreen.w ); + + _line = getNextLineInPool(); + _line.id = object.id; + _line.v1.copy( v1 ); + _line.v2.copy( v2 ); + _line.z = Math.max( v1.positionScreen.z, v2.positionScreen.z ); + _line.renderOrder = object.renderOrder; + + _line.material = object.material; + + if ( object.material.vertexColors === THREE.VertexColors ) { + + _line.vertexColors[ 0 ].fromArray( colors, a * 3 ); + _line.vertexColors[ 1 ].fromArray( colors, b * 3 ); + + } + + _renderData.elements.push( _line ); + + } + + } + + function pushTriangle( a, b, c ) { + + var v1 = _vertexPool[ a ]; + var v2 = _vertexPool[ b ]; + var v3 = _vertexPool[ c ]; + + if ( checkTriangleVisibility( v1, v2, v3 ) === false ) return; + + if ( material.side === THREE.DoubleSide || checkBackfaceCulling( v1, v2, v3 ) === true ) { + + _face = getNextFaceInPool(); + + _face.id = object.id; + _face.v1.copy( v1 ); + _face.v2.copy( v2 ); + _face.v3.copy( v3 ); + _face.z = ( v1.positionScreen.z + v2.positionScreen.z + v3.positionScreen.z ) / 3; + _face.renderOrder = object.renderOrder; + + // use first vertex normal as face normal + + _face.normalModel.fromArray( normals, a * 3 ); + _face.normalModel.applyMatrix3( normalMatrix ).normalize(); + + for ( var i = 0; i < 3; i ++ ) { + + var normal = _face.vertexNormalsModel[ i ]; + normal.fromArray( normals, arguments[ i ] * 3 ); + normal.applyMatrix3( normalMatrix ).normalize(); + + var uv = _face.uvs[ i ]; + uv.fromArray( uvs, arguments[ i ] * 2 ); + + } + + _face.vertexNormalsLength = 3; + + _face.material = object.material; + + _renderData.elements.push( _face ); + + } + + } + + return { + setObject: setObject, + projectVertex: projectVertex, + checkTriangleVisibility: checkTriangleVisibility, + checkBackfaceCulling: checkBackfaceCulling, + pushVertex: pushVertex, + pushNormal: pushNormal, + pushColor: pushColor, + pushUv: pushUv, + pushLine: pushLine, + pushTriangle: pushTriangle + }; + + }; + + var renderList = new RenderList(); + + function projectObject( object ) { + + if ( object.visible === false ) return; + + if ( object instanceof THREE.Light ) { + + _renderData.lights.push( object ); + + } else if ( object instanceof THREE.Mesh || object instanceof THREE.Line || object instanceof THREE.Points ) { + + if ( object.material.visible === false ) return; + if ( object.frustumCulled === true && _frustum.intersectsObject( object ) === false ) return; + + addObject( object ); + + } else if ( object instanceof THREE.Sprite ) { + + if ( object.material.visible === false ) return; + if ( object.frustumCulled === true && _frustum.intersectsSprite( object ) === false ) return; + + addObject( object ); + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ] ); + + } + + } + + function addObject( object ) { + + _object = getNextObjectInPool(); + _object.id = object.id; + _object.object = object; + + _vector3.setFromMatrixPosition( object.matrixWorld ); + _vector3.applyMatrix4( _viewProjectionMatrix ); + _object.z = _vector3.z; + _object.renderOrder = object.renderOrder; + + _renderData.objects.push( _object ); + + } + + this.projectScene = function ( scene, camera, sortObjects, sortElements ) { + + _faceCount = 0; + _lineCount = 0; + _spriteCount = 0; + + _renderData.elements.length = 0; + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + if ( camera.parent === null ) camera.updateMatrixWorld(); + + _viewMatrix.copy( camera.matrixWorldInverse ); + _viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, _viewMatrix ); + + _frustum.setFromMatrix( _viewProjectionMatrix ); + + // + + _objectCount = 0; + + _renderData.objects.length = 0; + _renderData.lights.length = 0; + + projectObject( scene ); + + if ( sortObjects === true ) { + + _renderData.objects.sort( painterSort ); + + } + + // + + var objects = _renderData.objects; + + for ( var o = 0, ol = objects.length; o < ol; o ++ ) { + + var object = objects[ o ].object; + var geometry = object.geometry; + + renderList.setObject( object ); + + _modelMatrix = object.matrixWorld; + + _vertexCount = 0; + + if ( object instanceof THREE.Mesh ) { + + if ( geometry instanceof THREE.BufferGeometry ) { + + var attributes = geometry.attributes; + var groups = geometry.groups; + + if ( attributes.position === undefined ) continue; + + var positions = attributes.position.array; + + for ( var i = 0, l = positions.length; i < l; i += 3 ) { + + renderList.pushVertex( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ); + + } + + if ( attributes.normal !== undefined ) { + + var normals = attributes.normal.array; + + for ( var i = 0, l = normals.length; i < l; i += 3 ) { + + renderList.pushNormal( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ); + + } + + } + + if ( attributes.uv !== undefined ) { + + var uvs = attributes.uv.array; + + for ( var i = 0, l = uvs.length; i < l; i += 2 ) { + + renderList.pushUv( uvs[ i ], uvs[ i + 1 ] ); + + } + + } + + if ( geometry.index !== null ) { + + var indices = geometry.index.array; + + if ( groups.length > 0 ) { + + for ( var g = 0; g < groups.length; g ++ ) { + + var group = groups[ g ]; + + for ( var i = group.start, l = group.start + group.count; i < l; i += 3 ) { + + renderList.pushTriangle( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } + + } else { + + for ( var i = 0, l = indices.length; i < l; i += 3 ) { + + renderList.pushTriangle( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } + + } else { + + for ( var i = 0, l = positions.length / 3; i < l; i += 3 ) { + + renderList.pushTriangle( i, i + 1, i + 2 ); + + } + + } + + } else if ( geometry instanceof THREE.Geometry ) { + + var vertices = geometry.vertices; + var faces = geometry.faces; + var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; + + _normalMatrix.getNormalMatrix( _modelMatrix ); + + var material = object.material; + + var isMultiMaterial = Array.isArray( material ); + + for ( var v = 0, vl = vertices.length; v < vl; v ++ ) { + + var vertex = vertices[ v ]; + + _vector3.copy( vertex ); + + if ( material.morphTargets === true ) { + + var morphTargets = geometry.morphTargets; + var morphInfluences = object.morphTargetInfluences; + + for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { + + var influence = morphInfluences[ t ]; + + if ( influence === 0 ) continue; + + var target = morphTargets[ t ]; + var targetVertex = target.vertices[ v ]; + + _vector3.x += ( targetVertex.x - vertex.x ) * influence; + _vector3.y += ( targetVertex.y - vertex.y ) * influence; + _vector3.z += ( targetVertex.z - vertex.z ) * influence; + + } + + } + + renderList.pushVertex( _vector3.x, _vector3.y, _vector3.z ); + + } + + for ( var f = 0, fl = faces.length; f < fl; f ++ ) { + + var face = faces[ f ]; + + material = isMultiMaterial === true + ? object.material[ face.materialIndex ] + : object.material; + + if ( material === undefined ) continue; + + var side = material.side; + + var v1 = _vertexPool[ face.a ]; + var v2 = _vertexPool[ face.b ]; + var v3 = _vertexPool[ face.c ]; + + if ( renderList.checkTriangleVisibility( v1, v2, v3 ) === false ) continue; + + var visible = renderList.checkBackfaceCulling( v1, v2, v3 ); + + if ( side !== THREE.DoubleSide ) { + + if ( side === THREE.FrontSide && visible === false ) continue; + if ( side === THREE.BackSide && visible === true ) continue; + + } + + _face = getNextFaceInPool(); + + _face.id = object.id; + _face.v1.copy( v1 ); + _face.v2.copy( v2 ); + _face.v3.copy( v3 ); + + _face.normalModel.copy( face.normal ); + + if ( visible === false && ( side === THREE.BackSide || side === THREE.DoubleSide ) ) { + + _face.normalModel.negate(); + + } + + _face.normalModel.applyMatrix3( _normalMatrix ).normalize(); + + var faceVertexNormals = face.vertexNormals; + + for ( var n = 0, nl = Math.min( faceVertexNormals.length, 3 ); n < nl; n ++ ) { + + var normalModel = _face.vertexNormalsModel[ n ]; + normalModel.copy( faceVertexNormals[ n ] ); + + if ( visible === false && ( side === THREE.BackSide || side === THREE.DoubleSide ) ) { + + normalModel.negate(); + + } + + normalModel.applyMatrix3( _normalMatrix ).normalize(); + + } + + _face.vertexNormalsLength = faceVertexNormals.length; + + var vertexUvs = faceVertexUvs[ f ]; + + if ( vertexUvs !== undefined ) { + + for ( var u = 0; u < 3; u ++ ) { + + _face.uvs[ u ].copy( vertexUvs[ u ] ); + + } + + } + + _face.color = face.color; + _face.material = material; + + _face.z = ( v1.positionScreen.z + v2.positionScreen.z + v3.positionScreen.z ) / 3; + _face.renderOrder = object.renderOrder; + + _renderData.elements.push( _face ); + + } + + } + + } else if ( object instanceof THREE.Line ) { + + _modelViewProjectionMatrix.multiplyMatrices( _viewProjectionMatrix, _modelMatrix ); + + if ( geometry instanceof THREE.BufferGeometry ) { + + var attributes = geometry.attributes; + + if ( attributes.position !== undefined ) { + + var positions = attributes.position.array; + + for ( var i = 0, l = positions.length; i < l; i += 3 ) { + + renderList.pushVertex( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ); + + } + + if ( attributes.color !== undefined ) { + + var colors = attributes.color.array; + + for ( var i = 0, l = colors.length; i < l; i += 3 ) { + + renderList.pushColor( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ); + + } + + } + + if ( geometry.index !== null ) { + + var indices = geometry.index.array; + + for ( var i = 0, l = indices.length; i < l; i += 2 ) { + + renderList.pushLine( indices[ i ], indices[ i + 1 ] ); + + } + + } else { + + var step = object instanceof THREE.LineSegments ? 2 : 1; + + for ( var i = 0, l = ( positions.length / 3 ) - 1; i < l; i += step ) { + + renderList.pushLine( i, i + 1 ); + + } + + } + + } + + } else if ( geometry instanceof THREE.Geometry ) { + + var vertices = object.geometry.vertices; + + if ( vertices.length === 0 ) continue; + + v1 = getNextVertexInPool(); + v1.positionScreen.copy( vertices[ 0 ] ).applyMatrix4( _modelViewProjectionMatrix ); + + var step = object instanceof THREE.LineSegments ? 2 : 1; + + for ( var v = 1, vl = vertices.length; v < vl; v ++ ) { + + v1 = getNextVertexInPool(); + v1.positionScreen.copy( vertices[ v ] ).applyMatrix4( _modelViewProjectionMatrix ); + + if ( ( v + 1 ) % step > 0 ) continue; + + v2 = _vertexPool[ _vertexCount - 2 ]; + + _clippedVertex1PositionScreen.copy( v1.positionScreen ); + _clippedVertex2PositionScreen.copy( v2.positionScreen ); + + if ( clipLine( _clippedVertex1PositionScreen, _clippedVertex2PositionScreen ) === true ) { + + // Perform the perspective divide + _clippedVertex1PositionScreen.multiplyScalar( 1 / _clippedVertex1PositionScreen.w ); + _clippedVertex2PositionScreen.multiplyScalar( 1 / _clippedVertex2PositionScreen.w ); + + _line = getNextLineInPool(); + + _line.id = object.id; + _line.v1.positionScreen.copy( _clippedVertex1PositionScreen ); + _line.v2.positionScreen.copy( _clippedVertex2PositionScreen ); + + _line.z = Math.max( _clippedVertex1PositionScreen.z, _clippedVertex2PositionScreen.z ); + _line.renderOrder = object.renderOrder; + + _line.material = object.material; + + if ( object.material.vertexColors === THREE.VertexColors ) { + + _line.vertexColors[ 0 ].copy( object.geometry.colors[ v ] ); + _line.vertexColors[ 1 ].copy( object.geometry.colors[ v - 1 ] ); + + } + + _renderData.elements.push( _line ); + + } + + } + + } + + } else if ( object instanceof THREE.Points ) { + + _modelViewProjectionMatrix.multiplyMatrices( _viewProjectionMatrix, _modelMatrix ); + + if ( geometry instanceof THREE.Geometry ) { + + var vertices = object.geometry.vertices; + + for ( var v = 0, vl = vertices.length; v < vl; v ++ ) { + + var vertex = vertices[ v ]; + + _vector4.set( vertex.x, vertex.y, vertex.z, 1 ); + _vector4.applyMatrix4( _modelViewProjectionMatrix ); + + pushPoint( _vector4, object, camera ); + + } + + } else if ( geometry instanceof THREE.BufferGeometry ) { + + var attributes = geometry.attributes; + + if ( attributes.position !== undefined ) { + + var positions = attributes.position.array; + + for ( var i = 0, l = positions.length; i < l; i += 3 ) { + + _vector4.set( positions[ i ], positions[ i + 1 ], positions[ i + 2 ], 1 ); + _vector4.applyMatrix4( _modelViewProjectionMatrix ); + + pushPoint( _vector4, object, camera ); + + } + + } + + } + + } else if ( object instanceof THREE.Sprite ) { + + _vector4.set( _modelMatrix.elements[ 12 ], _modelMatrix.elements[ 13 ], _modelMatrix.elements[ 14 ], 1 ); + _vector4.applyMatrix4( _viewProjectionMatrix ); + + pushPoint( _vector4, object, camera ); + + } + + } + + if ( sortElements === true ) { + + _renderData.elements.sort( painterSort ); + + } + + return _renderData; + + }; + + function pushPoint( _vector4, object, camera ) { + + var invW = 1 / _vector4.w; + + _vector4.z *= invW; + + if ( _vector4.z >= - 1 && _vector4.z <= 1 ) { + + _sprite = getNextSpriteInPool(); + _sprite.id = object.id; + _sprite.x = _vector4.x * invW; + _sprite.y = _vector4.y * invW; + _sprite.z = _vector4.z; + _sprite.renderOrder = object.renderOrder; + _sprite.object = object; + + _sprite.rotation = object.rotation; + + _sprite.scale.x = object.scale.x * Math.abs( _sprite.x - ( _vector4.x + camera.projectionMatrix.elements[ 0 ] ) / ( _vector4.w + camera.projectionMatrix.elements[ 12 ] ) ); + _sprite.scale.y = object.scale.y * Math.abs( _sprite.y - ( _vector4.y + camera.projectionMatrix.elements[ 5 ] ) / ( _vector4.w + camera.projectionMatrix.elements[ 13 ] ) ); + + _sprite.material = object.material; + + _renderData.elements.push( _sprite ); + + } + + } + + // Pools + + function getNextObjectInPool() { + + if ( _objectCount === _objectPoolLength ) { + + var object = new THREE.RenderableObject(); + _objectPool.push( object ); + _objectPoolLength ++; + _objectCount ++; + return object; + + } + + return _objectPool[ _objectCount ++ ]; + + } + + function getNextVertexInPool() { + + if ( _vertexCount === _vertexPoolLength ) { + + var vertex = new THREE.RenderableVertex(); + _vertexPool.push( vertex ); + _vertexPoolLength ++; + _vertexCount ++; + return vertex; + + } + + return _vertexPool[ _vertexCount ++ ]; + + } + + function getNextFaceInPool() { + + if ( _faceCount === _facePoolLength ) { + + var face = new THREE.RenderableFace(); + _facePool.push( face ); + _facePoolLength ++; + _faceCount ++; + return face; + + } + + return _facePool[ _faceCount ++ ]; + + + } + + function getNextLineInPool() { + + if ( _lineCount === _linePoolLength ) { + + var line = new THREE.RenderableLine(); + _linePool.push( line ); + _linePoolLength ++; + _lineCount ++; + return line; + + } + + return _linePool[ _lineCount ++ ]; + + } + + function getNextSpriteInPool() { + + if ( _spriteCount === _spritePoolLength ) { + + var sprite = new THREE.RenderableSprite(); + _spritePool.push( sprite ); + _spritePoolLength ++; + _spriteCount ++; + return sprite; + + } + + return _spritePool[ _spriteCount ++ ]; + + } + + // + + function painterSort( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.z !== b.z ) { + + return b.z - a.z; + + } else if ( a.id !== b.id ) { + + return a.id - b.id; + + } else { + + return 0; + + } + + } + + function clipLine( s1, s2 ) { + + var alpha1 = 0, alpha2 = 1, + + // Calculate the boundary coordinate of each vertex for the near and far clip planes, + // Z = -1 and Z = +1, respectively. + + bc1near = s1.z + s1.w, + bc2near = s2.z + s2.w, + bc1far = - s1.z + s1.w, + bc2far = - s2.z + s2.w; + + if ( bc1near >= 0 && bc2near >= 0 && bc1far >= 0 && bc2far >= 0 ) { + + // Both vertices lie entirely within all clip planes. + return true; + + } else if ( ( bc1near < 0 && bc2near < 0 ) || ( bc1far < 0 && bc2far < 0 ) ) { + + // Both vertices lie entirely outside one of the clip planes. + return false; + + } else { + + // The line segment spans at least one clip plane. + + if ( bc1near < 0 ) { + + // v1 lies outside the near plane, v2 inside + alpha1 = Math.max( alpha1, bc1near / ( bc1near - bc2near ) ); + + } else if ( bc2near < 0 ) { + + // v2 lies outside the near plane, v1 inside + alpha2 = Math.min( alpha2, bc1near / ( bc1near - bc2near ) ); + + } + + if ( bc1far < 0 ) { + + // v1 lies outside the far plane, v2 inside + alpha1 = Math.max( alpha1, bc1far / ( bc1far - bc2far ) ); + + } else if ( bc2far < 0 ) { + + // v2 lies outside the far plane, v2 inside + alpha2 = Math.min( alpha2, bc1far / ( bc1far - bc2far ) ); + + } + + if ( alpha2 < alpha1 ) { + + // The line segment spans two boundaries, but is outside both of them. + // (This can't happen when we're only clipping against just near/far but good + // to leave the check here for future usage if other clip planes are added.) + return false; + + } else { + + // Update the s1 and s2 vertices to match the clipped line segment. + s1.lerp( s2, alpha1 ); + s2.lerp( s1, 1 - alpha2 ); + + return true; + + } + + } + + } + +}; diff --git a/client-webgl/source.html b/client-webgl/source.html index 1ef0b90..da18a0e 100644 --- a/client-webgl/source.html +++ b/client-webgl/source.html @@ -32,6 +32,7 @@ + diff --git a/client-webgl/websocket-kinect.coffee b/client-webgl/websocket-kinect.coffee index 43992c8..cdfd5fe 100644 --- a/client-webgl/websocket-kinect.coffee +++ b/client-webgl/websocket-kinect.coffee @@ -1,9 +1,9 @@ $ -> - unless window.WebGLRenderingContext and document.createElement('canvas').getContext('experimental-webgl') and window.WebSocket and new WebSocket('ws://.').binaryType - # no point testing for plain 'webgl' context, because Three.js doesn't - $('#noWebGL').show() - return + #unless window.WebGLRenderingContext and document.createElement('canvas').getContext('experimental-webgl') and window.WebSocket and new WebSocket('ws://.').binaryType + # # no point testing for plain 'webgl' context, because Three.js doesn't + # $('#noWebGL').show() + # return params = stats: 0 @@ -32,7 +32,7 @@ $ -> h = inputH / useEvery Transform::t = Transform::transformPoint - v = (x, y, z) -> new THREE.Vertex(new THREE.Vector3(x, y, z)) + v = (x, y, z) -> new THREE.Vector3(x, y, z) renderer = new THREE.WebGLRenderer(antialias: true) camera = new THREE.PerspectiveCamera(60, 1, 1, 10000) # aspect (2nd param) shortly to be overridden... @@ -48,7 +48,7 @@ $ -> $(window).on('resize', setSize) document.body.appendChild(renderer.domElement) - renderer.setClearColorHex(bgColour, 1.0) + renderer.setClearColor(bgColour, 1.0) renderer.clear() projector = new THREE.Projector() @@ -56,7 +56,7 @@ $ -> scene.add(camera) scene.fog = new THREE.FogExp2(bgColour, 0.00033) if params.fog - pMaterial = new THREE.ParticleBasicMaterial(color: fgColour, size: useEvery * 3.5) + pMaterial = new THREE.PointsMaterial(color: fgColour, size: useEvery * 3.5) particles = new THREE.Geometry() for y in [0...h] for x in [0...w] @@ -66,7 +66,7 @@ $ -> particle.usualY = yc particles.vertices.push(particle) - particleSystem = new THREE.ParticleSystem(particles, pMaterial) + particleSystem = new THREE.Points(particles, pMaterial) scene.add(particleSystem) togglePlay = -> @@ -171,15 +171,16 @@ $ -> aByte = bytes[byteIdx] aByte = bytes[byteIdx] = (prevBytes[byteIdx] + aByte) % 256 unless keyFrame if aByte is 255 - pv.position.y = -5000 # = out of sight + pv.y = -5000 else - pv.position.y = pv.usualY + pv.y = pv.usualY depth = 128 - aByte - pv.position.z = depth * 10 + pv.z = depth * 10 pIdx += 1 byteIdx += 1 particleSystem.geometry.__dirtyVertices = yes + particleSystem.geometry.verticesNeedUpdate = true; connect = -> reconnectDelay = 10 diff --git a/client-webgl/websocket-kinect.js b/client-webgl/websocket-kinect.js index 4fbb92e..313fbdf 100644 --- a/client-webgl/websocket-kinect.js +++ b/client-webgl/websocket-kinect.js @@ -1,11 +1,7 @@ +// Generated by CoffeeScript 1.12.7 (function() { - $(function() { - var animate, bgColour, camT, camYRange, camZ, camZRange, camera, connect, currentOutArrayIdx, dataCallback, doCamPan, doCamZoom, down, drawControl, dvp, dynaPan, fgColour, h, i, inputH, inputW, k, kvp, outArrays, pLen, pMaterial, params, particle, particleSystem, particles, prevOutArrayIdx, projector, pvs, qbl, qbr, qtl, qtr, rawDataLen, renderer, scene, seenKeyFrame, setSize, startCamPan, stats, stopCamPan, sx, sy, togglePlay, useEvery, v, w, wls, x, xc, y, yc, _i, _len, _ref, _ref2, _ref3, _ref4; - if (!(window.WebGLRenderingContext && document.createElement('canvas').getContext('experimental-webgl') && window.WebSocket && new WebSocket('ws://.').binaryType)) { - $('#noWebGL').show(); - return; - } + var animate, bgColour, camT, camYRange, camZ, camZRange, camera, connect, currentOutArrayIdx, dataCallback, doCamPan, doCamZoom, down, drawControl, dvp, dynaPan, fgColour, h, i, inputH, inputW, j, k, kvp, l, len, m, outArrays, pLen, pMaterial, params, particle, particleSystem, particles, prevOutArrayIdx, projector, pvs, qbl, qbr, qtl, qtr, rawDataLen, ref, ref1, ref2, ref3, ref4, ref5, renderer, scene, seenKeyFrame, setSize, startCamPan, stats, stopCamPan, sx, sy, togglePlay, useEvery, v, w, wls, x, xc, y, yc; params = { stats: 0, fog: 1, @@ -13,13 +9,15 @@ ws: "ws://" + window.location.host }; wls = window.location.search; - _ref = wls.substring(1).split('&'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - kvp = _ref[_i]; - _ref2 = kvp.split('='), k = _ref2[0], v = _ref2[1]; + ref = wls.substring(1).split('&'); + for (j = 0, len = ref.length; j < len; j++) { + kvp = ref[j]; + ref1 = kvp.split('='), k = ref1[0], v = ref1[1]; params[k] = k === 'ws' ? v : parseInt(v); } - if (params.credits) $('#creditOuter').show(); + if (params.credits) { + $('#creditOuter').show(); + } if (params.stats) { stats = new Stats(); stats.domElement.id = 'stats'; @@ -34,13 +32,13 @@ h = inputH / useEvery; Transform.prototype.t = Transform.prototype.transformPoint; v = function(x, y, z) { - return new THREE.Vertex(new THREE.Vector3(x, y, z)); + return new THREE.Vector3(x, y, z); }; renderer = new THREE.WebGLRenderer({ antialias: true }); camera = new THREE.PerspectiveCamera(60, 1, 1, 10000); - dvp = (_ref3 = window.devicePixelRatio) != null ? _ref3 : 1; + dvp = (ref2 = window.devicePixelRatio) != null ? ref2 : 1; setSize = function() { renderer.setSize(window.innerWidth * dvp, window.innerHeight * dvp); renderer.domElement.style.width = window.innerWidth + 'px'; @@ -51,19 +49,21 @@ setSize(); $(window).on('resize', setSize); document.body.appendChild(renderer.domElement); - renderer.setClearColorHex(bgColour, 1.0); + renderer.setClearColor(bgColour, 1.0); renderer.clear(); projector = new THREE.Projector(); scene = new THREE.Scene(); scene.add(camera); - if (params.fog) scene.fog = new THREE.FogExp2(bgColour, 0.00033); - pMaterial = new THREE.ParticleBasicMaterial({ + if (params.fog) { + scene.fog = new THREE.FogExp2(bgColour, 0.00033); + } + pMaterial = new THREE.PointsMaterial({ color: fgColour, size: useEvery * 3.5 }); particles = new THREE.Geometry(); - for (y = 0; 0 <= h ? y < h : y > h; 0 <= h ? y++ : y--) { - for (x = 0; 0 <= w ? x < w : x > w; 0 <= w ? x++ : x--) { + for (y = l = 0, ref3 = h; 0 <= ref3 ? l < ref3 : l > ref3; y = 0 <= ref3 ? ++l : --l) { + for (x = m = 0, ref4 = w; 0 <= ref4 ? m < ref4 : m > ref4; x = 0 <= ref4 ? ++m : --m) { xc = (x - (w / 2)) * useEvery * 2; yc = ((h / 2) - y) * useEvery * 2; particle = v(xc, yc, 0); @@ -71,7 +71,7 @@ particles.vertices.push(particle); } } - particleSystem = new THREE.ParticleSystem(particles, pMaterial); + particleSystem = new THREE.Points(particles, pMaterial); scene.add(particleSystem); togglePlay = function() {}; drawControl = function(playing) { @@ -98,13 +98,15 @@ camYRange = [-600, 600]; camT = new Transform(); animate = function() { - var _ref4; + var ref5; renderer.clear(); - _ref4 = camT.t(0.01 * camZ * dynaPan, camZ), camera.position.x = _ref4[0], camera.position.z = _ref4[1]; + ref5 = camT.t(0.01 * camZ * dynaPan, camZ), camera.position.x = ref5[0], camera.position.z = ref5[1]; camera.lookAt(scene.position); renderer.render(scene, camera); window.requestAnimationFrame(animate, renderer.domElement); - if (params.stats) return stats.update(); + if (params.stats) { + return stats.update(); + } }; animate(); startCamPan = function(ev) { @@ -126,8 +128,12 @@ camT.rotate(rotation); camY = camera.position.y; camY += dy * 3; - if (camY < camYRange[0]) camY = camYRange[0]; - if (camY > camYRange[1]) camY = camYRange[1]; + if (camY < camYRange[0]) { + camY = camYRange[0]; + } + if (camY > camYRange[1]) { + camY = camYRange[1]; + } camera.position.y = camY; sx += dx; return sy += dy; @@ -143,51 +149,55 @@ seenKeyFrame = null; qtl = qtr = qbl = qbr = null; pvs = particles.vertices; + console.log(pvs); pLen = pvs.length; rawDataLen = 5 + pLen; outArrays = (function() { - var _results; - _results = []; - for (i = 0; i <= 1; i++) { - _results.push(new Uint8Array(new ArrayBuffer(rawDataLen))); + var n, results; + results = []; + for (i = n = 0; n <= 1; i = ++n) { + results.push(new Uint8Array(new ArrayBuffer(rawDataLen))); } - return _results; + return results; })(); - _ref4 = [0, 1], currentOutArrayIdx = _ref4[0], prevOutArrayIdx = _ref4[1]; + ref5 = [0, 1], currentOutArrayIdx = ref5[0], prevOutArrayIdx = ref5[1]; dataCallback = function(e) { - var aByte, byteIdx, bytes, depth, inStream, keyFrame, outStream, pIdx, prevBytes, pv, x, y, _ref5, _ref6; - _ref5 = [prevOutArrayIdx, currentOutArrayIdx], currentOutArrayIdx = _ref5[0], prevOutArrayIdx = _ref5[1]; + var aByte, byteIdx, bytes, depth, inStream, keyFrame, n, o, outStream, pIdx, prevBytes, pv, ref6, ref7, ref8, ref9; + ref6 = [prevOutArrayIdx, currentOutArrayIdx], currentOutArrayIdx = ref6[0], prevOutArrayIdx = ref6[1]; inStream = LZMA.wrapArrayBuffer(new Uint8Array(e.data)); outStream = LZMA.wrapArrayBuffer(outArrays[currentOutArrayIdx]); LZMA.decompress(inStream, inStream, outStream, rawDataLen); bytes = outStream.data; prevBytes = outArrays[prevOutArrayIdx]; keyFrame = bytes[0]; - if (!(keyFrame || seenKeyFrame)) return; + if (!(keyFrame || seenKeyFrame)) { + return; + } seenKeyFrame = true; - _ref6 = [bytes[1], bytes[2], bytes[3], bytes[4]], qtl = _ref6[0], qtr = _ref6[1], qbl = _ref6[2], qbr = _ref6[3]; + ref7 = [bytes[1], bytes[2], bytes[3], bytes[4]], qtl = ref7[0], qtr = ref7[1], qbl = ref7[2], qbr = ref7[3]; dynaPan = dynaPan * 0.9 + ((qtr + qbr) - (qtl + qbl)) * 0.1; pIdx = 0; byteIdx = 5; - for (y = 0; 0 <= h ? y < h : y > h; 0 <= h ? y++ : y--) { - for (x = 0; 0 <= w ? x < w : x > w; 0 <= w ? x++ : x--) { + for (y = n = 0, ref8 = h; 0 <= ref8 ? n < ref8 : n > ref8; y = 0 <= ref8 ? ++n : --n) { + for (x = o = 0, ref9 = w; 0 <= ref9 ? o < ref9 : o > ref9; x = 0 <= ref9 ? ++o : --o) { pv = pvs[pIdx]; aByte = bytes[byteIdx]; if (!keyFrame) { aByte = bytes[byteIdx] = (prevBytes[byteIdx] + aByte) % 256; } if (aByte === 255) { - pv.position.y = -5000; + pv.y = -5000; } else { - pv.position.y = pv.usualY; + pv.y = pv.usualY; depth = 128 - aByte; - pv.position.z = depth * 10; + pv.z = depth * 10; } pIdx += 1; byteIdx += 1; } } - return particleSystem.geometry.__dirtyVertices = true; + particleSystem.geometry.__dirtyVertices = true; + return particleSystem.geometry.verticesNeedUpdate = true; }; connect = function() { var reconnectDelay, ws; diff --git a/deploy/index.html b/deploy/index.html index 251f66b..8efeb67 100644 --- a/deploy/index.html +++ b/deploy/index.html @@ -33,18 +33,256 @@ {for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); + diff --git a/server/INSTALL.txt b/server/INSTALL.txt index 9decfb8..67b1041 100644 --- a/server/INSTALL.txt +++ b/server/INSTALL.txt @@ -18,6 +18,8 @@ sudo pip install twisted sudo pip install --upgrade pyopenssl sudo pip install service_identity +## Sierra probably also needs XQuartz installed so that X11 is on the system + cd /usr/local/Library/Formula curl --insecure -O https://raw.github.com/OpenKinect/libfreenect/master/platform/osx/homebrew/libfreenect.rb curl --insecure -O https://raw.github.com/OpenKinect/libfreenect/master/platform/osx/homebrew/libusb-freenect.rb diff --git a/server/websocket-kinect.py b/server/websocket-kinect.py index d773b19..6f57150 100755 --- a/server/websocket-kinect.py +++ b/server/websocket-kinect.py @@ -3,7 +3,7 @@ import sys, signal, numpy, freenect, pylzma from twisted.internet import reactor, threads, ssl from twisted.web.client import WebClientContextFactory -from autobahn.twisted.websocket import WebSocketServerFactory, WebSocketServerProtocol, listenWS, WebSocketClientFactory, WebSocketClientProtocol, connectWS +from autobahn.websocket import WebSocketServerFactory, WebSocketServerProtocol, listenWS, WebSocketClientFactory, WebSocketClientProtocol, connectWS class SendClientProtocol(WebSocketClientProtocol): From 7594d5979285a8092465022ef4c722a79b918288 Mon Sep 17 00:00:00 2001 From: Prophesi Date: Thu, 21 Sep 2017 14:39:53 -0400 Subject: [PATCH 5/6] uncomment compression. add closure compiler as npm dependency. add some logging. --- deploy/forwarding.coffee | 4 +- deploy/index.html | 2472 ----------- deploy/index.html.gz | Bin 0 -> 173221 bytes deploy/node_modules/.bin/cake | 1 + deploy/node_modules/.bin/coffee | 1 + deploy/node_modules/coffee-script/LICENSE | 22 + deploy/node_modules/coffee-script/README.md | 57 + deploy/node_modules/coffee-script/bin/cake | 18 + deploy/node_modules/coffee-script/bin/coffee | 18 + .../lib/coffee-script/browser.js | 132 + .../coffee-script/lib/coffee-script/cake.js | 114 + .../lib/coffee-script/coffee-script.js | 426 ++ .../lib/coffee-script/command.js | 610 +++ .../lib/coffee-script/grammar.js | 816 ++++ .../lib/coffee-script/helpers.js | 249 ++ .../coffee-script/lib/coffee-script/index.js | 11 + .../coffee-script/lib/coffee-script/lexer.js | 1166 +++++ .../coffee-script/lib/coffee-script/nodes.js | 3899 +++++++++++++++++ .../lib/coffee-script/optparse.js | 139 + .../coffee-script/lib/coffee-script/parser.js | 891 ++++ .../lib/coffee-script/register.js | 66 + .../coffee-script/lib/coffee-script/repl.js | 203 + .../lib/coffee-script/rewriter.js | 537 +++ .../coffee-script/lib/coffee-script/scope.js | 165 + .../lib/coffee-script/sourcemap.js | 161 + .../node_modules/coffee-script/package.json | 77 + deploy/node_modules/coffee-script/register.js | 1 + deploy/node_modules/coffee-script/repl.js | 1 + deploy/node_modules/debug/.coveralls.yml | 1 + deploy/node_modules/debug/.eslintrc | 11 + deploy/node_modules/debug/.npmignore | 9 + deploy/node_modules/debug/.travis.yml | 14 + deploy/node_modules/debug/CHANGELOG.md | 357 ++ deploy/node_modules/debug/LICENSE | 19 + deploy/node_modules/debug/Makefile | 50 + deploy/node_modules/debug/README.md | 312 ++ deploy/node_modules/debug/component.json | 19 + deploy/node_modules/debug/karma.conf.js | 70 + deploy/node_modules/debug/node.js | 1 + deploy/node_modules/debug/package.json | 88 + deploy/node_modules/debug/src/browser.js | 185 + deploy/node_modules/debug/src/debug.js | 202 + deploy/node_modules/debug/src/index.js | 10 + deploy/node_modules/debug/src/node.js | 246 ++ deploy/node_modules/inherits/LICENSE | 16 + deploy/node_modules/inherits/README.md | 42 + deploy/node_modules/inherits/inherits.js | 1 + .../node_modules/inherits/inherits_browser.js | 23 + deploy/node_modules/inherits/package.json | 54 + deploy/node_modules/inherits/test.js | 25 + deploy/node_modules/is-typedarray/LICENSE.md | 18 + deploy/node_modules/is-typedarray/README.md | 16 + deploy/node_modules/is-typedarray/index.js | 41 + .../node_modules/is-typedarray/package.json | 59 + deploy/node_modules/is-typedarray/test.js | 34 + deploy/node_modules/ms/index.js | 152 + deploy/node_modules/ms/license.md | 21 + deploy/node_modules/ms/package.json | 69 + deploy/node_modules/ms/readme.md | 51 + deploy/node_modules/nan/CHANGELOG.md | 458 ++ deploy/node_modules/nan/LICENSE.md | 13 + deploy/node_modules/nan/README.md | 424 ++ deploy/node_modules/nan/doc/asyncworker.md | 104 + deploy/node_modules/nan/doc/buffers.md | 54 + deploy/node_modules/nan/doc/callback.md | 56 + deploy/node_modules/nan/doc/converters.md | 41 + deploy/node_modules/nan/doc/errors.md | 226 + deploy/node_modules/nan/doc/json.md | 62 + deploy/node_modules/nan/doc/maybe_types.md | 560 +++ deploy/node_modules/nan/doc/methods.md | 659 +++ deploy/node_modules/nan/doc/new.md | 147 + deploy/node_modules/nan/doc/node_misc.md | 63 + .../node_modules/nan/doc/object_wrappers.md | 263 ++ deploy/node_modules/nan/doc/persistent.md | 295 ++ deploy/node_modules/nan/doc/scopes.md | 73 + deploy/node_modules/nan/doc/script.md | 38 + deploy/node_modules/nan/doc/string_bytes.md | 62 + deploy/node_modules/nan/doc/v8_internals.md | 199 + deploy/node_modules/nan/doc/v8_misc.md | 85 + deploy/node_modules/nan/include_dirs.js | 1 + deploy/node_modules/nan/nan.h | 2321 ++++++++++ deploy/node_modules/nan/nan_callbacks.h | 88 + .../node_modules/nan/nan_callbacks_12_inl.h | 512 +++ .../nan/nan_callbacks_pre_12_inl.h | 520 +++ deploy/node_modules/nan/nan_converters.h | 72 + .../node_modules/nan/nan_converters_43_inl.h | 48 + .../nan/nan_converters_pre_43_inl.h | 42 + .../nan/nan_implementation_12_inl.h | 399 ++ .../nan/nan_implementation_pre_12_inl.h | 263 ++ deploy/node_modules/nan/nan_json.h | 159 + deploy/node_modules/nan/nan_maybe_43_inl.h | 337 ++ .../node_modules/nan/nan_maybe_pre_43_inl.h | 305 ++ deploy/node_modules/nan/nan_new.h | 340 ++ deploy/node_modules/nan/nan_object_wrap.h | 155 + .../node_modules/nan/nan_persistent_12_inl.h | 132 + .../nan/nan_persistent_pre_12_inl.h | 242 + deploy/node_modules/nan/nan_private.h | 73 + deploy/node_modules/nan/nan_string_bytes.h | 305 ++ .../nan/nan_typedarray_contents.h | 90 + deploy/node_modules/nan/nan_weak.h | 432 ++ deploy/node_modules/nan/package.json | 96 + deploy/node_modules/nan/tools/1to2.js | 412 ++ deploy/node_modules/nan/tools/README.md | 14 + deploy/node_modules/nan/tools/package.json | 19 + .../typedarray-to-buffer/.travis.yml | 7 + .../typedarray-to-buffer/.zuul.yml | 20 + .../node_modules/typedarray-to-buffer/LICENSE | 21 + .../typedarray-to-buffer/README.md | 81 + .../typedarray-to-buffer/index.js | 25 + .../typedarray-to-buffer/package.json | 75 + .../typedarray-to-buffer/test/basic.js | 50 + deploy/node_modules/util/.npmignore | 1 + deploy/node_modules/util/.travis.yml | 8 + deploy/node_modules/util/.zuul.yml | 10 + deploy/node_modules/util/LICENSE | 18 + deploy/node_modules/util/README.md | 15 + deploy/node_modules/util/package.json | 60 + deploy/node_modules/util/support/isBuffer.js | 3 + .../util/support/isBufferBrowser.js | 6 + .../node_modules/util/test/browser/inspect.js | 41 + deploy/node_modules/util/test/browser/is.js | 91 + deploy/node_modules/util/test/node/debug.js | 86 + deploy/node_modules/util/test/node/format.js | 77 + deploy/node_modules/util/test/node/inspect.js | 195 + deploy/node_modules/util/test/node/log.js | 58 + deploy/node_modules/util/test/node/util.js | 83 + deploy/node_modules/util/util.js | 586 +++ deploy/node_modules/websocket/.jshintrc | 88 + deploy/node_modules/websocket/CHANGELOG.md | 213 + deploy/node_modules/websocket/LICENSE | 177 + deploy/node_modules/websocket/Makefile | 11 + deploy/node_modules/websocket/README.md | 314 ++ deploy/node_modules/websocket/binding.gyp | 18 + deploy/node_modules/websocket/build/Makefile | 347 ++ .../Release/.deps/Release/bufferutil.node.d | 1 + .../obj.target/bufferutil/src/bufferutil.o.d | 52 + .../obj.target/validation/src/validation.o.d | 52 + .../Release/.deps/Release/validation.node.d | 1 + .../websocket/build/Release/bufferutil.node | Bin 0 -> 22764 bytes .../obj.target/bufferutil/src/bufferutil.o | Bin 0 -> 227176 bytes .../obj.target/validation/src/validation.o | Bin 0 -> 222752 bytes .../websocket/build/Release/validation.node | Bin 0 -> 22692 bytes .../websocket/build/binding.Makefile | 6 + .../websocket/build/bufferutil.target.mk | 180 + .../node_modules/websocket/build/config.gypi | 170 + .../node_modules/websocket/build/gyp-mac-tool | 611 +++ .../websocket/build/validation.target.mk | 180 + deploy/node_modules/websocket/builderror.log | 0 deploy/node_modules/websocket/gulpfile.js | 14 + deploy/node_modules/websocket/index.js | 1 + .../websocket/lib/BufferUtil.fallback.js | 52 + .../node_modules/websocket/lib/BufferUtil.js | 17 + .../node_modules/websocket/lib/Deprecation.js | 32 + .../websocket/lib/Validation.fallback.js | 12 + .../node_modules/websocket/lib/Validation.js | 17 + .../websocket/lib/W3CWebSocket.js | 257 ++ .../websocket/lib/WebSocketClient.js | 348 ++ .../websocket/lib/WebSocketConnection.js | 889 ++++ .../websocket/lib/WebSocketFrame.js | 279 ++ .../websocket/lib/WebSocketRequest.js | 524 +++ .../websocket/lib/WebSocketRouter.js | 157 + .../websocket/lib/WebSocketRouterRequest.js | 54 + .../websocket/lib/WebSocketServer.js | 245 ++ deploy/node_modules/websocket/lib/browser.js | 36 + deploy/node_modules/websocket/lib/utils.js | 60 + deploy/node_modules/websocket/lib/version.js | 1 + .../node_modules/websocket/lib/websocket.js | 11 + deploy/node_modules/websocket/package.json | 94 + .../node_modules/websocket/src/bufferutil.cc | 121 + .../node_modules/websocket/src/validation.cc | 148 + .../websocket/vendor/FastBufferList.js | 193 + deploy/node_modules/yaeti/.jscsrc | 6 + deploy/node_modules/yaeti/.jshintrc | 27 + deploy/node_modules/yaeti/.npmignore | 1 + deploy/node_modules/yaeti/LICENSE | 21 + deploy/node_modules/yaeti/README.md | 98 + deploy/node_modules/yaeti/gulpfile.js | 23 + deploy/node_modules/yaeti/index.js | 4 + .../node_modules/yaeti/lib/Event.browser.js | 5 + deploy/node_modules/yaeti/lib/Event.js | 13 + deploy/node_modules/yaeti/lib/EventTarget.js | 119 + deploy/node_modules/yaeti/package.json | 57 + deploy/package-lock.json | 75 + deploy/package.json | 17 +- 184 files changed, 31322 insertions(+), 2476 deletions(-) delete mode 100644 deploy/index.html create mode 100644 deploy/index.html.gz create mode 120000 deploy/node_modules/.bin/cake create mode 120000 deploy/node_modules/.bin/coffee create mode 100644 deploy/node_modules/coffee-script/LICENSE create mode 100644 deploy/node_modules/coffee-script/README.md create mode 100755 deploy/node_modules/coffee-script/bin/cake create mode 100755 deploy/node_modules/coffee-script/bin/coffee create mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/browser.js create mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/cake.js create mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/coffee-script.js create mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/command.js create mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/grammar.js create mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/helpers.js create mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/index.js create mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/lexer.js create mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/nodes.js create mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/optparse.js create mode 100755 deploy/node_modules/coffee-script/lib/coffee-script/parser.js create mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/register.js create mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/repl.js create mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/rewriter.js create mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/scope.js create mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/sourcemap.js create mode 100644 deploy/node_modules/coffee-script/package.json create mode 100644 deploy/node_modules/coffee-script/register.js create mode 100644 deploy/node_modules/coffee-script/repl.js create mode 100644 deploy/node_modules/debug/.coveralls.yml create mode 100644 deploy/node_modules/debug/.eslintrc create mode 100644 deploy/node_modules/debug/.npmignore create mode 100644 deploy/node_modules/debug/.travis.yml create mode 100644 deploy/node_modules/debug/CHANGELOG.md create mode 100644 deploy/node_modules/debug/LICENSE create mode 100644 deploy/node_modules/debug/Makefile create mode 100644 deploy/node_modules/debug/README.md create mode 100644 deploy/node_modules/debug/component.json create mode 100644 deploy/node_modules/debug/karma.conf.js create mode 100644 deploy/node_modules/debug/node.js create mode 100644 deploy/node_modules/debug/package.json create mode 100644 deploy/node_modules/debug/src/browser.js create mode 100644 deploy/node_modules/debug/src/debug.js create mode 100644 deploy/node_modules/debug/src/index.js create mode 100644 deploy/node_modules/debug/src/node.js create mode 100644 deploy/node_modules/inherits/LICENSE create mode 100644 deploy/node_modules/inherits/README.md create mode 100644 deploy/node_modules/inherits/inherits.js create mode 100644 deploy/node_modules/inherits/inherits_browser.js create mode 100644 deploy/node_modules/inherits/package.json create mode 100644 deploy/node_modules/inherits/test.js create mode 100644 deploy/node_modules/is-typedarray/LICENSE.md create mode 100644 deploy/node_modules/is-typedarray/README.md create mode 100644 deploy/node_modules/is-typedarray/index.js create mode 100644 deploy/node_modules/is-typedarray/package.json create mode 100644 deploy/node_modules/is-typedarray/test.js create mode 100644 deploy/node_modules/ms/index.js create mode 100644 deploy/node_modules/ms/license.md create mode 100644 deploy/node_modules/ms/package.json create mode 100644 deploy/node_modules/ms/readme.md create mode 100644 deploy/node_modules/nan/CHANGELOG.md create mode 100644 deploy/node_modules/nan/LICENSE.md create mode 100644 deploy/node_modules/nan/README.md create mode 100644 deploy/node_modules/nan/doc/asyncworker.md create mode 100644 deploy/node_modules/nan/doc/buffers.md create mode 100644 deploy/node_modules/nan/doc/callback.md create mode 100644 deploy/node_modules/nan/doc/converters.md create mode 100644 deploy/node_modules/nan/doc/errors.md create mode 100644 deploy/node_modules/nan/doc/json.md create mode 100644 deploy/node_modules/nan/doc/maybe_types.md create mode 100644 deploy/node_modules/nan/doc/methods.md create mode 100644 deploy/node_modules/nan/doc/new.md create mode 100644 deploy/node_modules/nan/doc/node_misc.md create mode 100644 deploy/node_modules/nan/doc/object_wrappers.md create mode 100644 deploy/node_modules/nan/doc/persistent.md create mode 100644 deploy/node_modules/nan/doc/scopes.md create mode 100644 deploy/node_modules/nan/doc/script.md create mode 100644 deploy/node_modules/nan/doc/string_bytes.md create mode 100644 deploy/node_modules/nan/doc/v8_internals.md create mode 100644 deploy/node_modules/nan/doc/v8_misc.md create mode 100644 deploy/node_modules/nan/include_dirs.js create mode 100644 deploy/node_modules/nan/nan.h create mode 100644 deploy/node_modules/nan/nan_callbacks.h create mode 100644 deploy/node_modules/nan/nan_callbacks_12_inl.h create mode 100644 deploy/node_modules/nan/nan_callbacks_pre_12_inl.h create mode 100644 deploy/node_modules/nan/nan_converters.h create mode 100644 deploy/node_modules/nan/nan_converters_43_inl.h create mode 100644 deploy/node_modules/nan/nan_converters_pre_43_inl.h create mode 100644 deploy/node_modules/nan/nan_implementation_12_inl.h create mode 100644 deploy/node_modules/nan/nan_implementation_pre_12_inl.h create mode 100644 deploy/node_modules/nan/nan_json.h create mode 100644 deploy/node_modules/nan/nan_maybe_43_inl.h create mode 100644 deploy/node_modules/nan/nan_maybe_pre_43_inl.h create mode 100644 deploy/node_modules/nan/nan_new.h create mode 100644 deploy/node_modules/nan/nan_object_wrap.h create mode 100644 deploy/node_modules/nan/nan_persistent_12_inl.h create mode 100644 deploy/node_modules/nan/nan_persistent_pre_12_inl.h create mode 100644 deploy/node_modules/nan/nan_private.h create mode 100644 deploy/node_modules/nan/nan_string_bytes.h create mode 100644 deploy/node_modules/nan/nan_typedarray_contents.h create mode 100644 deploy/node_modules/nan/nan_weak.h create mode 100644 deploy/node_modules/nan/package.json create mode 100755 deploy/node_modules/nan/tools/1to2.js create mode 100644 deploy/node_modules/nan/tools/README.md create mode 100644 deploy/node_modules/nan/tools/package.json create mode 100644 deploy/node_modules/typedarray-to-buffer/.travis.yml create mode 100644 deploy/node_modules/typedarray-to-buffer/.zuul.yml create mode 100644 deploy/node_modules/typedarray-to-buffer/LICENSE create mode 100644 deploy/node_modules/typedarray-to-buffer/README.md create mode 100644 deploy/node_modules/typedarray-to-buffer/index.js create mode 100644 deploy/node_modules/typedarray-to-buffer/package.json create mode 100644 deploy/node_modules/typedarray-to-buffer/test/basic.js create mode 100644 deploy/node_modules/util/.npmignore create mode 100644 deploy/node_modules/util/.travis.yml create mode 100644 deploy/node_modules/util/.zuul.yml create mode 100644 deploy/node_modules/util/LICENSE create mode 100644 deploy/node_modules/util/README.md create mode 100644 deploy/node_modules/util/package.json create mode 100644 deploy/node_modules/util/support/isBuffer.js create mode 100644 deploy/node_modules/util/support/isBufferBrowser.js create mode 100644 deploy/node_modules/util/test/browser/inspect.js create mode 100644 deploy/node_modules/util/test/browser/is.js create mode 100644 deploy/node_modules/util/test/node/debug.js create mode 100644 deploy/node_modules/util/test/node/format.js create mode 100644 deploy/node_modules/util/test/node/inspect.js create mode 100644 deploy/node_modules/util/test/node/log.js create mode 100644 deploy/node_modules/util/test/node/util.js create mode 100644 deploy/node_modules/util/util.js create mode 100644 deploy/node_modules/websocket/.jshintrc create mode 100644 deploy/node_modules/websocket/CHANGELOG.md create mode 100644 deploy/node_modules/websocket/LICENSE create mode 100644 deploy/node_modules/websocket/Makefile create mode 100644 deploy/node_modules/websocket/README.md create mode 100644 deploy/node_modules/websocket/binding.gyp create mode 100644 deploy/node_modules/websocket/build/Makefile create mode 100644 deploy/node_modules/websocket/build/Release/.deps/Release/bufferutil.node.d create mode 100644 deploy/node_modules/websocket/build/Release/.deps/Release/obj.target/bufferutil/src/bufferutil.o.d create mode 100644 deploy/node_modules/websocket/build/Release/.deps/Release/obj.target/validation/src/validation.o.d create mode 100644 deploy/node_modules/websocket/build/Release/.deps/Release/validation.node.d create mode 100755 deploy/node_modules/websocket/build/Release/bufferutil.node create mode 100644 deploy/node_modules/websocket/build/Release/obj.target/bufferutil/src/bufferutil.o create mode 100644 deploy/node_modules/websocket/build/Release/obj.target/validation/src/validation.o create mode 100755 deploy/node_modules/websocket/build/Release/validation.node create mode 100644 deploy/node_modules/websocket/build/binding.Makefile create mode 100644 deploy/node_modules/websocket/build/bufferutil.target.mk create mode 100644 deploy/node_modules/websocket/build/config.gypi create mode 100755 deploy/node_modules/websocket/build/gyp-mac-tool create mode 100644 deploy/node_modules/websocket/build/validation.target.mk create mode 100644 deploy/node_modules/websocket/builderror.log create mode 100644 deploy/node_modules/websocket/gulpfile.js create mode 100644 deploy/node_modules/websocket/index.js create mode 100644 deploy/node_modules/websocket/lib/BufferUtil.fallback.js create mode 100644 deploy/node_modules/websocket/lib/BufferUtil.js create mode 100644 deploy/node_modules/websocket/lib/Deprecation.js create mode 100644 deploy/node_modules/websocket/lib/Validation.fallback.js create mode 100644 deploy/node_modules/websocket/lib/Validation.js create mode 100644 deploy/node_modules/websocket/lib/W3CWebSocket.js create mode 100644 deploy/node_modules/websocket/lib/WebSocketClient.js create mode 100644 deploy/node_modules/websocket/lib/WebSocketConnection.js create mode 100644 deploy/node_modules/websocket/lib/WebSocketFrame.js create mode 100644 deploy/node_modules/websocket/lib/WebSocketRequest.js create mode 100644 deploy/node_modules/websocket/lib/WebSocketRouter.js create mode 100644 deploy/node_modules/websocket/lib/WebSocketRouterRequest.js create mode 100644 deploy/node_modules/websocket/lib/WebSocketServer.js create mode 100644 deploy/node_modules/websocket/lib/browser.js create mode 100644 deploy/node_modules/websocket/lib/utils.js create mode 100644 deploy/node_modules/websocket/lib/version.js create mode 100644 deploy/node_modules/websocket/lib/websocket.js create mode 100644 deploy/node_modules/websocket/package.json create mode 100644 deploy/node_modules/websocket/src/bufferutil.cc create mode 100644 deploy/node_modules/websocket/src/validation.cc create mode 100644 deploy/node_modules/websocket/vendor/FastBufferList.js create mode 100644 deploy/node_modules/yaeti/.jscsrc create mode 100644 deploy/node_modules/yaeti/.jshintrc create mode 100644 deploy/node_modules/yaeti/.npmignore create mode 100644 deploy/node_modules/yaeti/LICENSE create mode 100644 deploy/node_modules/yaeti/README.md create mode 100644 deploy/node_modules/yaeti/gulpfile.js create mode 100644 deploy/node_modules/yaeti/index.js create mode 100644 deploy/node_modules/yaeti/lib/Event.browser.js create mode 100644 deploy/node_modules/yaeti/lib/Event.js create mode 100644 deploy/node_modules/yaeti/lib/EventTarget.js create mode 100644 deploy/node_modules/yaeti/package.json create mode 100644 deploy/package-lock.json diff --git a/deploy/forwarding.coffee b/deploy/forwarding.coffee index 542c0e0..94b1c1f 100755 --- a/deploy/forwarding.coffee +++ b/deploy/forwarding.coffee @@ -6,7 +6,7 @@ # - read index.html.gz from /app # changes for cloudno.de: as Nodester, except index.html.gz can be read from local dir - +util = require('util') sendingAddress = process.argv[2] # first argument -- e.g. '127.0.0.1' port = parseInt(process.argv[3]) # second argument -- e.g. 10000 https = process.argv[4] is 'https' # third arg -- 'https' or not @@ -43,6 +43,8 @@ wsServer.on 'request', (request) -> return connection = request.accept(null, request.origin) log "connected: #{connection.remoteAddress}\x07" + # Use this to figure out what you need to enter for your sendingAddress argument + # log (console.log(util.inspect(connection, {showHidden: false, depth: null}))) if connection.remoteAddress is sendingAddress connection.on 'message', (message) -> for c in wsServer.connections diff --git a/deploy/index.html b/deploy/index.html deleted file mode 100644 index 8efeb67..0000000 --- a/deploy/index.html +++ /dev/null @@ -1,2472 +0,0 @@ - - - - - - -webkinect - - - - - - - - - - - -
- for this you need: (1) a recent, decent Mac or PC - and (2) Chrome, Firefox 11.0b, or another web browser that has WebGL and binary WebSockets -
-
- responds to: - click + drag - — scroll-wheel - — made by: - George MacKerron - of CASA - – blog post - – GitHub - – HN -
- - - \ No newline at end of file diff --git a/deploy/index.html.gz b/deploy/index.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..3a30fdfc73c0a9579b7d53fac9c1da95c289424e GIT binary patch literal 173221 zcmV(sK<&RDiwFP!000021H`@ie%nT}F8Y6-f<&@pz-*C{Gg%iq%1ok*Rz~wIZt-#tLknvKuGb-+54Q#SOgk<@9OHR>bhLDU;Xs*?caa? zrZwF!7tcStGCz5o(a$p9$Mj{tInQryi}#WDa=qH;tNr=gkDJ_UrScYe`~1Vchob#f zI*qrxd>`HJ$LIgWS-G262{yyJ+ z+)s_t2=&%S*A%@XCJAL%Xm8}R$=R+-`d1kM$^a7 z$$FdRTYg;A#Euv1yRbDavMgWqTX#japN6f=i;I8hx28GzW8RWDolmyw+f^2}KEJql zhW0++?c@DUwLVX`c~uqBtuaB|`8Zw{3##DTeDOZt7immTClmVl zcs#B*P8C&#Ty2oP@?6KXFf^Dgrb9P_=?`_gRH*Ei^Yu&qs_Xwss*fqlNq?xwcD*6yC{-fZ+3G_d$PMMR^8d|v)NozFqA9N+{!Sh`XD3OE^bLgzd{?S?hb$T8#a6Iv>WP z;QoEQZ6#6K#b!}iH1@qKuM>B?=U&i_H=BHwy9z5Ke%9UQOPWkS z=u?I0iHG&_4hMerg8OuFIQZ#;swZfQ_xU%Ad`bQCy<)tLm$?_HbkXIpg9X1ji+d|Dgf&g0`(uCH&Es_H zr#BdV8t>8S;-fztDN5P_2nn+$L7*%Q(wYr%u8gAi81zjuP7`}%*+z+zw4)?C&E6Kv ze0{t3)4jSVi*9LPD+1fVDKMh~`|U>q+^hVq6?b3I$M^Z)eoAJv>3r{pBHgZc>+!z( zw;#U$_U+rBJsN$yr_s;=k4|MpQ)MVa2iu?NM9z2n=7K3rRvO&X-ii0|>taD@(0dx`|EqP+_4H&MbPSfihLa6gOIT>{dA)~V(3Zk*9@sV&;?`U$O4xqLVq zUXG-Gu5J_DuPJpsQftc9z8I{cO}ODl8sREh2mOTh%=}3IwO40n?akR4f$?@r&3iwt zTQb}oR&cx}wCZ)1v`c8i5G+$G%4-qD;}J-&+Pcm(S`Aiy8iX5vO+P_!JT|~}0%%Z~ zY@S@^75HMO#+CJ+(AzfOZPtXoUl;iz+hOgoalVLF$(Sj7TICr#> zbAMdU(73ys7Gv5|idH&GsKAu!U(!xOYlOGDlYIYY-Q2fCZxTp)x@YHr5gI9GbsE^l z^8m=0nmaqg-|n6^0DY&ErF*-Q)(SJnloOpnUxQhMM~0GnTUjP&1-{@|abT_BHN}S! z;Gxhp&I#eqqarxYqS@iVEzIaUtp&1TDNQG47Dr^m*~s0PF|e2{20BPb-;3=w{z&^b z&NC5got~W~?PztoSe%{dijuM-o_7WrOji=vMsuz%8RjFdQR>SWKbJ#Ieia{W}~*ij6b1gq6!FLeBh%Xp!WzF zs9oMZ9|&MFzkQ)FGfw+o2-H*4V>KZViN=6A3+=#RlW2mb)nqsx(S~9aNI*(&gz_%b zESe6c8u5h}gnD8C@>{jwzV?f&8Fi4LqK#9V5Z@x25>)!!XrT0jE-GlQP1z^I#b~gI zlF)a$V_|0zDEd}*enFk5jiB2hq%k23<`KC0m28xTj0Wx&&P4pTOKg>}MQdZ$yzO=| zjS`jc4(@9ZeQgR6hLQD*k}9&+7&G}9r~L)Zt359mfyjL2SCf8D(=;WFL7+2>dhf0~ zJ+q0`j4{NtySq)OGyY|8IG_`>5;0+a{&P6c@m>sP15eKu5h|P8-PEH=C)DSR`K9bL z+g;!!roKEPDA(gLo$0?Y(Qe+pWr~b??`BOtgvm!5%>|*bT#pEol0CoR{hQ*r5oSwv z3!Q;eJ_Bjj`q_E30WbV|v5xn?&_J>BG<8qghz_!VMoCm)ibjQ*^9EU`sa#s-4=w!o}Yx5IJ>$y9I}YT`QS*ZQ}tj4&SV9(!Iv{K{)PC7V9KleDgkD_&)6hLPLb8`B%$G@LGVy{Pyh+-xDko(_s$tWURd2 z(=RTb_Hddfnx*-XD04!{&Rc~>t{~Sn_O#(|Y79tLyr;dJOe=JFf_7|oXpz_8jqz;e zC+Uuh?QYN6ot9Q*OTMsXKN3$PIq5vK<+j|aRyp~>=_^ZL3K8q(68l%?kX;_hC!M=zb`={#9~@NmML#BH1v zYcH^jva!OqUgM7?15whg8l(1ys`c4VkuAiF z+q|rVUyoda1q#A7NgZMm^Ra{-Oy+wOr;f++#3kSB7WkL;ir(6Getl3fo0wSoz&*!i zvcM-xOLRbc+?~d|SA?8sX*3KdLuvh*Nje=|<|QHefDY41H-8VP#EKQceMa-OC$^vJ zT4jq|P4(wUQ)DS9vVzflM(1E26~lC7j>7CJ?`MSn$5NiB4I_Dg^aL=%#Z7ImxABDQk=;`h_6R?f z=&26sSe}lF^~MjHjYLPta; zfoSb`bXwfz!~@`&$fLREY<&!>KV{mUCR=h+cgxRt5SXuAw(@a;kB$(`5vWzFAe`hD zq6)_v%e~T_P;DaMrl2$E$Ow+=!kJ4xybZ^hu+T{G9y*0enJOrD-z+!#k6Mxz6OkGO zkQo%K+nhlX=f!^gr#CQ$8_Y->!rMcAom9N8)D=?64uxjDN*5r z3QZo)1pFy|+~qGAK0ahxI!NsAaop7_!$JUI*`vg41c&CCmI!PDi7X*pD$|Bv{5{Nnue z=>8AKpf^#QsOJseA=B!5J9_FJ0E7pIy#s*la6Y)sI#khh_d0tT3{YkM&1l%6KI2O; zph|9{9;LrKga;KMD|K-gbm+sDKFB3zFl=4-Mi^{&)S;2?=*xPOZ(|hbKGmYmU{K4p zr)??dyQI;7r5y>ovUpZ_*GV8o-KS4`9$&C&UCcivMU z8kf{3T*({xFLdVXjeJxeqpXXY+!qso>2K3PZB!5Bt!iS&6>N}8YfXyf` zzee|j842m!f`15!&?2x6-GfezWursH4#Y{9zyA1=8MF zak8L*=(6vWhlmu1zQ=SDoexAs%XM6>u2h-Y^lcq~-D%$E_nI&qm5XCRkb}$dF9IA1 zSIlMTB!jQcFZtVZ{w7IRUk)ZwL9}L`f`OexL+l6@EBvsKe?sTlWOzxWVmk}uu7lnJ zAapvkcKdjhvOso#Taqxtg~cGNl97i)7N)fEm!=&x8vv>OyoigHKH3PG)6@;?WFKxE zf{|i06w^^tQfPFv5*->1=Zz&oe@38@+!9f1$<84qj zl~dYS=f){xpJ^hgBG5Ivk}ed6(Z`}F5b#mzklSB>{4S%3dNvY~{@K~oA&z(!r`;l> z)!;l16-N|5(Vms%x3DrjHUN@8Pq24&!AV1>wN5(Rv7!%_BL22Rr-@ILV#f=-QtEhAxYh|9DT-XKd}Pbu_Czr(RVJNw zE%o=$LZ7G?%ww0_7=yOTZz@INsAFLt==c0m)=F;04W#Qg6?ZN{#z6M>5a{GLKHy;y zKbqwn^>D2ZWwH?9zt(FhL*GsqFYW^6ad}T^P%OW6XX|3+d&&dfu#7iNfLUt;yJ#aV zRIfcOC&_K#I*z6u^%CFzVAm~x9S$de%93*d@bDY8TW|N_aMZ=G0?AAhf>(YzDoa8- zCpFUOgNQiz%{)8Z!7h>Op0U1_x6{L-3nJ8KgdOK)vbls=MD5GIJ|zo2j@OGkX8HLd zDk>FSnu?y;8?2&j#d>svSI}SqF0a6~oWgbdjNf?1&(CMVBJ^ih^ZtyO0z#p5qLnSp zMuFTt23F1#;~0e;2vjxwu#Af89hW@bg1A7a3)GIwad0^Jlc>ZOMh^I-QnCleg!G6%MHax9l`aj=$`%0=h&FUxl_s8F=t}x8 zSSavIv7h>>8s1T;2tqIFjj z!lYkw6V+Um`bG06VH82^bVBq9tF39uO%8j_LTADK@nL@Z?2G{VPvD{fvIa>sVd|V^ z`;@@vvHtF%l+Y%^=jb;g(tf9g7}>bERts#RTFMKk$iZhGt?PGCt9&0XJfI-dq9rX2 z)wJnj{G;#4Ut&ndXtcoS=+BYS=3{h|Fn2hIzZ<^P=UhN&*K`U!aPU!mw?firN8fh! zK1x;%IUKD@D+%KjW~RkU4%u1{YW=qfFD;S6Wiaddj6sml}jqC7S;qmJ8g1_!*aZOxuy_^FXij<+>4g(mOB`eTIffDYJxp z(g(-Z&gwV^TwL>I4)<}((?D~mZ%=T@*JcJ2K@*d@l=^DD-neH6u|W2gzXBzM=Vs>4 zflqBP@^AQ}+rd_R+~cd1y1Ib8sS!`umA_Noa(C{4!h7{0KsV)XtC^`N zFX@d;TVK~YLN08$y4b7ErdW-^vDSbwG7_Q}r?O*fEHNvS@D?g$n~r6R%DKh#KI>Lx zXrE3sQLE#l&8m}BGfz65#_Y{a$Sk9UvBJ;qHlqtnMnq3bV{Q@4LJ>-*y&nE?@CZ`( zyzq|(mmkB&GeV8dS=705-xhcSi=zbqwM7;&dIC)-O;#}ptyyS$F7(Y}Nvo{i^7b>GI8m8feFcap60n5i)i9~aN5RW1&xJ-4&&M#>e(c218o0+n} zoJSYVJxyw-&0F0r6QkF~+aNL@`}x(FHQC}}MlchlM6e2lCYQE&2bbV{r=N03G6%A7 z|M-ABWH?fJKaJY$v|sk&f^QjgKgL&+{+Rl~m$e%51J<#ky`M2F%&9JptMbm3T~2#^ zXfz+~{17`?k!v0fGvR>rjLpiaB1|}YPBebZ>ag)}b`EZmGDH^wR7RA;m|`9nElO6N zr0J!;7SulVNR5qJsy`hX6-=;OeY=e(vhk%D@8HLZ>G4lbj0JFoGr27?VyB3z`S7s@ zEDmIxUQ;uRnntmTqwHvIrW!wi7>7wVj zcPxJnhl&2p`M1+CW1k#VoTmA1S6hCOCdinI61J)%H)=hW`kINRZr+tTsj8VuiKpk< zvY>=;oC&-c?#EGk%G`TpnzFz`_nfxk{Ho~B2^@$%9?qd(JRW2QPt*HcnGZy7WYq1l zA;X9dkmCY5!USjK-Kj{2iKth^Bn2QMz}Ddayp4YVF5{6PCbup3>K2l<*7*7alQHyW1pex*3ft zaxF0vG53`Ca?C4g(kxIWu5fot$A7wrcRP{Upb(9>6iXr14>;YW{{it()72u-+eF#s zN@(WWC0gup1$z)j;a5^())R&Q@@Rl5D5tnVdWJN;F0r3FAfe2x-XD*U zD6q8E`&y)5tsfa{wS<+|r@jUgJ{P zXI-3BPWA~{0jD>-;b7%}{zg<**tqpRqfLeF6Vuve5pNKe`$S?z8 zBFzF`qs&?ftxFML4*Z?t;u2E%b#za#Sd-~#Dk&}pv2;#HRSe4Eg@ko-V=+aPjas=4 z94j{|0@TfIC8h9M)mE7&&}u`L#2Qg(2D0qFApCe0&9N)b&lNoq>9ROK z$M%!!0)I^Dms-dmu%P*wYQG6K>T)96YpCc{mpUOTI+5Z|aVgPN z`(petq*|R zss)(kD)l8Z7%DOiA~QCOm8YlH8_CQO7u+#4NLqdh( z+8Pvevbk!TlPG=Q{&gZsmbNhKAT0|*_5=Iq2VE?M4;y*zyuuUuOb^mcqRolt^{^+r z5jR2`xfo=8^Q>T+a|}Z66->eCaGg*4%xqKH0-0Mptf1R1b%)wDC+#@1+hp(9?F_A0-M8z zvZ5w?+5$Ao|A7`#b$&iM9A*YuxSbh@`J*7OhC)gdOOsMaV=iuCTZrpiB4M&C*g?cK zh>c5#jYDS_;)Z%w0-2ccT?#|%D6Xa>ktms*wc6cJ!N7epyJ7+Ad1f}m5)$o@CZOLu z1q{XzsKk&cS3hS1nq^#58(^4&iy4D$+pM?yx@th8EFo%0RWZ<4HxJl|scm#}nb*JR z?p!TqkNHDLkUizWkxB-q#7JZ`cEJe@@M#DL;-{bgG0 z#SA9Aam?>rP4q7nTbYFIo5!tJtikPmxp1UZSu^OQa2Q^Qtnt z#~Cm}EbEW!?UL)y!g@Y@_V`k^7kkRAZ|~g&EwQbdE9>fywApt%zDuRvnr|jaF$Day z3JYyP1zFSz696XUB}{E1Pnu z#4_s}F$zPL)tY<5>@VKMDc09GK7P#eZ1;Wqk@|q5yXlrz_m^$F;jcSU99b0Dnm@4V z?4Q}~6D~^&Yr{rW!lH*8F&1t`ZIC*znwaxT7o+ufWfP|MBVQ|O6SEs$eSN#PgKc7E zgv37{30Uh=hqJSrs=R>rNp6G(H+9v9l!)fJ=Q@3{W8yq$21u+rEL&w+1#jk4=RVr- z)PN&Es;FU1_FbWj)gnCI;7Lpj9WZVvsb`l8ns`7jvT&il%qvF9#Yq=xCx)lkOa`8ZXvo~?0$A2_0B8X<`5 zB=5qrDa#U&IsK-Z^V#NuSDU<cGxvfC!b^<-=t1xNkl=E~$gM+XcC-S4dZRXngI_z5S4!Xd_i1`I zkrvY53|AvpdPGAVt~;K_Cq&O~`qh=X0VGYLX*7#&qJjx)HTF-`4XZSTP!!vWYPWl+ zSVPKwdrLhRbwtnlII}L!Knh&+K?2Z^cuxampuN%IQG2$#=zD4zdGCu|krWFYCEAUh zc5#RAtH{$7hS!;QwC{irKI5phB7-Npi@x!xcF})Arw1Wu0-x3Lwf&Sq?TT2NMz&`}rae3Iig{tzhBaSDilX@no z-)8Q>J{PH;Ihmbvym*}%J2p^T+Ge|ayZ<^TV1r`s)}bhZhl#-W(fw-ZIvJlK<;vN# z>tOua!A;r|JrDG6-!vnO2dSie#z4Iw5UM!lz_wDHDpRIg13p<0&s$GrUv182|CWK~ zC$4Z8ZO+b`8>nHbDn>DHdhFj5@J8MxW`5iy5*2>c7R0gG#~atr2vz^g=+l~tep|1X zHMa-;O?@PC$d`RVA=*{&<>p7Tm9U3WzV-xSFLrcVwr?BpsSYsz;&uJh5 z-+ne(^GapU_?FvEx%}$1`bxD>ebU6R_R|@8g5b(8Wyc7bW2ja!;c%Pmw{c3F$BgqQ zT?0+dUx6+cd98ovUnz(&c>2C0D(5!Shv0XsuL*C6{T3aZimHh$Pmhg^^4q zs&H>xlB2#RorxXf^?mp0_3>~$q@Pjn1=~9M!x!iOJqmggN50ACM^L=J#eMvR(*6)a zPgJ74jz7lbpV+>1SVd%u3`;*K)n|IwuX+=x&=9!{v*YkSUnayP5S1!7bRluHJF5TH zvwwT}>g#{~=KRGs|N83u@-iKt|Hr?6{qN_0_`@H*`s&NC{y>KY5fzY<-;9o8o4EbG`%G&kupbz87)=JZP zs-i$Bw(J?5pbOKxFsAczF^GpVbZs^|JDbsQ$d=#Y_`w75;5RL)hO3B3E~&-G4{V7S`nfAs+U!Dcy$OP5g@ePv zNh^t)e8AON*ufhv{B0MjpEwDsMxb{%FWiZV8wvZsRt#`J#Y0q?*7KhZF>_j7&rgF< zlyP4%E7M_Wjn%AQjrqVYB77liWwcR{P^%^gLP{;=eCF<{24h;v{UA7K`pf}`!d>}U zR5&X?r#JY~3R%6QJ%j0=UO-XO%A$0D)DVAoBD7AQ>#2@rj0LXQAc=;_DD-jvP>v0r zhTP8y9g5}6c_8W@;w3C86{^HFm}V8TA)L#J$i`0x%dlqnA5fQc$B(RdlUhe6m5$RM z<1w1NR(4ipJqgBVT}Kam;MB!4A^5Ifj|Po3m=Zj>aoxAe;3UPL1|fSj6U(8a`Za4> zc6*ngP4{7{#AX~NAe_j^t;T10Hzb&F7(d{nCBc|BMISHORw9oRuX`l}#N3)>+Y zKRYGsKiX4XU~{=Ut(i9)HLQx|9WInyt)Ozoprt9EDf9;H;?9rgRE8SWU}&Rb2yj zimTz0s6Gg%$HxY%LEIOWraa<4sdUs&P6n_$89)x$bta2|Rh^a-M*XDdF?axD*X$xs zR>yIPV%JEvk=aAP!Us!D?-#C+lE_aE2XFiV4n4)kOX+YWQNHuSvWU(l)F*zuU7gg& z&VfrOvT*naEylKJ8YH;HPo*X87C1Ex=21Mj2>sHj6np|+2IrT35I{B&PD-opUlQ&9 zg|F0=)CLz$irvvXtU4USkC8KO?dK+o+|jb;38eewIh6*3N*F8oZM4C{1Moc3Rj4o?G! zbVm(GjaTjHhjYao+@GIMp(f*APUdW*d3$Tb87rr;n%FZ}!LtL=uGXv7 z49|ME&+#k>XrVn#PtMPwzqByt3>u^NVt{q@$G)ilH~)QAow}3&DBB6?GHL+#O}b;eK0pR z2N6FU7Q~btmbZ(2K@9L=y`d!NRjyZykMwYJ3yqw^E~O9I!Cb#_hu%jeja<8qQ+Miv z`q-~v6wqSLc1&ZVT5jAUC|r{<@n(M6BkG|)@$Ol zFBID};#r+k*CTKZUNO1si=R2Kw9a`!5aYx?=%mDlbtDJ^6`Y)|%2X@UxSu?)wov=^ zWU@F}s8Ws2%o$*|^iFBqW&C5SmzJyNG+SA{w6=PnBojxH+K4fXPuq$yQm$<@4JSkp z&qiE!edW;1qnVgF7Ev}R!ZzH#?xbHtS5Ak;z%yvT3q1$uyb)zMR($G~e7p9mYo;lv z4hjcs$?q!f*I(_YUw`%L@LPM2s;>gU?MqluK2|Gy$9uq;W_S%cvw*6YLFyDq)ol$m zrmDd`1E%@(D5P6llLXJtFRiY1ztpv^SQuAPhml+KMGRP1y8|YzLFFUxqpkfW7E-20 zq*8N#nGay`>l)xppu0f4OGqD-HY}w~v=mN67i|hSn06vwBg2lt2AhQf@X0e(j~mFs zKK2-h?lQIc?Rq`eZlxZOV1cx&W<-}nfJlsNo4J3FE!GeOf?i}$Q{}NfhDfypa7965 ziX#`e4%pJEeDXUP}mAUepZz5&9l zoVpCbWn5u`=~H+wT592a-L03lZE(b5l@7EMc(Ny^Cgreu1MR~)jM>@!(Ksf1pk70o zSnp?f_8smk*q)i;DY&G@1=2AvP`jb}qxBao^sHvuYtP zOyd<9uA{XyXy;aI=|ri`d|)tPkuAgxx$EE8($DamYn@NKSrpU+5nXQsDfm64R(T*> zilYpb)}m99Oh7{xA8^rN1#4!gmYMbo2o-fbR%}R%vTr=$Tq#IGCopTy!^xdhVmu{L zOGjrpxH#h!*_>|NG;xj3ql;rj=ulho=={=gS51HefO|~<3ET&rxE*W4LGKQ~fG+&9 zM45i&ZWrjl>x>U@O0M{{q?%4?CnAkwolXx@G)KmRU2&-j3)LyOJJh240) zDrY+m2&DYXy{@WC%BvD>%SeDD(B{_tB0@`-3@XJAUNP3}1+rl7IjtfVzS}`B1hb^L zOS=_C$}|{!2=CO3AC&vePJqyx?z7{+F21m{hMXT8a zPM{h=9n-4`a|d~p5eJ}hUXYTV%Mn0K^Pq5f&G*cwmpktVd6))DuM+Ht#Jd@+ex@^y$(j`IM1{Z#5jK6M*Ey?rSa;?zLn%HkzZ$?6Zfga zfTe08@mOVW4A5+@2Ys#fXpo3L0_sqqH6OJ&R%eP*M={{Ygbp1ZwZlS>^{(EoNI|Sy zq1K&-r=+ZtXVxA{?5pYo`ROavPpDotK*I7x-GA=2h5%ZrIAK~YL{tGrYo0QKk&u0n z{X|d1rVu<42@PcSnx2&0pLwCHPrr;mXbVM;9>3>DqDD*YGRjRaZ{$V37|kpG^0N-4 zqhR#AiC5Ht^&MqjQQq}JQs_ZaZg)9+KX~-}L%i`6JNeS;Tb>iB5@p$f7co-VxX(mo z`$i{tr!tc=yqs}Oc#3QbLAHe;+d`1-G%6Z#;k35(fcH`kZGjYn3rh?HbTyciNNvK_ zrIR{Fqn*iHFbgLox-xm|xJqZ%%Wt--UiM~sC#@khR;l$2(3EaLQ^@>Fn#$^*rUG=( zCJlEdJ0Bhfny>+s?gtlPVrV~$S-PfWciy^Y2y z$*gJYDI~07(C}9s7KPZi+8GB&4NZGiE`btZ`A$wV_?xN&NLC`+Y{b^@Cnr~}Z8wAl zVJA9WKSuYs@MRVIjERdohXd#e(s*#@`VUNlg;eU?N9ygMIw>ICOMnR6uZ^?gL~}f8 z3?cbAT%OVREQg=fCxi>+uI~lgE+R?5>qHYgp^k{rrP3yiLmf0tc|xDTqOltN*P&t( zM|Y>1uIi^?T1q_Ft#@TL6Xij??N#W?ptc8U=uB3QPm)HU<73d{>pAV8EKu&jP%*;l zR?T6+1nSvfLm1`lwkiF6Y--Z#)T9qgO-fVKgmF&dPNeEt#j~C!q%t!xrsu3($TubB zREZks{X>qQt2&<5eMC%R6W7sPlqR^7R43B0=;2P4=*nR|?7We2_c!Z$fJifAJc9LZP(-gj8I;x41qPO-tSiA8>2@S zsmi;S@(mFY5WN#>(#A*%{;Bqz#i)K!&2(%f)@kX1S=*DiTxD!nN{+e1V9WPuzsb#( zx&G33W3onk_4EQ6hVQPsBZ*pZ-SxYO4)H}#eI50#6ONAVUw5zHbb`Tk(o-*~z&!uh zQ?I1z<(i12gLW3a%vZO;fsKKB>KnmQ?2Kz(i80tu8tOUF0ffNH^JR5JW>6yeX=8NB_7pBmreh#c3~y8ss&UyeFR zpx46}ffqPbxcW9~5)HT#AdbkYoh7xU7Z0hAL2?F98W4$yvm&Bm;DGA>7+7m3e9$?* zq#XDwl#HJaHEBF@NQQqeW z+H>rGrmLtq6)|yCCo&riMzm_HcA}A3VKBdR{jSpczaw%x%uFG6bV4u%5c*^~%o=?D zY@$qM(Z-}etwS7l`SO4$SnR+nKpON}2LTW(k{HDzz~$SS??4E;akas2 zi@z^>^#iwG_lxL-?1L1Fo9xSG8NtLuts;LRzOd}Q74+HI%{py~T~vb&4)=Y3q~iW$ zuw#AA3DH6v$#cg}^*N}?;jnzT?AnPt$2|H{t!Z+&4(=2Sr*fs&FwDf4oGf4&v0We(%2rR9m+Xs<&#gX0c05XkVaX>|<;K6)Aq99I(} znH4%WCxfkVZ&Mpur=u>Ys&Fe3&@~@VyfEU36%#@PxfmcEjeAzu4AdR>=rG$>1{k@~ z63Z(oaGH;7_4WjT7X7u2nka%>1Jelu;|W|t6g9mnubctbg@J2aEel-FqIpyRh!*to zOxArS4hh&j#oESIl)=Hr9$!@Rz=*f$8?X4s%?SX{j30lWxXUW=Z(QJ?5!9_YH}AA< z88Toos2nXgSh{quEKc{H24nipv6+x>098Gop7`uxu?$bmil%0DWm@U4Xli!R78?0J zQBQ~=u8*j7q9g%$Hv#DUA z_bUL?@vFvO6(@QZ1x7mr%M~2!vGCRy&`o4=s~ff^V?@kyS5;F192$EM;!3y#(R)yE zqFqH~&3?TUJM(+3_X}=#S3Z_XvCJUr6T|T=Z4Oh`}RC)h*eda>+%~W)% z-~j2NUHOd;8QwWLuMA^jq6kcX9P##LmoZGYKc zMoagyKp(6_qIpI{ibTu)idYB)AE|~Y1OAhoD;pHK$nOq^m99;CNVG31I`T>qYF}KH zNUsgZgmzp!;i!&p_Up|Cx}WS~kd7K!K~~lmNaj~M3~wT2Yl2$GaU{~9a^4kEn3+&I*!TsUD70}j zq}Qx;FM>LBQ6;M=#}us~0;dOiR@5*nO#xcH{p?;|81(CbyLx*kebHD z2R{WD#jkVs$Bx?fCmfv+j=s!h z6l`MRBuZ6!;*B-{Q!rX$%gT)g29_@7#`Sq#%f}0CvS#|MhM|qq_2LuI z3kG+;iQwCfmMgv8VrukiZTPToxX(>jw^*(CyX7*^3R>mH7MN4rMz$=msvOo3tbYkj zRMob8!}7a_F7S=}E(m?=QnRVprEazPsy^qcL zG$0`SN}IXbGjpX@8Xx+n2vLbCf-@<&K(R`ecF*&L*)H@TPB7`xqH?%{l|0;YgP4 z(%Kix{LMaIZd&i@B!jE|bXxW4Tzt@Xd`C6UKk8>a5`+%LRr>ZN`c0ql56`tK5MsP; z8`9;rtTC{8Pr9Z)O^cKXVbayr2d*zemSt7@CAg&}KQwKNf~Mtf`uFdx@s?;(J;QPu z{7wJ&HcwIkl>&FI8irPHJxI*l>g+#hRLJl^q{m$GbZYNd+$*hrV+g%+wMigugR0GswDjUBZHE zU`UeFKXE{7dUiRu45w$$24B+OKMbCQ7ZpGvP(LvocK8n~pYL1ST~_&YPHYkQ$L1Wq zw~jV9yMYdvNRK9bf&QW+Px5mgb`rwQOpN-u)#Jnv4XQ~Mk0}!Nb??dHU4peNXR}ImE*Fl=2%hj)9B1LZA@`YiW)d#EugGXTebWF}p+wX*eqG-pR#?LBer{J%v2L+; zrRflTOdOcdwCj~yI!Y0|OiLzeIIJnV6XUk_MO(GggcQr$MaAu}mdlyjYb#!L*jxH8 z!q!+7yEnQ9@!&znTd_hsCKgS=&?+0$xx<{@by26o6PdM+I+Mdod^0J3dgSp1xYVQN z>h)?>MP?H3~g3Ptatv=iRUsmD@nOYo|_$XcTkneT)##-r_jZSXm+Pr>l zKn9)F-qE>o2UfgdN3~d=fnIxeQB0_A9hZR}DRRQ;bVsq_ENv2)0BQEG`rfF0i8R`+ zKUbDTyC?X$wpN4x4F9BYjC24IHZ6#W!Hl*ru+%^#<1w!g=&Wd;NHzy2M!Z#JBHS43 zRd@;Odb17V{?ER6u0NfFdiE7y+e@uBt8Dc$*=U0f z(k{9aCVk@H+nH(NSGf(-CIn^oGUZ8z=DrBU<7k)=)n+BOrEJrjl)h&wsTEW)dj`QZ zalJ#l-x|;Ee{8b#HIrnrqp2x8RXo==EW3PfUiROF$*oxO1f|y(WBp+@P;{tmlde6g zp2CJvdX~1kznX9`6|>wbdh41pY-MH|mAi0m^w-(#Zm(<7Gprtj%BBWSYpJh&V?&qf z6eLXb+66g6fZo&G=$nA`Fe3@clwbW^{NcwRE+q_>N z*o%4|EDzGSld2oF>QUM%n%xV#VHphJFIMNC4#!I59Q*a7 zF&Q;rh^*6*+tY^l+0biXvZ86yh)*;Ho5*KV_Qah@B{=no0#Lu%_mXjVl2*K4WRML< ziMDB$*o2xj@(Zq-gBwn&Aw)7G5XrTA9+Yaf`bnDSdr2Xj ziG%)AY4VY~mdgE!Hee+xpuVuagjJ6ncJ~4Bl>mdV@ey^8X-#eEaWm!K>FLRSS*QFA1wF6gL zPI4&8%AwILxmAUL2Vl(jC7ZaAL`_d73IOB`<9<|&;{B;hC`~2kYmz`3af}mbk`q-A`jZuP zKTapraMP7~4hLw9I95iwE)5I63z`zymgAU1$*!?fsjyqK=cb)GaOMO((L5~@BxY`d z#>L5$KD4ApP7-V95kfjvoSvO(?;8JmH8sq7UAWH`EX^JdnoeJP7nj@XiSqr1a_2(7+Gd8u}%kXa?K zAmLEI=CivFOd{eQOR=)*BP&+&p3s3VSx)Gg#Q;J;y}yB@tj!m_Ek3ea`W$bW1H1(Z zT#I<4;eY{g)WkW>W+D|siPRp6;$?~jjr|8U(({W!xgQy|u+@<3-H?N^ z8zWyPZRHUyLp$iD6Xg9w_$@{(oMx_z0`=+>OO#hR%vdx8b^V~R3*W7jCxZC1$?N`X z?#1CUF6qUZ{9YpJ5_>m`X2W=-L3YO5d8UI92KRF+G9xnXH=@QyCYB>*sM*j?;LRU} zQe|>SQ`ZPOX*(WCP=R=wnU@hFt@n_n5t}CpnrwEpkb7n_OQ(+*PeiX}NUFR4-=<|& z_c#i>!RASsJ)$e`4zoT=5ytg==ARhUdOMv+pdJKC(?)Qpv9%HXd{*aQX0Pm*oET7r34|JMZN25YGDpnXxA%x zTF}!kz5eh*!NWf^>|DVCR!i^k3vCPHMqy>LeGGRGIV*%@5uGV%U!a10NM^3K;ia)h z)bIbH54EA_Vdb_4`>=&pIH$4wqD)QGLve6QMhM=0$f-^j2FufpSvP zDL=x10byik)Er}h`}X+k%pF1{;?;l9)_RY=vvx)IJB?D&E65~H(@jn1VuiAbmg3UF z>AQLlr9W_fo9)0NAbD3SD9|HnNytye&oGg7t7ts9N1l*YXuW}%LB0=nK8+)^jmQUQ z;z41fw-77+k9Rnj=Z?p=u%#Gd;J$?1$=Tzblpfl~=!ly~JHlS!EjCGQeQqMtxovdg zuF%bBur=Sp8-yX)+Jki)WkEHsKPM=Euf0FbBf$1?PUpcK-reb8sT~m991ck!{=t|v zn{ya26BwISEJq%@cDoI726(G2IWL_PWHo5G_*=G%hovsc-SVVPZCv3by6h)cu{r7x$d@BuMiKqc9^fk)(Q8jwul-mCL|+<} zrKph%T^c6La$>f?8_gR%R4{Q0(wSBs>!<@eC2F+pR$6sL#4YW(M8?KV{FqP^J0>Wd z#gExpJk62*G89)!6M9EXAr7%lN2)QX!x1v!$f#ysE_F=hLObjB3yVTv{O?^~6BRRI z6TFEv!7~TmjE}o4TJx}=6*&>cQ{1qK@0BRg5?I4wD|nUwqDlJTw_F>ika3R zc{u)|6DN}GFEhnxi?xO{CW)HeuX$pM!#h7@EI zL+EB4k+Ja$o37|4vD^LeL(5{6f5v>;%_CC^6SauOyka5{uPxicEZd@7wn#6Vv5Dy; zxsH(^%qBTe}-11;(z0Xx`m$ zHPXXk+m;zy6U+%@#x%1#=#%H~3OIi*w9eONKtsF;QILijZrCbCkPFZ69qRig;C&)MY7lp&aiG2k2V zJoDxw;n)wt-znlYw|TmrtY8q|0u&Mlh?ev_M@HcIZray9BWXClhl~{QRM8!une{+M_5TXi9<2M~vOmim?oo8p^*J*PK_}>` zm*2m5^Cs+FcYiM6se?EAm{L|n-|D$qfljb4py=!dlX=U`^e)m1iQs}eOwL%a#^n;aU|oE~WxS8@?|4~H0^;;=v>$R0Ub+Nb1ar&9sD2@{f) z`quFtbMKlsags9Dmsl974Ivx6XMOR{UvnH5*mxmhW_DxiySzWXn)JuwEObgccTDGt z9FS~x26^ZM3wj4Yxa`X zG51Q`g~!C~rPCph?)iJc@AWzEZbTEw02+ zOEz$84&4_Pt6<4ari13gYj!IHt>R9H7V$&>bYk2|XaWS>yiw6RI--5A?1zUi6Xu>o z5%2eZyy+@jRoaJ^?w*{AGnTVb|wOnOZe&dz}a; z(S1Tm3GNUzp*n%PZBP~O{Hg1Ts`5i^44bsB^z zdo-Dd>qE!uaRoL@41Y4DrkQ^*b9KKQ^*Mf`?taNK89Hv^R*D@aF$&bABOoB(eb^Iz#H?FHlcu3Lpen zGkgia@I;+XavvhRbyt%Ew6u(-DXW`?N&Exx(D;k)f7QrIo2mGp$m2?=gaGy*v=9EW zx0=9lgQl3?!uO|H)AgR^Onz)!E_^u(q-7&=JRE2-@AOpj_kexsEcwL|Wu#g_Dw9#3 zFUTcs7~YNP=z)cMMWQuvz}(RPMsi7%o@w|39W&_+sLq$VpK!SD0hL%)Yctl$?YfBv zI=Tz*^OZO?ZX~5_6n9Y!h^=0ejzY@Do1a+z;;6I|U2|UJ>q)X2-&(cNxXNPjgTA=> zrCTxM987AJ0uAlA+b*+qR5@HHH07&io5s5b?(N&{rJn){Vgpr_JCC!xDIiI2dY$!( z6W@(TadOW zhl`AxAPoS?`olk6qt&N#DkV_P|LF=**sW|sr`a8`$NzMNrUJK89o4;QA)9M7zO|CF zYFQSmg$!4wqJZnPQ!L}jKR*>*+O2Mz@ACicz2-{YR^;11-b^d0^jZyb<%Rsnu;+y$gkTo|H5mlU(JL2iwr})l&e8R_j*<*Pi(EOt)~(x> zdOlLGt%xfD=^du*8c^jjky?@Qk`-d3i?Zc$lyC^usyk0iEd0z9yGb<5nCNHO$KtOO z*FG28X@VP2zQ5?#`@E<}c3G75M4e6%^wCB%KAI>3{N>yp#3{3h(0RECXaAClGV-jK zvj0l;-K&S3qE=h2pZYf1?!(*+2Idh9_|Z;1i_d zd1@@cge9rJpW+oh&>O%$>@&g>${M@Mcx3DIgz)gc(vo303pZ+Vp|40PkD6; zB+JCMGXPz!D|=U~i~)zge8FGz^_Ed*IyWdKDEo6T-2>~P^Is^FvBMW)la6;zKp+{!f}7Y@t~)^-#* z?x)Js?rwd%P4iCAAGD#{gu8=4p8XNT=RKVRnhWJsW3{@T|ISr$8rVXelZHx;|N7d8 zoSr!Tn?N}J`ptP9v1Ws#@#K1*Q5PnnZsPKXi4*iRDX-`Ihz9sbb!puVLYHqLfD7T< z#tn+CV+ZcxK&oj2B6v;$bty+-BW_gKsQ1SiMyBFYal>Ay8Nr!}1r?M6y10x2m~)IC zEh389m%qLL>f`k?110CR?3$B!Udht8p;RDk z9pg{+tmPPr&g(3ih{{D26{i08Vj%8bK%X-)(Y9GGt-fV$1s5}DJvE&F37CJm5-$Tb( zUF{av|73`v)h9%ruQI8`WO}(?N+u%fRQ#~ckyY_3mz)UI#;JMi#-s0uIKlgZcN+Om+Mns=_5w4!WKA>FL6hXYVAB{HN3)Y{iul7qRanK=(|oUsf)+5?=iq%sRa6=5OYpH;3}M&jEb9s}@|gnQjCPZsH$!C- zKrfne;|@iGHgicDbChLX+Q_93)oOEab*TDS4|pt!Od`%&XCE0q;i0T^CNd71%FVQST#RI6V(o|Lm0_8I0*8-o9AV{5oovb)dm8Lakh*NE-!TdyH zwwVKMyH<~KYUgSZdm1O)AT-jY; ze{tpoVO|SbMpdg7yAR#4A2PS{fGKj!10V_{PoQIGzCyBeO>Bec|$B?J9_eD6bh>H%uKSG2Mf&} zQA=h+vD9JWB4}R0J_hD8S`CZk4g$UAgrcmmfruqd*hNBFy>`?y zuUd~bN(|E{y1-+J0ukHsv4bWfH+I#3E-iO`)Z-)^d94U1($A9dwcX2(X8ElVX zv~u8kN_<}bV$wYw$n62_rpcNnyyxY$BZ1h!*qobAv~CIZ`YF{oV#U7E4!1hO7s_K? z?FGt3-O;CM!MIJHYQr=uaFl%%6%KP=%Yl8$qKZIzP#PyRE7ix=tDh}WKGL=eq2UyM zIuHCi?X}zfqipHrzp~ZKX&ttLOXv&pHfo4(<0DFA&9`G5UIZsBiJ9X;>5BxX1mG6J zEYTqT_>eh)@UNZ+sh{0sgJD8cykWnh+O9VG=;Kb5LCV~qT&=UR=0oh-O2wl=+##|x zjDPPI0JaqqjweGJ)d059gmVfk(AkH-FefTV4Y4_M-+S=U_CAH{X*$rR6=c=gFkd9G zJ%~-I!;=b=bQ$QK1>)5xstpX(IYh(FGf6dVgv6w?6_~xOKS*EX(%7a?<@SlAkmSn_1PLWhQ`YZUKcxcC2$z;JYig_li8w(x=UZ z+a6DbrDuMB8tZELD87@I2i8u1^(#7$rFfCIwWWG~rv^tre=NzP=0$OXymJt6FVIW| z{Nt2_x=9i@(w1hg?nCD~lI;&pJ-Wn>N0*8l=w-aoCpMx4XU^vt_9kE290hva~_1b@+)}`haaW6494LyXTOn^`7^NiTZEUr9br47xcD=$hudkU+MX9_W9uY zuG8+|b#8eB4o z?xjoN@KSkK+WXb=cCjxui#&Q_o}N6X4qf%+`*UwZH1CAafRq{+`6Aopd&yJ2flVYp zkW3u1Typ3~`n(N?&+IpuW}Sr}-KoEtecn)pprE0Cn~^><$9x|N~Y0Yh`8-16T|@L$|8BD`K77ua=S>{W1HZ?G|JDi zllVKPjY~}VHFM*%@0W`=`L^IV?R2Wpchi{&UCoO3S1jd3Z~0+Va~67{s;`-+*JV=h zu>U=advv@fgchR;ab{XKmK?4Qi2?ift%@V`C5c8!)s|q(;0O9H*Y{88`+7u`KnsW= z@Zsy{3a!pv(1iKjHr~{!tbcUedc<8_S9QpCq?+w5g$Js!_dz$m@h@lqi}fmJo0n52 z2IO-^Yr#~m5~edw1m^4$Rr|B3TnJZgcq=-sHRFGK?$}k339R^!!~}c?5&ZwQ>EzlP zCiF2skY<7<>=?u@hD79mcS36n(sH?iFfoIQ*;ypMGzomFqj;nf=_ybo19ud}>q=9% zt7>C4`3x^PLH?<)%bLq`zE*|DcipTO@BUH{QzBvmhjOL*XslrRc+?NIo~@TZ#H(WC z#FuMdoVvfR5){HMI!YHZPU0B;&oouj-qCWSl0OJc1euzv_D5s{!SD6#@-ZLaO+C^$ zpzgrYY)^zz%Hx$oUL&4VsfK7`j;w_Zd5}_%jbn7r^o2f=%`|@I^nA{bP zXPG^$TNEfaBWgwD0~g1;Zxvmrtmd}2X6hGwR*^d=eP6BsAX(N!gYfx2srB6L&m)eQ zjANw4-DXLpgOyL!BZ7~$di=O3)++1m%aBr{M8C#iQi1f^*=7%PIV+8)Z1Ijy_6x4aB;I$U#1KIRVu!^pDKwhgjB@-kE%qj2V*76# z4E_H$mvx83PzcBXrpXnRl2O(B*58Su`{I)5(=VPq_e7zi0@{r?DjL=w174Hm5fC<6 z%6s?NC^F<4G1O=`xcL<|=;~oQ_%xCd%X&gmaw3zIVRMt!?cyAbbqIM3DgM7BhvA1s zceI~YPUq@qGA3_MuK-wl!dG+>0m~0Qg$SzSUX?~QY~3#j26lu_B;)`ZFWp4r?;wQh zlL~$0wyUYB8rD9UsX>gGPJ!~AkwcUp8pq=p(}UMkx^LP6j5(2-1wF=yEP?=D%_Hsg z)Q#^#{P9a*3?hF|T$3Y|o}T@gyQz~*cIxc0MK7to^3>Eu^!n7ROv|Hn<;DQd06+US zm^r|bt8_5YFcl_&n$%jYGaf}WJ3DjL%N_2~J$DL(t*zYKAfcom%eitPAdl|H+jt_O z8;>F6mdPy@d94#QC7|X3hh{Q))wHqZ%fTdqU!n3G2`80T*3D-%C>>7@jC^zx7I& zDGNe?OShj034VUrUtBFYN_VDJv<68b6SY7Hi_kpg6388V|KYHNv~_W{8khrT3L2G` zHk<~>xec$YZ$#!Q*;LOy7L!)yq^jc42*G{al`u;33pNp~^SbOvK^2!-0x% z&`8&LYZHLabdIa9E}zkQi#`2}1Gc`{6GIB!%_~0L60;L3r(3zLU_?^xmP#f7>sK~Y z>Slr~K#ss^AY+H{#ya%pCCjR(5P#E%^5~)A`awwv(i9>}J?#tbf?I7w;2K_9caj!v zX-Apm4ksKJ(Uuau6uIjXT=;e!dh+BM?gmNv(NiuN99p_uQeQAZZpd1V6CsAE;K$#; zU?_FT5mo?(ffETn>Jv<;=v{E@+Kh0UWZ#~yrAx9`^ zlP@v*P|uhW-9xR+aByZO%Id6o_LS#MhTtkzOQ?1uaY}N!&RHi6bdLfk!F|WEp9dq4 z94uHu-;*_H4ESSlj+xb(tKmRBxI(CZcqwAqfYslsdfjpD)?7!m7o{cEVo1R2P1#k} zLQEs*cPeOa0;PrFWYq6;CPB`QYbZNX6y8`l8|Hd5u0ne@``wBtyHmw6i*n&4Z0tP6 z+papz)&=XN&$k|_vigV>1L~~Gzba9M{djg_#$16D@FLu*@9C#%8dtNFLoc2knGQZ75?d26Ry; zhrZk@q8sZuqF=y$!TEU+IJCeGRQ$cYNXDodyq_YtvolVAfYrvg;MjhIi90*{n;A0( zRS|xiK*rz9dh?;Zu2`DEJ#g7ORtwtJrrNBVU=BDj5N1VS)Za$)(u}%doGRLHTh@L{ zR#dDo)~I+3`twq|WGXj-bE0ajg2|Mqwxc+xokWc;g|xqt+&CM-yVmWeo!Fn!Cgj}* z)w>G8hA+xk^#K{Sk)rFfkEcFgAj9wBUdt5K9@n`-SKp`hURhmyqjBP|>{vF5nT=|( zL9|tLcS4(4zBjYPrYrD`HPt$WT0%8d!&&DN!5{Qdwj(|-t87H>hSfSW2o;=o*z7@g zEX1iQ12*g6b3_D`FoWn!gdHTvZ&ii2PjC_Aq}Aw=k7%}+DIF_dsnCaE@qm5Hs6>}( zR5iNSL=l?xAyj$*IZlCO<-n(;n(S=6whhXpp%HHZkD)Ao5#>4CL z&M1iZw|kxCeD$2%MfV%6w@yT4vRf~xx1M@m?24pVP{W~dZwBvXbO2F8vRJ2cgj4?z z4ZZL4@t%&GKNpkf-W#dpBc;7vZz$>O^?tuzBJDSoyim#4qG6owb~OW(1`)1=f zKbEDj=5G*{>&#yH6u9nAJa6D#dSQAjjmy!QuFeea5Y+IGjAh{oX|ec8w~k@ap7ZFkZXe zYorZ4^W=pdcU4{xsQP2YznF23FXk?;Zeg3{A92kcH*8`=GeL+su&0cDmidB_KnlZk zorlgbUMC3%Rg4HL@H_XP-VX;3gdoP@=)(N$%%kP<2oKDe51ca_08M5nJh_*_6SF@5 z4|{Lg)kd-;41ecWh?*YWDwGHbY*e4+v`r7jv$(|Y#k?S24u8zj$hE_gxMz1KOH=9$+&~&(p87< zWLJ*M$%mWNiiZurxgclGylZd@)Gx<@9fl~^FNw*dM=`)EeYd3;x$qVrfQSZlP(Oaj z(pA__c+%OpY)UN5LN@4!w|rJxUe&5T@ye|{`CFpJv!DItN{*9W2N|RjxP&_cy2$NS z?dy!Jm8Ch=yYo@e37rAnR$G!>Fd7f5^5*1qZ;i!qGMaL{vRWy#3kyrJa6wjsoRj_B zN$ybp(D+0wvp?*QU^-)3Vx;W${7k3sEJ4wNp1uilwtgt3eIzqCUh->bG{{w9BLq(@?JR6{HrfSXn7EmPR zT1rp#l+rxLYxc=o0Mb#Ho$m?KVo4v!o~I}Df!->NI`>Hr$yh>jvP`tHrPxpa6U1FG zn+~By46^>+5BGq5{UFQ>Nr-Ql7V=P+MnZv;*M63{gK;I0KU@CI$v@NaXOWZ2MN2p+ zkM$?2|BQ-GXh;(|yZmg4^NOkooP2Raioi{S;UIAqEY)q|5PC@#51%zZ)x1@}Qz2O-3hZFjTG<@ZcExmJrjWI&&(n-`B0lbT|&6fy>Tkd2!ho+~{lDHf zD4I)k{r%T%p8AXTo|3&yowVJ84xaJ)Q?6Wzt2~FgQKLEh6*;JXU*o34D z&MMx0&3`SR?~pP@Ktau4nECDMf0P^KyuD1W-n=RXV+oNu0>%#G=Cbe#pEts5`u8&n ze`Dbn;0QOjokkx1I1TR3;Iq$ty9lB*{N2N}C1d;m^^-qyFEDW50*LrpgunUWh45X@!Vh+ z%^_qJq+QQbi)h}=B`XeW4U_w$$bT2fyNG8MHJc(WYSP|o!jfp{^&;p+z=_$HZh3Vs(#!72IyQ&CJ ziF)EDye%LWJTiUha1uRcb#%QLpd2ivv@wyY&E+fwAUJx^hNYN?N6Yn5|sI zU*?6ZuWA|tSvf+HAdC+rBxdtg#aUY<{Fc!8ZH&BY0E#wgoq}c6pNWEusBz($R`zSnQ4q|t7 z@8Xp+K%;C>{?=#4{H6^L2ydF>zlJ0Fu`l*2eNa3$o2~nHx#;iioWkhdt&`+UUC!eYN64ouPov4=Nqei1G7E2Qy|9KB{t} zPi||Gde4NeUDBOV&RQ&}o-^qvBvvBn1%t$YU7nq;HtjP?eVd@G^92(qXf{eQ4`DUD zA*D+bM|ov8q?qNYWJa)|8Rf#vFB8IoTczoDxU*6IyINL?>-lt#!^ z+Wc|MhUmTnR}yq@`+n>0?ry6&9QU`N+GG&H@uBzmAxFq|~I4onf17%vqJooR$$48uig9oyOF z?NAfjyh5sEn>^VQQa&Ur8qr~y_~qnS_Q*uu4z)1{c7>d^JDb!O2M(`@SWW%U(SUF^ z_$MuXnQ-bP!7U@waUNtcGzhe1FPNT@Z3T+elM3ysTs4);En350*R;gv^; zS3t2%klv-lYo3_e%~m}0i1k>XF8|58@9&_`*Bx|dg-;}7bp8kgoqLPXCqsN0MP8oG z0q+Fy17MUXTjb^Z07HY0A(}(jtHeY7&bN}0D|{LQa~&MjROowFr7`{sLP)eThejzZuInY z=doe6jWh(345Z+gu=<$Yu{l1qK?YJgGJOu|GdSe3rhR-QB{!%cLstwad}+0CN^plj z3&W}-5WiD)=rRCo57orb>bN{3O{ivPoEQy2+7ywoU6;I794ZYkTU$*L>Hv8v{sLu{ zzzd12T@9UIlXgSYNAdueg~x^Pj;e6sY~%uQ%{_NZ7Y^v_t>vSTJ+{32!KIPw3}8kE z5jNCBUm6KMe^9STU*#Za!qOl~Mxyxrpw|n7s5^0;Ar#8>lm2iFtRPHeY)mb741?ez zo!`fQ25gAoaN$5q{2~T=XLJ8iADeO!rEwR@?F|a3T5ClHUum??!?In;G(N^T*nCt`3rrK<)`(L zfgK&&hIhbL01BgYxVttsMg{tf3OaYdX{0JxR51SHu-}3H&FL)h69TveNp(oz5pL&& zCa}`*DXD+IgKizH!=nC{PZ*?H5KaC#>SWee8C5L({#u6UD)sL zSSYfzr_)i{ss2o}?H^{t4BXj3ba@ zKfoP~(G%I+(KE6*$*BO1g?2EJfr!_`e+%aVoF_qKD=}$4 z&*fYz@F|e`;!(`3(R-AG=c|#22|JNZ;8v+R8-V<)j+d9C6mRqNg^Dx;NAh>BB0<5w z_)fm}QKR7wM)APG^e+3AIX{$cd?$bJRrvmV$iw~abGYitUN}^yj8Xg+u3k7jBK$Ha zR*F-A4-ZBfunY4-8rQmxs9+009A?#m%b;lyRAKYG;xMr#Y9qV$qoyKJwk|txZ#c^( ziSgi6$jVAi0n2QW-%LkCdxVLW!1svacFaReI!tjv(BgGFr%_#*lXvZeb#kv^*_Pji`CD2al5JD=|XU@K?!aN(*le4ZAV54&*Hy;A`UmuaCStcdNvl z(_v0g)s775XHvkW41$XIW=R0S1R-05OEKjXHTk{1^(WlFI+EC?fr%K9BY=@#R3$xb zhBSdzM=+_twf5MZv<&*r33<3psO#T_CK?aA{#|K6&B?V-&`SrxkFg=lW2KrZcN3^jPU7bu~*dyX6; zcbY_Q7`c!kupWe6B_QG!lO#Mr>AMOVL1IXL_eKHw=R$ql2;JXFr5WLrWy8EX515m8 zQW6A?oq@VD4?70G#UO7Mk+;Y=!Zj8N zT9k9dBT1TO%I$=D6`)WjAI14R@215!x+IMtu5{!uJ20jS>tZ5Cyii{j38=d?n+&VOPREVqR^wD@>e&_a&75O{GRM#J>r+9I}&0+GSY!`AvB^+9jj&54A((ku)j$;asL~BNcPa1MNB?2Nzj;O?9 zIhum-tD(F&Fpa0Pj-(W2*`ZA(ttDLg(igg;3{3i&@`$$NqP##fjF74+b(Li|MXEPO zo!U2UM7K2(SJ^7MnCqbSHG*XO<$au3ehSE)f4uz4rIdZey$MJM|KNal)_xmBEK?#8 zBL3S?%{-Xq{_OP*G) zjZl$ck8Y|j{O+t~c~->>F=~5J8xRSvp}Y-C_2j5jU!Oz-Nyn%3NQERT{#HBmGL}t}|`#kCPZCv=j6us8AOyyoI~m zJJ&PSwJ?{sDeFj>=3htxM&?mKET=R>p$Fn@Ma{LK+bdg~g*;D5euf5DUd}9eI z^mCfG>pd>ooDz;K&M=~z=83y5L#2Lw%!Rt`HW5q639>J07vuME8 zMW(}6tCu`Y+QU0klu1x6B^r`WNdD_q!}qFg{cD^j)ez6E2V39&v$07UF%j&CTfc6o z#&VrKZVSMF3yT2sof@O*6VDSL%3Po>lxk%uVPRmZ2C70LPkc!ugt}70Zva~}wmqBU z*jAZv(vuB;rYTwm^}(Ri4=`Tl46bXaz+t-{<7JiVG2Rnx%R@%%J^Y8J;oNBo@K~`_ zz9J<-OaF=ie|Hm;s~6@Bd$Cf&;sIW{8dg?8)E;Gt&>iGDT(P0UWt7csfJJjR*4hD{ zHrbT@e^dkDQVXHMztj^I^%vM1-DfY|-xcG;r?!PH+r=$d&I%v*(i&kwbB&aV?$R2O zbIa!!YI#l>MOhHDx_aGK%y*J8#iCu+s`af`nop=L^uOVUwoJR6|7J2NQ(fM8bqa?= zG!1hqDJL5#PAL>lRYX(SYEk7t+Bn43XB>&d)u1djN;(tQDGU1|Px=q3hgE*Y%6u6c zu5!m>E-~+lxyaV6G~pV#8m^8PZhD2+eV~=r<~&8OfIV@AmowGAvJMItOgPA3A}^yw z_5R#K=?sQLnsGTY?GSWbD*SRt-*6ID0TJv;KP#pkA$ov;vRRX;17Gu-o(+L*7hQ{m z#&IW^NRx>U7Xm%DER&B85N{ZO7a1(rgnoeLui~c1->5f6A|oxTYQxQt)esiPKw_c< z{03ILyb3auc89fK0{EO_bD9YNgMyQUJ^)`#?xdWB3}w6jXSB-8dq+;pmmkkJR!QgodJp=3V zp(|s2zN3$_-do?u{VX7-d+C^{!}kyDsc69YO58m|buaM2i}RiDpkWiOr%0*BHhw4< zQBlBMQJM|aR;UVi{^hZ6^&#LEulx;VK=9Y?`q7X--nBg-O~0W^IS``Vs@pd$WV#fa zZs2$M+na5qRdt{NG|^%Myd&TjcUwa0`P8=#bNf$EB`-g~M)>b-(bguuxLB|~0D~^j z;~;dy?TUxKE#INgx87zy59B_Up8);j(y7Nm>4Y{ZN~(zR3+YE3j#d&2@uw6#*U;gW zmMB+s1c(f0uOO7T@@f> z#dk>yb>c|44`uxz&w=f#Oi*f4`&0?HwkjSPb8uT{?u?0)bi{p5d2%_);v}w;=N5EX zLYb3bo)9yG0)BMAqXOYz5MZz3Vsy9li0Fzq;cLXn2XA2of0*>(h#m~@24ziZmpn$v z*Q2tg?PTH=r*uq;0J8A*KN@H&US1QY3eILzBZF#_0HZWHvR z#wA5he&G3r{sLi5YES|x>7TwWUNbdnv5-g7!d`4p0!&n0P3=*U3vBa;ahAz*Ue;9&`En17KZss6j4Ld8*nIp7gN|mt=GCr#C$(`Bni;gF((%yf(rMmT1Wgu<>6P7&&?XfnX}qHYyf@_v_!?Gihv7t}!tvo( z6~+RY`mvZe{76wedUiDB(-ue6+7JAuZ}T0fr>?E<4)cvIQRNUpYgU^3;{ek5o-leo z;nU8aik=6es~g6PE?r%^iTLRe&R)>3PlRD@qY>&U91Vao#22gyM_G0!CgR1eeB{%oN4H_r<#BZctg=b7FhfcoY zam3=vM8O7COJ%VIs2(&QRy~qzaaux?!V2lZy=s2`%miTT{<`XBdgw(WE0a;S*BfS> z5aBXVx7e{ZuaFBSzxW+>d*$uZrre5)qXow;^H`O{u_AnmuOwNlurX)rJgy5-h*_{+ zW(6UtFs&E4GsKc7TwHdR*f@iooV013?C-w#Y`+dpJL0e!^N7n1) z!-lV$!54Wl=i+A=4jKJ)MJ#Rn{q)qK&E!2lO1UT6$UpLp6_Q4oL87=7~G61t;% zP;fnw3_ldT*RehGc`qPNimeBTaPcQH5L~Q7+(9J5WQsEC?gtKwV)Jo~TQ2RU*hBA; z>@^gUjsPpoS-ZNF9AsUU9kwn{bX9k_hl7RzMDzeoUG+}|})drann1o3+E6b;<^8wwlWe#EIEi9`t`9>nJ^|A*NNm-?=)lx$X z8PS#f;2yQXX>_6wieq_=5xd;DerDt}@^+^7is{%|>V^kNEPD>dxQ(uPIqt z1Njy|wfSSyJ%6r3hkQ?HbcCrDw6yy$oDJ|PXusD<2Ga{$Za#ubX11-6b>TOmNXfv{;yF!Wp`7F8#G@D$;9rIg5y}zyMOc(6 zy~xvw3*kyLp&rA18a=oPT9LF05%utDIKp>Of>!c7p8-=t zAspVH4C4g7PoQSZu-6j}s1Mc`rN6wUwCsTXVgsKBo$qaZV?&>hI^W-tk<@7T13vuW zVo`q87W?16!GtpqEJ|tTq|1ZOT`6d|y_?#8Ysou^V+61|kWYr|k!hr;nXEOrpF*C{qh13>Bj1DC zZRXQcY@iQ%Ll?1}xx9zf+pN>TP}z)hZ@Bd&8&tkk-JY*INXkz=x?l(JmwXwO?KddC z{Rd`Jhwt_!u`c07?(PoQh88JPL)A)1*2OQM(zaT3!SxXYTQy*~BPIH?#a$%f`;{|8 z&IL)Vuo@QVLpIg*$_Y(a*W>>0wF-{%IBJXX)}o$c_4por~-RxVh+t7RxUbU;yjs+%k8J2?3IyOdAMQC=PFQZT#FJvAb zK9o33pKbAaVJ*zrd!-8#BcPU98daYW*T{f?C_=lJj+@oA%SUbNkeaAAP*{jpYlH~2 zcpjncg-en4q`{Ga!?C23k4WdM9xq2YKnItoI?A1fCMF%Wo>)7t#YtAB&R=y5;*mUA zR$KLerwW1;1)v5@qnu4)#w)zJL4Pr1aBR|NkXBCMpT%>}nABA+Q-@Be8^sN(6mMAH z9j;f7SWu11M*0;p+agd2Ojwkf^iNWs@3&=Fmuljpl)X01zC*s?VKFT03F|EhO=q9sU=cdYJmWzTG1B98Gse#rx+HKpS6{(#>=g(*ieD# zEr)z8{mqD|*q2oBD(aqRLR5YFzv-)Fl#~T%@I`ul z`4^s^kVqIi;Ld&L>ax<2BVv{b;#JpT{}s7g>RF!?aj5^{&4g_PCIjeSaUnYQYrUgj0Sjv++Hw- ze_gUf-`);+YJiD_K{EB$a>t!08BCHmhmktQFjGnH2Jx^T;QK<$uvOZkUT#r0x6#ZoHyQSm+-OK*#7V)b2sd3PnB+b{ zitOs$-5th&$Mmfb(t%y|sGcA z9E_g-{2fN}8Tx^APj0tREWCpRRP^tRlSw&OD(nxmZ-9wGz&}0l6;0qd(40ul9~__P!il()$GVZ>zM~ z^vsgF+26SrZZn1VBoq1zY3xFERw6GD6=s7;yVFGHR88`Gx)uZ~>R=d&g*JKV= zOnH^q4$)v7PXBRYyV%k%1%+VNK4? zjHZ(XnJ)k|)RU5>P0#K2QD)1oZzVpt-QhW{PZJjA7i-} z=@|+BZ7eETMfL%s7#W)_qRGdE6X?ipj~kumhx7_Ot2o|>n;xu|A`_4MVhS9KRZRxFvqVdqGT`I#>HVacLR)nq=@TU?**N~mE<2F$K` zqB;JpL*0PWUO=wnpowS|yYR!e3Gy_)_)Cu0#P0%8f4-5hcX@ezQoE^LzV+8j>D1G+ zo726kqtCUQlfCn2^Dk>xWE1C!9^{ciKtGulIcfob-#QG8lm{sWp_E{y0O9kqB;ODLs@{_mVaXd zuk>}Fe^rGG&%kJ(H@?&z!6?i0%im8voE_hsU(^ndzMvNdOud;r^uuBA#;L4HI8^Dl zq*N0tKcAcKOo4+uJ-M0bs;~Uhn9Jp=MdWqGZZ1EaXAUs$h7>3xAD|-?*UK8;5imu; zbU1!~oUSJ%u$eh)N9LoEg5Kb2Bc%3cJ!oufWFHwf1}XBpF_y z!}rp8c=ZvT^P#T-;ZeCB=JSn3StJ*c-ZXYVx^AmOtH(xO7#}eLI3B;C{`^{7B0tkG zPs?^I=^h=9hkaVX)D7``pG^Oj+!-w*D;|VX2d?KGw;7X2&7hRsMftpxr1Pl^(MNkd zL7!H9iWiHRqM$DiPtLYj1kRlCw0UN-Q;0nyL8baebw6yuC(8* zxJ`e(E1m44Nnz7hpC}}I-!#LmY;5QR{s022-o(d!IY6`kTd-1Xcl%vY2ZU)Y|F7uO%OI)EyZ;JE*ut*? z8@{Tp$um$dQTk|L01QHBKmzRT+=RZrO>*O(a$8cY-0Do*Gcpq1?vLZ)Fx-}4#3E1~ zY3i&E=xhL2%#h-gzoo$MQH!eOh|OYa!`|C^s0tX^b0 zZ{Om7jRxxj(1gIJcyX~VYoUO*POwlyffr$Gw|)H}lNGvI=x3vf(gY|EN65k*l|fph zzVlOYbgvUtw6kL2XPwGpN%~HySS*$>c}Yyj#at)>OuO?MjY(vAz}3HCKMs6%kS}@v zxdXraV%1I3Hp$!=nZ?--5X#F1C}SC(*Mq)SP-ytVbjeE5*UMh7(;E0|T-QV8=yD!vAmYczL)=mU2ofb9Q)+ryCRR zp|C``Vs3YIkN?q{7*T)|uk!7M0e_Rh^@fA#VbJgNV8%Wry?HY2L;(ZJ8$$r+CcwRK zVdRshW0k;YTE6o$wk(q)bLb%q33+)O68$b2zk#pE0h#svCMFh0qZo5^C~@cT{1OLm z4(}TfGcOFUxmxi@<%tvU;~N}?Oyo+{u==}2GkL`lzh;~iX42|^6Z=O|y2r^t;Q9AI zzNvV@%27>50lIhy?5>wEYFS|SoOfKM%D|jH-_9z1<$#LDfQrU|igG~cUC$UyfJ#@- zFGjp{xWw6tSD&r;)n_YOdA6dJXDhPLR-8IpYxd#FMn$PJ2UKwPg?Z@y=`+{OK6Bly zGZz_qF*5dIWbDQ6$}`tB&)mr+4%!@D*Q>N%7+vd`BiG70a;>b5t5R1i{A)%@oQ~D~ z7IyD1ow&7E968!p^w`~Zz0KVsk0$sRPhe!6z{og(k#PcB=@Y2<(7xz@xy_dCc1V92YSfsi7Cd(a)+Bpdb^#ik>>$< zrP{qkKeS`r|1l%y7-s)_(0{m3Z~(V7fH6(yQs;ZyYbDFTM~XeHi*+HCVu1k4Lz>c8aEspi7=5%W7vMsRV8 zkG0ns{jR`f1K@7EM1bP{^xss3jchcGt)=Z(`{mu5n2|YG+>-qr4n#jm-$ZTY zX8PPee@w+rNS}FC-G>mWThoXBneEN#5-~&KE)q|(lc+O6=AXQ91-J-gIc8;EC6lR| zuX!iALqxw+LdBz^{-Q)r??aSO8M_j9s%QeQ-q|>z+Tg77!c6>$_$d*8ui&rR`^=~h ze)Ap6lrLbt!Qn%$o@g>oM$`6(S+i-LkH}1}T3=OiU$Wa@nl`5FCL_r1?nEB?Cqqt{gJH*UHf%jk#>BQ!MVTL|k~#Gyp%X*(be} zeT0o8^JT?l64=-t@VPbcfLR!Qw^&-L!onp+iw9xKdy~-pF8+dEQ;P4E^T9xv8ikt? zYx>`ldeYD*sY&XTctnUx*xli85(%nD)C1T{Og)Sb=+4VH;Uu%iejN=|uR@Ozm~S}0jjhH}7u^pEFu%h{ zZ1n3vXKF-`)$RA2ynV7d$5UR?DvM(@an&Ty5@cru|kN>scKeIo(R!`T=A>KYa#5XI4_+~{f;lDeh z`f+-$Ipt?h-Fk_Iim-foGP^ff?w$&LoT_tosZOu#?k7Yt>QX57dcN2`Mln_$n7+OP zZ?ZaY@L~s+iXB)Tm^E$05M>>Q?5!N5t};H9aoC*$ROeW$p&^2mX67-IO22Soe=)(Ymg9pG#ye;j#D+?^rZ&oO6_wBoP zZ)D=oNPH_3M@FJ5eybCIRK>?eqAETy5>@f3k@!=Y|9n^a`6rn_)A>IYW#U{U!Z6;H zRdJO)F#7qU&M(RQk4a@s0sN!^b|k>3L|5>$&fk^!N6A7@@clCCU9}bu%eZ$H==U_J zjWpoG6u#&to$m?TG0)6iy6En6MR(1jAJRqNJXiFMS#M)z@%t6 zU4N}@Mk=_BDXJ!aiZ50wyurQ?>C$iYt#1OcxlgtjBOleID^3Gty?q{CcK+lSiLFpH z(&*{QsUyT_W8*fzgJIgd$F|?9NOl&ps>BXJDddm5GJgF_exbHNa?3p`Cin#tT~A=W zP`97_sZen6+{kZH*1W-V#n7b@@f!c)(TDvO%*Tjge~Kzw7zq^1wW!J#PS|K+Ecu~a zae3V;>ThF1Gc{GY*<5MlgE4nLeh`Iqb=}xhh3^b(E|N>Nq#rmYe@Ih^;NF%Ka_}t$ zuYMT~{#zUywx$%UEQXzp*p&6yn0;sWY{m}Qk-3LWt-yZ3_Smna7D)Y7nvVT|=6FEt z=&Ao};coj^Apb{^UwFHTzj`tMb;myWrFYx-<6|I1c%L>;*(Z-pL>(yUL-zB7A^2mT z>7yH0KGTy1PV=w8XZ#AR6eb1tGAR%LeBXlG3-j>f4nOQ2IpdS?X_+^!Z8T=4-ab>Y)sjdMXm-@*`I(*y1d%EI@-TExY+w`sjk{_?WA^kbz>D;`@U3ZCfrGo zuKhrDURZz|@mdrf?bsFRkKZo#&TlRuVgGpVISKc6s&s!bhhWg`b(*qvz&!O-$#WJ-d7VZ+fl593|ZQj}(sb z{<4iR!_bO^?$umxcsI(yfzNTYhzkMiOs& zPTsOQJ-96}53wUgCUd>q zf3yEq`OoJ55&x$vEsS&9xt|Ng4CqZiS1J^9TPAetIq0Rj!#`DbU_rw%DcnPk(Rfsy zav0a9IzW)Ul|yUN71<9)O*r;vK<{(;=NjTQE%2XK??xghs1gsT3nv&)_9n+rP?L?v z3il5=5B_24^zV%302gZEu(jqmXrWN^&mm5Y?D~Y`Z0snshSP|awA20p6qkX$iW+;t zR2{;YNQX+z6^s~nXpyO3Vy7;0#Drv2Sz1}8aT@w`2ms|;wV8NS06$yo>r~{yW`r#& zrVp0Zo`}_5$;d2>TOn2^C!IFZ!dV~{ED1ot+`1lH`$Hx2jR2SM;l1iDwr8*AM@Navk%#N&!NWTN-)?ksKdW9-^9wOSh^ZexUWWizZEcR4(%BL zxm{Te;T*K8TRkv=(g0}mOf@EIa=Zma|CI|cL*g0P;yp6=*}pzMzB%06uMw+3C58F{GS?@;r0b%=!$~0gvj3q30Fd_n5BMja_khp- znBKj@KL}3i4U8- zINysQaUF#VpOuGeS|9g==RHP3kz$E=D?ZEBaei!N;nK_OHV)$I1(qAehr^M~p}m2d zR>Drxy~Rbn$A2D-jNPU?Vrw`nozO6z zU_UR8_D(+@*Dl#RlTE$+barvYiqA|+@nt^w6_c{}(yWy1(V1iUJL~l)XW>k##9tEr zLnR_&~McJyYtusm}hQ3qUg?3Jtsg8SAOMS?QIQ67{wbU;R zF^D+u1Iz@fn7Ma_Q2b=#XYF>zLwbns%W))s9!#bfR?K=ryOSz$C@lT6`^Z}?jD@wX zfy~po@^*kNxfUt6QHBWpHd(uD)s+GHC<&|L<5&ZWm{I>;P<*?9+;YTMXk8XSHS9Z!q5lX;Gyv?}S zxgAIW_#j)_K42f%XC-PMC{ep9$Uc>4DnpPBoHYK2qHOWA#DCJS5~WZ+3bY?yl4tKN z3$K4&PFj18)Y*GppndmO1lqs8PM-acuA9%=GWYWEB4cv)GJBI|I38I2MP|lf&VO*N z^c=6{=5+6*mb)B{JJSTHk_0WdG#3nX%^S47NO~CdfKx4%RCb!Gd5!2XQ&1^HiroM3 za{8qJ|A(cM&0*^RvCDI!N#3Pg9)1FktGgoPl>usVYB&0Z>{1FlG%WW37N48K%~aY7 zaZak06;hov)I(+q**`#L2{CNaOqXCHTRC^CNYX6N0{Z!1}?CHJEp7k0ni0x&zv zAK0Yzlj`;|tK=f;s0SO@)swMwqJ?NUL+l6Wp>v;F5J+cg12bceJuMtuIl#o^Zk{QH3GU6vaI$>7(HNGG9yYMyuff^`Thte@bQFv0q%f^0Cwjv62$b)B6UARjPpUXKDs`OaM%t~E!bQP?)* z1Aaom;E0=E07rJ0l9HajQc8N1l~@a&7n827lr*L#3NP{ySu)V0*NaPQ!C#e^{%S}> z3^iJ;nBe?BX6$n|5Ny?Vw<_o<~?2&hJz0Y)S6rn zo9_n5-AjYTYw^R}4NdoeT^AHO$=rD(+n?r@U0y_kJsA7Pw_=xZ3I zUhu0#zaEG;-iIwn`)_08n*VY4eYlP>n%cg#8E|FyJ$C2sdll}b55^6*kFf)Hnr@S= zQL2mwc+afQ2U`%=61m*|R{@L92Wx9lQG&)Lv^hV zl~qd{GL$UPl#I{aE;|%9FiNg>t>t>xDY@RYmg`+Bxn3HIjE)UZ>l@(Zx3*L60N%yK zOer1iBM?0)#wb^H`OtnA|x2PVtSA0$T@C-Wn-#$Dx&VMl!d4w<<^{$?Zw@ z>yxKbHs?6{7#o)^NZ{dsWyYlYPlS!NC*VG236*v!~F7|(SN3MQyhKvnzD(|Gj5h3X35W}>O&_`JN&LQPMYLNQZ}km zj^X@r+PJjhq?K&@4|IL0C+m-wC#%C<0H@{)nor<}MTwMAnL>P|vSc~gucnzKeLwu| z>HQ~W_s`APufa=p3j=Mpu=b}c7zSAu44JkJ-^@-3MZW0W3u{EsPyeAH$6T#Tr?=A4+3nH{dlm^Yu}*TEE)RVh| z3nVA`2US}R-!`VhTr=oRlClGPm0{G?R2OvXtPPAxALsMQ$5&wfYX@T$ckAs28cX(u zfEV_~4O=6+36^i2`&}_ESeS%$nWQgc?KrsYcZn>5MUVK8(4RsZ%(RViLx1gY!7$wq zG5Bp*?;8-Zo~Sn*Brfz9a{V^;wvFE5}ftsvL<&)Jy1bFS&#y z7~GEU_i35o5KDlIgqTDD;bL$4u-{5$Tuup1UKNol>sPuK@nOxB$TKLG^sEU8i&BY} zlFZTRt1Ze%1jwENpnl^)?85HIy1OXa?$XW0)kPARa{JD|a9O{*8h1??yB);Q1G3Xk5?nf4f&t1lMCj7O0 z?y10IGrwOz=Zm8WIa?n2GbuQjz8_VlQgG1oXZ2}=o%r*5PgP9Tm5s{D#>R=9N*Mi# zAH!Uqur9l0ZCWY#Ly{Y*n7}dT0c;hRhcv_gt=4M_fg<_UO!N0Xv214UnA=51EK zXY#@*&w$09*Q17iP~ra2fGU1`4tRvX_q2*fL^n!DXLOTj_D4HiTa#>z#kG_SV!LGO zzZj_7Hb_)>*Ptg5(dJ;)Sw>*C9g;xBIIflBx_wCAD39tiF z@l5WgQe-_}mXGYCYkgPPj+zj*Fa}ko&=wg8cI7mUv}_eR5m+S5#3Bc9r%oG{nSVe} z;=?<_Tm%1LW8*;L(_^IaQ}(Z~AX6N6z?^n4K`)HFZVdH-xI}Ej8Q|!CG7c(jevizM z9YI&ZWTM>}pl9DTXm%i#l-h-R_5lArRK8;bbrjF+Y~Ha4MlXHe>m{C6)G0eWW!Hq- zTQzNP)ID{WtLEVbkAPAQHoQz#hZym~lo5_Wy^_#a;p!dsJS<$dMRR zUdZ?-cO6Im4Hs|_NkA!|wMi;;K!5U%SQu2NXZPYlIZwS6xIk>okgyvK`EtpdZzgY` z1AI=RRw@tlmo$2AagZ2ogjXZ)b@#x&&F(cBOe=NkRR&de=D%YP0N72gL~J-Lx^)ZV zhkqXMpYJGYo%w)3RyH&xL}9hZ*6xAO9Cr7nZr@X5KG6`UXhqAT_0!CMq?VfSB#OZD z5_j)2l(ntw42^Fje9;!48%R)p@zoekF`ZF<)(!yE9=xAb4&Z1FkOJgWrKb*VB=j@k z_UZ=>J}M3|7T+(8c&>aPy5F&g$6Cv@$@1`6=8#y^UJ!I*Kps)pJsZF^dz3=ArWEwF zse?p4%3vRlFezm_zCve0^eN2IJP{9Lim}3INPrm8Z=a$K!+JohKx4tyc&JrfVT6>~ z3l$qJ3g7}b=2YPuHwWc!KHzKJ^%71oLK zJxw3TV86-3aRDXMEW{6R@H;ELx_2UU4$Fb5fe55dkXD`y%ooTQ^DjWp-J+sm>BUhOkp;ZM_UWR%1hQqA97Boj)&Rq{Cvk~s&B+lV{ z<#;D^0wY>A!j(~8v)VIsOsPw@;NR}skqw#wfwh?fRJ9$QF4tuOX665+v(X%Wxg`!j zY-?bf&U=-RqFV8(D0eB|db!QQ2bi++WGsEBx2WdJoAcVmjd)^a!VPS>DILNtIK`gG z@Ar}XMGhU!{nmwFe79c&gI2;)dni$-gaj4l-c0Q*Yj=8Oime2E>u@%hD&WgmDBz2% z<&}#DNTy$B+Buv#n}}Wt-=;ay46%VW zA71|!cJ`Ow!gvF_2O?3tO&L!*f`e2plx8FUK@R15Bt=6a4glu^L;Cvz1|=4H^s(VL zhRp4TgZ(yc5i=NABrnX`tVhn5)_}^!Aat3~p@jZ*hOGI3-y-7ikr!MMB9%|yqof+j zkI7($RI(L^E?6-6hMWx$F4(PVIU6KeFj5rD&W#r=B?u{t)g+dC!MMPCIcpp&7T%Jd z>|-;9D3Rr4!_&4}!;@6bQZ=U;Tp_{zem!cvj{hoZl`j~M9szO?zBOk3*$m7~ z{Q68|zMeyBz0t^cm8_eIa+YNxN`-isA3F_Z#_9%2r==WOr-m4A1+L=DQ9Bt6O#qqp zVR&zBUoJ^SEFqA@a;@o1KJs)b-%n;Tf1sYtmq6uQrqiWfm62{b?Y@w2YfIAM!1Jc< z@enpHqBK~(nn@<5sGo9ld<=0Suqh(Yn4NW3X?3Qqe^*OZz6$jPB{kx~6XO)hkZ1Cw>J176!f5e&D{ z5r3$?Fulri@8Lhm3AUWYPF57qG(48DJYP?rE3%IY^huoA)@*g>q$yphL=vuUYDJOx z>PDo&U#dj&nMPI=`H)@0GAm3Kxr?4DBUr$6nd3x~q@5J5Si)h06w*oIwAtMHy`w%j z(y$Sj#A<7DqrDb`{asv@fnZ*Xp;lod6YG4&C|zVF>KhIjxkyGSP$+3~NTCFPbS?qa zth_fw?_+vj2Z8cblyUAmi)MovUYC85K^HVpQt!U!{xvu=eMd z6!o$MPJ`QKtWlbrS<_8uij4dB3Mvj-NDXZyJ=Q^&c?^s|#=r;}y%&@t9vtH`A zKMMEkkHQ1|_uXSurpRH79I*JlS1rM%#cng;=REE6Ho688AEmAR?LCh*^T=SU4)0Ni zbszfybu#cr`Oo>*rn{dMFQX!jQyc6s@4w@Lb3fuX zcc<(S4Hc$&|FAO3`_0AO>V24b(EgitBiAgVH^bOB0%peE(^ILEm`MpGHO-_ZCGi;C zbqr_>|Dfk(HphQPuym+u*>aul4s#yhzk7$Rac8a(%u@iHGeI>j8$#u8aexv5K!yZD zkwQQaF(U^U>Fh0@zr_J|6~F@r5&-gqyh-P8DS#~w@zzr+c*JD5(hUNvuQs;PMs0N6 zesKHfw>}GyUn&ypb`{ucEfXJW+b{#LuIyw!%fL(3TEx zXTUz*J=gs|e-d6EgmBvp=&tF9fbJr5Lr1isGfo1QYWWdh!?qv8zg?&yLgl*c*xK>% z&lHIi<>&r=yAo*al3=sH)uhZ2GDEfI761LStg@qAM5>IVY0k9pZ-=(c! z8$)=gc4BHrR~=E+z*8U&3lN9Fc=ILo)fQiYM5rNsBn%yk3%A~Ic-rZ$fBUMfKYwZK zuW`81%X@!n@BR6UD#9OvNheC_2XkQqQNeEM-H$*1xKomcn)Gc~DDTQVe4--5Dk;wi zh9?#veJ?>JgZT;_;mIh8X1!o+*Afl;Ay99=l8H5YD7l#%Rg&Hr&BO&tD*eLGKmB>7 zY%2$Cg8k*>2zusF1lA0jiB~8}XR9lJUtYa6WBIs2@sch)lC+v|6vjO|!SovFJ4>eW zFMB;$;cP)}YSW{pM1rO>!|XPn^HOPT1}KetE0|032=aPM9X!0 zFKDpYyj%zDhd*}suZ6*J6jkw4oE|PJsc4A_hCEOo22-*k)~UVi$~j#?3Va5`I~4ke zV7s}_zN2omX#^`P3Nxya^5P|Jd82`WQ1O3Qg#{3aJ2C_)pV{S3+}Xn4<-Wj0A@-C+_?uSX zZpj7X&OI4wJ1?OoVw@h6=Q?j{+QrbiMHb*OT%~Xp6viwl;Cn7FX((JCx8*nLu}L-v&1_Rdyr`t&*8)ZFqCvre$p*;iDWidwZXg8$=)2_ysv`bw zQ#RE7Vs!H5J;r`)ggmbZ<*vBO3zo$b0`(r1j}td0O22Zy;)yT97AmM-BG6d>mDfP6JR`;59jiVTF{}prQ(hdY2Gz= z4lp)5XlpOgkFlJk)N<<8Q{(EI7CN5QqKR{Kq`(jktq~ zjg3(MRH;;#_+3@0=z}jbKFVu>9%hGvikjb5D|gGvGhF<^FUb2|4meOJHeP?4|7{Kh zGg`ZBx}4DqkPielj79h(Mut!z_TebFMKu9tm<5+(hEhut3nL3Bwe~UQl=`_~xS2Jm z;kS`nM+8<-*M1dH+at^t24-SI5)qdZCU;A@$>fxlTTHA=xg}SKnKO`>^TEEC+l&Ob zQU$PE?H9iLZ6+)^{4QJ+ z^!U{>jjXG2Ir7Aj_mBsMn`}6?X1DY{Qbtn|cQ5g4)2o!;$0|AI$rnxQ^jzr$UZJCD z#l`Eyd51aq2qz@*F+#6i8ALE#AK|h|!FzojvNu^UG!7k360_H&24QsO+TPnl+XUgn z4eO{UrPGnAX@#*(1g#i*Yn)0=mVQUo;hyZy2aAN-@DK zZOye9$paxJ;oG)Y>A&xiZAy#=XZ1c1{1s8w=RP}c{btG}Fj;9>SZPXN!4hQw^Q)0M zVRk?m7+^mtNI1=50%5Ukv5KXe)98?s?|ZDd8jAM>p}5$_Y?C*~=IHpN&#*>xk-1%ez35mQC2nv<3k3b zg0c5fI-ZMF#wl%7sW+oU$(fbwP!l&&=QX||%>i^mB`E6tGishR zM^dZ$LIgi73q?#0Cwmd6I9b%|YzO1`4mCI9VS*MX)11&T&MB!tF1vfE#0j^7Ij^cA zDgm>+)|Pr8~+O+7QGzPp(L%vLT(2JmM0xh2XhfE1JtJ8y5;*KF41 zP1ls0jxa86IZRuz-I}YnTl2ZGG+*3qOV;JjZ8x+T;ybSGt=@6}BU`PqrVOCEKrsXv z_d)krJA?FGac>B& z7dhK3zkYhNG;y;eo+^>ln+*n>qYaIQLMaN5YM|1Qr$hKgSUdsd?ADj`ekFN-TS?Mda+$M6n4`jm^}~_d%p_MSJuy3t($z+94*@cJ01? zO8S6YQLk+EYEHTj`$ng^+}cR7Yee_0d+@F6Ge?}7jCRm#{zj?_`uh`CS>SIY3wvk! zk!6Xb_d9t5Xfj~k+rgw=b{rP;!w$-j>SUMO(0e54mFw20HX_eXCz}(5GF&%OxkIPlMUC^Y^2XN3A{W(?X49Bx+=0c zS>%(-5$nN!=m@UuXZaOTH_HIPfQOVAb@2YaGLRC08DQ~2gB_qnJ-sv>!LN>d;b*k~ zKIO({ef*jz^KfCAj}AA@4{3^CrWb!eP-tDg#}|Rv(OAV>nnsZHX0D5JrSwCk3yk6) zNaqOX2s7iP)aMPqA7p3Z;4t4$;;rtaZaEr0=UMNVs{ zmj7UB;g9&_3qL}&;D6=f;~3~3!lL^Y=iVUOuj8|oSrZYnm{ zMAx}XAr8RrRpGM)VC1MY1h2yCXOb$N&P3jj&u_g4v(I|K1(~z2X`%lkNBY$mT^w<} z=l>TS1(l;|ImqPRYq8{p8)$9L$puwYXf^^rJCOXLRTET1Lql^NFFC#%@nl= zytH+m{v57kFQPgNLK$|sm@aA3=a>BmK@ECULK{h0Wx@hdVD&L>=rNEzi?AT5NqmOr zR`h2H=GFMzY52GHJtyBM=K@E`?`cJ!9GTXWGcOZH72Xs1J;rY!Z~ZwvpN;6>DgE1{ zf7izJrzHw37`cKfhX&0Yw6qK+GNd$1Pg>G(NLV1Qo;CegKc=_Dvd1Kyt+$XiU*~Uk zO-mBf5*)1|R*BJXo8WU>9uuXFSH2byzNn>QzVSt=H@>hX1#Xj3uQTPLTMWA)RPy&d&o*skM+qVw>q8m6#EOEB-eq49P_`q2-WWf|KBtxS|o9=@q({Uthm)%F6cSHQ(=`>T)C>lHF=z}Bh_^rmf0+Wg^E12w1!T=X@V;#WDJ22 zFYMNK%N(@speAQ9hW+g3NMj}EIStNZ?iPzB1va_(_+bUmjsgOh+6tgICeVonV!0nt z4b^~ryArbWE(Q9|1U)c8ciyI9e^js^gML3Sfhii3oBOzTa;;+swavl{H%A#d% zs4EO~XNIerWDpI}Kn!>LTHsa8r^VPr0k96CTpx#mXTkBvV;}Ihn6KPpPOPAlj{phg zovWc(ANVf8cO|!QbQ4kQZ#2Oxz8Z?Avg(h``jwzcY@$**^5yO^MH4%ievxzr_@-jz z>|)OKAc72-yB#a<4d$JVrky?-74Ji}!+`{NaTTUOsl)v{5(@#du+Y=6YfOU(-VRE;etJTs%>L*EgC2wh>0g6B z42S+z=Rfp2)5qhRv)bhiQbsXM;f+y$uAJlU3mufbxIsbbKx2iyVJjGSrtN+wqBJhR zC&#JuwpROcb%O57VVvFCGMqJ*2F5?ao8ckyGB2fOOY5lA8!X~ZH&KossC%j& zH7evRlHL+X1g&BT0xEz#1%F~s3f98Rh8`kpNNiQQQ*_>0vZOjj?%Lh$)9aI)gQJU^ z)yqxKly_4! zK$9jh44=C#ZR5Vbq*{FIJ4nu){dTf|jYVJF=)6Xh*{~F1YkxD!{0AN6$zdNYGoZGUuj>aeNG zA{VYlryp-lu8*&d&X0e0=mAxtB}q`lA^~|yygVd*1%#9Mu~W|Kgmo(d86$rDm<4=u z{n-It(=4zn3%p4esQr3<1gALFz}qy~<@u-DMa@~fG>jeH(DJlh?D1*SwFvt$QM_1w zc0P?BmNFrazNF}i44}P(1Bd&M?)gPvMOsMP@i;71>#JO1V;?T@*sv&KP4u2W@B!Zg z7kuxx(vhDlsE~aT+}ZXyRk!We2MlrfimL>O`TCeW3*wcr7Arz+Gc!W%+A}bKT~@`g z#elcyL;-pM2ZvKi6YkwdT(py_Dk!)P5r6KI?q!u}k;T9Q>ztFlFE<~~PHUIcv3_v> zVTeefiH@@lF+5lkO}TV4*O#@M!?TZ6eF~^{Khkgj1NZp(jsV1G466><0V0cUTRWF; zkre>I&hrduS!tK0i%FLzt4bSU@64#Y-ET!Sdu z&;~j^yExf9Ca^VvOGSXe34CdNv7UpY%k$&CeR}NHjT&~KHu&XvZU6ds??Qu)hqG22 z)_1Z5dvSLC@e^!=OAQRHchJiOKB-;p9oxXtG&MET$LF8+G?3|y%Ld#(J3hM*P&Q31 z_tWv72*Z9Lhb=4-Q)B-3(dj8*6}>^N3Dv;3>E&sW12!~+Qv*J`IRA9Dck!`yb!h@C z&0yh$GqdZe0=^9{)g~CuLg5iz10S4Se?TF}ksfFhV^Y{qhsQ_f28>Ea>TDnK&JnM| zR*~l#D71YmbOkeRVi7GQHIMRAmb1MQ+R5Jv5a9aurhu4vV6jwvM}O4zuC8jQ*L!r~ zh!dR2?WE50*~f$0`PHWn*N4xRLK=P*i$pG62Q(&0J|I@-9LHyFfY3}Kh2_t&w-R)2HANT zWS4dTbQB*Ao`L40dQ*83nJ4DwjLwvNqF8 zbl5A1tbc&UQo;Q+%AgzUs&;url`4SesjHW%r?vk{@@f78UA3Gs{lAys`d>&Qt^Iu( zsf912oOrZ>K3?n{99iVyE6J(m|Q|;tpE9^-!G5$_l}Q$ht<6x(H)no{qLfWBucQV zSRu(3RSC)(sykRgX3aCHsBBt?eDM~HCjz4(q~l>R&n3~n40}mmLN0QHLbe+z-^wl! zw_L~g#tAS!J#k=UY*^#C99?~?U1;uOIGc`U)0%i+dU{$TOs>D>yjm$5KgwhnfPABx zEO+0kv-(@?I`9qbPSR5kPd1EaE~!<7LfMHG&1`iMOpY z%A&fKA>~>afw7F`zkC0nxe^yGH^bFu*G{A{Ux# zp?-f5wZ%*MJw^~&N&`3@N;J#EO|?ZKBzW5KFycy4_pHb=!M!rsMW^j$S5~6kcVXvX z@w!q3hc-JtnR$v7`Q{B73D2iPSE$DCHL@Okg}=m5w;QL})^>_7_C15%%B4cL?5 zkbA;gPpN{@8&Y$1952<`tlCfsp=s8IR^m@j^!L^qp+_bRizS=_1+BqwGVMeY|8YDU z(B)U2Yis^kTJuB2<)-bX4*rfaF$dYU;(H2Qg;%GEFy>Yo* z#ZCKnpIQJk(A`{|xe!HV+lqUklM z=L30jfMW2r(I9R8R@^jWD}~O>zU!$+$9-+`YBC)UAI#>f;WPG`@=8GV5V&tIEBsk# zyEL};i}SR41!`+4=&J>-TP0Mvjfoh9grJ9_s}kgPd~Y^?m43oYvzAPCaW62dy}5 zgh5WZ91_A%Oc%-@R9?^9lww}-3-ZJh$Q$HeK7$m@%lp3OgO2iv zcapqukI$PI^}Klz&l{KHyt;Jf<-2CyykF;=!&aV|FnQ*{Kq&DJYV+1vT=PWJul;%*dyNK=R3(Z{B*HH$}4Y z3+}Rc%@NBR41~O966902_I$>jJ#W(Gd3~`eD2dg4L7Di%BRRI+YnVfbL`&R?Iopln zx8&v(>tkMvF%pbZ+rK(mJQ=&w@}!H0=x|W>>ESad6F<>j`Oes_R%+X^kJJI{i=Z!5 z!^|&PCA*jISL8{zS*tj2wjD862K*a?kLr78G0KjuA6&@x<0G78+t0!`&_9~`*9TDWCVd>KKAa) zW!1rB&l>u>k8_KHVW=Sr1zUS4;KO@-pup_2XIc`RwcLGbLqklvAMV$CLKj{ih-_3= z59HacB7}XdtcS(>oqJ2yPDoJ%zK+7>4o=Niuh5>@NEk>Fa&nvmKO7J=BSy-=pCZPZ zb>CpG*g_n_MyOP{%%4?0%PShSz;td^-jQ;@UGVesR^_LRctAn~m~pHQiCp4LpyWiHFwX`8Fe8L{SnwPg5yCiQDA5QD zb(-)<$bc};8%i+3LLNIX$MQ><2M|P?LAL1k>Q?ZX1gQ`q_++ZzzJ7fRDC{$ZYQi|E z>Xsa;NE};`nurnE2N`UN?1b1;xUXN`U%#$=91C^g)yE=v=G8MXsqL`bx0nmUJQ!7) z42oRhpsb@^KPyHgj!pwY6=I&8^(aI6MA*kEz?fPl!a7|c(NI$nsneCL-C1fY!a9#3 z-OyMOse=-(;u%L}eI)exSodQlq)49SbuVUY$Nti%wu3#KMWq5Gti#{Rj;E+F1++br zA1W5m258?gJ4K|an!2CCWEZ*k!Of2!--JPGkXRwE@GugZ>Zn)aNQ>ncTe7uThISB* zYQAXRfjq?aEaOauy2};Xc2TF#jx=Qv$2j$(jPnzBLr3TY^CIau4b$#~uLLz?YaS@Y z97oGSBBMB&bQN8*q7T|7j`T#6l@is?s}?|AI}M#z8F1Z`x-!$@#S|A9dNP+l_DQG} zR+xFJEJk?&$%o6)b4{1cY%)r9XD&7FwNaAM$J`W^=@cCoU5!Zcx5syL*F}3%Zm&@) z&Ep$7OBuerXok)lZQBrkND9NYNF26_nxSlMB<2^*wUw)02MMR4?*U)6uo6YKV1F^`6{6I@C4l*AshQh>+V&UEYBwX(pEP^((2%s?@Ypwp< ze}49)cIv;i7K#6c$y4uM!3hNftHce5!3>w76qS_L)lM#oh4yqhs=s-2cXwC5+bR#o ztvA&VA3nUfZ%_Mh6)gnbVD6zIuaHYMeO$+cv-Db6*!GG26D)c`rKU#AjeZ{lM53B3X3UhB9s z0zz#<%#&)RvPCLva0~fNFBlZ}&W?-Aye-BhVqQd%&(H9+t-s#l*N#^{IoLfvxVQua zesqZ6hUW|{#0R7#jd%Gg3~S9{)z{^!q-jU>CRo0HnWhC*LvC*9^XBF*@>@MgC?F;4 zD9`XRuDA?V+HW&ix(H5ihl9@4A^ec{8d-&!r8zI5GUDYsFD-QkK$~596h=Qd3M1xh z$3q|@^{L9|QBnMDR1i(H3k@UNEl)zAQ6ys6r*)nq0Kx>+{#4gpF$`3lbQ`bmuHjw@% z;MN^K4AJA+h%|6GyE&z7tTu%s z;>m)w3#6GxPcSOoD@)0QO6e9;@ijA*c2nC=RfWg*sB<6nE~Y>obpZI=2|g{~ko3#< z8&abaKFP;?UkDrvi+pEM5uML4UqQ6*!XkE$4!@j`$9lg!8;pQt-GyuV0FQ7+Gh?@{ z@GBdOls!O$3A8?ofasx9KNLR78_De9W6$jBgLM(MW9)s*pWLHqr9@M zIc(;?ULGIOp)M(m=jT-N9#IrB-I2Vtze=CvVgh9#36!6i{4h@2kvxV0L{cePFp9ny zEF)D$M3l&?#NaOxCCL36Va<6Mk?GwKsgsdGcZ?QNCj$dY)r}{O!S5S27|Gxap^gmd zf8kXFuOfIQ25RupiY4=Pjh?*|e06@E(CiZhqE3)~<9u4Yem_{_iLGK}E4C0-K#;{hd!2D*^v{n1e{k}(EAQ=GFcTS^P zsWCf@`~Uj&390NSAaS)_T zspp@mNqKWfk%`Ndy4a$u*`hxEWcA7D{Ke(L$=>0S0GP_(=m4~}w*B62uJnwus@1hh zW~&kR!lt5)RNJ=~Tt%FSvD{VTnEoG#NA^acjTX@g^roI#fOPiePP7I7QGCn1gFEJf ztCAXbA0HZba6XLPldHRHvA8XFQ0;=YjLF(BQe6r19NqX*6PI;yWwB-_@iGnv8eTkQ zSFvBq`vgPJNL(!oh^QG6JDcdkfY4i_aGp|pL09+MfwL13wV>gCWUyq9>T4`I5EAJic9zzdKZw~gq9IVyXR30ScNGy&9jEJ^4420be(D@m(Nm(Uw@p*3$ zS}~W()14pXClPI8u41p}^+%V(gRm9-K4zwIxgc6=&&%z~`N(BX$gMpQLejOZ47%2e z`=^FU7rAI)&|q0KnMxoySvi^|W;vDy%4xhRYV-Oie66IeS#3BHm1O*43 z%`(N+lE=L?x-aviVG^Am39lO#wJmVQcWY%tLwBj%uZq==t+H;+!}Bv=i(3w0gC*DS$6 zQe!DgpsmBkn>x}mO^SH#XQna{ZQ*gWF4%?37@s&%eByLPpJ^Jn?IBJzxg8$L0v{i+ zIcq^?w3>0UTw`=dm~iO-gFCKU!h>}UIpa|lZsM%p{Sf>aS3?8CC0B^PzL!9M=K9tpqbe@YfKUiGy9{8+r7Np-TO+{ z=TysqLb03v_gb!K?{uqww9&Gp6^&oBaVQ?Qoo-ZP_1yBBU`dQZ%vb{KiAx@kA79Y8 z2*C03-V9`ldF{W0T84M!Y*_6JMK5nR6^BepH)lM>-7039$%Nx;9^JE*=uMI}H(JD+ z8!cuu1I}8-q*{{O{hwi1k%^Jx-Lqv?{~-TL-J7Pak9_2eD~K4Y@x7{C6O8<}FJ)qY z;+&7fPkwAXLMI1TkJs+>`FXrE-ch+8ulb`MN7OYJ3j)l@!hT50pIRiSTO2^0j=0NY zZ#=AEZ|ITpg>)@qwiKnt^t0<%@yW%eD;9`2fa}+u`$=5`4nFQR4j|K4_tVwEKYRVU zTjTnrdUA7idT~hd>3@_S#Q|J8zRIosH9mH}{-3y!**li5WD71gKhXAE1!5mm2l$pY z-ua<&u>_h($+yE#Ju+B0#mE8r(SlWezN6hQzoV&QoW|%!Z))nYxCC8@zlAPdve54S z!@%oz0!#4Hd0NtnXbq&Luy*R^s9P`_nU7Q^?pLN)^}|{-{jjzaUyoqdCm$73NV;Jn zY3Z=&75mIt@Q5aE0WtAG1e9cy@or`ME}Rq2nWK?+Ckqx$z^g`?B%53XnZ;+q%l53C zl4k1hBO7U|VL=5Z>WtBmadAOc0N0{5*Q3*OgP^I1<-2Q+T69IT!Zml+%Dx&b#U*@= z)QE^Am)vNY$nN{fj@S0#PO*L`5qwFL`CdUd#Gq=?$DyW^nk$yEky|tQ$qALky_fd- zO|ZNr)r-dg7MIX1VUKW=9qT#!LaCH$own%RsWYlF!7>vBURLBe7WCaPl0?54?* z7?n4f9_XXPOb0#dEk?RK=|ie+FAlju(u^JZG(h4^q|OiDNr5RJ@39zLYo(KF7J!<~ zI-!(pvb}}}q}}%<9eW3cil1P)8mlPjD-m5+VTsonX6=)%t9w}rlq5B&1|MZVzjX%F z_w18;8;Qd-X(x|{crco{9BlrwpUv;rf^sWz#Efhs2kuZdz8|vHeeAADyp`Y;oolmN%c$0)?ThOJ}*ubSXM zAKUO%)4D8lFJzbTqK{fv&J#T@?;rs}W<8yHQ-30&ev8ROI{5H)_xwDEpRZ2B8hNcg zM;05@I|vVMSy$mA8hN;QaYKGP*+XNYBL2kXP2iuQZ3gJ+$$?1y<%bxn^rBf*&L|5K zF3$H@L`UVe&7l8NP5txW{8Z>4GG=mk^6laVt0!796-$j;)fu}li%Yk=wf#?b%j|^_ z_1C+QZn&~6|4*)+T;`aYi)oGd_-oZCYWuM^ynJ#W+!Oa#ch~KEE~0g!37)!c_xU+& z^xgjRbE|Rd-abFK$+IYI!@l?Y+=bs0XHokD%|Z*wskRJs9n^wzLviAEv9J~tvI_;n z&#%wVefW8Je!hjDPfk`>?+dMlrNQO7#v;P- z7t1(1J^KFT^yKFB^XH3$OFUtY9Pt}8FnE4GLL)FR>Z4)rp*0+wHk;_n3d<0`xq&!x zL+QPBK{*Mj@z_T&Q7#65=g-Zm)0la3yuAb?2u}|W2bY-~cp#gmJV<#0EwgZnht3;O z(=w9bBKf04N;vl7cw(6l>*qTKnYE3yB9bd4IYI?L=|jS~@N8>*}wR3xFrNkyq?tIDQ z&fQzL?{?j`Yfp2J)$e0lNM0F5G^8;zwuW?pMh6lXuO7-Cr{nH3;%0bb+~=im$Uk>- znJ_s61OWZ~%0DOk^T0o!_~$FGyaWE;A|H>DyDw`j!oj2v^KEf@TC>O@);_&puajvS@jyQFz zAI(yFbWBp4E^z>UQRm?|_3<-a!+*Xqxd7L0XtR5*0G!GuxZ)$&nKTQ0DeGOla~kuq zT3_-^uHuuGj;o@mVGQ9k5{C=J(jM7z8to$7CL3MMWs_Hp`2N^vVX{O6(&}NE*kAB0$XNoKD+O50@z98!&EE;2c6M+Y~GzjPWe8>N!(46b}^)i}YNNcRLifgrac9;teyT2Ke-Yw=@y-8Ks+<=*yDlVBft zroQPbD}MIY;&7w+cp9Jx+$zAy)_QQ!G^iHfVxR^mNFythj5-HO$3Rt|(e5##snD%7 z!jFL(%Mcd&zS8&(uQktT{{`(fD5GlT(IEj2iLX;6rDtVl4o3M9PNi2B2NmV<PS3Rrq2Y zsL%b$GzrDF1!7Pu4DizSK$b-Ur`|&R7UMHNro?14QY`V?#bhd@iO`VIzmGf9NMcnP zPpD1C;}f8Da}$X$yTeJweghOZkwlEPgwQ6+K;As-T_PbmgNXbW+jJGo^k>*!r}*U9 zQy@6mpNUq0jAv$T^*%;j1f2=&{6$pS-r>c?>A6XznK3WIx-Qmlg~5rf+qM?uj+}X~ zU*8s49Vv7#uV$XXb4Iikx=$$OBP~4$Wx+?pDL6K5YYw?B7;07-uOEkyCDAV!7lb0#L!#YV+{7|0>V1JhgJFj{~qDrog;qX+pmweUo-%XFSP06 zz9ouNkm>Ti8Rey@S=-0$!1QrjrGs&e^CTw^lm?Qf4ItB)I&C1K*4T3o+&h;ERoKnc zfFka9^)*#r=F3Gt^W}ohokF|QYLC!bD~HJ)mUf4$%v$l8RZMuA1uE|A;g_#BpN~#= zFCEi9*NRe-7Kay<<47Ne+{A|O7Wz@xne|5n<)~AInNjqEZ9hKPKm2z5PqcnPNjtiI z^+IoW2hFBuBGGiU&b?t9Z6{|0>ax>ttqY4yAWqRl?^;@PXx?{$g|n7v;S5@VJS7&# zSY(H(q1^ao+*&d(EA6E>w#+Qu<;9~LAC!B~zB#GOgAIMV-o0_Y6bzb�><|%Lagt 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 Rf+yc?{Xchz4m20I2>@S;Ds%t< literal 0 HcmV?d00001 diff --git a/deploy/node_modules/.bin/cake b/deploy/node_modules/.bin/cake new file mode 120000 index 0000000..d95f32a --- /dev/null +++ b/deploy/node_modules/.bin/cake @@ -0,0 +1 @@ +../coffee-script/bin/cake \ No newline at end of file diff --git a/deploy/node_modules/.bin/coffee b/deploy/node_modules/.bin/coffee new file mode 120000 index 0000000..b57f275 --- /dev/null +++ b/deploy/node_modules/.bin/coffee @@ -0,0 +1 @@ +../coffee-script/bin/coffee \ No newline at end of file diff --git a/deploy/node_modules/coffee-script/LICENSE b/deploy/node_modules/coffee-script/LICENSE new file mode 100644 index 0000000..2b8b228 --- /dev/null +++ b/deploy/node_modules/coffee-script/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2009-2017 Jeremy Ashkenas + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/deploy/node_modules/coffee-script/README.md b/deploy/node_modules/coffee-script/README.md new file mode 100644 index 0000000..1097e36 --- /dev/null +++ b/deploy/node_modules/coffee-script/README.md @@ -0,0 +1,57 @@ + { + } } { + { { } } + } }{ { + { }{ } } _____ __ __ + { }{ }{ { } / ____| / _|/ _| + .- { { } { }} -. | | ___ | |_| |_ ___ ___ + ( { } { } { } } ) | | / _ \| _| _/ _ \/ _ \ + |`-..________ ..-'| | |___| (_) | | | || __/ __/ + | | \_____\___/|_| |_| \___|\___| + | ;--. + | (__ \ _____ _ _ + | | ) ) / ____| (_) | | + | |/ / | (___ ___ _ __ _ _ __ | |_ + | ( / \___ \ / __| '__| | '_ \| __| + | |/ ____) | (__| | | | |_) | |_ + | | |_____/ \___|_| |_| .__/ \__| + `-.._________..-' | | + |_| + +CoffeeScript is a little language that compiles into JavaScript. + +## Installation + +Once you have Node.js installed: + +```shell +npm install --global coffeescript +``` + +Leave off the `--global` if you don’t wish to install globally. + +## Getting Started + +Execute a script: + +```shell +coffee /path/to/script.coffee +``` + +Compile a script: + +```shell +coffee -c /path/to/script.coffee +``` + +For documentation, usage, and examples, see: http://coffeescript.org/ + +To suggest a feature or report a bug: https://github.com/jashkenas/coffeescript/issues + +If you’d like to chat, drop by #coffeescript on Freenode IRC. + +The source repository: https://github.com/jashkenas/coffeescript.git + +Changelog: http://coffeescript.org/#changelog + +Our lovely and talented contributors are listed here: https://github.com/jashkenas/coffeescript/contributors diff --git a/deploy/node_modules/coffee-script/bin/cake b/deploy/node_modules/coffee-script/bin/cake new file mode 100755 index 0000000..1c6f9f5 --- /dev/null +++ b/deploy/node_modules/coffee-script/bin/cake @@ -0,0 +1,18 @@ +#!/usr/bin/env node + +var path = require('path'); +var fs = require('fs'); + +var potentialPaths = [ + path.join(process.cwd(), 'node_modules/coffeescript/lib/coffeescript'), + path.join(process.cwd(), 'node_modules/coffeescript/lib/coffee-script'), + path.join(process.cwd(), 'node_modules/coffee-script/lib/coffee-script'), + path.join(__dirname, '../lib/coffee-script') +]; + +for (var i = 0, len = potentialPaths.length; i < len; i++) { + if (fs.existsSync(potentialPaths[i])) { + require(potentialPaths[i] + '/cake').run(); + break; + } +} diff --git a/deploy/node_modules/coffee-script/bin/coffee b/deploy/node_modules/coffee-script/bin/coffee new file mode 100755 index 0000000..1bcdd1e --- /dev/null +++ b/deploy/node_modules/coffee-script/bin/coffee @@ -0,0 +1,18 @@ +#!/usr/bin/env node + +var path = require('path'); +var fs = require('fs'); + +var potentialPaths = [ + path.join(process.cwd(), 'node_modules/coffeescript/lib/coffeescript'), + path.join(process.cwd(), 'node_modules/coffeescript/lib/coffee-script'), + path.join(process.cwd(), 'node_modules/coffee-script/lib/coffee-script'), + path.join(__dirname, '../lib/coffee-script') +]; + +for (var i = 0, len = potentialPaths.length; i < len; i++) { + if (fs.existsSync(potentialPaths[i])) { + require(potentialPaths[i] + '/command').run(); + break; + } +} diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/browser.js b/deploy/node_modules/coffee-script/lib/coffee-script/browser.js new file mode 100644 index 0000000..e6e5d6e --- /dev/null +++ b/deploy/node_modules/coffee-script/lib/coffee-script/browser.js @@ -0,0 +1,132 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var CoffeeScript, compile, runScripts, + indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + CoffeeScript = require('./coffee-script'); + + CoffeeScript.require = require; + + compile = CoffeeScript.compile; + + CoffeeScript["eval"] = function(code, options) { + if (options == null) { + options = {}; + } + if (options.bare == null) { + options.bare = true; + } + return eval(compile(code, options)); + }; + + CoffeeScript.run = function(code, options) { + if (options == null) { + options = {}; + } + options.bare = true; + options.shiftLine = true; + return Function(compile(code, options))(); + }; + + if (typeof window === "undefined" || window === null) { + return; + } + + if ((typeof btoa !== "undefined" && btoa !== null) && (typeof JSON !== "undefined" && JSON !== null)) { + compile = function(code, options) { + if (options == null) { + options = {}; + } + options.inlineMap = true; + return CoffeeScript.compile(code, options); + }; + } + + CoffeeScript.load = function(url, callback, options, hold) { + var xhr; + if (options == null) { + options = {}; + } + if (hold == null) { + hold = false; + } + options.sourceFiles = [url]; + xhr = window.ActiveXObject ? new window.ActiveXObject('Microsoft.XMLHTTP') : new window.XMLHttpRequest(); + xhr.open('GET', url, true); + if ('overrideMimeType' in xhr) { + xhr.overrideMimeType('text/plain'); + } + xhr.onreadystatechange = function() { + var param, ref; + if (xhr.readyState === 4) { + if ((ref = xhr.status) === 0 || ref === 200) { + param = [xhr.responseText, options]; + if (!hold) { + CoffeeScript.run.apply(CoffeeScript, param); + } + } else { + throw new Error("Could not load " + url); + } + if (callback) { + return callback(param); + } + } + }; + return xhr.send(null); + }; + + runScripts = function() { + var coffees, coffeetypes, execute, fn, i, index, j, len, s, script, scripts; + scripts = window.document.getElementsByTagName('script'); + coffeetypes = ['text/coffeescript', 'text/literate-coffeescript']; + coffees = (function() { + var j, len, ref, results; + results = []; + for (j = 0, len = scripts.length; j < len; j++) { + s = scripts[j]; + if (ref = s.type, indexOf.call(coffeetypes, ref) >= 0) { + results.push(s); + } + } + return results; + })(); + index = 0; + execute = function() { + var param; + param = coffees[index]; + if (param instanceof Array) { + CoffeeScript.run.apply(CoffeeScript, param); + index++; + return execute(); + } + }; + fn = function(script, i) { + var options, source; + options = { + literate: script.type === coffeetypes[1] + }; + source = script.src || script.getAttribute('data-src'); + if (source) { + return CoffeeScript.load(source, function(param) { + coffees[i] = param; + return execute(); + }, options, true); + } else { + options.sourceFiles = ['embedded']; + return coffees[i] = [script.innerHTML, options]; + } + }; + for (i = j = 0, len = coffees.length; j < len; i = ++j) { + script = coffees[i]; + fn(script, i); + } + return execute(); + }; + + if (window.addEventListener) { + window.addEventListener('DOMContentLoaded', runScripts, false); + } else { + window.attachEvent('onload', runScripts); + } + +}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/cake.js b/deploy/node_modules/coffee-script/lib/coffee-script/cake.js new file mode 100644 index 0000000..d7155fc --- /dev/null +++ b/deploy/node_modules/coffee-script/lib/coffee-script/cake.js @@ -0,0 +1,114 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var CoffeeScript, cakefileDirectory, fatalError, fs, helpers, missingTask, oparse, options, optparse, path, printTasks, switches, tasks; + + fs = require('fs'); + + path = require('path'); + + helpers = require('./helpers'); + + optparse = require('./optparse'); + + CoffeeScript = require('./coffee-script'); + + CoffeeScript.register(); + + tasks = {}; + + options = {}; + + switches = []; + + oparse = null; + + helpers.extend(global, { + task: function(name, description, action) { + var ref; + if (!action) { + ref = [description, action], action = ref[0], description = ref[1]; + } + return tasks[name] = { + name: name, + description: description, + action: action + }; + }, + option: function(letter, flag, description) { + return switches.push([letter, flag, description]); + }, + invoke: function(name) { + if (!tasks[name]) { + missingTask(name); + } + return tasks[name].action(options); + } + }); + + exports.run = function() { + var arg, args, e, i, len, ref, results; + global.__originalDirname = fs.realpathSync('.'); + process.chdir(cakefileDirectory(__originalDirname)); + args = process.argv.slice(2); + CoffeeScript.run(fs.readFileSync('Cakefile').toString(), { + filename: 'Cakefile' + }); + oparse = new optparse.OptionParser(switches); + if (!args.length) { + return printTasks(); + } + try { + options = oparse.parse(args); + } catch (error) { + e = error; + return fatalError("" + e); + } + ref = options["arguments"]; + results = []; + for (i = 0, len = ref.length; i < len; i++) { + arg = ref[i]; + results.push(invoke(arg)); + } + return results; + }; + + printTasks = function() { + var cakefilePath, desc, name, relative, spaces, task; + relative = path.relative || path.resolve; + cakefilePath = path.join(relative(__originalDirname, process.cwd()), 'Cakefile'); + console.log(cakefilePath + " defines the following tasks:\n"); + for (name in tasks) { + task = tasks[name]; + spaces = 20 - name.length; + spaces = spaces > 0 ? Array(spaces + 1).join(' ') : ''; + desc = task.description ? "# " + task.description : ''; + console.log("cake " + name + spaces + " " + desc); + } + if (switches.length) { + return console.log(oparse.help()); + } + }; + + fatalError = function(message) { + console.error(message + '\n'); + console.log('To see a list of all tasks/options, run "cake"'); + return process.exit(1); + }; + + missingTask = function(task) { + return fatalError("No such task: " + task); + }; + + cakefileDirectory = function(dir) { + var parent; + if (fs.existsSync(path.join(dir, 'Cakefile'))) { + return dir; + } + parent = path.normalize(path.join(dir, '..')); + if (parent !== dir) { + return cakefileDirectory(parent); + } + throw new Error("Cakefile not found in " + (process.cwd())); + }; + +}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/coffee-script.js b/deploy/node_modules/coffee-script/lib/coffee-script/coffee-script.js new file mode 100644 index 0000000..7e77237 --- /dev/null +++ b/deploy/node_modules/coffee-script/lib/coffee-script/coffee-script.js @@ -0,0 +1,426 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var Lexer, SourceMap, base64encode, compile, ext, fn1, formatSourcePosition, fs, getSourceMap, helpers, i, len, lexer, packageJson, parser, path, ref, sourceMaps, sources, vm, withPrettyErrors, + hasProp = {}.hasOwnProperty; + + fs = require('fs'); + + vm = require('vm'); + + path = require('path'); + + Lexer = require('./lexer').Lexer; + + parser = require('./parser').parser; + + helpers = require('./helpers'); + + SourceMap = require('./sourcemap'); + + packageJson = require('../../package.json'); + + exports.VERSION = packageJson.version; + + exports.FILE_EXTENSIONS = ['.coffee', '.litcoffee', '.coffee.md']; + + exports.helpers = helpers; + + base64encode = function(src) { + switch (false) { + case typeof Buffer !== 'function': + return new Buffer(src).toString('base64'); + case typeof btoa !== 'function': + return btoa(encodeURIComponent(src).replace(/%([0-9A-F]{2})/g, function(match, p1) { + return String.fromCharCode('0x' + p1); + })); + default: + throw new Error('Unable to base64 encode inline sourcemap.'); + } + }; + + withPrettyErrors = function(fn) { + return function(code, options) { + var err; + if (options == null) { + options = {}; + } + try { + return fn.call(this, code, options); + } catch (error) { + err = error; + if (typeof code !== 'string') { + throw err; + } + throw helpers.updateSyntaxError(err, code, options.filename); + } + }; + }; + + sources = {}; + + sourceMaps = {}; + + exports.compile = compile = withPrettyErrors(function(code, options) { + var currentColumn, currentLine, encoded, extend, filename, fragment, fragments, generateSourceMap, header, i, j, js, len, len1, map, merge, newLines, ref, ref1, sourceMapDataURI, sourceURL, token, tokens, v3SourceMap; + merge = helpers.merge, extend = helpers.extend; + options = extend({}, options); + generateSourceMap = options.sourceMap || options.inlineMap || (options.filename == null); + filename = options.filename || ''; + sources[filename] = code; + if (generateSourceMap) { + map = new SourceMap; + } + tokens = lexer.tokenize(code, options); + options.referencedVars = (function() { + var i, len, results; + results = []; + for (i = 0, len = tokens.length; i < len; i++) { + token = tokens[i]; + if (token[0] === 'IDENTIFIER') { + results.push(token[1]); + } + } + return results; + })(); + if (!((options.bare != null) && options.bare === true)) { + for (i = 0, len = tokens.length; i < len; i++) { + token = tokens[i]; + if ((ref = token[0]) === 'IMPORT' || ref === 'EXPORT') { + options.bare = true; + break; + } + } + } + fragments = parser.parse(tokens).compileToFragments(options); + currentLine = 0; + if (options.header) { + currentLine += 1; + } + if (options.shiftLine) { + currentLine += 1; + } + currentColumn = 0; + js = ""; + for (j = 0, len1 = fragments.length; j < len1; j++) { + fragment = fragments[j]; + if (generateSourceMap) { + if (fragment.locationData && !/^[;\s]*$/.test(fragment.code)) { + map.add([fragment.locationData.first_line, fragment.locationData.first_column], [currentLine, currentColumn], { + noReplace: true + }); + } + newLines = helpers.count(fragment.code, "\n"); + currentLine += newLines; + if (newLines) { + currentColumn = fragment.code.length - (fragment.code.lastIndexOf("\n") + 1); + } else { + currentColumn += fragment.code.length; + } + } + js += fragment.code; + } + if (options.header) { + header = "Generated by CoffeeScript " + this.VERSION; + js = "// " + header + "\n" + js; + } + if (generateSourceMap) { + v3SourceMap = map.generate(options, code); + sourceMaps[filename] = map; + } + if (options.inlineMap) { + encoded = base64encode(JSON.stringify(v3SourceMap)); + sourceMapDataURI = "//# sourceMappingURL=data:application/json;base64," + encoded; + sourceURL = "//# sourceURL=" + ((ref1 = options.filename) != null ? ref1 : 'coffeescript'); + js = js + "\n" + sourceMapDataURI + "\n" + sourceURL; + } + if (options.sourceMap) { + return { + js: js, + sourceMap: map, + v3SourceMap: JSON.stringify(v3SourceMap, null, 2) + }; + } else { + return js; + } + }); + + exports.tokens = withPrettyErrors(function(code, options) { + return lexer.tokenize(code, options); + }); + + exports.nodes = withPrettyErrors(function(source, options) { + if (typeof source === 'string') { + return parser.parse(lexer.tokenize(source, options)); + } else { + return parser.parse(source); + } + }); + + exports.run = function(code, options) { + var answer, dir, mainModule, ref; + if (options == null) { + options = {}; + } + mainModule = require.main; + mainModule.filename = process.argv[1] = options.filename ? fs.realpathSync(options.filename) : ''; + mainModule.moduleCache && (mainModule.moduleCache = {}); + dir = options.filename != null ? path.dirname(fs.realpathSync(options.filename)) : fs.realpathSync('.'); + mainModule.paths = require('module')._nodeModulePaths(dir); + if (!helpers.isCoffee(mainModule.filename) || require.extensions) { + answer = compile(code, options); + code = (ref = answer.js) != null ? ref : answer; + } + return mainModule._compile(code, mainModule.filename); + }; + + exports["eval"] = function(code, options) { + var Module, _module, _require, createContext, i, isContext, js, k, len, o, r, ref, ref1, ref2, ref3, sandbox, v; + if (options == null) { + options = {}; + } + if (!(code = code.trim())) { + return; + } + createContext = (ref = vm.Script.createContext) != null ? ref : vm.createContext; + isContext = (ref1 = vm.isContext) != null ? ref1 : function(ctx) { + return options.sandbox instanceof createContext().constructor; + }; + if (createContext) { + if (options.sandbox != null) { + if (isContext(options.sandbox)) { + sandbox = options.sandbox; + } else { + sandbox = createContext(); + ref2 = options.sandbox; + for (k in ref2) { + if (!hasProp.call(ref2, k)) continue; + v = ref2[k]; + sandbox[k] = v; + } + } + sandbox.global = sandbox.root = sandbox.GLOBAL = sandbox; + } else { + sandbox = global; + } + sandbox.__filename = options.filename || 'eval'; + sandbox.__dirname = path.dirname(sandbox.__filename); + if (!(sandbox !== global || sandbox.module || sandbox.require)) { + Module = require('module'); + sandbox.module = _module = new Module(options.modulename || 'eval'); + sandbox.require = _require = function(path) { + return Module._load(path, _module, true); + }; + _module.filename = sandbox.__filename; + ref3 = Object.getOwnPropertyNames(require); + for (i = 0, len = ref3.length; i < len; i++) { + r = ref3[i]; + if (r !== 'paths' && r !== 'arguments' && r !== 'caller') { + _require[r] = require[r]; + } + } + _require.paths = _module.paths = Module._nodeModulePaths(process.cwd()); + _require.resolve = function(request) { + return Module._resolveFilename(request, _module); + }; + } + } + o = {}; + for (k in options) { + if (!hasProp.call(options, k)) continue; + v = options[k]; + o[k] = v; + } + o.bare = true; + js = compile(code, o); + if (sandbox === global) { + return vm.runInThisContext(js); + } else { + return vm.runInContext(js, sandbox); + } + }; + + exports.register = function() { + return require('./register'); + }; + + if (require.extensions) { + ref = this.FILE_EXTENSIONS; + fn1 = function(ext) { + var base; + return (base = require.extensions)[ext] != null ? base[ext] : base[ext] = function() { + throw new Error("Use CoffeeScript.register() or require the coffee-script/register module to require " + ext + " files."); + }; + }; + for (i = 0, len = ref.length; i < len; i++) { + ext = ref[i]; + fn1(ext); + } + } + + exports._compileFile = function(filename, sourceMap, inlineMap) { + var answer, err, raw, stripped; + if (sourceMap == null) { + sourceMap = false; + } + if (inlineMap == null) { + inlineMap = false; + } + raw = fs.readFileSync(filename, 'utf8'); + stripped = raw.charCodeAt(0) === 0xFEFF ? raw.substring(1) : raw; + try { + answer = compile(stripped, { + filename: filename, + sourceMap: sourceMap, + inlineMap: inlineMap, + sourceFiles: [filename], + literate: helpers.isLiterate(filename) + }); + } catch (error) { + err = error; + throw helpers.updateSyntaxError(err, stripped, filename); + } + return answer; + }; + + lexer = new Lexer; + + parser.lexer = { + lex: function() { + var tag, token; + token = parser.tokens[this.pos++]; + if (token) { + tag = token[0], this.yytext = token[1], this.yylloc = token[2]; + parser.errorToken = token.origin || token; + this.yylineno = this.yylloc.first_line; + } else { + tag = ''; + } + return tag; + }, + setInput: function(tokens) { + parser.tokens = tokens; + return this.pos = 0; + }, + upcomingInput: function() { + return ""; + } + }; + + parser.yy = require('./nodes'); + + parser.yy.parseError = function(message, arg) { + var errorLoc, errorTag, errorText, errorToken, token, tokens; + token = arg.token; + errorToken = parser.errorToken, tokens = parser.tokens; + errorTag = errorToken[0], errorText = errorToken[1], errorLoc = errorToken[2]; + errorText = (function() { + switch (false) { + case errorToken !== tokens[tokens.length - 1]: + return 'end of input'; + case errorTag !== 'INDENT' && errorTag !== 'OUTDENT': + return 'indentation'; + case errorTag !== 'IDENTIFIER' && errorTag !== 'NUMBER' && errorTag !== 'INFINITY' && errorTag !== 'STRING' && errorTag !== 'STRING_START' && errorTag !== 'REGEX' && errorTag !== 'REGEX_START': + return errorTag.replace(/_START$/, '').toLowerCase(); + default: + return helpers.nameWhitespaceCharacter(errorText); + } + })(); + return helpers.throwSyntaxError("unexpected " + errorText, errorLoc); + }; + + formatSourcePosition = function(frame, getSourceMapping) { + var as, column, fileLocation, filename, functionName, isConstructor, isMethodCall, line, methodName, source, tp, typeName; + filename = void 0; + fileLocation = ''; + if (frame.isNative()) { + fileLocation = "native"; + } else { + if (frame.isEval()) { + filename = frame.getScriptNameOrSourceURL(); + if (!filename) { + fileLocation = (frame.getEvalOrigin()) + ", "; + } + } else { + filename = frame.getFileName(); + } + filename || (filename = ""); + line = frame.getLineNumber(); + column = frame.getColumnNumber(); + source = getSourceMapping(filename, line, column); + fileLocation = source ? filename + ":" + source[0] + ":" + source[1] : filename + ":" + line + ":" + column; + } + functionName = frame.getFunctionName(); + isConstructor = frame.isConstructor(); + isMethodCall = !(frame.isToplevel() || isConstructor); + if (isMethodCall) { + methodName = frame.getMethodName(); + typeName = frame.getTypeName(); + if (functionName) { + tp = as = ''; + if (typeName && functionName.indexOf(typeName)) { + tp = typeName + "."; + } + if (methodName && functionName.indexOf("." + methodName) !== functionName.length - methodName.length - 1) { + as = " [as " + methodName + "]"; + } + return "" + tp + functionName + as + " (" + fileLocation + ")"; + } else { + return typeName + "." + (methodName || '') + " (" + fileLocation + ")"; + } + } else if (isConstructor) { + return "new " + (functionName || '') + " (" + fileLocation + ")"; + } else if (functionName) { + return functionName + " (" + fileLocation + ")"; + } else { + return fileLocation; + } + }; + + getSourceMap = function(filename) { + var answer; + if (sourceMaps[filename] != null) { + return sourceMaps[filename]; + } else if (sourceMaps[''] != null) { + return sourceMaps['']; + } else if (sources[filename] != null) { + answer = compile(sources[filename], { + filename: filename, + sourceMap: true, + literate: helpers.isLiterate(filename) + }); + return answer.sourceMap; + } else { + return null; + } + }; + + Error.prepareStackTrace = function(err, stack) { + var frame, frames, getSourceMapping; + getSourceMapping = function(filename, line, column) { + var answer, sourceMap; + sourceMap = getSourceMap(filename); + if (sourceMap != null) { + answer = sourceMap.sourceLocation([line - 1, column - 1]); + } + if (answer != null) { + return [answer[0] + 1, answer[1] + 1]; + } else { + return null; + } + }; + frames = (function() { + var j, len1, results; + results = []; + for (j = 0, len1 = stack.length; j < len1; j++) { + frame = stack[j]; + if (frame.getFunction() === exports.run) { + break; + } + results.push(" at " + (formatSourcePosition(frame, getSourceMapping))); + } + return results; + })(); + return (err.toString()) + "\n" + (frames.join('\n')) + "\n"; + }; + +}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/command.js b/deploy/node_modules/coffee-script/lib/coffee-script/command.js new file mode 100644 index 0000000..59f11ac --- /dev/null +++ b/deploy/node_modules/coffee-script/lib/coffee-script/command.js @@ -0,0 +1,610 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var BANNER, CoffeeScript, EventEmitter, SWITCHES, compileJoin, compileOptions, compilePath, compileScript, compileStdio, exec, findDirectoryIndex, forkNode, fs, helpers, hidden, joinTimeout, makePrelude, mkdirp, notSources, optionParser, optparse, opts, outputPath, parseOptions, path, printLine, printTokens, printWarn, ref, removeSource, removeSourceDir, silentUnlink, sourceCode, sources, spawn, timeLog, usage, useWinPathSep, version, wait, watch, watchDir, watchedDirs, writeJs, + indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + fs = require('fs'); + + path = require('path'); + + helpers = require('./helpers'); + + optparse = require('./optparse'); + + CoffeeScript = require('./coffee-script'); + + ref = require('child_process'), spawn = ref.spawn, exec = ref.exec; + + EventEmitter = require('events').EventEmitter; + + useWinPathSep = path.sep === '\\'; + + helpers.extend(CoffeeScript, new EventEmitter); + + printLine = function(line) { + return process.stdout.write(line + '\n'); + }; + + printWarn = function(line) { + return process.stderr.write(line + '\n'); + }; + + hidden = function(file) { + return /^\.|~$/.test(file); + }; + + BANNER = 'Usage: coffee [options] path/to/script.coffee -- [args]\n\nIf called without options, `coffee` will run your script.'; + + SWITCHES = [['-b', '--bare', 'compile without a top-level function wrapper'], ['-c', '--compile', 'compile to JavaScript and save as .js files'], ['-e', '--eval', 'pass a string from the command line as input'], ['-h', '--help', 'display this help message'], ['-i', '--interactive', 'run an interactive CoffeeScript REPL'], ['-j', '--join [FILE]', 'concatenate the source CoffeeScript before compiling'], ['-m', '--map', 'generate source map and save as .js.map files'], ['-M', '--inline-map', 'generate source map and include it directly in output'], ['-n', '--nodes', 'print out the parse tree that the parser produces'], ['--nodejs [ARGS]', 'pass options directly to the "node" binary'], ['--no-header', 'suppress the "Generated by" header'], ['-o', '--output [DIR]', 'set the output directory for compiled JavaScript'], ['-p', '--print', 'print out the compiled JavaScript'], ['-r', '--require [MODULE*]', 'require the given module before eval or REPL'], ['-s', '--stdio', 'listen for and compile scripts over stdio'], ['-l', '--literate', 'treat stdio as literate style coffee-script'], ['-t', '--tokens', 'print out the tokens that the lexer/rewriter produce'], ['-v', '--version', 'display the version number'], ['-w', '--watch', 'watch scripts for changes and rerun commands']]; + + opts = {}; + + sources = []; + + sourceCode = []; + + notSources = {}; + + watchedDirs = {}; + + optionParser = null; + + exports.run = function() { + var i, len, literals, ref1, replCliOpts, results, source; + parseOptions(); + replCliOpts = { + useGlobal: true + }; + if (opts.require) { + opts.prelude = makePrelude(opts.require); + } + replCliOpts.prelude = opts.prelude; + if (opts.nodejs) { + return forkNode(); + } + if (opts.help) { + return usage(); + } + if (opts.version) { + return version(); + } + if (opts.interactive) { + return require('./repl').start(replCliOpts); + } + if (opts.stdio) { + return compileStdio(); + } + if (opts["eval"]) { + return compileScript(null, opts["arguments"][0]); + } + if (!opts["arguments"].length) { + return require('./repl').start(replCliOpts); + } + literals = opts.run ? opts["arguments"].splice(1) : []; + process.argv = process.argv.slice(0, 2).concat(literals); + process.argv[0] = 'coffee'; + if (opts.output) { + opts.output = path.resolve(opts.output); + } + if (opts.join) { + opts.join = path.resolve(opts.join); + console.error('\nThe --join option is deprecated and will be removed in a future version.\n\nIf for some reason it\'s necessary to share local variables between files,\nreplace...\n\n $ coffee --compile --join bundle.js -- a.coffee b.coffee c.coffee\n\nwith...\n\n $ cat a.coffee b.coffee c.coffee | coffee --compile --stdio > bundle.js\n'); + } + ref1 = opts["arguments"]; + results = []; + for (i = 0, len = ref1.length; i < len; i++) { + source = ref1[i]; + source = path.resolve(source); + results.push(compilePath(source, true, source)); + } + return results; + }; + + makePrelude = function(requires) { + return requires.map(function(module) { + var _, match, name; + if (match = module.match(/^(.*)=(.*)$/)) { + _ = match[0], name = match[1], module = match[2]; + } + name || (name = helpers.baseFileName(module, true, useWinPathSep)); + return name + " = require('" + module + "')"; + }).join(';'); + }; + + compilePath = function(source, topLevel, base) { + var code, err, file, files, i, len, results, stats; + if (indexOf.call(sources, source) >= 0 || watchedDirs[source] || !topLevel && (notSources[source] || hidden(source))) { + return; + } + try { + stats = fs.statSync(source); + } catch (error) { + err = error; + if (err.code === 'ENOENT') { + console.error("File not found: " + source); + process.exit(1); + } + throw err; + } + if (stats.isDirectory()) { + if (path.basename(source) === 'node_modules') { + notSources[source] = true; + return; + } + if (opts.run) { + compilePath(findDirectoryIndex(source), topLevel, base); + return; + } + if (opts.watch) { + watchDir(source, base); + } + try { + files = fs.readdirSync(source); + } catch (error) { + err = error; + if (err.code === 'ENOENT') { + return; + } else { + throw err; + } + } + results = []; + for (i = 0, len = files.length; i < len; i++) { + file = files[i]; + results.push(compilePath(path.join(source, file), false, base)); + } + return results; + } else if (topLevel || helpers.isCoffee(source)) { + sources.push(source); + sourceCode.push(null); + delete notSources[source]; + if (opts.watch) { + watch(source, base); + } + try { + code = fs.readFileSync(source); + } catch (error) { + err = error; + if (err.code === 'ENOENT') { + return; + } else { + throw err; + } + } + return compileScript(source, code.toString(), base); + } else { + return notSources[source] = true; + } + }; + + findDirectoryIndex = function(source) { + var err, ext, i, index, len, ref1; + ref1 = CoffeeScript.FILE_EXTENSIONS; + for (i = 0, len = ref1.length; i < len; i++) { + ext = ref1[i]; + index = path.join(source, "index" + ext); + try { + if ((fs.statSync(index)).isFile()) { + return index; + } + } catch (error) { + err = error; + if (err.code !== 'ENOENT') { + throw err; + } + } + } + console.error("Missing index.coffee or index.litcoffee in " + source); + return process.exit(1); + }; + + compileScript = function(file, input, base) { + var compiled, err, message, o, options, t, task; + if (base == null) { + base = null; + } + o = opts; + options = compileOptions(file, base); + try { + t = task = { + file: file, + input: input, + options: options + }; + CoffeeScript.emit('compile', task); + if (o.tokens) { + return printTokens(CoffeeScript.tokens(t.input, t.options)); + } else if (o.nodes) { + return printLine(CoffeeScript.nodes(t.input, t.options).toString().trim()); + } else if (o.run) { + CoffeeScript.register(); + if (opts.prelude) { + CoffeeScript["eval"](opts.prelude, t.options); + } + return CoffeeScript.run(t.input, t.options); + } else if (o.join && t.file !== o.join) { + if (helpers.isLiterate(file)) { + t.input = helpers.invertLiterate(t.input); + } + sourceCode[sources.indexOf(t.file)] = t.input; + return compileJoin(); + } else { + compiled = CoffeeScript.compile(t.input, t.options); + t.output = compiled; + if (o.map) { + t.output = compiled.js; + t.sourceMap = compiled.v3SourceMap; + } + CoffeeScript.emit('success', task); + if (o.print) { + return printLine(t.output.trim()); + } else if (o.compile || o.map) { + return writeJs(base, t.file, t.output, options.jsPath, t.sourceMap); + } + } + } catch (error) { + err = error; + CoffeeScript.emit('failure', err, task); + if (CoffeeScript.listeners('failure').length) { + return; + } + message = (err != null ? err.stack : void 0) || ("" + err); + if (o.watch) { + return printLine(message + '\x07'); + } else { + printWarn(message); + return process.exit(1); + } + } + }; + + compileStdio = function() { + var buffers, stdin; + buffers = []; + stdin = process.openStdin(); + stdin.on('data', function(buffer) { + if (buffer) { + return buffers.push(buffer); + } + }); + return stdin.on('end', function() { + return compileScript(null, Buffer.concat(buffers).toString()); + }); + }; + + joinTimeout = null; + + compileJoin = function() { + if (!opts.join) { + return; + } + if (!sourceCode.some(function(code) { + return code === null; + })) { + clearTimeout(joinTimeout); + return joinTimeout = wait(100, function() { + return compileScript(opts.join, sourceCode.join('\n'), opts.join); + }); + } + }; + + watch = function(source, base) { + var compile, compileTimeout, err, prevStats, rewatch, startWatcher, watchErr, watcher; + watcher = null; + prevStats = null; + compileTimeout = null; + watchErr = function(err) { + if (err.code !== 'ENOENT') { + throw err; + } + if (indexOf.call(sources, source) < 0) { + return; + } + try { + rewatch(); + return compile(); + } catch (error) { + removeSource(source, base); + return compileJoin(); + } + }; + compile = function() { + clearTimeout(compileTimeout); + return compileTimeout = wait(25, function() { + return fs.stat(source, function(err, stats) { + if (err) { + return watchErr(err); + } + if (prevStats && stats.size === prevStats.size && stats.mtime.getTime() === prevStats.mtime.getTime()) { + return rewatch(); + } + prevStats = stats; + return fs.readFile(source, function(err, code) { + if (err) { + return watchErr(err); + } + compileScript(source, code.toString(), base); + return rewatch(); + }); + }); + }); + }; + startWatcher = function() { + return watcher = fs.watch(source).on('change', compile).on('error', function(err) { + if (err.code !== 'EPERM') { + throw err; + } + return removeSource(source, base); + }); + }; + rewatch = function() { + if (watcher != null) { + watcher.close(); + } + return startWatcher(); + }; + try { + return startWatcher(); + } catch (error) { + err = error; + return watchErr(err); + } + }; + + watchDir = function(source, base) { + var err, readdirTimeout, startWatcher, stopWatcher, watcher; + watcher = null; + readdirTimeout = null; + startWatcher = function() { + return watcher = fs.watch(source).on('error', function(err) { + if (err.code !== 'EPERM') { + throw err; + } + return stopWatcher(); + }).on('change', function() { + clearTimeout(readdirTimeout); + return readdirTimeout = wait(25, function() { + var err, file, files, i, len, results; + try { + files = fs.readdirSync(source); + } catch (error) { + err = error; + if (err.code !== 'ENOENT') { + throw err; + } + return stopWatcher(); + } + results = []; + for (i = 0, len = files.length; i < len; i++) { + file = files[i]; + results.push(compilePath(path.join(source, file), false, base)); + } + return results; + }); + }); + }; + stopWatcher = function() { + watcher.close(); + return removeSourceDir(source, base); + }; + watchedDirs[source] = true; + try { + return startWatcher(); + } catch (error) { + err = error; + if (err.code !== 'ENOENT') { + throw err; + } + } + }; + + removeSourceDir = function(source, base) { + var file, i, len, sourcesChanged; + delete watchedDirs[source]; + sourcesChanged = false; + for (i = 0, len = sources.length; i < len; i++) { + file = sources[i]; + if (!(source === path.dirname(file))) { + continue; + } + removeSource(file, base); + sourcesChanged = true; + } + if (sourcesChanged) { + return compileJoin(); + } + }; + + removeSource = function(source, base) { + var index; + index = sources.indexOf(source); + sources.splice(index, 1); + sourceCode.splice(index, 1); + if (!opts.join) { + silentUnlink(outputPath(source, base)); + silentUnlink(outputPath(source, base, '.js.map')); + return timeLog("removed " + source); + } + }; + + silentUnlink = function(path) { + var err, ref1; + try { + return fs.unlinkSync(path); + } catch (error) { + err = error; + if ((ref1 = err.code) !== 'ENOENT' && ref1 !== 'EPERM') { + throw err; + } + } + }; + + outputPath = function(source, base, extension) { + var basename, dir, srcDir; + if (extension == null) { + extension = ".js"; + } + basename = helpers.baseFileName(source, true, useWinPathSep); + srcDir = path.dirname(source); + if (!opts.output) { + dir = srcDir; + } else if (source === base) { + dir = opts.output; + } else { + dir = path.join(opts.output, path.relative(base, srcDir)); + } + return path.join(dir, basename + extension); + }; + + mkdirp = function(dir, fn) { + var mkdirs, mode; + mode = 0x1ff & ~process.umask(); + return (mkdirs = function(p, fn) { + return fs.exists(p, function(exists) { + if (exists) { + return fn(); + } else { + return mkdirs(path.dirname(p), function() { + return fs.mkdir(p, mode, function(err) { + if (err) { + return fn(err); + } + return fn(); + }); + }); + } + }); + })(dir, fn); + }; + + writeJs = function(base, sourcePath, js, jsPath, generatedSourceMap) { + var compile, jsDir, sourceMapPath; + if (generatedSourceMap == null) { + generatedSourceMap = null; + } + sourceMapPath = outputPath(sourcePath, base, ".js.map"); + jsDir = path.dirname(jsPath); + compile = function() { + if (opts.compile) { + if (js.length <= 0) { + js = ' '; + } + if (generatedSourceMap) { + js = js + "\n//# sourceMappingURL=" + (helpers.baseFileName(sourceMapPath, false, useWinPathSep)) + "\n"; + } + fs.writeFile(jsPath, js, function(err) { + if (err) { + printLine(err.message); + return process.exit(1); + } else if (opts.compile && opts.watch) { + return timeLog("compiled " + sourcePath); + } + }); + } + if (generatedSourceMap) { + return fs.writeFile(sourceMapPath, generatedSourceMap, function(err) { + if (err) { + printLine("Could not write source map: " + err.message); + return process.exit(1); + } + }); + } + }; + return fs.exists(jsDir, function(itExists) { + if (itExists) { + return compile(); + } else { + return mkdirp(jsDir, compile); + } + }); + }; + + wait = function(milliseconds, func) { + return setTimeout(func, milliseconds); + }; + + timeLog = function(message) { + return console.log(((new Date).toLocaleTimeString()) + " - " + message); + }; + + printTokens = function(tokens) { + var strings, tag, token, value; + strings = (function() { + var i, len, results; + results = []; + for (i = 0, len = tokens.length; i < len; i++) { + token = tokens[i]; + tag = token[0]; + value = token[1].toString().replace(/\n/, '\\n'); + results.push("[" + tag + " " + value + "]"); + } + return results; + })(); + return printLine(strings.join(' ')); + }; + + parseOptions = function() { + var o; + optionParser = new optparse.OptionParser(SWITCHES, BANNER); + o = opts = optionParser.parse(process.argv.slice(2)); + o.compile || (o.compile = !!o.output); + o.run = !(o.compile || o.print || o.map); + return o.print = !!(o.print || (o["eval"] || o.stdio && o.compile)); + }; + + compileOptions = function(filename, base) { + var answer, cwd, jsDir, jsPath; + answer = { + filename: filename, + literate: opts.literate || helpers.isLiterate(filename), + bare: opts.bare, + header: opts.compile && !opts['no-header'], + sourceMap: opts.map, + inlineMap: opts['inline-map'] + }; + if (filename) { + if (base) { + cwd = process.cwd(); + jsPath = outputPath(filename, base); + jsDir = path.dirname(jsPath); + answer = helpers.merge(answer, { + jsPath: jsPath, + sourceRoot: path.relative(jsDir, cwd), + sourceFiles: [path.relative(cwd, filename)], + generatedFile: helpers.baseFileName(jsPath, false, useWinPathSep) + }); + } else { + answer = helpers.merge(answer, { + sourceRoot: "", + sourceFiles: [helpers.baseFileName(filename, false, useWinPathSep)], + generatedFile: helpers.baseFileName(filename, true, useWinPathSep) + ".js" + }); + } + } + return answer; + }; + + forkNode = function() { + var args, nodeArgs, p; + nodeArgs = opts.nodejs.split(/\s+/); + args = process.argv.slice(1); + args.splice(args.indexOf('--nodejs'), 2); + p = spawn(process.execPath, nodeArgs.concat(args), { + cwd: process.cwd(), + env: process.env, + stdio: [0, 1, 2] + }); + return p.on('exit', function(code) { + return process.exit(code); + }); + }; + + usage = function() { + return printLine((new optparse.OptionParser(SWITCHES, BANNER)).help()); + }; + + version = function() { + return printLine("CoffeeScript version " + CoffeeScript.VERSION); + }; + +}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/grammar.js b/deploy/node_modules/coffee-script/lib/coffee-script/grammar.js new file mode 100644 index 0000000..b0f6e80 --- /dev/null +++ b/deploy/node_modules/coffee-script/lib/coffee-script/grammar.js @@ -0,0 +1,816 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var Parser, alt, alternatives, grammar, name, o, operators, token, tokens, unwrap; + + Parser = require('jison').Parser; + + unwrap = /^function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/; + + o = function(patternString, action, options) { + var addLocationDataFn, match, patternCount; + patternString = patternString.replace(/\s{2,}/g, ' '); + patternCount = patternString.split(' ').length; + if (!action) { + return [patternString, '$$ = $1;', options]; + } + action = (match = unwrap.exec(action)) ? match[1] : "(" + action + "())"; + action = action.replace(/\bnew /g, '$&yy.'); + action = action.replace(/\b(?:Block\.wrap|extend)\b/g, 'yy.$&'); + addLocationDataFn = function(first, last) { + if (!last) { + return "yy.addLocationDataFn(@" + first + ")"; + } else { + return "yy.addLocationDataFn(@" + first + ", @" + last + ")"; + } + }; + action = action.replace(/LOC\(([0-9]*)\)/g, addLocationDataFn('$1')); + action = action.replace(/LOC\(([0-9]*),\s*([0-9]*)\)/g, addLocationDataFn('$1', '$2')); + return [patternString, "$$ = " + (addLocationDataFn(1, patternCount)) + "(" + action + ");", options]; + }; + + grammar = { + Root: [ + o('', function() { + return new Block; + }), o('Body') + ], + Body: [ + o('Line', function() { + return Block.wrap([$1]); + }), o('Body TERMINATOR Line', function() { + return $1.push($3); + }), o('Body TERMINATOR') + ], + Line: [o('Expression'), o('Statement'), o('YieldReturn')], + Statement: [ + o('Return'), o('Comment'), o('STATEMENT', function() { + return new StatementLiteral($1); + }), o('Import'), o('Export') + ], + Expression: [o('Value'), o('Invocation'), o('Code'), o('Operation'), o('Assign'), o('If'), o('Try'), o('While'), o('For'), o('Switch'), o('Class'), o('Throw'), o('Yield')], + Yield: [ + o('YIELD', function() { + return new Op($1, new Value(new Literal(''))); + }), o('YIELD Expression', function() { + return new Op($1, $2); + }), o('YIELD FROM Expression', function() { + return new Op($1.concat($2), $3); + }) + ], + Block: [ + o('INDENT OUTDENT', function() { + return new Block; + }), o('INDENT Body OUTDENT', function() { + return $2; + }) + ], + Identifier: [ + o('IDENTIFIER', function() { + return new IdentifierLiteral($1); + }) + ], + Property: [ + o('PROPERTY', function() { + return new PropertyName($1); + }) + ], + AlphaNumeric: [ + o('NUMBER', function() { + return new NumberLiteral($1); + }), o('String') + ], + String: [ + o('STRING', function() { + return new StringLiteral($1); + }), o('STRING_START Body STRING_END', function() { + return new StringWithInterpolations($2); + }) + ], + Regex: [ + o('REGEX', function() { + return new RegexLiteral($1); + }), o('REGEX_START Invocation REGEX_END', function() { + return new RegexWithInterpolations($2.args); + }) + ], + Literal: [ + o('AlphaNumeric'), o('JS', function() { + return new PassthroughLiteral($1); + }), o('Regex'), o('UNDEFINED', function() { + return new UndefinedLiteral; + }), o('NULL', function() { + return new NullLiteral; + }), o('BOOL', function() { + return new BooleanLiteral($1); + }), o('INFINITY', function() { + return new InfinityLiteral($1); + }), o('NAN', function() { + return new NaNLiteral; + }) + ], + Assign: [ + o('Assignable = Expression', function() { + return new Assign($1, $3); + }), o('Assignable = TERMINATOR Expression', function() { + return new Assign($1, $4); + }), o('Assignable = INDENT Expression OUTDENT', function() { + return new Assign($1, $4); + }) + ], + AssignObj: [ + o('ObjAssignable', function() { + return new Value($1); + }), o('ObjAssignable : Expression', function() { + return new Assign(LOC(1)(new Value($1)), $3, 'object', { + operatorToken: LOC(2)(new Literal($2)) + }); + }), o('ObjAssignable : INDENT Expression OUTDENT', function() { + return new Assign(LOC(1)(new Value($1)), $4, 'object', { + operatorToken: LOC(2)(new Literal($2)) + }); + }), o('SimpleObjAssignable = Expression', function() { + return new Assign(LOC(1)(new Value($1)), $3, null, { + operatorToken: LOC(2)(new Literal($2)) + }); + }), o('SimpleObjAssignable = INDENT Expression OUTDENT', function() { + return new Assign(LOC(1)(new Value($1)), $4, null, { + operatorToken: LOC(2)(new Literal($2)) + }); + }), o('Comment') + ], + SimpleObjAssignable: [o('Identifier'), o('Property'), o('ThisProperty')], + ObjAssignable: [o('SimpleObjAssignable'), o('AlphaNumeric')], + Return: [ + o('RETURN Expression', function() { + return new Return($2); + }), o('RETURN INDENT Object OUTDENT', function() { + return new Return(new Value($3)); + }), o('RETURN', function() { + return new Return; + }) + ], + YieldReturn: [ + o('YIELD RETURN Expression', function() { + return new YieldReturn($3); + }), o('YIELD RETURN', function() { + return new YieldReturn; + }) + ], + Comment: [ + o('HERECOMMENT', function() { + return new Comment($1); + }) + ], + Code: [ + o('PARAM_START ParamList PARAM_END FuncGlyph Block', function() { + return new Code($2, $5, $4); + }), o('FuncGlyph Block', function() { + return new Code([], $2, $1); + }) + ], + FuncGlyph: [ + o('->', function() { + return 'func'; + }), o('=>', function() { + return 'boundfunc'; + }) + ], + OptComma: [o(''), o(',')], + ParamList: [ + o('', function() { + return []; + }), o('Param', function() { + return [$1]; + }), o('ParamList , Param', function() { + return $1.concat($3); + }), o('ParamList OptComma TERMINATOR Param', function() { + return $1.concat($4); + }), o('ParamList OptComma INDENT ParamList OptComma OUTDENT', function() { + return $1.concat($4); + }) + ], + Param: [ + o('ParamVar', function() { + return new Param($1); + }), o('ParamVar ...', function() { + return new Param($1, null, true); + }), o('ParamVar = Expression', function() { + return new Param($1, $3); + }), o('...', function() { + return new Expansion; + }) + ], + ParamVar: [o('Identifier'), o('ThisProperty'), o('Array'), o('Object')], + Splat: [ + o('Expression ...', function() { + return new Splat($1); + }) + ], + SimpleAssignable: [ + o('Identifier', function() { + return new Value($1); + }), o('Value Accessor', function() { + return $1.add($2); + }), o('Invocation Accessor', function() { + return new Value($1, [].concat($2)); + }), o('ThisProperty') + ], + Assignable: [ + o('SimpleAssignable'), o('Array', function() { + return new Value($1); + }), o('Object', function() { + return new Value($1); + }) + ], + Value: [ + o('Assignable'), o('Literal', function() { + return new Value($1); + }), o('Parenthetical', function() { + return new Value($1); + }), o('Range', function() { + return new Value($1); + }), o('This') + ], + Accessor: [ + o('. Property', function() { + return new Access($2); + }), o('?. Property', function() { + return new Access($2, 'soak'); + }), o(':: Property', function() { + return [LOC(1)(new Access(new PropertyName('prototype'))), LOC(2)(new Access($2))]; + }), o('?:: Property', function() { + return [LOC(1)(new Access(new PropertyName('prototype'), 'soak')), LOC(2)(new Access($2))]; + }), o('::', function() { + return new Access(new PropertyName('prototype')); + }), o('Index') + ], + Index: [ + o('INDEX_START IndexValue INDEX_END', function() { + return $2; + }), o('INDEX_SOAK Index', function() { + return extend($2, { + soak: true + }); + }) + ], + IndexValue: [ + o('Expression', function() { + return new Index($1); + }), o('Slice', function() { + return new Slice($1); + }) + ], + Object: [ + o('{ AssignList OptComma }', function() { + return new Obj($2, $1.generated); + }) + ], + AssignList: [ + o('', function() { + return []; + }), o('AssignObj', function() { + return [$1]; + }), o('AssignList , AssignObj', function() { + return $1.concat($3); + }), o('AssignList OptComma TERMINATOR AssignObj', function() { + return $1.concat($4); + }), o('AssignList OptComma INDENT AssignList OptComma OUTDENT', function() { + return $1.concat($4); + }) + ], + Class: [ + o('CLASS', function() { + return new Class; + }), o('CLASS Block', function() { + return new Class(null, null, $2); + }), o('CLASS EXTENDS Expression', function() { + return new Class(null, $3); + }), o('CLASS EXTENDS Expression Block', function() { + return new Class(null, $3, $4); + }), o('CLASS SimpleAssignable', function() { + return new Class($2); + }), o('CLASS SimpleAssignable Block', function() { + return new Class($2, null, $3); + }), o('CLASS SimpleAssignable EXTENDS Expression', function() { + return new Class($2, $4); + }), o('CLASS SimpleAssignable EXTENDS Expression Block', function() { + return new Class($2, $4, $5); + }) + ], + Import: [ + o('IMPORT String', function() { + return new ImportDeclaration(null, $2); + }), o('IMPORT ImportDefaultSpecifier FROM String', function() { + return new ImportDeclaration(new ImportClause($2, null), $4); + }), o('IMPORT ImportNamespaceSpecifier FROM String', function() { + return new ImportDeclaration(new ImportClause(null, $2), $4); + }), o('IMPORT { } FROM String', function() { + return new ImportDeclaration(new ImportClause(null, new ImportSpecifierList([])), $5); + }), o('IMPORT { ImportSpecifierList OptComma } FROM String', function() { + return new ImportDeclaration(new ImportClause(null, new ImportSpecifierList($3)), $7); + }), o('IMPORT ImportDefaultSpecifier , ImportNamespaceSpecifier FROM String', function() { + return new ImportDeclaration(new ImportClause($2, $4), $6); + }), o('IMPORT ImportDefaultSpecifier , { ImportSpecifierList OptComma } FROM String', function() { + return new ImportDeclaration(new ImportClause($2, new ImportSpecifierList($5)), $9); + }) + ], + ImportSpecifierList: [ + o('ImportSpecifier', function() { + return [$1]; + }), o('ImportSpecifierList , ImportSpecifier', function() { + return $1.concat($3); + }), o('ImportSpecifierList OptComma TERMINATOR ImportSpecifier', function() { + return $1.concat($4); + }), o('INDENT ImportSpecifierList OptComma OUTDENT', function() { + return $2; + }), o('ImportSpecifierList OptComma INDENT ImportSpecifierList OptComma OUTDENT', function() { + return $1.concat($4); + }) + ], + ImportSpecifier: [ + o('Identifier', function() { + return new ImportSpecifier($1); + }), o('Identifier AS Identifier', function() { + return new ImportSpecifier($1, $3); + }), o('DEFAULT', function() { + return new ImportSpecifier(new Literal($1)); + }), o('DEFAULT AS Identifier', function() { + return new ImportSpecifier(new Literal($1), $3); + }) + ], + ImportDefaultSpecifier: [ + o('Identifier', function() { + return new ImportDefaultSpecifier($1); + }) + ], + ImportNamespaceSpecifier: [ + o('IMPORT_ALL AS Identifier', function() { + return new ImportNamespaceSpecifier(new Literal($1), $3); + }) + ], + Export: [ + o('EXPORT { }', function() { + return new ExportNamedDeclaration(new ExportSpecifierList([])); + }), o('EXPORT { ExportSpecifierList OptComma }', function() { + return new ExportNamedDeclaration(new ExportSpecifierList($3)); + }), o('EXPORT Class', function() { + return new ExportNamedDeclaration($2); + }), o('EXPORT Identifier = Expression', function() { + return new ExportNamedDeclaration(new Assign($2, $4, null, { + moduleDeclaration: 'export' + })); + }), o('EXPORT Identifier = TERMINATOR Expression', function() { + return new ExportNamedDeclaration(new Assign($2, $5, null, { + moduleDeclaration: 'export' + })); + }), o('EXPORT Identifier = INDENT Expression OUTDENT', function() { + return new ExportNamedDeclaration(new Assign($2, $5, null, { + moduleDeclaration: 'export' + })); + }), o('EXPORT DEFAULT Expression', function() { + return new ExportDefaultDeclaration($3); + }), o('EXPORT EXPORT_ALL FROM String', function() { + return new ExportAllDeclaration(new Literal($2), $4); + }), o('EXPORT { ExportSpecifierList OptComma } FROM String', function() { + return new ExportNamedDeclaration(new ExportSpecifierList($3), $7); + }) + ], + ExportSpecifierList: [ + o('ExportSpecifier', function() { + return [$1]; + }), o('ExportSpecifierList , ExportSpecifier', function() { + return $1.concat($3); + }), o('ExportSpecifierList OptComma TERMINATOR ExportSpecifier', function() { + return $1.concat($4); + }), o('INDENT ExportSpecifierList OptComma OUTDENT', function() { + return $2; + }), o('ExportSpecifierList OptComma INDENT ExportSpecifierList OptComma OUTDENT', function() { + return $1.concat($4); + }) + ], + ExportSpecifier: [ + o('Identifier', function() { + return new ExportSpecifier($1); + }), o('Identifier AS Identifier', function() { + return new ExportSpecifier($1, $3); + }), o('Identifier AS DEFAULT', function() { + return new ExportSpecifier($1, new Literal($3)); + }), o('DEFAULT', function() { + return new ExportSpecifier(new Literal($1)); + }), o('DEFAULT AS Identifier', function() { + return new ExportSpecifier(new Literal($1), $3); + }) + ], + Invocation: [ + o('Value OptFuncExist String', function() { + return new TaggedTemplateCall($1, $3, $2); + }), o('Value OptFuncExist Arguments', function() { + return new Call($1, $3, $2); + }), o('Invocation OptFuncExist Arguments', function() { + return new Call($1, $3, $2); + }), o('Super') + ], + Super: [ + o('SUPER', function() { + return new SuperCall; + }), o('SUPER Arguments', function() { + return new SuperCall($2); + }) + ], + OptFuncExist: [ + o('', function() { + return false; + }), o('FUNC_EXIST', function() { + return true; + }) + ], + Arguments: [ + o('CALL_START CALL_END', function() { + return []; + }), o('CALL_START ArgList OptComma CALL_END', function() { + return $2; + }) + ], + This: [ + o('THIS', function() { + return new Value(new ThisLiteral); + }), o('@', function() { + return new Value(new ThisLiteral); + }) + ], + ThisProperty: [ + o('@ Property', function() { + return new Value(LOC(1)(new ThisLiteral), [LOC(2)(new Access($2))], 'this'); + }) + ], + Array: [ + o('[ ]', function() { + return new Arr([]); + }), o('[ ArgList OptComma ]', function() { + return new Arr($2); + }) + ], + RangeDots: [ + o('..', function() { + return 'inclusive'; + }), o('...', function() { + return 'exclusive'; + }) + ], + Range: [ + o('[ Expression RangeDots Expression ]', function() { + return new Range($2, $4, $3); + }) + ], + Slice: [ + o('Expression RangeDots Expression', function() { + return new Range($1, $3, $2); + }), o('Expression RangeDots', function() { + return new Range($1, null, $2); + }), o('RangeDots Expression', function() { + return new Range(null, $2, $1); + }), o('RangeDots', function() { + return new Range(null, null, $1); + }) + ], + ArgList: [ + o('Arg', function() { + return [$1]; + }), o('ArgList , Arg', function() { + return $1.concat($3); + }), o('ArgList OptComma TERMINATOR Arg', function() { + return $1.concat($4); + }), o('INDENT ArgList OptComma OUTDENT', function() { + return $2; + }), o('ArgList OptComma INDENT ArgList OptComma OUTDENT', function() { + return $1.concat($4); + }) + ], + Arg: [ + o('Expression'), o('Splat'), o('...', function() { + return new Expansion; + }) + ], + SimpleArgs: [ + o('Expression'), o('SimpleArgs , Expression', function() { + return [].concat($1, $3); + }) + ], + Try: [ + o('TRY Block', function() { + return new Try($2); + }), o('TRY Block Catch', function() { + return new Try($2, $3[0], $3[1]); + }), o('TRY Block FINALLY Block', function() { + return new Try($2, null, null, $4); + }), o('TRY Block Catch FINALLY Block', function() { + return new Try($2, $3[0], $3[1], $5); + }) + ], + Catch: [ + o('CATCH Identifier Block', function() { + return [$2, $3]; + }), o('CATCH Object Block', function() { + return [LOC(2)(new Value($2)), $3]; + }), o('CATCH Block', function() { + return [null, $2]; + }) + ], + Throw: [ + o('THROW Expression', function() { + return new Throw($2); + }) + ], + Parenthetical: [ + o('( Body )', function() { + return new Parens($2); + }), o('( INDENT Body OUTDENT )', function() { + return new Parens($3); + }) + ], + WhileSource: [ + o('WHILE Expression', function() { + return new While($2); + }), o('WHILE Expression WHEN Expression', function() { + return new While($2, { + guard: $4 + }); + }), o('UNTIL Expression', function() { + return new While($2, { + invert: true + }); + }), o('UNTIL Expression WHEN Expression', function() { + return new While($2, { + invert: true, + guard: $4 + }); + }) + ], + While: [ + o('WhileSource Block', function() { + return $1.addBody($2); + }), o('Statement WhileSource', function() { + return $2.addBody(LOC(1)(Block.wrap([$1]))); + }), o('Expression WhileSource', function() { + return $2.addBody(LOC(1)(Block.wrap([$1]))); + }), o('Loop', function() { + return $1; + }) + ], + Loop: [ + o('LOOP Block', function() { + return new While(LOC(1)(new BooleanLiteral('true'))).addBody($2); + }), o('LOOP Expression', function() { + return new While(LOC(1)(new BooleanLiteral('true'))).addBody(LOC(2)(Block.wrap([$2]))); + }) + ], + For: [ + o('Statement ForBody', function() { + return new For($1, $2); + }), o('Expression ForBody', function() { + return new For($1, $2); + }), o('ForBody Block', function() { + return new For($2, $1); + }) + ], + ForBody: [ + o('FOR Range', function() { + return { + source: LOC(2)(new Value($2)) + }; + }), o('FOR Range BY Expression', function() { + return { + source: LOC(2)(new Value($2)), + step: $4 + }; + }), o('ForStart ForSource', function() { + $2.own = $1.own; + $2.ownTag = $1.ownTag; + $2.name = $1[0]; + $2.index = $1[1]; + return $2; + }) + ], + ForStart: [ + o('FOR ForVariables', function() { + return $2; + }), o('FOR OWN ForVariables', function() { + $3.own = true; + $3.ownTag = LOC(2)(new Literal($2)); + return $3; + }) + ], + ForValue: [ + o('Identifier'), o('ThisProperty'), o('Array', function() { + return new Value($1); + }), o('Object', function() { + return new Value($1); + }) + ], + ForVariables: [ + o('ForValue', function() { + return [$1]; + }), o('ForValue , ForValue', function() { + return [$1, $3]; + }) + ], + ForSource: [ + o('FORIN Expression', function() { + return { + source: $2 + }; + }), o('FOROF Expression', function() { + return { + source: $2, + object: true + }; + }), o('FORIN Expression WHEN Expression', function() { + return { + source: $2, + guard: $4 + }; + }), o('FOROF Expression WHEN Expression', function() { + return { + source: $2, + guard: $4, + object: true + }; + }), o('FORIN Expression BY Expression', function() { + return { + source: $2, + step: $4 + }; + }), o('FORIN Expression WHEN Expression BY Expression', function() { + return { + source: $2, + guard: $4, + step: $6 + }; + }), o('FORIN Expression BY Expression WHEN Expression', function() { + return { + source: $2, + step: $4, + guard: $6 + }; + }), o('FORFROM Expression', function() { + return { + source: $2, + from: true + }; + }), o('FORFROM Expression WHEN Expression', function() { + return { + source: $2, + guard: $4, + from: true + }; + }) + ], + Switch: [ + o('SWITCH Expression INDENT Whens OUTDENT', function() { + return new Switch($2, $4); + }), o('SWITCH Expression INDENT Whens ELSE Block OUTDENT', function() { + return new Switch($2, $4, $6); + }), o('SWITCH INDENT Whens OUTDENT', function() { + return new Switch(null, $3); + }), o('SWITCH INDENT Whens ELSE Block OUTDENT', function() { + return new Switch(null, $3, $5); + }) + ], + Whens: [ + o('When'), o('Whens When', function() { + return $1.concat($2); + }) + ], + When: [ + o('LEADING_WHEN SimpleArgs Block', function() { + return [[$2, $3]]; + }), o('LEADING_WHEN SimpleArgs Block TERMINATOR', function() { + return [[$2, $3]]; + }) + ], + IfBlock: [ + o('IF Expression Block', function() { + return new If($2, $3, { + type: $1 + }); + }), o('IfBlock ELSE IF Expression Block', function() { + return $1.addElse(LOC(3, 5)(new If($4, $5, { + type: $3 + }))); + }) + ], + If: [ + o('IfBlock'), o('IfBlock ELSE Block', function() { + return $1.addElse($3); + }), o('Statement POST_IF Expression', function() { + return new If($3, LOC(1)(Block.wrap([$1])), { + type: $2, + statement: true + }); + }), o('Expression POST_IF Expression', function() { + return new If($3, LOC(1)(Block.wrap([$1])), { + type: $2, + statement: true + }); + }) + ], + Operation: [ + o('UNARY Expression', function() { + return new Op($1, $2); + }), o('UNARY_MATH Expression', function() { + return new Op($1, $2); + }), o('- Expression', (function() { + return new Op('-', $2); + }), { + prec: 'UNARY_MATH' + }), o('+ Expression', (function() { + return new Op('+', $2); + }), { + prec: 'UNARY_MATH' + }), o('-- SimpleAssignable', function() { + return new Op('--', $2); + }), o('++ SimpleAssignable', function() { + return new Op('++', $2); + }), o('SimpleAssignable --', function() { + return new Op('--', $1, null, true); + }), o('SimpleAssignable ++', function() { + return new Op('++', $1, null, true); + }), o('Expression ?', function() { + return new Existence($1); + }), o('Expression + Expression', function() { + return new Op('+', $1, $3); + }), o('Expression - Expression', function() { + return new Op('-', $1, $3); + }), o('Expression MATH Expression', function() { + return new Op($2, $1, $3); + }), o('Expression ** Expression', function() { + return new Op($2, $1, $3); + }), o('Expression SHIFT Expression', function() { + return new Op($2, $1, $3); + }), o('Expression COMPARE Expression', function() { + return new Op($2, $1, $3); + }), o('Expression & Expression', function() { + return new Op($2, $1, $3); + }), o('Expression ^ Expression', function() { + return new Op($2, $1, $3); + }), o('Expression | Expression', function() { + return new Op($2, $1, $3); + }), o('Expression && Expression', function() { + return new Op($2, $1, $3); + }), o('Expression || Expression', function() { + return new Op($2, $1, $3); + }), o('Expression BIN? Expression', function() { + return new Op($2, $1, $3); + }), o('Expression RELATION Expression', function() { + if ($2.charAt(0) === '!') { + return new Op($2.slice(1), $1, $3).invert(); + } else { + return new Op($2, $1, $3); + } + }), o('SimpleAssignable COMPOUND_ASSIGN Expression', function() { + return new Assign($1, $3, $2); + }), o('SimpleAssignable COMPOUND_ASSIGN INDENT Expression OUTDENT', function() { + return new Assign($1, $4, $2); + }), o('SimpleAssignable COMPOUND_ASSIGN TERMINATOR Expression', function() { + return new Assign($1, $4, $2); + }), o('SimpleAssignable EXTENDS Expression', function() { + return new Extends($1, $3); + }) + ] + }; + + operators = [['left', '.', '?.', '::', '?::'], ['left', 'CALL_START', 'CALL_END'], ['nonassoc', '++', '--'], ['left', '?'], ['right', 'UNARY'], ['right', '**'], ['right', 'UNARY_MATH'], ['left', 'MATH'], ['left', '+', '-'], ['left', 'SHIFT'], ['left', 'RELATION'], ['left', 'COMPARE'], ['left', '&'], ['left', '^'], ['left', '|'], ['left', '&&'], ['left', '||'], ['left', 'BIN?'], ['nonassoc', 'INDENT', 'OUTDENT'], ['right', 'YIELD'], ['right', '=', ':', 'COMPOUND_ASSIGN', 'RETURN', 'THROW', 'EXTENDS'], ['right', 'FORIN', 'FOROF', 'FORFROM', 'BY', 'WHEN'], ['right', 'IF', 'ELSE', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'SUPER', 'CLASS', 'IMPORT', 'EXPORT'], ['left', 'POST_IF']]; + + tokens = []; + + for (name in grammar) { + alternatives = grammar[name]; + grammar[name] = (function() { + var i, j, len, len1, ref, results; + results = []; + for (i = 0, len = alternatives.length; i < len; i++) { + alt = alternatives[i]; + ref = alt[0].split(' '); + for (j = 0, len1 = ref.length; j < len1; j++) { + token = ref[j]; + if (!grammar[token]) { + tokens.push(token); + } + } + if (name === 'Root') { + alt[1] = "return " + alt[1]; + } + results.push(alt); + } + return results; + })(); + } + + exports.parser = new Parser({ + tokens: tokens.join(' '), + bnf: grammar, + operators: operators.reverse(), + startSymbol: 'Root' + }); + +}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/helpers.js b/deploy/node_modules/coffee-script/lib/coffee-script/helpers.js new file mode 100644 index 0000000..043a465 --- /dev/null +++ b/deploy/node_modules/coffee-script/lib/coffee-script/helpers.js @@ -0,0 +1,249 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var buildLocationData, extend, flatten, ref, repeat, syntaxErrorToString; + + exports.starts = function(string, literal, start) { + return literal === string.substr(start, literal.length); + }; + + exports.ends = function(string, literal, back) { + var len; + len = literal.length; + return literal === string.substr(string.length - len - (back || 0), len); + }; + + exports.repeat = repeat = function(str, n) { + var res; + res = ''; + while (n > 0) { + if (n & 1) { + res += str; + } + n >>>= 1; + str += str; + } + return res; + }; + + exports.compact = function(array) { + var i, item, len1, results; + results = []; + for (i = 0, len1 = array.length; i < len1; i++) { + item = array[i]; + if (item) { + results.push(item); + } + } + return results; + }; + + exports.count = function(string, substr) { + var num, pos; + num = pos = 0; + if (!substr.length) { + return 1 / 0; + } + while (pos = 1 + string.indexOf(substr, pos)) { + num++; + } + return num; + }; + + exports.merge = function(options, overrides) { + return extend(extend({}, options), overrides); + }; + + extend = exports.extend = function(object, properties) { + var key, val; + for (key in properties) { + val = properties[key]; + object[key] = val; + } + return object; + }; + + exports.flatten = flatten = function(array) { + var element, flattened, i, len1; + flattened = []; + for (i = 0, len1 = array.length; i < len1; i++) { + element = array[i]; + if ('[object Array]' === Object.prototype.toString.call(element)) { + flattened = flattened.concat(flatten(element)); + } else { + flattened.push(element); + } + } + return flattened; + }; + + exports.del = function(obj, key) { + var val; + val = obj[key]; + delete obj[key]; + return val; + }; + + exports.some = (ref = Array.prototype.some) != null ? ref : function(fn) { + var e, i, len1, ref1; + ref1 = this; + for (i = 0, len1 = ref1.length; i < len1; i++) { + e = ref1[i]; + if (fn(e)) { + return true; + } + } + return false; + }; + + exports.invertLiterate = function(code) { + var line, lines, maybe_code; + maybe_code = true; + lines = (function() { + var i, len1, ref1, results; + ref1 = code.split('\n'); + results = []; + for (i = 0, len1 = ref1.length; i < len1; i++) { + line = ref1[i]; + if (maybe_code && /^([ ]{4}|[ ]{0,3}\t)/.test(line)) { + results.push(line); + } else if (maybe_code = /^\s*$/.test(line)) { + results.push(line); + } else { + results.push('# ' + line); + } + } + return results; + })(); + return lines.join('\n'); + }; + + buildLocationData = function(first, last) { + if (!last) { + return first; + } else { + return { + first_line: first.first_line, + first_column: first.first_column, + last_line: last.last_line, + last_column: last.last_column + }; + } + }; + + exports.addLocationDataFn = function(first, last) { + return function(obj) { + if (((typeof obj) === 'object') && (!!obj['updateLocationDataIfMissing'])) { + obj.updateLocationDataIfMissing(buildLocationData(first, last)); + } + return obj; + }; + }; + + exports.locationDataToString = function(obj) { + var locationData; + if (("2" in obj) && ("first_line" in obj[2])) { + locationData = obj[2]; + } else if ("first_line" in obj) { + locationData = obj; + } + if (locationData) { + return ((locationData.first_line + 1) + ":" + (locationData.first_column + 1) + "-") + ((locationData.last_line + 1) + ":" + (locationData.last_column + 1)); + } else { + return "No location data"; + } + }; + + exports.baseFileName = function(file, stripExt, useWinPathSep) { + var parts, pathSep; + if (stripExt == null) { + stripExt = false; + } + if (useWinPathSep == null) { + useWinPathSep = false; + } + pathSep = useWinPathSep ? /\\|\// : /\//; + parts = file.split(pathSep); + file = parts[parts.length - 1]; + if (!(stripExt && file.indexOf('.') >= 0)) { + return file; + } + parts = file.split('.'); + parts.pop(); + if (parts[parts.length - 1] === 'coffee' && parts.length > 1) { + parts.pop(); + } + return parts.join('.'); + }; + + exports.isCoffee = function(file) { + return /\.((lit)?coffee|coffee\.md)$/.test(file); + }; + + exports.isLiterate = function(file) { + return /\.(litcoffee|coffee\.md)$/.test(file); + }; + + exports.throwSyntaxError = function(message, location) { + var error; + error = new SyntaxError(message); + error.location = location; + error.toString = syntaxErrorToString; + error.stack = error.toString(); + throw error; + }; + + exports.updateSyntaxError = function(error, code, filename) { + if (error.toString === syntaxErrorToString) { + error.code || (error.code = code); + error.filename || (error.filename = filename); + error.stack = error.toString(); + } + return error; + }; + + syntaxErrorToString = function() { + var codeLine, colorize, colorsEnabled, end, filename, first_column, first_line, last_column, last_line, marker, ref1, ref2, ref3, ref4, start; + if (!(this.code && this.location)) { + return Error.prototype.toString.call(this); + } + ref1 = this.location, first_line = ref1.first_line, first_column = ref1.first_column, last_line = ref1.last_line, last_column = ref1.last_column; + if (last_line == null) { + last_line = first_line; + } + if (last_column == null) { + last_column = first_column; + } + filename = this.filename || '[stdin]'; + codeLine = this.code.split('\n')[first_line]; + start = first_column; + end = first_line === last_line ? last_column + 1 : codeLine.length; + marker = codeLine.slice(0, start).replace(/[^\s]/g, ' ') + repeat('^', end - start); + if (typeof process !== "undefined" && process !== null) { + colorsEnabled = ((ref2 = process.stdout) != null ? ref2.isTTY : void 0) && !((ref3 = process.env) != null ? ref3.NODE_DISABLE_COLORS : void 0); + } + if ((ref4 = this.colorful) != null ? ref4 : colorsEnabled) { + colorize = function(str) { + return "\x1B[1;31m" + str + "\x1B[0m"; + }; + codeLine = codeLine.slice(0, start) + colorize(codeLine.slice(start, end)) + codeLine.slice(end); + marker = colorize(marker); + } + return filename + ":" + (first_line + 1) + ":" + (first_column + 1) + ": error: " + this.message + "\n" + codeLine + "\n" + marker; + }; + + exports.nameWhitespaceCharacter = function(string) { + switch (string) { + case ' ': + return 'space'; + case '\n': + return 'newline'; + case '\r': + return 'carriage return'; + case '\t': + return 'tab'; + default: + return string; + } + }; + +}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/index.js b/deploy/node_modules/coffee-script/lib/coffee-script/index.js new file mode 100644 index 0000000..c6813d5 --- /dev/null +++ b/deploy/node_modules/coffee-script/lib/coffee-script/index.js @@ -0,0 +1,11 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var key, ref, val; + + ref = require('./coffee-script'); + for (key in ref) { + val = ref[key]; + exports[key] = val; + } + +}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/lexer.js b/deploy/node_modules/coffee-script/lib/coffee-script/lexer.js new file mode 100644 index 0000000..1c93ea1 --- /dev/null +++ b/deploy/node_modules/coffee-script/lib/coffee-script/lexer.js @@ -0,0 +1,1166 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var BOM, BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HERECOMMENT_ILLEGAL, HEREDOC_DOUBLE, HEREDOC_INDENT, HEREDOC_SINGLE, HEREGEX, HEREGEX_OMIT, HERE_JSTOKEN, IDENTIFIER, INDENTABLE_CLOSERS, INDEXABLE, INVERSES, JSTOKEN, JS_KEYWORDS, LEADING_BLANK_LINE, LINE_BREAK, LINE_CONTINUER, Lexer, MATH, MULTI_DENT, NOT_REGEX, NUMBER, OPERATOR, POSSIBLY_DIVISION, REGEX, REGEX_FLAGS, REGEX_ILLEGAL, REGEX_INVALID_ESCAPE, RELATION, RESERVED, Rewriter, SHIFT, SIMPLE_STRING_OMIT, STRICT_PROSCRIBED, STRING_DOUBLE, STRING_INVALID_ESCAPE, STRING_OMIT, STRING_SINGLE, STRING_START, TRAILING_BLANK_LINE, TRAILING_SPACES, UNARY, UNARY_MATH, UNFINISHED, UNICODE_CODE_POINT_ESCAPE, VALID_FLAGS, WHITESPACE, compact, count, invertLiterate, isForFrom, isUnassignable, key, locationDataToString, ref, ref1, repeat, starts, throwSyntaxError, + indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, + slice = [].slice; + + ref = require('./rewriter'), Rewriter = ref.Rewriter, INVERSES = ref.INVERSES; + + ref1 = require('./helpers'), count = ref1.count, starts = ref1.starts, compact = ref1.compact, repeat = ref1.repeat, invertLiterate = ref1.invertLiterate, locationDataToString = ref1.locationDataToString, throwSyntaxError = ref1.throwSyntaxError; + + exports.Lexer = Lexer = (function() { + function Lexer() {} + + Lexer.prototype.tokenize = function(code, opts) { + var consumed, end, i, ref2; + if (opts == null) { + opts = {}; + } + this.literate = opts.literate; + this.indent = 0; + this.baseIndent = 0; + this.indebt = 0; + this.outdebt = 0; + this.indents = []; + this.ends = []; + this.tokens = []; + this.seenFor = false; + this.seenImport = false; + this.seenExport = false; + this.importSpecifierList = false; + this.exportSpecifierList = false; + this.chunkLine = opts.line || 0; + this.chunkColumn = opts.column || 0; + code = this.clean(code); + i = 0; + while (this.chunk = code.slice(i)) { + consumed = this.identifierToken() || this.commentToken() || this.whitespaceToken() || this.lineToken() || this.stringToken() || this.numberToken() || this.regexToken() || this.jsToken() || this.literalToken(); + ref2 = this.getLineAndColumnFromChunk(consumed), this.chunkLine = ref2[0], this.chunkColumn = ref2[1]; + i += consumed; + if (opts.untilBalanced && this.ends.length === 0) { + return { + tokens: this.tokens, + index: i + }; + } + } + this.closeIndentation(); + if (end = this.ends.pop()) { + this.error("missing " + end.tag, end.origin[2]); + } + if (opts.rewrite === false) { + return this.tokens; + } + return (new Rewriter).rewrite(this.tokens); + }; + + Lexer.prototype.clean = function(code) { + if (code.charCodeAt(0) === BOM) { + code = code.slice(1); + } + code = code.replace(/\r/g, '').replace(TRAILING_SPACES, ''); + if (WHITESPACE.test(code)) { + code = "\n" + code; + this.chunkLine--; + } + if (this.literate) { + code = invertLiterate(code); + } + return code; + }; + + Lexer.prototype.identifierToken = function() { + var alias, colon, colonOffset, id, idLength, input, match, poppedToken, prev, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9, tag, tagToken; + if (!(match = IDENTIFIER.exec(this.chunk))) { + return 0; + } + input = match[0], id = match[1], colon = match[2]; + idLength = id.length; + poppedToken = void 0; + if (id === 'own' && this.tag() === 'FOR') { + this.token('OWN', id); + return id.length; + } + if (id === 'from' && this.tag() === 'YIELD') { + this.token('FROM', id); + return id.length; + } + if (id === 'as' && this.seenImport) { + if (this.value() === '*') { + this.tokens[this.tokens.length - 1][0] = 'IMPORT_ALL'; + } else if (ref2 = this.value(), indexOf.call(COFFEE_KEYWORDS, ref2) >= 0) { + this.tokens[this.tokens.length - 1][0] = 'IDENTIFIER'; + } + if ((ref3 = this.tag()) === 'DEFAULT' || ref3 === 'IMPORT_ALL' || ref3 === 'IDENTIFIER') { + this.token('AS', id); + return id.length; + } + } + if (id === 'as' && this.seenExport && ((ref4 = this.tag()) === 'IDENTIFIER' || ref4 === 'DEFAULT')) { + this.token('AS', id); + return id.length; + } + if (id === 'default' && this.seenExport && ((ref5 = this.tag()) === 'EXPORT' || ref5 === 'AS')) { + this.token('DEFAULT', id); + return id.length; + } + ref6 = this.tokens, prev = ref6[ref6.length - 1]; + tag = colon || (prev != null) && (((ref7 = prev[0]) === '.' || ref7 === '?.' || ref7 === '::' || ref7 === '?::') || !prev.spaced && prev[0] === '@') ? 'PROPERTY' : 'IDENTIFIER'; + if (tag === 'IDENTIFIER' && (indexOf.call(JS_KEYWORDS, id) >= 0 || indexOf.call(COFFEE_KEYWORDS, id) >= 0) && !(this.exportSpecifierList && indexOf.call(COFFEE_KEYWORDS, id) >= 0)) { + tag = id.toUpperCase(); + if (tag === 'WHEN' && (ref8 = this.tag(), indexOf.call(LINE_BREAK, ref8) >= 0)) { + tag = 'LEADING_WHEN'; + } else if (tag === 'FOR') { + this.seenFor = true; + } else if (tag === 'UNLESS') { + tag = 'IF'; + } else if (tag === 'IMPORT') { + this.seenImport = true; + } else if (tag === 'EXPORT') { + this.seenExport = true; + } else if (indexOf.call(UNARY, tag) >= 0) { + tag = 'UNARY'; + } else if (indexOf.call(RELATION, tag) >= 0) { + if (tag !== 'INSTANCEOF' && this.seenFor) { + tag = 'FOR' + tag; + this.seenFor = false; + } else { + tag = 'RELATION'; + if (this.value() === '!') { + poppedToken = this.tokens.pop(); + id = '!' + id; + } + } + } + } else if (tag === 'IDENTIFIER' && this.seenFor && id === 'from' && isForFrom(prev)) { + tag = 'FORFROM'; + this.seenFor = false; + } + if (tag === 'IDENTIFIER' && indexOf.call(RESERVED, id) >= 0) { + this.error("reserved word '" + id + "'", { + length: id.length + }); + } + if (tag !== 'PROPERTY') { + if (indexOf.call(COFFEE_ALIASES, id) >= 0) { + alias = id; + id = COFFEE_ALIAS_MAP[id]; + } + tag = (function() { + switch (id) { + case '!': + return 'UNARY'; + case '==': + case '!=': + return 'COMPARE'; + case 'true': + case 'false': + return 'BOOL'; + case 'break': + case 'continue': + case 'debugger': + return 'STATEMENT'; + case '&&': + case '||': + return id; + default: + return tag; + } + })(); + } + tagToken = this.token(tag, id, 0, idLength); + if (alias) { + tagToken.origin = [tag, alias, tagToken[2]]; + } + if (poppedToken) { + ref9 = [poppedToken[2].first_line, poppedToken[2].first_column], tagToken[2].first_line = ref9[0], tagToken[2].first_column = ref9[1]; + } + if (colon) { + colonOffset = input.lastIndexOf(':'); + this.token(':', ':', colonOffset, colon.length); + } + return input.length; + }; + + Lexer.prototype.numberToken = function() { + var base, lexedLength, match, number, numberValue, ref2, tag; + if (!(match = NUMBER.exec(this.chunk))) { + return 0; + } + number = match[0]; + lexedLength = number.length; + switch (false) { + case !/^0[BOX]/.test(number): + this.error("radix prefix in '" + number + "' must be lowercase", { + offset: 1 + }); + break; + case !/^(?!0x).*E/.test(number): + this.error("exponential notation in '" + number + "' must be indicated with a lowercase 'e'", { + offset: number.indexOf('E') + }); + break; + case !/^0\d*[89]/.test(number): + this.error("decimal literal '" + number + "' must not be prefixed with '0'", { + length: lexedLength + }); + break; + case !/^0\d+/.test(number): + this.error("octal literal '" + number + "' must be prefixed with '0o'", { + length: lexedLength + }); + } + base = (function() { + switch (number.charAt(1)) { + case 'b': + return 2; + case 'o': + return 8; + case 'x': + return 16; + default: + return null; + } + })(); + numberValue = base != null ? parseInt(number.slice(2), base) : parseFloat(number); + if ((ref2 = number.charAt(1)) === 'b' || ref2 === 'o') { + number = "0x" + (numberValue.toString(16)); + } + tag = numberValue === 2e308 ? 'INFINITY' : 'NUMBER'; + this.token(tag, number, 0, lexedLength); + return lexedLength; + }; + + Lexer.prototype.stringToken = function() { + var $, attempt, delimiter, doc, end, heredoc, i, indent, indentRegex, match, quote, ref2, ref3, regex, token, tokens; + quote = (STRING_START.exec(this.chunk) || [])[0]; + if (!quote) { + return 0; + } + if (this.tokens.length && this.value() === 'from' && (this.seenImport || this.seenExport)) { + this.tokens[this.tokens.length - 1][0] = 'FROM'; + } + regex = (function() { + switch (quote) { + case "'": + return STRING_SINGLE; + case '"': + return STRING_DOUBLE; + case "'''": + return HEREDOC_SINGLE; + case '"""': + return HEREDOC_DOUBLE; + } + })(); + heredoc = quote.length === 3; + ref2 = this.matchWithInterpolations(regex, quote), tokens = ref2.tokens, end = ref2.index; + $ = tokens.length - 1; + delimiter = quote.charAt(0); + if (heredoc) { + indent = null; + doc = ((function() { + var j, len, results; + results = []; + for (i = j = 0, len = tokens.length; j < len; i = ++j) { + token = tokens[i]; + if (token[0] === 'NEOSTRING') { + results.push(token[1]); + } + } + return results; + })()).join('#{}'); + while (match = HEREDOC_INDENT.exec(doc)) { + attempt = match[1]; + if (indent === null || (0 < (ref3 = attempt.length) && ref3 < indent.length)) { + indent = attempt; + } + } + if (indent) { + indentRegex = RegExp("\\n" + indent, "g"); + } + this.mergeInterpolationTokens(tokens, { + delimiter: delimiter + }, (function(_this) { + return function(value, i) { + value = _this.formatString(value, { + delimiter: quote + }); + if (indentRegex) { + value = value.replace(indentRegex, '\n'); + } + if (i === 0) { + value = value.replace(LEADING_BLANK_LINE, ''); + } + if (i === $) { + value = value.replace(TRAILING_BLANK_LINE, ''); + } + return value; + }; + })(this)); + } else { + this.mergeInterpolationTokens(tokens, { + delimiter: delimiter + }, (function(_this) { + return function(value, i) { + value = _this.formatString(value, { + delimiter: quote + }); + value = value.replace(SIMPLE_STRING_OMIT, function(match, offset) { + if ((i === 0 && offset === 0) || (i === $ && offset + match.length === value.length)) { + return ''; + } else { + return ' '; + } + }); + return value; + }; + })(this)); + } + return end; + }; + + Lexer.prototype.commentToken = function() { + var comment, here, match; + if (!(match = this.chunk.match(COMMENT))) { + return 0; + } + comment = match[0], here = match[1]; + if (here) { + if (match = HERECOMMENT_ILLEGAL.exec(comment)) { + this.error("block comments cannot contain " + match[0], { + offset: match.index, + length: match[0].length + }); + } + if (here.indexOf('\n') >= 0) { + here = here.replace(RegExp("\\n" + (repeat(' ', this.indent)), "g"), '\n'); + } + this.token('HERECOMMENT', here, 0, comment.length); + } + return comment.length; + }; + + Lexer.prototype.jsToken = function() { + var match, script; + if (!(this.chunk.charAt(0) === '`' && (match = HERE_JSTOKEN.exec(this.chunk) || JSTOKEN.exec(this.chunk)))) { + return 0; + } + script = match[1].replace(/\\+(`|$)/g, function(string) { + return string.slice(-Math.ceil(string.length / 2)); + }); + this.token('JS', script, 0, match[0].length); + return match[0].length; + }; + + Lexer.prototype.regexToken = function() { + var body, closed, end, flags, index, match, origin, prev, ref2, ref3, ref4, regex, tokens; + switch (false) { + case !(match = REGEX_ILLEGAL.exec(this.chunk)): + this.error("regular expressions cannot begin with " + match[2], { + offset: match.index + match[1].length + }); + break; + case !(match = this.matchWithInterpolations(HEREGEX, '///')): + tokens = match.tokens, index = match.index; + break; + case !(match = REGEX.exec(this.chunk)): + regex = match[0], body = match[1], closed = match[2]; + this.validateEscapes(body, { + isRegex: true, + offsetInChunk: 1 + }); + body = this.formatRegex(body, { + delimiter: '/' + }); + index = regex.length; + ref2 = this.tokens, prev = ref2[ref2.length - 1]; + if (prev) { + if (prev.spaced && (ref3 = prev[0], indexOf.call(CALLABLE, ref3) >= 0)) { + if (!closed || POSSIBLY_DIVISION.test(regex)) { + return 0; + } + } else if (ref4 = prev[0], indexOf.call(NOT_REGEX, ref4) >= 0) { + return 0; + } + } + if (!closed) { + this.error('missing / (unclosed regex)'); + } + break; + default: + return 0; + } + flags = REGEX_FLAGS.exec(this.chunk.slice(index))[0]; + end = index + flags.length; + origin = this.makeToken('REGEX', null, 0, end); + switch (false) { + case !!VALID_FLAGS.test(flags): + this.error("invalid regular expression flags " + flags, { + offset: index, + length: flags.length + }); + break; + case !(regex || tokens.length === 1): + if (body == null) { + body = this.formatHeregex(tokens[0][1]); + } + this.token('REGEX', "" + (this.makeDelimitedLiteral(body, { + delimiter: '/' + })) + flags, 0, end, origin); + break; + default: + this.token('REGEX_START', '(', 0, 0, origin); + this.token('IDENTIFIER', 'RegExp', 0, 0); + this.token('CALL_START', '(', 0, 0); + this.mergeInterpolationTokens(tokens, { + delimiter: '"', + double: true + }, this.formatHeregex); + if (flags) { + this.token(',', ',', index - 1, 0); + this.token('STRING', '"' + flags + '"', index - 1, flags.length); + } + this.token(')', ')', end - 1, 0); + this.token('REGEX_END', ')', end - 1, 0); + } + return end; + }; + + Lexer.prototype.lineToken = function() { + var diff, indent, match, noNewlines, size; + if (!(match = MULTI_DENT.exec(this.chunk))) { + return 0; + } + indent = match[0]; + this.seenFor = false; + if (!this.importSpecifierList) { + this.seenImport = false; + } + if (!this.exportSpecifierList) { + this.seenExport = false; + } + size = indent.length - 1 - indent.lastIndexOf('\n'); + noNewlines = this.unfinished(); + if (size - this.indebt === this.indent) { + if (noNewlines) { + this.suppressNewlines(); + } else { + this.newlineToken(0); + } + return indent.length; + } + if (size > this.indent) { + if (noNewlines) { + this.indebt = size - this.indent; + this.suppressNewlines(); + return indent.length; + } + if (!this.tokens.length) { + this.baseIndent = this.indent = size; + return indent.length; + } + diff = size - this.indent + this.outdebt; + this.token('INDENT', diff, indent.length - size, size); + this.indents.push(diff); + this.ends.push({ + tag: 'OUTDENT' + }); + this.outdebt = this.indebt = 0; + this.indent = size; + } else if (size < this.baseIndent) { + this.error('missing indentation', { + offset: indent.length + }); + } else { + this.indebt = 0; + this.outdentToken(this.indent - size, noNewlines, indent.length); + } + return indent.length; + }; + + Lexer.prototype.outdentToken = function(moveOut, noNewlines, outdentLength) { + var decreasedIndent, dent, lastIndent, ref2; + decreasedIndent = this.indent - moveOut; + while (moveOut > 0) { + lastIndent = this.indents[this.indents.length - 1]; + if (!lastIndent) { + moveOut = 0; + } else if (lastIndent === this.outdebt) { + moveOut -= this.outdebt; + this.outdebt = 0; + } else if (lastIndent < this.outdebt) { + this.outdebt -= lastIndent; + moveOut -= lastIndent; + } else { + dent = this.indents.pop() + this.outdebt; + if (outdentLength && (ref2 = this.chunk[outdentLength], indexOf.call(INDENTABLE_CLOSERS, ref2) >= 0)) { + decreasedIndent -= dent - moveOut; + moveOut = dent; + } + this.outdebt = 0; + this.pair('OUTDENT'); + this.token('OUTDENT', moveOut, 0, outdentLength); + moveOut -= dent; + } + } + if (dent) { + this.outdebt -= moveOut; + } + while (this.value() === ';') { + this.tokens.pop(); + } + if (!(this.tag() === 'TERMINATOR' || noNewlines)) { + this.token('TERMINATOR', '\n', outdentLength, 0); + } + this.indent = decreasedIndent; + return this; + }; + + Lexer.prototype.whitespaceToken = function() { + var match, nline, prev, ref2; + if (!((match = WHITESPACE.exec(this.chunk)) || (nline = this.chunk.charAt(0) === '\n'))) { + return 0; + } + ref2 = this.tokens, prev = ref2[ref2.length - 1]; + if (prev) { + prev[match ? 'spaced' : 'newLine'] = true; + } + if (match) { + return match[0].length; + } else { + return 0; + } + }; + + Lexer.prototype.newlineToken = function(offset) { + while (this.value() === ';') { + this.tokens.pop(); + } + if (this.tag() !== 'TERMINATOR') { + this.token('TERMINATOR', '\n', offset, 0); + } + return this; + }; + + Lexer.prototype.suppressNewlines = function() { + if (this.value() === '\\') { + this.tokens.pop(); + } + return this; + }; + + Lexer.prototype.literalToken = function() { + var match, message, origin, prev, ref2, ref3, ref4, ref5, ref6, skipToken, tag, token, value; + if (match = OPERATOR.exec(this.chunk)) { + value = match[0]; + if (CODE.test(value)) { + this.tagParameters(); + } + } else { + value = this.chunk.charAt(0); + } + tag = value; + ref2 = this.tokens, prev = ref2[ref2.length - 1]; + if (prev && indexOf.call(['='].concat(slice.call(COMPOUND_ASSIGN)), value) >= 0) { + skipToken = false; + if (value === '=' && ((ref3 = prev[1]) === '||' || ref3 === '&&') && !prev.spaced) { + prev[0] = 'COMPOUND_ASSIGN'; + prev[1] += '='; + prev = this.tokens[this.tokens.length - 2]; + skipToken = true; + } + if (prev && prev[0] !== 'PROPERTY') { + origin = (ref4 = prev.origin) != null ? ref4 : prev; + message = isUnassignable(prev[1], origin[1]); + if (message) { + this.error(message, origin[2]); + } + } + if (skipToken) { + return value.length; + } + } + if (value === '{' && this.seenImport) { + this.importSpecifierList = true; + } else if (this.importSpecifierList && value === '}') { + this.importSpecifierList = false; + } else if (value === '{' && (prev != null ? prev[0] : void 0) === 'EXPORT') { + this.exportSpecifierList = true; + } else if (this.exportSpecifierList && value === '}') { + this.exportSpecifierList = false; + } + if (value === ';') { + this.seenFor = this.seenImport = this.seenExport = false; + tag = 'TERMINATOR'; + } else if (value === '*' && prev[0] === 'EXPORT') { + tag = 'EXPORT_ALL'; + } else if (indexOf.call(MATH, value) >= 0) { + tag = 'MATH'; + } else if (indexOf.call(COMPARE, value) >= 0) { + tag = 'COMPARE'; + } else if (indexOf.call(COMPOUND_ASSIGN, value) >= 0) { + tag = 'COMPOUND_ASSIGN'; + } else if (indexOf.call(UNARY, value) >= 0) { + tag = 'UNARY'; + } else if (indexOf.call(UNARY_MATH, value) >= 0) { + tag = 'UNARY_MATH'; + } else if (indexOf.call(SHIFT, value) >= 0) { + tag = 'SHIFT'; + } else if (value === '?' && (prev != null ? prev.spaced : void 0)) { + tag = 'BIN?'; + } else if (prev && !prev.spaced) { + if (value === '(' && (ref5 = prev[0], indexOf.call(CALLABLE, ref5) >= 0)) { + if (prev[0] === '?') { + prev[0] = 'FUNC_EXIST'; + } + tag = 'CALL_START'; + } else if (value === '[' && (ref6 = prev[0], indexOf.call(INDEXABLE, ref6) >= 0)) { + tag = 'INDEX_START'; + switch (prev[0]) { + case '?': + prev[0] = 'INDEX_SOAK'; + } + } + } + token = this.makeToken(tag, value); + switch (value) { + case '(': + case '{': + case '[': + this.ends.push({ + tag: INVERSES[value], + origin: token + }); + break; + case ')': + case '}': + case ']': + this.pair(value); + } + this.tokens.push(token); + return value.length; + }; + + Lexer.prototype.tagParameters = function() { + var i, stack, tok, tokens; + if (this.tag() !== ')') { + return this; + } + stack = []; + tokens = this.tokens; + i = tokens.length; + tokens[--i][0] = 'PARAM_END'; + while (tok = tokens[--i]) { + switch (tok[0]) { + case ')': + stack.push(tok); + break; + case '(': + case 'CALL_START': + if (stack.length) { + stack.pop(); + } else if (tok[0] === '(') { + tok[0] = 'PARAM_START'; + return this; + } else { + return this; + } + } + } + return this; + }; + + Lexer.prototype.closeIndentation = function() { + return this.outdentToken(this.indent); + }; + + Lexer.prototype.matchWithInterpolations = function(regex, delimiter) { + var close, column, firstToken, index, lastToken, line, nested, offsetInChunk, open, ref2, ref3, ref4, str, strPart, tokens; + tokens = []; + offsetInChunk = delimiter.length; + if (this.chunk.slice(0, offsetInChunk) !== delimiter) { + return null; + } + str = this.chunk.slice(offsetInChunk); + while (true) { + strPart = regex.exec(str)[0]; + this.validateEscapes(strPart, { + isRegex: delimiter.charAt(0) === '/', + offsetInChunk: offsetInChunk + }); + tokens.push(this.makeToken('NEOSTRING', strPart, offsetInChunk)); + str = str.slice(strPart.length); + offsetInChunk += strPart.length; + if (str.slice(0, 2) !== '#{') { + break; + } + ref2 = this.getLineAndColumnFromChunk(offsetInChunk + 1), line = ref2[0], column = ref2[1]; + ref3 = new Lexer().tokenize(str.slice(1), { + line: line, + column: column, + untilBalanced: true + }), nested = ref3.tokens, index = ref3.index; + index += 1; + open = nested[0], close = nested[nested.length - 1]; + open[0] = open[1] = '('; + close[0] = close[1] = ')'; + close.origin = ['', 'end of interpolation', close[2]]; + if (((ref4 = nested[1]) != null ? ref4[0] : void 0) === 'TERMINATOR') { + nested.splice(1, 1); + } + tokens.push(['TOKENS', nested]); + str = str.slice(index); + offsetInChunk += index; + } + if (str.slice(0, delimiter.length) !== delimiter) { + this.error("missing " + delimiter, { + length: delimiter.length + }); + } + firstToken = tokens[0], lastToken = tokens[tokens.length - 1]; + firstToken[2].first_column -= delimiter.length; + if (lastToken[1].substr(-1) === '\n') { + lastToken[2].last_line += 1; + lastToken[2].last_column = delimiter.length - 1; + } else { + lastToken[2].last_column += delimiter.length; + } + if (lastToken[1].length === 0) { + lastToken[2].last_column -= 1; + } + return { + tokens: tokens, + index: offsetInChunk + delimiter.length + }; + }; + + Lexer.prototype.mergeInterpolationTokens = function(tokens, options, fn) { + var converted, firstEmptyStringIndex, firstIndex, i, j, lastToken, len, locationToken, lparen, plusToken, ref2, rparen, tag, token, tokensToPush, value; + if (tokens.length > 1) { + lparen = this.token('STRING_START', '(', 0, 0); + } + firstIndex = this.tokens.length; + for (i = j = 0, len = tokens.length; j < len; i = ++j) { + token = tokens[i]; + tag = token[0], value = token[1]; + switch (tag) { + case 'TOKENS': + if (value.length === 2) { + continue; + } + locationToken = value[0]; + tokensToPush = value; + break; + case 'NEOSTRING': + converted = fn.call(this, token[1], i); + if (converted.length === 0) { + if (i === 0) { + firstEmptyStringIndex = this.tokens.length; + } else { + continue; + } + } + if (i === 2 && (firstEmptyStringIndex != null)) { + this.tokens.splice(firstEmptyStringIndex, 2); + } + token[0] = 'STRING'; + token[1] = this.makeDelimitedLiteral(converted, options); + locationToken = token; + tokensToPush = [token]; + } + if (this.tokens.length > firstIndex) { + plusToken = this.token('+', '+'); + plusToken[2] = { + first_line: locationToken[2].first_line, + first_column: locationToken[2].first_column, + last_line: locationToken[2].first_line, + last_column: locationToken[2].first_column + }; + } + (ref2 = this.tokens).push.apply(ref2, tokensToPush); + } + if (lparen) { + lastToken = tokens[tokens.length - 1]; + lparen.origin = [ + 'STRING', null, { + first_line: lparen[2].first_line, + first_column: lparen[2].first_column, + last_line: lastToken[2].last_line, + last_column: lastToken[2].last_column + } + ]; + rparen = this.token('STRING_END', ')'); + return rparen[2] = { + first_line: lastToken[2].last_line, + first_column: lastToken[2].last_column, + last_line: lastToken[2].last_line, + last_column: lastToken[2].last_column + }; + } + }; + + Lexer.prototype.pair = function(tag) { + var lastIndent, prev, ref2, ref3, wanted; + ref2 = this.ends, prev = ref2[ref2.length - 1]; + if (tag !== (wanted = prev != null ? prev.tag : void 0)) { + if ('OUTDENT' !== wanted) { + this.error("unmatched " + tag); + } + ref3 = this.indents, lastIndent = ref3[ref3.length - 1]; + this.outdentToken(lastIndent, true); + return this.pair(tag); + } + return this.ends.pop(); + }; + + Lexer.prototype.getLineAndColumnFromChunk = function(offset) { + var column, lastLine, lineCount, ref2, string; + if (offset === 0) { + return [this.chunkLine, this.chunkColumn]; + } + if (offset >= this.chunk.length) { + string = this.chunk; + } else { + string = this.chunk.slice(0, +(offset - 1) + 1 || 9e9); + } + lineCount = count(string, '\n'); + column = this.chunkColumn; + if (lineCount > 0) { + ref2 = string.split('\n'), lastLine = ref2[ref2.length - 1]; + column = lastLine.length; + } else { + column += string.length; + } + return [this.chunkLine + lineCount, column]; + }; + + Lexer.prototype.makeToken = function(tag, value, offsetInChunk, length) { + var lastCharacter, locationData, ref2, ref3, token; + if (offsetInChunk == null) { + offsetInChunk = 0; + } + if (length == null) { + length = value.length; + } + locationData = {}; + ref2 = this.getLineAndColumnFromChunk(offsetInChunk), locationData.first_line = ref2[0], locationData.first_column = ref2[1]; + lastCharacter = length > 0 ? length - 1 : 0; + ref3 = this.getLineAndColumnFromChunk(offsetInChunk + lastCharacter), locationData.last_line = ref3[0], locationData.last_column = ref3[1]; + token = [tag, value, locationData]; + return token; + }; + + Lexer.prototype.token = function(tag, value, offsetInChunk, length, origin) { + var token; + token = this.makeToken(tag, value, offsetInChunk, length); + if (origin) { + token.origin = origin; + } + this.tokens.push(token); + return token; + }; + + Lexer.prototype.tag = function() { + var ref2, token; + ref2 = this.tokens, token = ref2[ref2.length - 1]; + return token != null ? token[0] : void 0; + }; + + Lexer.prototype.value = function() { + var ref2, token; + ref2 = this.tokens, token = ref2[ref2.length - 1]; + return token != null ? token[1] : void 0; + }; + + Lexer.prototype.unfinished = function() { + var ref2; + return LINE_CONTINUER.test(this.chunk) || (ref2 = this.tag(), indexOf.call(UNFINISHED, ref2) >= 0); + }; + + Lexer.prototype.formatString = function(str, options) { + return this.replaceUnicodeCodePointEscapes(str.replace(STRING_OMIT, '$1'), options); + }; + + Lexer.prototype.formatHeregex = function(str) { + return this.formatRegex(str.replace(HEREGEX_OMIT, '$1$2'), { + delimiter: '///' + }); + }; + + Lexer.prototype.formatRegex = function(str, options) { + return this.replaceUnicodeCodePointEscapes(str, options); + }; + + Lexer.prototype.unicodeCodePointToUnicodeEscapes = function(codePoint) { + var high, low, toUnicodeEscape; + toUnicodeEscape = function(val) { + var str; + str = val.toString(16); + return "\\u" + (repeat('0', 4 - str.length)) + str; + }; + if (codePoint < 0x10000) { + return toUnicodeEscape(codePoint); + } + high = Math.floor((codePoint - 0x10000) / 0x400) + 0xD800; + low = (codePoint - 0x10000) % 0x400 + 0xDC00; + return "" + (toUnicodeEscape(high)) + (toUnicodeEscape(low)); + }; + + Lexer.prototype.replaceUnicodeCodePointEscapes = function(str, options) { + return str.replace(UNICODE_CODE_POINT_ESCAPE, (function(_this) { + return function(match, escapedBackslash, codePointHex, offset) { + var codePointDecimal; + if (escapedBackslash) { + return escapedBackslash; + } + codePointDecimal = parseInt(codePointHex, 16); + if (codePointDecimal > 0x10ffff) { + _this.error("unicode code point escapes greater than \\u{10ffff} are not allowed", { + offset: offset + options.delimiter.length, + length: codePointHex.length + 4 + }); + } + return _this.unicodeCodePointToUnicodeEscapes(codePointDecimal); + }; + })(this)); + }; + + Lexer.prototype.validateEscapes = function(str, options) { + var before, hex, invalidEscape, invalidEscapeRegex, match, message, octal, ref2, unicode, unicodeCodePoint; + if (options == null) { + options = {}; + } + invalidEscapeRegex = options.isRegex ? REGEX_INVALID_ESCAPE : STRING_INVALID_ESCAPE; + match = invalidEscapeRegex.exec(str); + if (!match) { + return; + } + match[0], before = match[1], octal = match[2], hex = match[3], unicodeCodePoint = match[4], unicode = match[5]; + message = octal ? "octal escape sequences are not allowed" : "invalid escape sequence"; + invalidEscape = "\\" + (octal || hex || unicodeCodePoint || unicode); + return this.error(message + " " + invalidEscape, { + offset: ((ref2 = options.offsetInChunk) != null ? ref2 : 0) + match.index + before.length, + length: invalidEscape.length + }); + }; + + Lexer.prototype.makeDelimitedLiteral = function(body, options) { + var regex; + if (options == null) { + options = {}; + } + if (body === '' && options.delimiter === '/') { + body = '(?:)'; + } + regex = RegExp("(\\\\\\\\)|(\\\\0(?=[1-7]))|\\\\?(" + options.delimiter + ")|\\\\?(?:(\\n)|(\\r)|(\\u2028)|(\\u2029))|(\\\\.)", "g"); + body = body.replace(regex, function(match, backslash, nul, delimiter, lf, cr, ls, ps, other) { + switch (false) { + case !backslash: + if (options.double) { + return backslash + backslash; + } else { + return backslash; + } + case !nul: + return '\\x00'; + case !delimiter: + return "\\" + delimiter; + case !lf: + return '\\n'; + case !cr: + return '\\r'; + case !ls: + return '\\u2028'; + case !ps: + return '\\u2029'; + case !other: + if (options.double) { + return "\\" + other; + } else { + return other; + } + } + }); + return "" + options.delimiter + body + options.delimiter; + }; + + Lexer.prototype.error = function(message, options) { + var first_column, first_line, location, ref2, ref3, ref4; + if (options == null) { + options = {}; + } + location = 'first_line' in options ? options : ((ref3 = this.getLineAndColumnFromChunk((ref2 = options.offset) != null ? ref2 : 0), first_line = ref3[0], first_column = ref3[1], ref3), { + first_line: first_line, + first_column: first_column, + last_column: first_column + ((ref4 = options.length) != null ? ref4 : 1) - 1 + }); + return throwSyntaxError(message, location); + }; + + return Lexer; + + })(); + + isUnassignable = function(name, displayName) { + if (displayName == null) { + displayName = name; + } + switch (false) { + case indexOf.call(slice.call(JS_KEYWORDS).concat(slice.call(COFFEE_KEYWORDS)), name) < 0: + return "keyword '" + displayName + "' can't be assigned"; + case indexOf.call(STRICT_PROSCRIBED, name) < 0: + return "'" + displayName + "' can't be assigned"; + case indexOf.call(RESERVED, name) < 0: + return "reserved word '" + displayName + "' can't be assigned"; + default: + return false; + } + }; + + exports.isUnassignable = isUnassignable; + + isForFrom = function(prev) { + var ref2; + if (prev[0] === 'IDENTIFIER') { + if (prev[1] === 'from') { + prev[1][0] = 'IDENTIFIER'; + true; + } + return true; + } else if (prev[0] === 'FOR') { + return false; + } else if ((ref2 = prev[1]) === '{' || ref2 === '[' || ref2 === ',' || ref2 === ':') { + return false; + } else { + return true; + } + }; + + JS_KEYWORDS = ['true', 'false', 'null', 'this', 'new', 'delete', 'typeof', 'in', 'instanceof', 'return', 'throw', 'break', 'continue', 'debugger', 'yield', 'if', 'else', 'switch', 'for', 'while', 'do', 'try', 'catch', 'finally', 'class', 'extends', 'super', 'import', 'export', 'default']; + + COFFEE_KEYWORDS = ['undefined', 'Infinity', 'NaN', 'then', 'unless', 'until', 'loop', 'of', 'by', 'when']; + + COFFEE_ALIAS_MAP = { + and: '&&', + or: '||', + is: '==', + isnt: '!=', + not: '!', + yes: 'true', + no: 'false', + on: 'true', + off: 'false' + }; + + COFFEE_ALIASES = (function() { + var results; + results = []; + for (key in COFFEE_ALIAS_MAP) { + results.push(key); + } + return results; + })(); + + COFFEE_KEYWORDS = COFFEE_KEYWORDS.concat(COFFEE_ALIASES); + + RESERVED = ['case', 'function', 'var', 'void', 'with', 'const', 'let', 'enum', 'native', 'implements', 'interface', 'package', 'private', 'protected', 'public', 'static']; + + STRICT_PROSCRIBED = ['arguments', 'eval']; + + exports.JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED); + + BOM = 65279; + + IDENTIFIER = /^(?!\d)((?:(?!\s)[$\w\x7f-\uffff])+)([^\n\S]*:(?!:))?/; + + NUMBER = /^0b[01]+|^0o[0-7]+|^0x[\da-f]+|^\d*\.?\d+(?:e[+-]?\d+)?/i; + + OPERATOR = /^(?:[-=]>|[-+*\/%<>&|^!?=]=|>>>=?|([-+:])\1|([&|<>*\/%])\2=?|\?(\.|::)|\.{2,3})/; + + WHITESPACE = /^[^\n\S]+/; + + COMMENT = /^###([^#][\s\S]*?)(?:###[^\n\S]*|###$)|^(?:\s*#(?!##[^#]).*)+/; + + CODE = /^[-=]>/; + + MULTI_DENT = /^(?:\n[^\n\S]*)+/; + + JSTOKEN = /^`(?!``)((?:[^`\\]|\\[\s\S])*)`/; + + HERE_JSTOKEN = /^```((?:[^`\\]|\\[\s\S]|`(?!``))*)```/; + + STRING_START = /^(?:'''|"""|'|")/; + + STRING_SINGLE = /^(?:[^\\']|\\[\s\S])*/; + + STRING_DOUBLE = /^(?:[^\\"#]|\\[\s\S]|\#(?!\{))*/; + + HEREDOC_SINGLE = /^(?:[^\\']|\\[\s\S]|'(?!''))*/; + + HEREDOC_DOUBLE = /^(?:[^\\"#]|\\[\s\S]|"(?!"")|\#(?!\{))*/; + + STRING_OMIT = /((?:\\\\)+)|\\[^\S\n]*\n\s*/g; + + SIMPLE_STRING_OMIT = /\s*\n\s*/g; + + HEREDOC_INDENT = /\n+([^\n\S]*)(?=\S)/g; + + REGEX = /^\/(?!\/)((?:[^[\/\n\\]|\\[^\n]|\[(?:\\[^\n]|[^\]\n\\])*\])*)(\/)?/; + + REGEX_FLAGS = /^\w*/; + + VALID_FLAGS = /^(?!.*(.).*\1)[imguy]*$/; + + HEREGEX = /^(?:[^\\\/#]|\\[\s\S]|\/(?!\/\/)|\#(?!\{))*/; + + HEREGEX_OMIT = /((?:\\\\)+)|\\(\s)|\s+(?:#.*)?/g; + + REGEX_ILLEGAL = /^(\/|\/{3}\s*)(\*)/; + + POSSIBLY_DIVISION = /^\/=?\s/; + + HERECOMMENT_ILLEGAL = /\*\//; + + LINE_CONTINUER = /^\s*(?:,|\??\.(?![.\d])|::)/; + + STRING_INVALID_ESCAPE = /((?:^|[^\\])(?:\\\\)*)\\(?:(0[0-7]|[1-7])|(x(?![\da-fA-F]{2}).{0,2})|(u\{(?![\da-fA-F]{1,}\})[^}]*\}?)|(u(?!\{|[\da-fA-F]{4}).{0,4}))/; + + REGEX_INVALID_ESCAPE = /((?:^|[^\\])(?:\\\\)*)\\(?:(0[0-7])|(x(?![\da-fA-F]{2}).{0,2})|(u\{(?![\da-fA-F]{1,}\})[^}]*\}?)|(u(?!\{|[\da-fA-F]{4}).{0,4}))/; + + UNICODE_CODE_POINT_ESCAPE = /(\\\\)|\\u\{([\da-fA-F]+)\}/g; + + LEADING_BLANK_LINE = /^[^\n\S]*\n/; + + TRAILING_BLANK_LINE = /\n[^\n\S]*$/; + + TRAILING_SPACES = /\s+$/; + + COMPOUND_ASSIGN = ['-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|=', '**=', '//=', '%%=']; + + UNARY = ['NEW', 'TYPEOF', 'DELETE', 'DO']; + + UNARY_MATH = ['!', '~']; + + SHIFT = ['<<', '>>', '>>>']; + + COMPARE = ['==', '!=', '<', '>', '<=', '>=']; + + MATH = ['*', '/', '%', '//', '%%']; + + RELATION = ['IN', 'OF', 'INSTANCEOF']; + + BOOL = ['TRUE', 'FALSE']; + + CALLABLE = ['IDENTIFIER', 'PROPERTY', ')', ']', '?', '@', 'THIS', 'SUPER']; + + INDEXABLE = CALLABLE.concat(['NUMBER', 'INFINITY', 'NAN', 'STRING', 'STRING_END', 'REGEX', 'REGEX_END', 'BOOL', 'NULL', 'UNDEFINED', '}', '::']); + + NOT_REGEX = INDEXABLE.concat(['++', '--']); + + LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR']; + + INDENTABLE_CLOSERS = [')', '}', ']']; + + UNFINISHED = ['\\', '.', '?.', '?::', 'UNARY', 'MATH', 'UNARY_MATH', '+', '-', '**', 'SHIFT', 'RELATION', 'COMPARE', '&', '^', '|', '&&', '||', 'BIN?', 'THROW', 'EXTENDS', 'DEFAULT']; + +}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/nodes.js b/deploy/node_modules/coffee-script/lib/coffee-script/nodes.js new file mode 100644 index 0000000..f4d6479 --- /dev/null +++ b/deploy/node_modules/coffee-script/lib/coffee-script/nodes.js @@ -0,0 +1,3899 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var Access, Arr, Assign, Base, Block, BooleanLiteral, Call, Class, Code, CodeFragment, Comment, Existence, Expansion, ExportAllDeclaration, ExportDeclaration, ExportDefaultDeclaration, ExportNamedDeclaration, ExportSpecifier, ExportSpecifierList, Extends, For, IdentifierLiteral, If, ImportClause, ImportDeclaration, ImportDefaultSpecifier, ImportNamespaceSpecifier, ImportSpecifier, ImportSpecifierList, In, Index, InfinityLiteral, JS_FORBIDDEN, LEVEL_ACCESS, LEVEL_COND, LEVEL_LIST, LEVEL_OP, LEVEL_PAREN, LEVEL_TOP, Literal, ModuleDeclaration, ModuleSpecifier, ModuleSpecifierList, NEGATE, NO, NaNLiteral, NullLiteral, NumberLiteral, Obj, Op, Param, Parens, PassthroughLiteral, PropertyName, Range, RegexLiteral, RegexWithInterpolations, Return, SIMPLENUM, Scope, Slice, Splat, StatementLiteral, StringLiteral, StringWithInterpolations, SuperCall, Switch, TAB, THIS, TaggedTemplateCall, ThisLiteral, Throw, Try, UTILITIES, UndefinedLiteral, Value, While, YES, YieldReturn, addLocationDataFn, compact, del, ends, extend, flatten, fragmentsToText, isComplexOrAssignable, isLiteralArguments, isLiteralThis, isUnassignable, locationDataToString, merge, multident, ref1, ref2, some, starts, throwSyntaxError, unfoldSoak, utility, + extend1 = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty, + indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, + slice = [].slice; + + Error.stackTraceLimit = 2e308; + + Scope = require('./scope').Scope; + + ref1 = require('./lexer'), isUnassignable = ref1.isUnassignable, JS_FORBIDDEN = ref1.JS_FORBIDDEN; + + ref2 = require('./helpers'), compact = ref2.compact, flatten = ref2.flatten, extend = ref2.extend, merge = ref2.merge, del = ref2.del, starts = ref2.starts, ends = ref2.ends, some = ref2.some, addLocationDataFn = ref2.addLocationDataFn, locationDataToString = ref2.locationDataToString, throwSyntaxError = ref2.throwSyntaxError; + + exports.extend = extend; + + exports.addLocationDataFn = addLocationDataFn; + + YES = function() { + return true; + }; + + NO = function() { + return false; + }; + + THIS = function() { + return this; + }; + + NEGATE = function() { + this.negated = !this.negated; + return this; + }; + + exports.CodeFragment = CodeFragment = (function() { + function CodeFragment(parent, code) { + var ref3; + this.code = "" + code; + this.locationData = parent != null ? parent.locationData : void 0; + this.type = (parent != null ? (ref3 = parent.constructor) != null ? ref3.name : void 0 : void 0) || 'unknown'; + } + + CodeFragment.prototype.toString = function() { + return "" + this.code + (this.locationData ? ": " + locationDataToString(this.locationData) : ''); + }; + + return CodeFragment; + + })(); + + fragmentsToText = function(fragments) { + var fragment; + return ((function() { + var j, len1, results; + results = []; + for (j = 0, len1 = fragments.length; j < len1; j++) { + fragment = fragments[j]; + results.push(fragment.code); + } + return results; + })()).join(''); + }; + + exports.Base = Base = (function() { + function Base() {} + + Base.prototype.compile = function(o, lvl) { + return fragmentsToText(this.compileToFragments(o, lvl)); + }; + + Base.prototype.compileToFragments = function(o, lvl) { + var node; + o = extend({}, o); + if (lvl) { + o.level = lvl; + } + node = this.unfoldSoak(o) || this; + node.tab = o.indent; + if (o.level === LEVEL_TOP || !node.isStatement(o)) { + return node.compileNode(o); + } else { + return node.compileClosure(o); + } + }; + + Base.prototype.compileClosure = function(o) { + var args, argumentsNode, func, jumpNode, meth, parts, ref3; + if (jumpNode = this.jumps()) { + jumpNode.error('cannot use a pure statement in an expression'); + } + o.sharedScope = true; + func = new Code([], Block.wrap([this])); + args = []; + if ((argumentsNode = this.contains(isLiteralArguments)) || this.contains(isLiteralThis)) { + args = [new ThisLiteral]; + if (argumentsNode) { + meth = 'apply'; + args.push(new IdentifierLiteral('arguments')); + } else { + meth = 'call'; + } + func = new Value(func, [new Access(new PropertyName(meth))]); + } + parts = (new Call(func, args)).compileNode(o); + if (func.isGenerator || ((ref3 = func.base) != null ? ref3.isGenerator : void 0)) { + parts.unshift(this.makeCode("(yield* ")); + parts.push(this.makeCode(")")); + } + return parts; + }; + + Base.prototype.cache = function(o, level, isComplex) { + var complex, ref, sub; + complex = isComplex != null ? isComplex(this) : this.isComplex(); + if (complex) { + ref = new IdentifierLiteral(o.scope.freeVariable('ref')); + sub = new Assign(ref, this); + if (level) { + return [sub.compileToFragments(o, level), [this.makeCode(ref.value)]]; + } else { + return [sub, ref]; + } + } else { + ref = level ? this.compileToFragments(o, level) : this; + return [ref, ref]; + } + }; + + Base.prototype.cacheToCodeFragments = function(cacheValues) { + return [fragmentsToText(cacheValues[0]), fragmentsToText(cacheValues[1])]; + }; + + Base.prototype.makeReturn = function(res) { + var me; + me = this.unwrapAll(); + if (res) { + return new Call(new Literal(res + ".push"), [me]); + } else { + return new Return(me); + } + }; + + Base.prototype.contains = function(pred) { + var node; + node = void 0; + this.traverseChildren(false, function(n) { + if (pred(n)) { + node = n; + return false; + } + }); + return node; + }; + + Base.prototype.lastNonComment = function(list) { + var i; + i = list.length; + while (i--) { + if (!(list[i] instanceof Comment)) { + return list[i]; + } + } + return null; + }; + + Base.prototype.toString = function(idt, name) { + var tree; + if (idt == null) { + idt = ''; + } + if (name == null) { + name = this.constructor.name; + } + tree = '\n' + idt + name; + if (this.soak) { + tree += '?'; + } + this.eachChild(function(node) { + return tree += node.toString(idt + TAB); + }); + return tree; + }; + + Base.prototype.eachChild = function(func) { + var attr, child, j, k, len1, len2, ref3, ref4; + if (!this.children) { + return this; + } + ref3 = this.children; + for (j = 0, len1 = ref3.length; j < len1; j++) { + attr = ref3[j]; + if (this[attr]) { + ref4 = flatten([this[attr]]); + for (k = 0, len2 = ref4.length; k < len2; k++) { + child = ref4[k]; + if (func(child) === false) { + return this; + } + } + } + } + return this; + }; + + Base.prototype.traverseChildren = function(crossScope, func) { + return this.eachChild(function(child) { + var recur; + recur = func(child); + if (recur !== false) { + return child.traverseChildren(crossScope, func); + } + }); + }; + + Base.prototype.invert = function() { + return new Op('!', this); + }; + + Base.prototype.unwrapAll = function() { + var node; + node = this; + while (node !== (node = node.unwrap())) { + continue; + } + return node; + }; + + Base.prototype.children = []; + + Base.prototype.isStatement = NO; + + Base.prototype.jumps = NO; + + Base.prototype.isComplex = YES; + + Base.prototype.isChainable = NO; + + Base.prototype.isAssignable = NO; + + Base.prototype.isNumber = NO; + + Base.prototype.unwrap = THIS; + + Base.prototype.unfoldSoak = NO; + + Base.prototype.assigns = NO; + + Base.prototype.updateLocationDataIfMissing = function(locationData) { + if (this.locationData) { + return this; + } + this.locationData = locationData; + return this.eachChild(function(child) { + return child.updateLocationDataIfMissing(locationData); + }); + }; + + Base.prototype.error = function(message) { + return throwSyntaxError(message, this.locationData); + }; + + Base.prototype.makeCode = function(code) { + return new CodeFragment(this, code); + }; + + Base.prototype.wrapInBraces = function(fragments) { + return [].concat(this.makeCode('('), fragments, this.makeCode(')')); + }; + + Base.prototype.joinFragmentArrays = function(fragmentsList, joinStr) { + var answer, fragments, i, j, len1; + answer = []; + for (i = j = 0, len1 = fragmentsList.length; j < len1; i = ++j) { + fragments = fragmentsList[i]; + if (i) { + answer.push(this.makeCode(joinStr)); + } + answer = answer.concat(fragments); + } + return answer; + }; + + return Base; + + })(); + + exports.Block = Block = (function(superClass1) { + extend1(Block, superClass1); + + function Block(nodes) { + this.expressions = compact(flatten(nodes || [])); + } + + Block.prototype.children = ['expressions']; + + Block.prototype.push = function(node) { + this.expressions.push(node); + return this; + }; + + Block.prototype.pop = function() { + return this.expressions.pop(); + }; + + Block.prototype.unshift = function(node) { + this.expressions.unshift(node); + return this; + }; + + Block.prototype.unwrap = function() { + if (this.expressions.length === 1) { + return this.expressions[0]; + } else { + return this; + } + }; + + Block.prototype.isEmpty = function() { + return !this.expressions.length; + }; + + Block.prototype.isStatement = function(o) { + var exp, j, len1, ref3; + ref3 = this.expressions; + for (j = 0, len1 = ref3.length; j < len1; j++) { + exp = ref3[j]; + if (exp.isStatement(o)) { + return true; + } + } + return false; + }; + + Block.prototype.jumps = function(o) { + var exp, j, jumpNode, len1, ref3; + ref3 = this.expressions; + for (j = 0, len1 = ref3.length; j < len1; j++) { + exp = ref3[j]; + if (jumpNode = exp.jumps(o)) { + return jumpNode; + } + } + }; + + Block.prototype.makeReturn = function(res) { + var expr, len; + len = this.expressions.length; + while (len--) { + expr = this.expressions[len]; + if (!(expr instanceof Comment)) { + this.expressions[len] = expr.makeReturn(res); + if (expr instanceof Return && !expr.expression) { + this.expressions.splice(len, 1); + } + break; + } + } + return this; + }; + + Block.prototype.compileToFragments = function(o, level) { + if (o == null) { + o = {}; + } + if (o.scope) { + return Block.__super__.compileToFragments.call(this, o, level); + } else { + return this.compileRoot(o); + } + }; + + Block.prototype.compileNode = function(o) { + var answer, compiledNodes, fragments, index, j, len1, node, ref3, top; + this.tab = o.indent; + top = o.level === LEVEL_TOP; + compiledNodes = []; + ref3 = this.expressions; + for (index = j = 0, len1 = ref3.length; j < len1; index = ++j) { + node = ref3[index]; + node = node.unwrapAll(); + node = node.unfoldSoak(o) || node; + if (node instanceof Block) { + compiledNodes.push(node.compileNode(o)); + } else if (top) { + node.front = true; + fragments = node.compileToFragments(o); + if (!node.isStatement(o)) { + fragments.unshift(this.makeCode("" + this.tab)); + fragments.push(this.makeCode(";")); + } + compiledNodes.push(fragments); + } else { + compiledNodes.push(node.compileToFragments(o, LEVEL_LIST)); + } + } + if (top) { + if (this.spaced) { + return [].concat(this.joinFragmentArrays(compiledNodes, '\n\n'), this.makeCode("\n")); + } else { + return this.joinFragmentArrays(compiledNodes, '\n'); + } + } + if (compiledNodes.length) { + answer = this.joinFragmentArrays(compiledNodes, ', '); + } else { + answer = [this.makeCode("void 0")]; + } + if (compiledNodes.length > 1 && o.level >= LEVEL_LIST) { + return this.wrapInBraces(answer); + } else { + return answer; + } + }; + + Block.prototype.compileRoot = function(o) { + var exp, fragments, i, j, len1, name, prelude, preludeExps, ref3, ref4, rest; + o.indent = o.bare ? '' : TAB; + o.level = LEVEL_TOP; + this.spaced = true; + o.scope = new Scope(null, this, null, (ref3 = o.referencedVars) != null ? ref3 : []); + ref4 = o.locals || []; + for (j = 0, len1 = ref4.length; j < len1; j++) { + name = ref4[j]; + o.scope.parameter(name); + } + prelude = []; + if (!o.bare) { + preludeExps = (function() { + var k, len2, ref5, results; + ref5 = this.expressions; + results = []; + for (i = k = 0, len2 = ref5.length; k < len2; i = ++k) { + exp = ref5[i]; + if (!(exp.unwrap() instanceof Comment)) { + break; + } + results.push(exp); + } + return results; + }).call(this); + rest = this.expressions.slice(preludeExps.length); + this.expressions = preludeExps; + if (preludeExps.length) { + prelude = this.compileNode(merge(o, { + indent: '' + })); + prelude.push(this.makeCode("\n")); + } + this.expressions = rest; + } + fragments = this.compileWithDeclarations(o); + if (o.bare) { + return fragments; + } + return [].concat(prelude, this.makeCode("(function() {\n"), fragments, this.makeCode("\n}).call(this);\n")); + }; + + Block.prototype.compileWithDeclarations = function(o) { + var assigns, declars, exp, fragments, i, j, len1, post, ref3, ref4, ref5, rest, scope, spaced; + fragments = []; + post = []; + ref3 = this.expressions; + for (i = j = 0, len1 = ref3.length; j < len1; i = ++j) { + exp = ref3[i]; + exp = exp.unwrap(); + if (!(exp instanceof Comment || exp instanceof Literal)) { + break; + } + } + o = merge(o, { + level: LEVEL_TOP + }); + if (i) { + rest = this.expressions.splice(i, 9e9); + ref4 = [this.spaced, false], spaced = ref4[0], this.spaced = ref4[1]; + ref5 = [this.compileNode(o), spaced], fragments = ref5[0], this.spaced = ref5[1]; + this.expressions = rest; + } + post = this.compileNode(o); + scope = o.scope; + if (scope.expressions === this) { + declars = o.scope.hasDeclarations(); + assigns = scope.hasAssignments; + if (declars || assigns) { + if (i) { + fragments.push(this.makeCode('\n')); + } + fragments.push(this.makeCode(this.tab + "var ")); + if (declars) { + fragments.push(this.makeCode(scope.declaredVariables().join(', '))); + } + if (assigns) { + if (declars) { + fragments.push(this.makeCode(",\n" + (this.tab + TAB))); + } + fragments.push(this.makeCode(scope.assignedVariables().join(",\n" + (this.tab + TAB)))); + } + fragments.push(this.makeCode(";\n" + (this.spaced ? '\n' : ''))); + } else if (fragments.length && post.length) { + fragments.push(this.makeCode("\n")); + } + } + return fragments.concat(post); + }; + + Block.wrap = function(nodes) { + if (nodes.length === 1 && nodes[0] instanceof Block) { + return nodes[0]; + } + return new Block(nodes); + }; + + return Block; + + })(Base); + + exports.Literal = Literal = (function(superClass1) { + extend1(Literal, superClass1); + + function Literal(value1) { + this.value = value1; + } + + Literal.prototype.isComplex = NO; + + Literal.prototype.assigns = function(name) { + return name === this.value; + }; + + Literal.prototype.compileNode = function(o) { + return [this.makeCode(this.value)]; + }; + + Literal.prototype.toString = function() { + return " " + (this.isStatement() ? Literal.__super__.toString.apply(this, arguments) : this.constructor.name) + ": " + this.value; + }; + + return Literal; + + })(Base); + + exports.NumberLiteral = NumberLiteral = (function(superClass1) { + extend1(NumberLiteral, superClass1); + + function NumberLiteral() { + return NumberLiteral.__super__.constructor.apply(this, arguments); + } + + return NumberLiteral; + + })(Literal); + + exports.InfinityLiteral = InfinityLiteral = (function(superClass1) { + extend1(InfinityLiteral, superClass1); + + function InfinityLiteral() { + return InfinityLiteral.__super__.constructor.apply(this, arguments); + } + + InfinityLiteral.prototype.compileNode = function() { + return [this.makeCode('2e308')]; + }; + + return InfinityLiteral; + + })(NumberLiteral); + + exports.NaNLiteral = NaNLiteral = (function(superClass1) { + extend1(NaNLiteral, superClass1); + + function NaNLiteral() { + NaNLiteral.__super__.constructor.call(this, 'NaN'); + } + + NaNLiteral.prototype.compileNode = function(o) { + var code; + code = [this.makeCode('0/0')]; + if (o.level >= LEVEL_OP) { + return this.wrapInBraces(code); + } else { + return code; + } + }; + + return NaNLiteral; + + })(NumberLiteral); + + exports.StringLiteral = StringLiteral = (function(superClass1) { + extend1(StringLiteral, superClass1); + + function StringLiteral() { + return StringLiteral.__super__.constructor.apply(this, arguments); + } + + return StringLiteral; + + })(Literal); + + exports.RegexLiteral = RegexLiteral = (function(superClass1) { + extend1(RegexLiteral, superClass1); + + function RegexLiteral() { + return RegexLiteral.__super__.constructor.apply(this, arguments); + } + + return RegexLiteral; + + })(Literal); + + exports.PassthroughLiteral = PassthroughLiteral = (function(superClass1) { + extend1(PassthroughLiteral, superClass1); + + function PassthroughLiteral() { + return PassthroughLiteral.__super__.constructor.apply(this, arguments); + } + + return PassthroughLiteral; + + })(Literal); + + exports.IdentifierLiteral = IdentifierLiteral = (function(superClass1) { + extend1(IdentifierLiteral, superClass1); + + function IdentifierLiteral() { + return IdentifierLiteral.__super__.constructor.apply(this, arguments); + } + + IdentifierLiteral.prototype.isAssignable = YES; + + return IdentifierLiteral; + + })(Literal); + + exports.PropertyName = PropertyName = (function(superClass1) { + extend1(PropertyName, superClass1); + + function PropertyName() { + return PropertyName.__super__.constructor.apply(this, arguments); + } + + PropertyName.prototype.isAssignable = YES; + + return PropertyName; + + })(Literal); + + exports.StatementLiteral = StatementLiteral = (function(superClass1) { + extend1(StatementLiteral, superClass1); + + function StatementLiteral() { + return StatementLiteral.__super__.constructor.apply(this, arguments); + } + + StatementLiteral.prototype.isStatement = YES; + + StatementLiteral.prototype.makeReturn = THIS; + + StatementLiteral.prototype.jumps = function(o) { + if (this.value === 'break' && !((o != null ? o.loop : void 0) || (o != null ? o.block : void 0))) { + return this; + } + if (this.value === 'continue' && !(o != null ? o.loop : void 0)) { + return this; + } + }; + + StatementLiteral.prototype.compileNode = function(o) { + return [this.makeCode("" + this.tab + this.value + ";")]; + }; + + return StatementLiteral; + + })(Literal); + + exports.ThisLiteral = ThisLiteral = (function(superClass1) { + extend1(ThisLiteral, superClass1); + + function ThisLiteral() { + ThisLiteral.__super__.constructor.call(this, 'this'); + } + + ThisLiteral.prototype.compileNode = function(o) { + var code, ref3; + code = ((ref3 = o.scope.method) != null ? ref3.bound : void 0) ? o.scope.method.context : this.value; + return [this.makeCode(code)]; + }; + + return ThisLiteral; + + })(Literal); + + exports.UndefinedLiteral = UndefinedLiteral = (function(superClass1) { + extend1(UndefinedLiteral, superClass1); + + function UndefinedLiteral() { + UndefinedLiteral.__super__.constructor.call(this, 'undefined'); + } + + UndefinedLiteral.prototype.compileNode = function(o) { + return [this.makeCode(o.level >= LEVEL_ACCESS ? '(void 0)' : 'void 0')]; + }; + + return UndefinedLiteral; + + })(Literal); + + exports.NullLiteral = NullLiteral = (function(superClass1) { + extend1(NullLiteral, superClass1); + + function NullLiteral() { + NullLiteral.__super__.constructor.call(this, 'null'); + } + + return NullLiteral; + + })(Literal); + + exports.BooleanLiteral = BooleanLiteral = (function(superClass1) { + extend1(BooleanLiteral, superClass1); + + function BooleanLiteral() { + return BooleanLiteral.__super__.constructor.apply(this, arguments); + } + + return BooleanLiteral; + + })(Literal); + + exports.Return = Return = (function(superClass1) { + extend1(Return, superClass1); + + function Return(expression) { + this.expression = expression; + } + + Return.prototype.children = ['expression']; + + Return.prototype.isStatement = YES; + + Return.prototype.makeReturn = THIS; + + Return.prototype.jumps = THIS; + + Return.prototype.compileToFragments = function(o, level) { + var expr, ref3; + expr = (ref3 = this.expression) != null ? ref3.makeReturn() : void 0; + if (expr && !(expr instanceof Return)) { + return expr.compileToFragments(o, level); + } else { + return Return.__super__.compileToFragments.call(this, o, level); + } + }; + + Return.prototype.compileNode = function(o) { + var answer; + answer = []; + answer.push(this.makeCode(this.tab + ("return" + (this.expression ? " " : "")))); + if (this.expression) { + answer = answer.concat(this.expression.compileToFragments(o, LEVEL_PAREN)); + } + answer.push(this.makeCode(";")); + return answer; + }; + + return Return; + + })(Base); + + exports.YieldReturn = YieldReturn = (function(superClass1) { + extend1(YieldReturn, superClass1); + + function YieldReturn() { + return YieldReturn.__super__.constructor.apply(this, arguments); + } + + YieldReturn.prototype.compileNode = function(o) { + if (o.scope.parent == null) { + this.error('yield can only occur inside functions'); + } + return YieldReturn.__super__.compileNode.apply(this, arguments); + }; + + return YieldReturn; + + })(Return); + + exports.Value = Value = (function(superClass1) { + extend1(Value, superClass1); + + function Value(base, props, tag) { + if (!props && base instanceof Value) { + return base; + } + this.base = base; + this.properties = props || []; + if (tag) { + this[tag] = true; + } + return this; + } + + Value.prototype.children = ['base', 'properties']; + + Value.prototype.add = function(props) { + this.properties = this.properties.concat(props); + return this; + }; + + Value.prototype.hasProperties = function() { + return !!this.properties.length; + }; + + Value.prototype.bareLiteral = function(type) { + return !this.properties.length && this.base instanceof type; + }; + + Value.prototype.isArray = function() { + return this.bareLiteral(Arr); + }; + + Value.prototype.isRange = function() { + return this.bareLiteral(Range); + }; + + Value.prototype.isComplex = function() { + return this.hasProperties() || this.base.isComplex(); + }; + + Value.prototype.isAssignable = function() { + return this.hasProperties() || this.base.isAssignable(); + }; + + Value.prototype.isNumber = function() { + return this.bareLiteral(NumberLiteral); + }; + + Value.prototype.isString = function() { + return this.bareLiteral(StringLiteral); + }; + + Value.prototype.isRegex = function() { + return this.bareLiteral(RegexLiteral); + }; + + Value.prototype.isUndefined = function() { + return this.bareLiteral(UndefinedLiteral); + }; + + Value.prototype.isNull = function() { + return this.bareLiteral(NullLiteral); + }; + + Value.prototype.isBoolean = function() { + return this.bareLiteral(BooleanLiteral); + }; + + Value.prototype.isAtomic = function() { + var j, len1, node, ref3; + ref3 = this.properties.concat(this.base); + for (j = 0, len1 = ref3.length; j < len1; j++) { + node = ref3[j]; + if (node.soak || node instanceof Call) { + return false; + } + } + return true; + }; + + Value.prototype.isNotCallable = function() { + return this.isNumber() || this.isString() || this.isRegex() || this.isArray() || this.isRange() || this.isSplice() || this.isObject() || this.isUndefined() || this.isNull() || this.isBoolean(); + }; + + Value.prototype.isStatement = function(o) { + return !this.properties.length && this.base.isStatement(o); + }; + + Value.prototype.assigns = function(name) { + return !this.properties.length && this.base.assigns(name); + }; + + Value.prototype.jumps = function(o) { + return !this.properties.length && this.base.jumps(o); + }; + + Value.prototype.isObject = function(onlyGenerated) { + if (this.properties.length) { + return false; + } + return (this.base instanceof Obj) && (!onlyGenerated || this.base.generated); + }; + + Value.prototype.isSplice = function() { + var lastProp, ref3; + ref3 = this.properties, lastProp = ref3[ref3.length - 1]; + return lastProp instanceof Slice; + }; + + Value.prototype.looksStatic = function(className) { + var ref3; + return this.base.value === className && this.properties.length === 1 && ((ref3 = this.properties[0].name) != null ? ref3.value : void 0) !== 'prototype'; + }; + + Value.prototype.unwrap = function() { + if (this.properties.length) { + return this; + } else { + return this.base; + } + }; + + Value.prototype.cacheReference = function(o) { + var base, bref, name, nref, ref3; + ref3 = this.properties, name = ref3[ref3.length - 1]; + if (this.properties.length < 2 && !this.base.isComplex() && !(name != null ? name.isComplex() : void 0)) { + return [this, this]; + } + base = new Value(this.base, this.properties.slice(0, -1)); + if (base.isComplex()) { + bref = new IdentifierLiteral(o.scope.freeVariable('base')); + base = new Value(new Parens(new Assign(bref, base))); + } + if (!name) { + return [base, bref]; + } + if (name.isComplex()) { + nref = new IdentifierLiteral(o.scope.freeVariable('name')); + name = new Index(new Assign(nref, name.index)); + nref = new Index(nref); + } + return [base.add(name), new Value(bref || base.base, [nref || name])]; + }; + + Value.prototype.compileNode = function(o) { + var fragments, j, len1, prop, props; + this.base.front = this.front; + props = this.properties; + fragments = this.base.compileToFragments(o, (props.length ? LEVEL_ACCESS : null)); + if (props.length && SIMPLENUM.test(fragmentsToText(fragments))) { + fragments.push(this.makeCode('.')); + } + for (j = 0, len1 = props.length; j < len1; j++) { + prop = props[j]; + fragments.push.apply(fragments, prop.compileToFragments(o)); + } + return fragments; + }; + + Value.prototype.unfoldSoak = function(o) { + return this.unfoldedSoak != null ? this.unfoldedSoak : this.unfoldedSoak = (function(_this) { + return function() { + var fst, i, ifn, j, len1, prop, ref, ref3, ref4, snd; + if (ifn = _this.base.unfoldSoak(o)) { + (ref3 = ifn.body.properties).push.apply(ref3, _this.properties); + return ifn; + } + ref4 = _this.properties; + for (i = j = 0, len1 = ref4.length; j < len1; i = ++j) { + prop = ref4[i]; + if (!prop.soak) { + continue; + } + prop.soak = false; + fst = new Value(_this.base, _this.properties.slice(0, i)); + snd = new Value(_this.base, _this.properties.slice(i)); + if (fst.isComplex()) { + ref = new IdentifierLiteral(o.scope.freeVariable('ref')); + fst = new Parens(new Assign(ref, fst)); + snd.base = ref; + } + return new If(new Existence(fst), snd, { + soak: true + }); + } + return false; + }; + })(this)(); + }; + + return Value; + + })(Base); + + exports.Comment = Comment = (function(superClass1) { + extend1(Comment, superClass1); + + function Comment(comment1) { + this.comment = comment1; + } + + Comment.prototype.isStatement = YES; + + Comment.prototype.makeReturn = THIS; + + Comment.prototype.compileNode = function(o, level) { + var code, comment; + comment = this.comment.replace(/^(\s*)#(?=\s)/gm, "$1 *"); + code = "/*" + (multident(comment, this.tab)) + (indexOf.call(comment, '\n') >= 0 ? "\n" + this.tab : '') + " */"; + if ((level || o.level) === LEVEL_TOP) { + code = o.indent + code; + } + return [this.makeCode("\n"), this.makeCode(code)]; + }; + + return Comment; + + })(Base); + + exports.Call = Call = (function(superClass1) { + extend1(Call, superClass1); + + function Call(variable1, args1, soak1) { + this.variable = variable1; + this.args = args1 != null ? args1 : []; + this.soak = soak1; + this.isNew = false; + if (this.variable instanceof Value && this.variable.isNotCallable()) { + this.variable.error("literal is not a function"); + } + } + + Call.prototype.children = ['variable', 'args']; + + Call.prototype.updateLocationDataIfMissing = function(locationData) { + var base, ref3; + if (this.locationData && this.needsUpdatedStartLocation) { + this.locationData.first_line = locationData.first_line; + this.locationData.first_column = locationData.first_column; + base = ((ref3 = this.variable) != null ? ref3.base : void 0) || this.variable; + if (base.needsUpdatedStartLocation) { + this.variable.locationData.first_line = locationData.first_line; + this.variable.locationData.first_column = locationData.first_column; + base.updateLocationDataIfMissing(locationData); + } + delete this.needsUpdatedStartLocation; + } + return Call.__super__.updateLocationDataIfMissing.apply(this, arguments); + }; + + Call.prototype.newInstance = function() { + var base, ref3; + base = ((ref3 = this.variable) != null ? ref3.base : void 0) || this.variable; + if (base instanceof Call && !base.isNew) { + base.newInstance(); + } else { + this.isNew = true; + } + this.needsUpdatedStartLocation = true; + return this; + }; + + Call.prototype.unfoldSoak = function(o) { + var call, ifn, j, left, len1, list, ref3, ref4, rite; + if (this.soak) { + if (this instanceof SuperCall) { + left = new Literal(this.superReference(o)); + rite = new Value(left); + } else { + if (ifn = unfoldSoak(o, this, 'variable')) { + return ifn; + } + ref3 = new Value(this.variable).cacheReference(o), left = ref3[0], rite = ref3[1]; + } + rite = new Call(rite, this.args); + rite.isNew = this.isNew; + left = new Literal("typeof " + (left.compile(o)) + " === \"function\""); + return new If(left, new Value(rite), { + soak: true + }); + } + call = this; + list = []; + while (true) { + if (call.variable instanceof Call) { + list.push(call); + call = call.variable; + continue; + } + if (!(call.variable instanceof Value)) { + break; + } + list.push(call); + if (!((call = call.variable.base) instanceof Call)) { + break; + } + } + ref4 = list.reverse(); + for (j = 0, len1 = ref4.length; j < len1; j++) { + call = ref4[j]; + if (ifn) { + if (call.variable instanceof Call) { + call.variable = ifn; + } else { + call.variable.base = ifn; + } + } + ifn = unfoldSoak(o, call, 'variable'); + } + return ifn; + }; + + Call.prototype.compileNode = function(o) { + var arg, argIndex, compiledArgs, compiledArray, fragments, j, len1, preface, ref3, ref4; + if ((ref3 = this.variable) != null) { + ref3.front = this.front; + } + compiledArray = Splat.compileSplattedArray(o, this.args, true); + if (compiledArray.length) { + return this.compileSplat(o, compiledArray); + } + compiledArgs = []; + ref4 = this.args; + for (argIndex = j = 0, len1 = ref4.length; j < len1; argIndex = ++j) { + arg = ref4[argIndex]; + if (argIndex) { + compiledArgs.push(this.makeCode(", ")); + } + compiledArgs.push.apply(compiledArgs, arg.compileToFragments(o, LEVEL_LIST)); + } + fragments = []; + if (this instanceof SuperCall) { + preface = this.superReference(o) + (".call(" + (this.superThis(o))); + if (compiledArgs.length) { + preface += ", "; + } + fragments.push(this.makeCode(preface)); + } else { + if (this.isNew) { + fragments.push(this.makeCode('new ')); + } + fragments.push.apply(fragments, this.variable.compileToFragments(o, LEVEL_ACCESS)); + fragments.push(this.makeCode("(")); + } + fragments.push.apply(fragments, compiledArgs); + fragments.push(this.makeCode(")")); + return fragments; + }; + + Call.prototype.compileSplat = function(o, splatArgs) { + var answer, base, fun, idt, name, ref; + if (this instanceof SuperCall) { + return [].concat(this.makeCode((this.superReference(o)) + ".apply(" + (this.superThis(o)) + ", "), splatArgs, this.makeCode(")")); + } + if (this.isNew) { + idt = this.tab + TAB; + return [].concat(this.makeCode("(function(func, args, ctor) {\n" + idt + "ctor.prototype = func.prototype;\n" + idt + "var child = new ctor, result = func.apply(child, args);\n" + idt + "return Object(result) === result ? result : child;\n" + this.tab + "})("), this.variable.compileToFragments(o, LEVEL_LIST), this.makeCode(", "), splatArgs, this.makeCode(", function(){})")); + } + answer = []; + base = new Value(this.variable); + if ((name = base.properties.pop()) && base.isComplex()) { + ref = o.scope.freeVariable('ref'); + answer = answer.concat(this.makeCode("(" + ref + " = "), base.compileToFragments(o, LEVEL_LIST), this.makeCode(")"), name.compileToFragments(o)); + } else { + fun = base.compileToFragments(o, LEVEL_ACCESS); + if (SIMPLENUM.test(fragmentsToText(fun))) { + fun = this.wrapInBraces(fun); + } + if (name) { + ref = fragmentsToText(fun); + fun.push.apply(fun, name.compileToFragments(o)); + } else { + ref = 'null'; + } + answer = answer.concat(fun); + } + return answer = answer.concat(this.makeCode(".apply(" + ref + ", "), splatArgs, this.makeCode(")")); + }; + + return Call; + + })(Base); + + exports.SuperCall = SuperCall = (function(superClass1) { + extend1(SuperCall, superClass1); + + function SuperCall(args) { + SuperCall.__super__.constructor.call(this, null, args != null ? args : [new Splat(new IdentifierLiteral('arguments'))]); + this.isBare = args != null; + } + + SuperCall.prototype.superReference = function(o) { + var accesses, base, bref, klass, method, name, nref, variable; + method = o.scope.namedMethod(); + if (method != null ? method.klass : void 0) { + klass = method.klass, name = method.name, variable = method.variable; + if (klass.isComplex()) { + bref = new IdentifierLiteral(o.scope.parent.freeVariable('base')); + base = new Value(new Parens(new Assign(bref, klass))); + variable.base = base; + variable.properties.splice(0, klass.properties.length); + } + if (name.isComplex() || (name instanceof Index && name.index.isAssignable())) { + nref = new IdentifierLiteral(o.scope.parent.freeVariable('name')); + name = new Index(new Assign(nref, name.index)); + variable.properties.pop(); + variable.properties.push(name); + } + accesses = [new Access(new PropertyName('__super__'))]; + if (method["static"]) { + accesses.push(new Access(new PropertyName('constructor'))); + } + accesses.push(nref != null ? new Index(nref) : name); + return (new Value(bref != null ? bref : klass, accesses)).compile(o); + } else if (method != null ? method.ctor : void 0) { + return method.name + ".__super__.constructor"; + } else { + return this.error('cannot call super outside of an instance method.'); + } + }; + + SuperCall.prototype.superThis = function(o) { + var method; + method = o.scope.method; + return (method && !method.klass && method.context) || "this"; + }; + + return SuperCall; + + })(Call); + + exports.RegexWithInterpolations = RegexWithInterpolations = (function(superClass1) { + extend1(RegexWithInterpolations, superClass1); + + function RegexWithInterpolations(args) { + if (args == null) { + args = []; + } + RegexWithInterpolations.__super__.constructor.call(this, new Value(new IdentifierLiteral('RegExp')), args, false); + } + + return RegexWithInterpolations; + + })(Call); + + exports.TaggedTemplateCall = TaggedTemplateCall = (function(superClass1) { + extend1(TaggedTemplateCall, superClass1); + + function TaggedTemplateCall(variable, arg, soak) { + if (arg instanceof StringLiteral) { + arg = new StringWithInterpolations(Block.wrap([new Value(arg)])); + } + TaggedTemplateCall.__super__.constructor.call(this, variable, [arg], soak); + } + + TaggedTemplateCall.prototype.compileNode = function(o) { + o.inTaggedTemplateCall = true; + return this.variable.compileToFragments(o, LEVEL_ACCESS).concat(this.args[0].compileToFragments(o, LEVEL_LIST)); + }; + + return TaggedTemplateCall; + + })(Call); + + exports.Extends = Extends = (function(superClass1) { + extend1(Extends, superClass1); + + function Extends(child1, parent1) { + this.child = child1; + this.parent = parent1; + } + + Extends.prototype.children = ['child', 'parent']; + + Extends.prototype.compileToFragments = function(o) { + return new Call(new Value(new Literal(utility('extend', o))), [this.child, this.parent]).compileToFragments(o); + }; + + return Extends; + + })(Base); + + exports.Access = Access = (function(superClass1) { + extend1(Access, superClass1); + + function Access(name1, tag) { + this.name = name1; + this.soak = tag === 'soak'; + } + + Access.prototype.children = ['name']; + + Access.prototype.compileToFragments = function(o) { + var name, node, ref3; + name = this.name.compileToFragments(o); + node = this.name.unwrap(); + if (node instanceof PropertyName) { + if (ref3 = node.value, indexOf.call(JS_FORBIDDEN, ref3) >= 0) { + return [this.makeCode('["')].concat(slice.call(name), [this.makeCode('"]')]); + } else { + return [this.makeCode('.')].concat(slice.call(name)); + } + } else { + return [this.makeCode('[')].concat(slice.call(name), [this.makeCode(']')]); + } + }; + + Access.prototype.isComplex = NO; + + return Access; + + })(Base); + + exports.Index = Index = (function(superClass1) { + extend1(Index, superClass1); + + function Index(index1) { + this.index = index1; + } + + Index.prototype.children = ['index']; + + Index.prototype.compileToFragments = function(o) { + return [].concat(this.makeCode("["), this.index.compileToFragments(o, LEVEL_PAREN), this.makeCode("]")); + }; + + Index.prototype.isComplex = function() { + return this.index.isComplex(); + }; + + return Index; + + })(Base); + + exports.Range = Range = (function(superClass1) { + extend1(Range, superClass1); + + Range.prototype.children = ['from', 'to']; + + function Range(from1, to1, tag) { + this.from = from1; + this.to = to1; + this.exclusive = tag === 'exclusive'; + this.equals = this.exclusive ? '' : '='; + } + + Range.prototype.compileVariables = function(o) { + var isComplex, ref3, ref4, ref5, step; + o = merge(o, { + top: true + }); + isComplex = del(o, 'isComplex'); + ref3 = this.cacheToCodeFragments(this.from.cache(o, LEVEL_LIST, isComplex)), this.fromC = ref3[0], this.fromVar = ref3[1]; + ref4 = this.cacheToCodeFragments(this.to.cache(o, LEVEL_LIST, isComplex)), this.toC = ref4[0], this.toVar = ref4[1]; + if (step = del(o, 'step')) { + ref5 = this.cacheToCodeFragments(step.cache(o, LEVEL_LIST, isComplex)), this.step = ref5[0], this.stepVar = ref5[1]; + } + this.fromNum = this.from.isNumber() ? Number(this.fromVar) : null; + this.toNum = this.to.isNumber() ? Number(this.toVar) : null; + return this.stepNum = (step != null ? step.isNumber() : void 0) ? Number(this.stepVar) : null; + }; + + Range.prototype.compileNode = function(o) { + var cond, condPart, from, gt, idx, idxName, known, lt, namedIndex, ref3, ref4, stepPart, to, varPart; + if (!this.fromVar) { + this.compileVariables(o); + } + if (!o.index) { + return this.compileArray(o); + } + known = (this.fromNum != null) && (this.toNum != null); + idx = del(o, 'index'); + idxName = del(o, 'name'); + namedIndex = idxName && idxName !== idx; + varPart = idx + " = " + this.fromC; + if (this.toC !== this.toVar) { + varPart += ", " + this.toC; + } + if (this.step !== this.stepVar) { + varPart += ", " + this.step; + } + ref3 = [idx + " <" + this.equals, idx + " >" + this.equals], lt = ref3[0], gt = ref3[1]; + condPart = this.stepNum != null ? this.stepNum > 0 ? lt + " " + this.toVar : gt + " " + this.toVar : known ? ((ref4 = [this.fromNum, this.toNum], from = ref4[0], to = ref4[1], ref4), from <= to ? lt + " " + to : gt + " " + to) : (cond = this.stepVar ? this.stepVar + " > 0" : this.fromVar + " <= " + this.toVar, cond + " ? " + lt + " " + this.toVar + " : " + gt + " " + this.toVar); + stepPart = this.stepVar ? idx + " += " + this.stepVar : known ? namedIndex ? from <= to ? "++" + idx : "--" + idx : from <= to ? idx + "++" : idx + "--" : namedIndex ? cond + " ? ++" + idx + " : --" + idx : cond + " ? " + idx + "++ : " + idx + "--"; + if (namedIndex) { + varPart = idxName + " = " + varPart; + } + if (namedIndex) { + stepPart = idxName + " = " + stepPart; + } + return [this.makeCode(varPart + "; " + condPart + "; " + stepPart)]; + }; + + Range.prototype.compileArray = function(o) { + var args, body, cond, hasArgs, i, idt, j, known, post, pre, range, ref3, ref4, result, results, vars; + known = (this.fromNum != null) && (this.toNum != null); + if (known && Math.abs(this.fromNum - this.toNum) <= 20) { + range = (function() { + results = []; + for (var j = ref3 = this.fromNum, ref4 = this.toNum; ref3 <= ref4 ? j <= ref4 : j >= ref4; ref3 <= ref4 ? j++ : j--){ results.push(j); } + return results; + }).apply(this); + if (this.exclusive) { + range.pop(); + } + return [this.makeCode("[" + (range.join(', ')) + "]")]; + } + idt = this.tab + TAB; + i = o.scope.freeVariable('i', { + single: true + }); + result = o.scope.freeVariable('results'); + pre = "\n" + idt + result + " = [];"; + if (known) { + o.index = i; + body = fragmentsToText(this.compileNode(o)); + } else { + vars = (i + " = " + this.fromC) + (this.toC !== this.toVar ? ", " + this.toC : ''); + cond = this.fromVar + " <= " + this.toVar; + body = "var " + vars + "; " + cond + " ? " + i + " <" + this.equals + " " + this.toVar + " : " + i + " >" + this.equals + " " + this.toVar + "; " + cond + " ? " + i + "++ : " + i + "--"; + } + post = "{ " + result + ".push(" + i + "); }\n" + idt + "return " + result + ";\n" + o.indent; + hasArgs = function(node) { + return node != null ? node.contains(isLiteralArguments) : void 0; + }; + if (hasArgs(this.from) || hasArgs(this.to)) { + args = ', arguments'; + } + return [this.makeCode("(function() {" + pre + "\n" + idt + "for (" + body + ")" + post + "}).apply(this" + (args != null ? args : '') + ")")]; + }; + + return Range; + + })(Base); + + exports.Slice = Slice = (function(superClass1) { + extend1(Slice, superClass1); + + Slice.prototype.children = ['range']; + + function Slice(range1) { + this.range = range1; + Slice.__super__.constructor.call(this); + } + + Slice.prototype.compileNode = function(o) { + var compiled, compiledText, from, fromCompiled, ref3, to, toStr; + ref3 = this.range, to = ref3.to, from = ref3.from; + fromCompiled = from && from.compileToFragments(o, LEVEL_PAREN) || [this.makeCode('0')]; + if (to) { + compiled = to.compileToFragments(o, LEVEL_PAREN); + compiledText = fragmentsToText(compiled); + if (!(!this.range.exclusive && +compiledText === -1)) { + toStr = ', ' + (this.range.exclusive ? compiledText : to.isNumber() ? "" + (+compiledText + 1) : (compiled = to.compileToFragments(o, LEVEL_ACCESS), "+" + (fragmentsToText(compiled)) + " + 1 || 9e9")); + } + } + return [this.makeCode(".slice(" + (fragmentsToText(fromCompiled)) + (toStr || '') + ")")]; + }; + + return Slice; + + })(Base); + + exports.Obj = Obj = (function(superClass1) { + extend1(Obj, superClass1); + + function Obj(props, generated) { + this.generated = generated != null ? generated : false; + this.objects = this.properties = props || []; + } + + Obj.prototype.children = ['properties']; + + Obj.prototype.compileNode = function(o) { + var answer, dynamicIndex, hasDynamic, i, idt, indent, j, join, k, key, l, lastNoncom, len1, len2, len3, node, oref, prop, props, ref3, value; + props = this.properties; + if (this.generated) { + for (j = 0, len1 = props.length; j < len1; j++) { + node = props[j]; + if (node instanceof Value) { + node.error('cannot have an implicit value in an implicit object'); + } + } + } + for (dynamicIndex = k = 0, len2 = props.length; k < len2; dynamicIndex = ++k) { + prop = props[dynamicIndex]; + if ((prop.variable || prop).base instanceof Parens) { + break; + } + } + hasDynamic = dynamicIndex < props.length; + idt = o.indent += TAB; + lastNoncom = this.lastNonComment(this.properties); + answer = []; + if (hasDynamic) { + oref = o.scope.freeVariable('obj'); + answer.push(this.makeCode("(\n" + idt + oref + " = ")); + } + answer.push(this.makeCode("{" + (props.length === 0 || dynamicIndex === 0 ? '}' : '\n'))); + for (i = l = 0, len3 = props.length; l < len3; i = ++l) { + prop = props[i]; + if (i === dynamicIndex) { + if (i !== 0) { + answer.push(this.makeCode("\n" + idt + "}")); + } + answer.push(this.makeCode(',\n')); + } + join = i === props.length - 1 || i === dynamicIndex - 1 ? '' : prop === lastNoncom || prop instanceof Comment ? '\n' : ',\n'; + indent = prop instanceof Comment ? '' : idt; + if (hasDynamic && i < dynamicIndex) { + indent += TAB; + } + if (prop instanceof Assign) { + if (prop.context !== 'object') { + prop.operatorToken.error("unexpected " + prop.operatorToken.value); + } + if (prop.variable instanceof Value && prop.variable.hasProperties()) { + prop.variable.error('invalid object key'); + } + } + if (prop instanceof Value && prop["this"]) { + prop = new Assign(prop.properties[0].name, prop, 'object'); + } + if (!(prop instanceof Comment)) { + if (i < dynamicIndex) { + if (!(prop instanceof Assign)) { + prop = new Assign(prop, prop, 'object'); + } + } else { + if (prop instanceof Assign) { + key = prop.variable; + value = prop.value; + } else { + ref3 = prop.base.cache(o), key = ref3[0], value = ref3[1]; + if (key instanceof IdentifierLiteral) { + key = new PropertyName(key.value); + } + } + prop = new Assign(new Value(new IdentifierLiteral(oref), [new Access(key)]), value); + } + } + if (indent) { + answer.push(this.makeCode(indent)); + } + answer.push.apply(answer, prop.compileToFragments(o, LEVEL_TOP)); + if (join) { + answer.push(this.makeCode(join)); + } + } + if (hasDynamic) { + answer.push(this.makeCode(",\n" + idt + oref + "\n" + this.tab + ")")); + } else { + if (props.length !== 0) { + answer.push(this.makeCode("\n" + this.tab + "}")); + } + } + if (this.front && !hasDynamic) { + return this.wrapInBraces(answer); + } else { + return answer; + } + }; + + Obj.prototype.assigns = function(name) { + var j, len1, prop, ref3; + ref3 = this.properties; + for (j = 0, len1 = ref3.length; j < len1; j++) { + prop = ref3[j]; + if (prop.assigns(name)) { + return true; + } + } + return false; + }; + + return Obj; + + })(Base); + + exports.Arr = Arr = (function(superClass1) { + extend1(Arr, superClass1); + + function Arr(objs) { + this.objects = objs || []; + } + + Arr.prototype.children = ['objects']; + + Arr.prototype.compileNode = function(o) { + var answer, compiledObjs, fragments, index, j, len1, obj; + if (!this.objects.length) { + return [this.makeCode('[]')]; + } + o.indent += TAB; + answer = Splat.compileSplattedArray(o, this.objects); + if (answer.length) { + return answer; + } + answer = []; + compiledObjs = (function() { + var j, len1, ref3, results; + ref3 = this.objects; + results = []; + for (j = 0, len1 = ref3.length; j < len1; j++) { + obj = ref3[j]; + results.push(obj.compileToFragments(o, LEVEL_LIST)); + } + return results; + }).call(this); + for (index = j = 0, len1 = compiledObjs.length; j < len1; index = ++j) { + fragments = compiledObjs[index]; + if (index) { + answer.push(this.makeCode(", ")); + } + answer.push.apply(answer, fragments); + } + if (fragmentsToText(answer).indexOf('\n') >= 0) { + answer.unshift(this.makeCode("[\n" + o.indent)); + answer.push(this.makeCode("\n" + this.tab + "]")); + } else { + answer.unshift(this.makeCode("[")); + answer.push(this.makeCode("]")); + } + return answer; + }; + + Arr.prototype.assigns = function(name) { + var j, len1, obj, ref3; + ref3 = this.objects; + for (j = 0, len1 = ref3.length; j < len1; j++) { + obj = ref3[j]; + if (obj.assigns(name)) { + return true; + } + } + return false; + }; + + return Arr; + + })(Base); + + exports.Class = Class = (function(superClass1) { + extend1(Class, superClass1); + + function Class(variable1, parent1, body1) { + this.variable = variable1; + this.parent = parent1; + this.body = body1 != null ? body1 : new Block; + this.boundFuncs = []; + this.body.classBody = true; + } + + Class.prototype.children = ['variable', 'parent', 'body']; + + Class.prototype.defaultClassVariableName = '_Class'; + + Class.prototype.determineName = function() { + var message, name, node, ref3, tail; + if (!this.variable) { + return this.defaultClassVariableName; + } + ref3 = this.variable.properties, tail = ref3[ref3.length - 1]; + node = tail ? tail instanceof Access && tail.name : this.variable.base; + if (!(node instanceof IdentifierLiteral || node instanceof PropertyName)) { + return this.defaultClassVariableName; + } + name = node.value; + if (!tail) { + message = isUnassignable(name); + if (message) { + this.variable.error(message); + } + } + if (indexOf.call(JS_FORBIDDEN, name) >= 0) { + return "_" + name; + } else { + return name; + } + }; + + Class.prototype.setContext = function(name) { + return this.body.traverseChildren(false, function(node) { + if (node.classBody) { + return false; + } + if (node instanceof ThisLiteral) { + return node.value = name; + } else if (node instanceof Code) { + if (node.bound) { + return node.context = name; + } + } + }); + }; + + Class.prototype.addBoundFunctions = function(o) { + var bvar, j, len1, lhs, ref3; + ref3 = this.boundFuncs; + for (j = 0, len1 = ref3.length; j < len1; j++) { + bvar = ref3[j]; + lhs = (new Value(new ThisLiteral, [new Access(bvar)])).compile(o); + this.ctor.body.unshift(new Literal(lhs + " = " + (utility('bind', o)) + "(" + lhs + ", this)")); + } + }; + + Class.prototype.addProperties = function(node, name, o) { + var acc, assign, base, exprs, func, props; + props = node.base.properties.slice(0); + exprs = (function() { + var results; + results = []; + while (assign = props.shift()) { + if (assign instanceof Assign) { + base = assign.variable.base; + delete assign.context; + func = assign.value; + if (base.value === 'constructor') { + if (this.ctor) { + assign.error('cannot define more than one constructor in a class'); + } + if (func.bound) { + assign.error('cannot define a constructor as a bound function'); + } + if (func instanceof Code) { + assign = this.ctor = func; + } else { + this.externalCtor = o.classScope.freeVariable('ctor'); + assign = new Assign(new IdentifierLiteral(this.externalCtor), func); + } + } else { + if (assign.variable["this"]) { + func["static"] = true; + } else { + acc = base.isComplex() ? new Index(base) : new Access(base); + assign.variable = new Value(new IdentifierLiteral(name), [new Access(new PropertyName('prototype')), acc]); + if (func instanceof Code && func.bound) { + this.boundFuncs.push(base); + func.bound = false; + } + } + } + } + results.push(assign); + } + return results; + }).call(this); + return compact(exprs); + }; + + Class.prototype.walkBody = function(name, o) { + return this.traverseChildren(false, (function(_this) { + return function(child) { + var cont, exps, i, j, len1, node, ref3; + cont = true; + if (child instanceof Class) { + return false; + } + if (child instanceof Block) { + ref3 = exps = child.expressions; + for (i = j = 0, len1 = ref3.length; j < len1; i = ++j) { + node = ref3[i]; + if (node instanceof Assign && node.variable.looksStatic(name)) { + node.value["static"] = true; + } else if (node instanceof Value && node.isObject(true)) { + cont = false; + exps[i] = _this.addProperties(node, name, o); + } + } + child.expressions = exps = flatten(exps); + } + return cont && !(child instanceof Class); + }; + })(this)); + }; + + Class.prototype.hoistDirectivePrologue = function() { + var expressions, index, node; + index = 0; + expressions = this.body.expressions; + while ((node = expressions[index]) && node instanceof Comment || node instanceof Value && node.isString()) { + ++index; + } + return this.directives = expressions.splice(0, index); + }; + + Class.prototype.ensureConstructor = function(name) { + if (!this.ctor) { + this.ctor = new Code; + if (this.externalCtor) { + this.ctor.body.push(new Literal(this.externalCtor + ".apply(this, arguments)")); + } else if (this.parent) { + this.ctor.body.push(new Literal(name + ".__super__.constructor.apply(this, arguments)")); + } + this.ctor.body.makeReturn(); + this.body.expressions.unshift(this.ctor); + } + this.ctor.ctor = this.ctor.name = name; + this.ctor.klass = null; + return this.ctor.noReturn = true; + }; + + Class.prototype.compileNode = function(o) { + var args, argumentsNode, func, jumpNode, klass, lname, name, ref3, superClass; + if (jumpNode = this.body.jumps()) { + jumpNode.error('Class bodies cannot contain pure statements'); + } + if (argumentsNode = this.body.contains(isLiteralArguments)) { + argumentsNode.error("Class bodies shouldn't reference arguments"); + } + name = this.determineName(); + lname = new IdentifierLiteral(name); + func = new Code([], Block.wrap([this.body])); + args = []; + o.classScope = func.makeScope(o.scope); + this.hoistDirectivePrologue(); + this.setContext(name); + this.walkBody(name, o); + this.ensureConstructor(name); + this.addBoundFunctions(o); + this.body.spaced = true; + this.body.expressions.push(lname); + if (this.parent) { + superClass = new IdentifierLiteral(o.classScope.freeVariable('superClass', { + reserve: false + })); + this.body.expressions.unshift(new Extends(lname, superClass)); + func.params.push(new Param(superClass)); + args.push(this.parent); + } + (ref3 = this.body.expressions).unshift.apply(ref3, this.directives); + klass = new Parens(new Call(func, args)); + if (this.variable) { + klass = new Assign(this.variable, klass, null, { + moduleDeclaration: this.moduleDeclaration + }); + } + return klass.compileToFragments(o); + }; + + return Class; + + })(Base); + + exports.ModuleDeclaration = ModuleDeclaration = (function(superClass1) { + extend1(ModuleDeclaration, superClass1); + + function ModuleDeclaration(clause, source1) { + this.clause = clause; + this.source = source1; + this.checkSource(); + } + + ModuleDeclaration.prototype.children = ['clause', 'source']; + + ModuleDeclaration.prototype.isStatement = YES; + + ModuleDeclaration.prototype.jumps = THIS; + + ModuleDeclaration.prototype.makeReturn = THIS; + + ModuleDeclaration.prototype.checkSource = function() { + if ((this.source != null) && this.source instanceof StringWithInterpolations) { + return this.source.error('the name of the module to be imported from must be an uninterpolated string'); + } + }; + + ModuleDeclaration.prototype.checkScope = function(o, moduleDeclarationType) { + if (o.indent.length !== 0) { + return this.error(moduleDeclarationType + " statements must be at top-level scope"); + } + }; + + return ModuleDeclaration; + + })(Base); + + exports.ImportDeclaration = ImportDeclaration = (function(superClass1) { + extend1(ImportDeclaration, superClass1); + + function ImportDeclaration() { + return ImportDeclaration.__super__.constructor.apply(this, arguments); + } + + ImportDeclaration.prototype.compileNode = function(o) { + var code, ref3; + this.checkScope(o, 'import'); + o.importedSymbols = []; + code = []; + code.push(this.makeCode(this.tab + "import ")); + if (this.clause != null) { + code.push.apply(code, this.clause.compileNode(o)); + } + if (((ref3 = this.source) != null ? ref3.value : void 0) != null) { + if (this.clause !== null) { + code.push(this.makeCode(' from ')); + } + code.push(this.makeCode(this.source.value)); + } + code.push(this.makeCode(';')); + return code; + }; + + return ImportDeclaration; + + })(ModuleDeclaration); + + exports.ImportClause = ImportClause = (function(superClass1) { + extend1(ImportClause, superClass1); + + function ImportClause(defaultBinding, namedImports) { + this.defaultBinding = defaultBinding; + this.namedImports = namedImports; + } + + ImportClause.prototype.children = ['defaultBinding', 'namedImports']; + + ImportClause.prototype.compileNode = function(o) { + var code; + code = []; + if (this.defaultBinding != null) { + code.push.apply(code, this.defaultBinding.compileNode(o)); + if (this.namedImports != null) { + code.push(this.makeCode(', ')); + } + } + if (this.namedImports != null) { + code.push.apply(code, this.namedImports.compileNode(o)); + } + return code; + }; + + return ImportClause; + + })(Base); + + exports.ExportDeclaration = ExportDeclaration = (function(superClass1) { + extend1(ExportDeclaration, superClass1); + + function ExportDeclaration() { + return ExportDeclaration.__super__.constructor.apply(this, arguments); + } + + ExportDeclaration.prototype.compileNode = function(o) { + var code, ref3; + this.checkScope(o, 'export'); + code = []; + code.push(this.makeCode(this.tab + "export ")); + if (this instanceof ExportDefaultDeclaration) { + code.push(this.makeCode('default ')); + } + if (!(this instanceof ExportDefaultDeclaration) && (this.clause instanceof Assign || this.clause instanceof Class)) { + if (this.clause instanceof Class && !this.clause.variable) { + this.clause.error('anonymous classes cannot be exported'); + } + code.push(this.makeCode('var ')); + this.clause.moduleDeclaration = 'export'; + } + if ((this.clause.body != null) && this.clause.body instanceof Block) { + code = code.concat(this.clause.compileToFragments(o, LEVEL_TOP)); + } else { + code = code.concat(this.clause.compileNode(o)); + } + if (((ref3 = this.source) != null ? ref3.value : void 0) != null) { + code.push(this.makeCode(" from " + this.source.value)); + } + code.push(this.makeCode(';')); + return code; + }; + + return ExportDeclaration; + + })(ModuleDeclaration); + + exports.ExportNamedDeclaration = ExportNamedDeclaration = (function(superClass1) { + extend1(ExportNamedDeclaration, superClass1); + + function ExportNamedDeclaration() { + return ExportNamedDeclaration.__super__.constructor.apply(this, arguments); + } + + return ExportNamedDeclaration; + + })(ExportDeclaration); + + exports.ExportDefaultDeclaration = ExportDefaultDeclaration = (function(superClass1) { + extend1(ExportDefaultDeclaration, superClass1); + + function ExportDefaultDeclaration() { + return ExportDefaultDeclaration.__super__.constructor.apply(this, arguments); + } + + return ExportDefaultDeclaration; + + })(ExportDeclaration); + + exports.ExportAllDeclaration = ExportAllDeclaration = (function(superClass1) { + extend1(ExportAllDeclaration, superClass1); + + function ExportAllDeclaration() { + return ExportAllDeclaration.__super__.constructor.apply(this, arguments); + } + + return ExportAllDeclaration; + + })(ExportDeclaration); + + exports.ModuleSpecifierList = ModuleSpecifierList = (function(superClass1) { + extend1(ModuleSpecifierList, superClass1); + + function ModuleSpecifierList(specifiers) { + this.specifiers = specifiers; + } + + ModuleSpecifierList.prototype.children = ['specifiers']; + + ModuleSpecifierList.prototype.compileNode = function(o) { + var code, compiledList, fragments, index, j, len1, specifier; + code = []; + o.indent += TAB; + compiledList = (function() { + var j, len1, ref3, results; + ref3 = this.specifiers; + results = []; + for (j = 0, len1 = ref3.length; j < len1; j++) { + specifier = ref3[j]; + results.push(specifier.compileToFragments(o, LEVEL_LIST)); + } + return results; + }).call(this); + if (this.specifiers.length !== 0) { + code.push(this.makeCode("{\n" + o.indent)); + for (index = j = 0, len1 = compiledList.length; j < len1; index = ++j) { + fragments = compiledList[index]; + if (index) { + code.push(this.makeCode(",\n" + o.indent)); + } + code.push.apply(code, fragments); + } + code.push(this.makeCode("\n}")); + } else { + code.push(this.makeCode('{}')); + } + return code; + }; + + return ModuleSpecifierList; + + })(Base); + + exports.ImportSpecifierList = ImportSpecifierList = (function(superClass1) { + extend1(ImportSpecifierList, superClass1); + + function ImportSpecifierList() { + return ImportSpecifierList.__super__.constructor.apply(this, arguments); + } + + return ImportSpecifierList; + + })(ModuleSpecifierList); + + exports.ExportSpecifierList = ExportSpecifierList = (function(superClass1) { + extend1(ExportSpecifierList, superClass1); + + function ExportSpecifierList() { + return ExportSpecifierList.__super__.constructor.apply(this, arguments); + } + + return ExportSpecifierList; + + })(ModuleSpecifierList); + + exports.ModuleSpecifier = ModuleSpecifier = (function(superClass1) { + extend1(ModuleSpecifier, superClass1); + + function ModuleSpecifier(original, alias, moduleDeclarationType1) { + this.original = original; + this.alias = alias; + this.moduleDeclarationType = moduleDeclarationType1; + this.identifier = this.alias != null ? this.alias.value : this.original.value; + } + + ModuleSpecifier.prototype.children = ['original', 'alias']; + + ModuleSpecifier.prototype.compileNode = function(o) { + var code; + o.scope.find(this.identifier, this.moduleDeclarationType); + code = []; + code.push(this.makeCode(this.original.value)); + if (this.alias != null) { + code.push(this.makeCode(" as " + this.alias.value)); + } + return code; + }; + + return ModuleSpecifier; + + })(Base); + + exports.ImportSpecifier = ImportSpecifier = (function(superClass1) { + extend1(ImportSpecifier, superClass1); + + function ImportSpecifier(imported, local) { + ImportSpecifier.__super__.constructor.call(this, imported, local, 'import'); + } + + ImportSpecifier.prototype.compileNode = function(o) { + var ref3; + if ((ref3 = this.identifier, indexOf.call(o.importedSymbols, ref3) >= 0) || o.scope.check(this.identifier)) { + this.error("'" + this.identifier + "' has already been declared"); + } else { + o.importedSymbols.push(this.identifier); + } + return ImportSpecifier.__super__.compileNode.call(this, o); + }; + + return ImportSpecifier; + + })(ModuleSpecifier); + + exports.ImportDefaultSpecifier = ImportDefaultSpecifier = (function(superClass1) { + extend1(ImportDefaultSpecifier, superClass1); + + function ImportDefaultSpecifier() { + return ImportDefaultSpecifier.__super__.constructor.apply(this, arguments); + } + + return ImportDefaultSpecifier; + + })(ImportSpecifier); + + exports.ImportNamespaceSpecifier = ImportNamespaceSpecifier = (function(superClass1) { + extend1(ImportNamespaceSpecifier, superClass1); + + function ImportNamespaceSpecifier() { + return ImportNamespaceSpecifier.__super__.constructor.apply(this, arguments); + } + + return ImportNamespaceSpecifier; + + })(ImportSpecifier); + + exports.ExportSpecifier = ExportSpecifier = (function(superClass1) { + extend1(ExportSpecifier, superClass1); + + function ExportSpecifier(local, exported) { + ExportSpecifier.__super__.constructor.call(this, local, exported, 'export'); + } + + return ExportSpecifier; + + })(ModuleSpecifier); + + exports.Assign = Assign = (function(superClass1) { + extend1(Assign, superClass1); + + function Assign(variable1, value1, context, options) { + this.variable = variable1; + this.value = value1; + this.context = context; + if (options == null) { + options = {}; + } + this.param = options.param, this.subpattern = options.subpattern, this.operatorToken = options.operatorToken, this.moduleDeclaration = options.moduleDeclaration; + } + + Assign.prototype.children = ['variable', 'value']; + + Assign.prototype.isStatement = function(o) { + return (o != null ? o.level : void 0) === LEVEL_TOP && (this.context != null) && (this.moduleDeclaration || indexOf.call(this.context, "?") >= 0); + }; + + Assign.prototype.checkAssignability = function(o, varBase) { + if (Object.prototype.hasOwnProperty.call(o.scope.positions, varBase.value) && o.scope.variables[o.scope.positions[varBase.value]].type === 'import') { + return varBase.error("'" + varBase.value + "' is read-only"); + } + }; + + Assign.prototype.assigns = function(name) { + return this[this.context === 'object' ? 'value' : 'variable'].assigns(name); + }; + + Assign.prototype.unfoldSoak = function(o) { + return unfoldSoak(o, this, 'variable'); + }; + + Assign.prototype.compileNode = function(o) { + var answer, compiledName, isValue, j, name, properties, prototype, ref3, ref4, ref5, ref6, ref7, ref8, val, varBase; + if (isValue = this.variable instanceof Value) { + if (this.variable.isArray() || this.variable.isObject()) { + return this.compilePatternMatch(o); + } + if (this.variable.isSplice()) { + return this.compileSplice(o); + } + if ((ref3 = this.context) === '||=' || ref3 === '&&=' || ref3 === '?=') { + return this.compileConditional(o); + } + if ((ref4 = this.context) === '**=' || ref4 === '//=' || ref4 === '%%=') { + return this.compileSpecialMath(o); + } + } + if (this.value instanceof Code) { + if (this.value["static"]) { + this.value.klass = this.variable.base; + this.value.name = this.variable.properties[0]; + this.value.variable = this.variable; + } else if (((ref5 = this.variable.properties) != null ? ref5.length : void 0) >= 2) { + ref6 = this.variable.properties, properties = 3 <= ref6.length ? slice.call(ref6, 0, j = ref6.length - 2) : (j = 0, []), prototype = ref6[j++], name = ref6[j++]; + if (((ref7 = prototype.name) != null ? ref7.value : void 0) === 'prototype') { + this.value.klass = new Value(this.variable.base, properties); + this.value.name = name; + this.value.variable = this.variable; + } + } + } + if (!this.context) { + varBase = this.variable.unwrapAll(); + if (!varBase.isAssignable()) { + this.variable.error("'" + (this.variable.compile(o)) + "' can't be assigned"); + } + if (!(typeof varBase.hasProperties === "function" ? varBase.hasProperties() : void 0)) { + if (this.moduleDeclaration) { + this.checkAssignability(o, varBase); + o.scope.add(varBase.value, this.moduleDeclaration); + } else if (this.param) { + o.scope.add(varBase.value, 'var'); + } else { + this.checkAssignability(o, varBase); + o.scope.find(varBase.value); + } + } + } + val = this.value.compileToFragments(o, LEVEL_LIST); + if (isValue && this.variable.base instanceof Obj) { + this.variable.front = true; + } + compiledName = this.variable.compileToFragments(o, LEVEL_LIST); + if (this.context === 'object') { + if (ref8 = fragmentsToText(compiledName), indexOf.call(JS_FORBIDDEN, ref8) >= 0) { + compiledName.unshift(this.makeCode('"')); + compiledName.push(this.makeCode('"')); + } + return compiledName.concat(this.makeCode(": "), val); + } + answer = compiledName.concat(this.makeCode(" " + (this.context || '=') + " "), val); + if (o.level <= LEVEL_LIST) { + return answer; + } else { + return this.wrapInBraces(answer); + } + }; + + Assign.prototype.compilePatternMatch = function(o) { + var acc, assigns, code, defaultValue, expandedIdx, fragments, i, idx, isObject, ivar, j, len1, message, name, obj, objects, olen, ref, ref3, ref4, ref5, ref6, rest, top, val, value, vvar, vvarText; + top = o.level === LEVEL_TOP; + value = this.value; + objects = this.variable.base.objects; + if (!(olen = objects.length)) { + code = value.compileToFragments(o); + if (o.level >= LEVEL_OP) { + return this.wrapInBraces(code); + } else { + return code; + } + } + obj = objects[0]; + if (olen === 1 && obj instanceof Expansion) { + obj.error('Destructuring assignment has no target'); + } + isObject = this.variable.isObject(); + if (top && olen === 1 && !(obj instanceof Splat)) { + defaultValue = null; + if (obj instanceof Assign && obj.context === 'object') { + ref3 = obj, (ref4 = ref3.variable, idx = ref4.base), obj = ref3.value; + if (obj instanceof Assign) { + defaultValue = obj.value; + obj = obj.variable; + } + } else { + if (obj instanceof Assign) { + defaultValue = obj.value; + obj = obj.variable; + } + idx = isObject ? obj["this"] ? obj.properties[0].name : new PropertyName(obj.unwrap().value) : new NumberLiteral(0); + } + acc = idx.unwrap() instanceof PropertyName; + value = new Value(value); + value.properties.push(new (acc ? Access : Index)(idx)); + message = isUnassignable(obj.unwrap().value); + if (message) { + obj.error(message); + } + if (defaultValue) { + value = new Op('?', value, defaultValue); + } + return new Assign(obj, value, null, { + param: this.param + }).compileToFragments(o, LEVEL_TOP); + } + vvar = value.compileToFragments(o, LEVEL_LIST); + vvarText = fragmentsToText(vvar); + assigns = []; + expandedIdx = false; + if (!(value.unwrap() instanceof IdentifierLiteral) || this.variable.assigns(vvarText)) { + assigns.push([this.makeCode((ref = o.scope.freeVariable('ref')) + " = ")].concat(slice.call(vvar))); + vvar = [this.makeCode(ref)]; + vvarText = ref; + } + for (i = j = 0, len1 = objects.length; j < len1; i = ++j) { + obj = objects[i]; + idx = i; + if (!expandedIdx && obj instanceof Splat) { + name = obj.name.unwrap().value; + obj = obj.unwrap(); + val = olen + " <= " + vvarText + ".length ? " + (utility('slice', o)) + ".call(" + vvarText + ", " + i; + if (rest = olen - i - 1) { + ivar = o.scope.freeVariable('i', { + single: true + }); + val += ", " + ivar + " = " + vvarText + ".length - " + rest + ") : (" + ivar + " = " + i + ", [])"; + } else { + val += ") : []"; + } + val = new Literal(val); + expandedIdx = ivar + "++"; + } else if (!expandedIdx && obj instanceof Expansion) { + if (rest = olen - i - 1) { + if (rest === 1) { + expandedIdx = vvarText + ".length - 1"; + } else { + ivar = o.scope.freeVariable('i', { + single: true + }); + val = new Literal(ivar + " = " + vvarText + ".length - " + rest); + expandedIdx = ivar + "++"; + assigns.push(val.compileToFragments(o, LEVEL_LIST)); + } + } + continue; + } else { + if (obj instanceof Splat || obj instanceof Expansion) { + obj.error("multiple splats/expansions are disallowed in an assignment"); + } + defaultValue = null; + if (obj instanceof Assign && obj.context === 'object') { + ref5 = obj, (ref6 = ref5.variable, idx = ref6.base), obj = ref5.value; + if (obj instanceof Assign) { + defaultValue = obj.value; + obj = obj.variable; + } + } else { + if (obj instanceof Assign) { + defaultValue = obj.value; + obj = obj.variable; + } + idx = isObject ? obj["this"] ? obj.properties[0].name : new PropertyName(obj.unwrap().value) : new Literal(expandedIdx || idx); + } + name = obj.unwrap().value; + acc = idx.unwrap() instanceof PropertyName; + val = new Value(new Literal(vvarText), [new (acc ? Access : Index)(idx)]); + if (defaultValue) { + val = new Op('?', val, defaultValue); + } + } + if (name != null) { + message = isUnassignable(name); + if (message) { + obj.error(message); + } + } + assigns.push(new Assign(obj, val, null, { + param: this.param, + subpattern: true + }).compileToFragments(o, LEVEL_LIST)); + } + if (!(top || this.subpattern)) { + assigns.push(vvar); + } + fragments = this.joinFragmentArrays(assigns, ', '); + if (o.level < LEVEL_LIST) { + return fragments; + } else { + return this.wrapInBraces(fragments); + } + }; + + Assign.prototype.compileConditional = function(o) { + var fragments, left, ref3, right; + ref3 = this.variable.cacheReference(o), left = ref3[0], right = ref3[1]; + if (!left.properties.length && left.base instanceof Literal && !(left.base instanceof ThisLiteral) && !o.scope.check(left.base.value)) { + this.variable.error("the variable \"" + left.base.value + "\" can't be assigned with " + this.context + " because it has not been declared before"); + } + if (indexOf.call(this.context, "?") >= 0) { + o.isExistentialEquals = true; + return new If(new Existence(left), right, { + type: 'if' + }).addElse(new Assign(right, this.value, '=')).compileToFragments(o); + } else { + fragments = new Op(this.context.slice(0, -1), left, new Assign(right, this.value, '=')).compileToFragments(o); + if (o.level <= LEVEL_LIST) { + return fragments; + } else { + return this.wrapInBraces(fragments); + } + } + }; + + Assign.prototype.compileSpecialMath = function(o) { + var left, ref3, right; + ref3 = this.variable.cacheReference(o), left = ref3[0], right = ref3[1]; + return new Assign(left, new Op(this.context.slice(0, -1), right, this.value)).compileToFragments(o); + }; + + Assign.prototype.compileSplice = function(o) { + var answer, exclusive, from, fromDecl, fromRef, name, ref3, ref4, ref5, to, valDef, valRef; + ref3 = this.variable.properties.pop().range, from = ref3.from, to = ref3.to, exclusive = ref3.exclusive; + name = this.variable.compile(o); + if (from) { + ref4 = this.cacheToCodeFragments(from.cache(o, LEVEL_OP)), fromDecl = ref4[0], fromRef = ref4[1]; + } else { + fromDecl = fromRef = '0'; + } + if (to) { + if ((from != null ? from.isNumber() : void 0) && to.isNumber()) { + to = to.compile(o) - fromRef; + if (!exclusive) { + to += 1; + } + } else { + to = to.compile(o, LEVEL_ACCESS) + ' - ' + fromRef; + if (!exclusive) { + to += ' + 1'; + } + } + } else { + to = "9e9"; + } + ref5 = this.value.cache(o, LEVEL_LIST), valDef = ref5[0], valRef = ref5[1]; + answer = [].concat(this.makeCode("[].splice.apply(" + name + ", [" + fromDecl + ", " + to + "].concat("), valDef, this.makeCode(")), "), valRef); + if (o.level > LEVEL_TOP) { + return this.wrapInBraces(answer); + } else { + return answer; + } + }; + + return Assign; + + })(Base); + + exports.Code = Code = (function(superClass1) { + extend1(Code, superClass1); + + function Code(params, body, tag) { + this.params = params || []; + this.body = body || new Block; + this.bound = tag === 'boundfunc'; + this.isGenerator = !!this.body.contains(function(node) { + return (node instanceof Op && node.isYield()) || node instanceof YieldReturn; + }); + } + + Code.prototype.children = ['params', 'body']; + + Code.prototype.isStatement = function() { + return !!this.ctor; + }; + + Code.prototype.jumps = NO; + + Code.prototype.makeScope = function(parentScope) { + return new Scope(parentScope, this.body, this); + }; + + Code.prototype.compileNode = function(o) { + var answer, boundfunc, code, exprs, i, j, k, l, len1, len2, len3, len4, len5, len6, lit, m, p, param, params, q, r, ref, ref3, ref4, ref5, ref6, ref7, ref8, splats, uniqs, val, wasEmpty, wrapper; + if (this.bound && ((ref3 = o.scope.method) != null ? ref3.bound : void 0)) { + this.context = o.scope.method.context; + } + if (this.bound && !this.context) { + this.context = '_this'; + wrapper = new Code([new Param(new IdentifierLiteral(this.context))], new Block([this])); + boundfunc = new Call(wrapper, [new ThisLiteral]); + boundfunc.updateLocationDataIfMissing(this.locationData); + return boundfunc.compileNode(o); + } + o.scope = del(o, 'classScope') || this.makeScope(o.scope); + o.scope.shared = del(o, 'sharedScope'); + o.indent += TAB; + delete o.bare; + delete o.isExistentialEquals; + params = []; + exprs = []; + ref4 = this.params; + for (j = 0, len1 = ref4.length; j < len1; j++) { + param = ref4[j]; + if (!(param instanceof Expansion)) { + o.scope.parameter(param.asReference(o)); + } + } + ref5 = this.params; + for (k = 0, len2 = ref5.length; k < len2; k++) { + param = ref5[k]; + if (!(param.splat || param instanceof Expansion)) { + continue; + } + ref6 = this.params; + for (l = 0, len3 = ref6.length; l < len3; l++) { + p = ref6[l]; + if (!(p instanceof Expansion) && p.name.value) { + o.scope.add(p.name.value, 'var', true); + } + } + splats = new Assign(new Value(new Arr((function() { + var len4, m, ref7, results; + ref7 = this.params; + results = []; + for (m = 0, len4 = ref7.length; m < len4; m++) { + p = ref7[m]; + results.push(p.asReference(o)); + } + return results; + }).call(this))), new Value(new IdentifierLiteral('arguments'))); + break; + } + ref7 = this.params; + for (m = 0, len4 = ref7.length; m < len4; m++) { + param = ref7[m]; + if (param.isComplex()) { + val = ref = param.asReference(o); + if (param.value) { + val = new Op('?', ref, param.value); + } + exprs.push(new Assign(new Value(param.name), val, '=', { + param: true + })); + } else { + ref = param; + if (param.value) { + lit = new Literal(ref.name.value + ' == null'); + val = new Assign(new Value(param.name), param.value, '='); + exprs.push(new If(lit, val)); + } + } + if (!splats) { + params.push(ref); + } + } + wasEmpty = this.body.isEmpty(); + if (splats) { + exprs.unshift(splats); + } + if (exprs.length) { + (ref8 = this.body.expressions).unshift.apply(ref8, exprs); + } + for (i = q = 0, len5 = params.length; q < len5; i = ++q) { + p = params[i]; + params[i] = p.compileToFragments(o); + o.scope.parameter(fragmentsToText(params[i])); + } + uniqs = []; + this.eachParamName(function(name, node) { + if (indexOf.call(uniqs, name) >= 0) { + node.error("multiple parameters named " + name); + } + return uniqs.push(name); + }); + if (!(wasEmpty || this.noReturn)) { + this.body.makeReturn(); + } + code = 'function'; + if (this.isGenerator) { + code += '*'; + } + if (this.ctor) { + code += ' ' + this.name; + } + code += '('; + answer = [this.makeCode(code)]; + for (i = r = 0, len6 = params.length; r < len6; i = ++r) { + p = params[i]; + if (i) { + answer.push(this.makeCode(", ")); + } + answer.push.apply(answer, p); + } + answer.push(this.makeCode(') {')); + if (!this.body.isEmpty()) { + answer = answer.concat(this.makeCode("\n"), this.body.compileWithDeclarations(o), this.makeCode("\n" + this.tab)); + } + answer.push(this.makeCode('}')); + if (this.ctor) { + return [this.makeCode(this.tab)].concat(slice.call(answer)); + } + if (this.front || (o.level >= LEVEL_ACCESS)) { + return this.wrapInBraces(answer); + } else { + return answer; + } + }; + + Code.prototype.eachParamName = function(iterator) { + var j, len1, param, ref3, results; + ref3 = this.params; + results = []; + for (j = 0, len1 = ref3.length; j < len1; j++) { + param = ref3[j]; + results.push(param.eachName(iterator)); + } + return results; + }; + + Code.prototype.traverseChildren = function(crossScope, func) { + if (crossScope) { + return Code.__super__.traverseChildren.call(this, crossScope, func); + } + }; + + return Code; + + })(Base); + + exports.Param = Param = (function(superClass1) { + extend1(Param, superClass1); + + function Param(name1, value1, splat) { + var message, token; + this.name = name1; + this.value = value1; + this.splat = splat; + message = isUnassignable(this.name.unwrapAll().value); + if (message) { + this.name.error(message); + } + if (this.name instanceof Obj && this.name.generated) { + token = this.name.objects[0].operatorToken; + token.error("unexpected " + token.value); + } + } + + Param.prototype.children = ['name', 'value']; + + Param.prototype.compileToFragments = function(o) { + return this.name.compileToFragments(o, LEVEL_LIST); + }; + + Param.prototype.asReference = function(o) { + var name, node; + if (this.reference) { + return this.reference; + } + node = this.name; + if (node["this"]) { + name = node.properties[0].name.value; + if (indexOf.call(JS_FORBIDDEN, name) >= 0) { + name = "_" + name; + } + node = new IdentifierLiteral(o.scope.freeVariable(name)); + } else if (node.isComplex()) { + node = new IdentifierLiteral(o.scope.freeVariable('arg')); + } + node = new Value(node); + if (this.splat) { + node = new Splat(node); + } + node.updateLocationDataIfMissing(this.locationData); + return this.reference = node; + }; + + Param.prototype.isComplex = function() { + return this.name.isComplex(); + }; + + Param.prototype.eachName = function(iterator, name) { + var atParam, j, len1, node, obj, ref3, ref4; + if (name == null) { + name = this.name; + } + atParam = function(obj) { + return iterator("@" + obj.properties[0].name.value, obj); + }; + if (name instanceof Literal) { + return iterator(name.value, name); + } + if (name instanceof Value) { + return atParam(name); + } + ref4 = (ref3 = name.objects) != null ? ref3 : []; + for (j = 0, len1 = ref4.length; j < len1; j++) { + obj = ref4[j]; + if (obj instanceof Assign && (obj.context == null)) { + obj = obj.variable; + } + if (obj instanceof Assign) { + if (obj.value instanceof Assign) { + obj = obj.value; + } + this.eachName(iterator, obj.value.unwrap()); + } else if (obj instanceof Splat) { + node = obj.name.unwrap(); + iterator(node.value, node); + } else if (obj instanceof Value) { + if (obj.isArray() || obj.isObject()) { + this.eachName(iterator, obj.base); + } else if (obj["this"]) { + atParam(obj); + } else { + iterator(obj.base.value, obj.base); + } + } else if (!(obj instanceof Expansion)) { + obj.error("illegal parameter " + (obj.compile())); + } + } + }; + + return Param; + + })(Base); + + exports.Splat = Splat = (function(superClass1) { + extend1(Splat, superClass1); + + Splat.prototype.children = ['name']; + + Splat.prototype.isAssignable = YES; + + function Splat(name) { + this.name = name.compile ? name : new Literal(name); + } + + Splat.prototype.assigns = function(name) { + return this.name.assigns(name); + }; + + Splat.prototype.compileToFragments = function(o) { + return this.name.compileToFragments(o); + }; + + Splat.prototype.unwrap = function() { + return this.name; + }; + + Splat.compileSplattedArray = function(o, list, apply) { + var args, base, compiledNode, concatPart, fragments, i, index, j, last, len1, node; + index = -1; + while ((node = list[++index]) && !(node instanceof Splat)) { + continue; + } + if (index >= list.length) { + return []; + } + if (list.length === 1) { + node = list[0]; + fragments = node.compileToFragments(o, LEVEL_LIST); + if (apply) { + return fragments; + } + return [].concat(node.makeCode((utility('slice', o)) + ".call("), fragments, node.makeCode(")")); + } + args = list.slice(index); + for (i = j = 0, len1 = args.length; j < len1; i = ++j) { + node = args[i]; + compiledNode = node.compileToFragments(o, LEVEL_LIST); + args[i] = node instanceof Splat ? [].concat(node.makeCode((utility('slice', o)) + ".call("), compiledNode, node.makeCode(")")) : [].concat(node.makeCode("["), compiledNode, node.makeCode("]")); + } + if (index === 0) { + node = list[0]; + concatPart = node.joinFragmentArrays(args.slice(1), ', '); + return args[0].concat(node.makeCode(".concat("), concatPart, node.makeCode(")")); + } + base = (function() { + var k, len2, ref3, results; + ref3 = list.slice(0, index); + results = []; + for (k = 0, len2 = ref3.length; k < len2; k++) { + node = ref3[k]; + results.push(node.compileToFragments(o, LEVEL_LIST)); + } + return results; + })(); + base = list[0].joinFragmentArrays(base, ', '); + concatPart = list[index].joinFragmentArrays(args, ', '); + last = list[list.length - 1]; + return [].concat(list[0].makeCode("["), base, list[index].makeCode("].concat("), concatPart, last.makeCode(")")); + }; + + return Splat; + + })(Base); + + exports.Expansion = Expansion = (function(superClass1) { + extend1(Expansion, superClass1); + + function Expansion() { + return Expansion.__super__.constructor.apply(this, arguments); + } + + Expansion.prototype.isComplex = NO; + + Expansion.prototype.compileNode = function(o) { + return this.error('Expansion must be used inside a destructuring assignment or parameter list'); + }; + + Expansion.prototype.asReference = function(o) { + return this; + }; + + Expansion.prototype.eachName = function(iterator) {}; + + return Expansion; + + })(Base); + + exports.While = While = (function(superClass1) { + extend1(While, superClass1); + + function While(condition, options) { + this.condition = (options != null ? options.invert : void 0) ? condition.invert() : condition; + this.guard = options != null ? options.guard : void 0; + } + + While.prototype.children = ['condition', 'guard', 'body']; + + While.prototype.isStatement = YES; + + While.prototype.makeReturn = function(res) { + if (res) { + return While.__super__.makeReturn.apply(this, arguments); + } else { + this.returns = !this.jumps({ + loop: true + }); + return this; + } + }; + + While.prototype.addBody = function(body1) { + this.body = body1; + return this; + }; + + While.prototype.jumps = function() { + var expressions, j, jumpNode, len1, node; + expressions = this.body.expressions; + if (!expressions.length) { + return false; + } + for (j = 0, len1 = expressions.length; j < len1; j++) { + node = expressions[j]; + if (jumpNode = node.jumps({ + loop: true + })) { + return jumpNode; + } + } + return false; + }; + + While.prototype.compileNode = function(o) { + var answer, body, rvar, set; + o.indent += TAB; + set = ''; + body = this.body; + if (body.isEmpty()) { + body = this.makeCode(''); + } else { + if (this.returns) { + body.makeReturn(rvar = o.scope.freeVariable('results')); + set = "" + this.tab + rvar + " = [];\n"; + } + if (this.guard) { + if (body.expressions.length > 1) { + body.expressions.unshift(new If((new Parens(this.guard)).invert(), new StatementLiteral("continue"))); + } else { + if (this.guard) { + body = Block.wrap([new If(this.guard, body)]); + } + } + } + body = [].concat(this.makeCode("\n"), body.compileToFragments(o, LEVEL_TOP), this.makeCode("\n" + this.tab)); + } + answer = [].concat(this.makeCode(set + this.tab + "while ("), this.condition.compileToFragments(o, LEVEL_PAREN), this.makeCode(") {"), body, this.makeCode("}")); + if (this.returns) { + answer.push(this.makeCode("\n" + this.tab + "return " + rvar + ";")); + } + return answer; + }; + + return While; + + })(Base); + + exports.Op = Op = (function(superClass1) { + var CONVERSIONS, INVERSIONS; + + extend1(Op, superClass1); + + function Op(op, first, second, flip) { + if (op === 'in') { + return new In(first, second); + } + if (op === 'do') { + return this.generateDo(first); + } + if (op === 'new') { + if (first instanceof Call && !first["do"] && !first.isNew) { + return first.newInstance(); + } + if (first instanceof Code && first.bound || first["do"]) { + first = new Parens(first); + } + } + this.operator = CONVERSIONS[op] || op; + this.first = first; + this.second = second; + this.flip = !!flip; + return this; + } + + CONVERSIONS = { + '==': '===', + '!=': '!==', + 'of': 'in', + 'yieldfrom': 'yield*' + }; + + INVERSIONS = { + '!==': '===', + '===': '!==' + }; + + Op.prototype.children = ['first', 'second']; + + Op.prototype.isNumber = function() { + var ref3; + return this.isUnary() && ((ref3 = this.operator) === '+' || ref3 === '-') && this.first instanceof Value && this.first.isNumber(); + }; + + Op.prototype.isYield = function() { + var ref3; + return (ref3 = this.operator) === 'yield' || ref3 === 'yield*'; + }; + + Op.prototype.isUnary = function() { + return !this.second; + }; + + Op.prototype.isComplex = function() { + return !this.isNumber(); + }; + + Op.prototype.isChainable = function() { + var ref3; + return (ref3 = this.operator) === '<' || ref3 === '>' || ref3 === '>=' || ref3 === '<=' || ref3 === '===' || ref3 === '!=='; + }; + + Op.prototype.invert = function() { + var allInvertable, curr, fst, op, ref3; + if (this.isChainable() && this.first.isChainable()) { + allInvertable = true; + curr = this; + while (curr && curr.operator) { + allInvertable && (allInvertable = curr.operator in INVERSIONS); + curr = curr.first; + } + if (!allInvertable) { + return new Parens(this).invert(); + } + curr = this; + while (curr && curr.operator) { + curr.invert = !curr.invert; + curr.operator = INVERSIONS[curr.operator]; + curr = curr.first; + } + return this; + } else if (op = INVERSIONS[this.operator]) { + this.operator = op; + if (this.first.unwrap() instanceof Op) { + this.first.invert(); + } + return this; + } else if (this.second) { + return new Parens(this).invert(); + } else if (this.operator === '!' && (fst = this.first.unwrap()) instanceof Op && ((ref3 = fst.operator) === '!' || ref3 === 'in' || ref3 === 'instanceof')) { + return fst; + } else { + return new Op('!', this); + } + }; + + Op.prototype.unfoldSoak = function(o) { + var ref3; + return ((ref3 = this.operator) === '++' || ref3 === '--' || ref3 === 'delete') && unfoldSoak(o, this, 'first'); + }; + + Op.prototype.generateDo = function(exp) { + var call, func, j, len1, param, passedParams, ref, ref3; + passedParams = []; + func = exp instanceof Assign && (ref = exp.value.unwrap()) instanceof Code ? ref : exp; + ref3 = func.params || []; + for (j = 0, len1 = ref3.length; j < len1; j++) { + param = ref3[j]; + if (param.value) { + passedParams.push(param.value); + delete param.value; + } else { + passedParams.push(param); + } + } + call = new Call(exp, passedParams); + call["do"] = true; + return call; + }; + + Op.prototype.compileNode = function(o) { + var answer, isChain, lhs, message, ref3, rhs; + isChain = this.isChainable() && this.first.isChainable(); + if (!isChain) { + this.first.front = this.front; + } + if (this.operator === 'delete' && o.scope.check(this.first.unwrapAll().value)) { + this.error('delete operand may not be argument or var'); + } + if ((ref3 = this.operator) === '--' || ref3 === '++') { + message = isUnassignable(this.first.unwrapAll().value); + if (message) { + this.first.error(message); + } + } + if (this.isYield()) { + return this.compileYield(o); + } + if (this.isUnary()) { + return this.compileUnary(o); + } + if (isChain) { + return this.compileChain(o); + } + switch (this.operator) { + case '?': + return this.compileExistence(o); + case '**': + return this.compilePower(o); + case '//': + return this.compileFloorDivision(o); + case '%%': + return this.compileModulo(o); + default: + lhs = this.first.compileToFragments(o, LEVEL_OP); + rhs = this.second.compileToFragments(o, LEVEL_OP); + answer = [].concat(lhs, this.makeCode(" " + this.operator + " "), rhs); + if (o.level <= LEVEL_OP) { + return answer; + } else { + return this.wrapInBraces(answer); + } + } + }; + + Op.prototype.compileChain = function(o) { + var fragments, fst, ref3, shared; + ref3 = this.first.second.cache(o), this.first.second = ref3[0], shared = ref3[1]; + fst = this.first.compileToFragments(o, LEVEL_OP); + fragments = fst.concat(this.makeCode(" " + (this.invert ? '&&' : '||') + " "), shared.compileToFragments(o), this.makeCode(" " + this.operator + " "), this.second.compileToFragments(o, LEVEL_OP)); + return this.wrapInBraces(fragments); + }; + + Op.prototype.compileExistence = function(o) { + var fst, ref; + if (this.first.isComplex()) { + ref = new IdentifierLiteral(o.scope.freeVariable('ref')); + fst = new Parens(new Assign(ref, this.first)); + } else { + fst = this.first; + ref = fst; + } + return new If(new Existence(fst), ref, { + type: 'if' + }).addElse(this.second).compileToFragments(o); + }; + + Op.prototype.compileUnary = function(o) { + var op, parts, plusMinus; + parts = []; + op = this.operator; + parts.push([this.makeCode(op)]); + if (op === '!' && this.first instanceof Existence) { + this.first.negated = !this.first.negated; + return this.first.compileToFragments(o); + } + if (o.level >= LEVEL_ACCESS) { + return (new Parens(this)).compileToFragments(o); + } + plusMinus = op === '+' || op === '-'; + if ((op === 'new' || op === 'typeof' || op === 'delete') || plusMinus && this.first instanceof Op && this.first.operator === op) { + parts.push([this.makeCode(' ')]); + } + if ((plusMinus && this.first instanceof Op) || (op === 'new' && this.first.isStatement(o))) { + this.first = new Parens(this.first); + } + parts.push(this.first.compileToFragments(o, LEVEL_OP)); + if (this.flip) { + parts.reverse(); + } + return this.joinFragmentArrays(parts, ''); + }; + + Op.prototype.compileYield = function(o) { + var op, parts, ref3; + parts = []; + op = this.operator; + if (o.scope.parent == null) { + this.error('yield can only occur inside functions'); + } + if (indexOf.call(Object.keys(this.first), 'expression') >= 0 && !(this.first instanceof Throw)) { + if (this.first.expression != null) { + parts.push(this.first.expression.compileToFragments(o, LEVEL_OP)); + } + } else { + if (o.level >= LEVEL_PAREN) { + parts.push([this.makeCode("(")]); + } + parts.push([this.makeCode(op)]); + if (((ref3 = this.first.base) != null ? ref3.value : void 0) !== '') { + parts.push([this.makeCode(" ")]); + } + parts.push(this.first.compileToFragments(o, LEVEL_OP)); + if (o.level >= LEVEL_PAREN) { + parts.push([this.makeCode(")")]); + } + } + return this.joinFragmentArrays(parts, ''); + }; + + Op.prototype.compilePower = function(o) { + var pow; + pow = new Value(new IdentifierLiteral('Math'), [new Access(new PropertyName('pow'))]); + return new Call(pow, [this.first, this.second]).compileToFragments(o); + }; + + Op.prototype.compileFloorDivision = function(o) { + var div, floor, second; + floor = new Value(new IdentifierLiteral('Math'), [new Access(new PropertyName('floor'))]); + second = this.second.isComplex() ? new Parens(this.second) : this.second; + div = new Op('/', this.first, second); + return new Call(floor, [div]).compileToFragments(o); + }; + + Op.prototype.compileModulo = function(o) { + var mod; + mod = new Value(new Literal(utility('modulo', o))); + return new Call(mod, [this.first, this.second]).compileToFragments(o); + }; + + Op.prototype.toString = function(idt) { + return Op.__super__.toString.call(this, idt, this.constructor.name + ' ' + this.operator); + }; + + return Op; + + })(Base); + + exports.In = In = (function(superClass1) { + extend1(In, superClass1); + + function In(object, array) { + this.object = object; + this.array = array; + } + + In.prototype.children = ['object', 'array']; + + In.prototype.invert = NEGATE; + + In.prototype.compileNode = function(o) { + var hasSplat, j, len1, obj, ref3; + if (this.array instanceof Value && this.array.isArray() && this.array.base.objects.length) { + ref3 = this.array.base.objects; + for (j = 0, len1 = ref3.length; j < len1; j++) { + obj = ref3[j]; + if (!(obj instanceof Splat)) { + continue; + } + hasSplat = true; + break; + } + if (!hasSplat) { + return this.compileOrTest(o); + } + } + return this.compileLoopTest(o); + }; + + In.prototype.compileOrTest = function(o) { + var cmp, cnj, i, item, j, len1, ref, ref3, ref4, ref5, sub, tests; + ref3 = this.object.cache(o, LEVEL_OP), sub = ref3[0], ref = ref3[1]; + ref4 = this.negated ? [' !== ', ' && '] : [' === ', ' || '], cmp = ref4[0], cnj = ref4[1]; + tests = []; + ref5 = this.array.base.objects; + for (i = j = 0, len1 = ref5.length; j < len1; i = ++j) { + item = ref5[i]; + if (i) { + tests.push(this.makeCode(cnj)); + } + tests = tests.concat((i ? ref : sub), this.makeCode(cmp), item.compileToFragments(o, LEVEL_ACCESS)); + } + if (o.level < LEVEL_OP) { + return tests; + } else { + return this.wrapInBraces(tests); + } + }; + + In.prototype.compileLoopTest = function(o) { + var fragments, ref, ref3, sub; + ref3 = this.object.cache(o, LEVEL_LIST), sub = ref3[0], ref = ref3[1]; + fragments = [].concat(this.makeCode(utility('indexOf', o) + ".call("), this.array.compileToFragments(o, LEVEL_LIST), this.makeCode(", "), ref, this.makeCode(") " + (this.negated ? '< 0' : '>= 0'))); + if (fragmentsToText(sub) === fragmentsToText(ref)) { + return fragments; + } + fragments = sub.concat(this.makeCode(', '), fragments); + if (o.level < LEVEL_LIST) { + return fragments; + } else { + return this.wrapInBraces(fragments); + } + }; + + In.prototype.toString = function(idt) { + return In.__super__.toString.call(this, idt, this.constructor.name + (this.negated ? '!' : '')); + }; + + return In; + + })(Base); + + exports.Try = Try = (function(superClass1) { + extend1(Try, superClass1); + + function Try(attempt, errorVariable, recovery, ensure) { + this.attempt = attempt; + this.errorVariable = errorVariable; + this.recovery = recovery; + this.ensure = ensure; + } + + Try.prototype.children = ['attempt', 'recovery', 'ensure']; + + Try.prototype.isStatement = YES; + + Try.prototype.jumps = function(o) { + var ref3; + return this.attempt.jumps(o) || ((ref3 = this.recovery) != null ? ref3.jumps(o) : void 0); + }; + + Try.prototype.makeReturn = function(res) { + if (this.attempt) { + this.attempt = this.attempt.makeReturn(res); + } + if (this.recovery) { + this.recovery = this.recovery.makeReturn(res); + } + return this; + }; + + Try.prototype.compileNode = function(o) { + var catchPart, ensurePart, generatedErrorVariableName, message, placeholder, tryPart; + o.indent += TAB; + tryPart = this.attempt.compileToFragments(o, LEVEL_TOP); + catchPart = this.recovery ? (generatedErrorVariableName = o.scope.freeVariable('error', { + reserve: false + }), placeholder = new IdentifierLiteral(generatedErrorVariableName), this.errorVariable ? (message = isUnassignable(this.errorVariable.unwrapAll().value), message ? this.errorVariable.error(message) : void 0, this.recovery.unshift(new Assign(this.errorVariable, placeholder))) : void 0, [].concat(this.makeCode(" catch ("), placeholder.compileToFragments(o), this.makeCode(") {\n"), this.recovery.compileToFragments(o, LEVEL_TOP), this.makeCode("\n" + this.tab + "}"))) : !(this.ensure || this.recovery) ? (generatedErrorVariableName = o.scope.freeVariable('error', { + reserve: false + }), [this.makeCode(" catch (" + generatedErrorVariableName + ") {}")]) : []; + ensurePart = this.ensure ? [].concat(this.makeCode(" finally {\n"), this.ensure.compileToFragments(o, LEVEL_TOP), this.makeCode("\n" + this.tab + "}")) : []; + return [].concat(this.makeCode(this.tab + "try {\n"), tryPart, this.makeCode("\n" + this.tab + "}"), catchPart, ensurePart); + }; + + return Try; + + })(Base); + + exports.Throw = Throw = (function(superClass1) { + extend1(Throw, superClass1); + + function Throw(expression) { + this.expression = expression; + } + + Throw.prototype.children = ['expression']; + + Throw.prototype.isStatement = YES; + + Throw.prototype.jumps = NO; + + Throw.prototype.makeReturn = THIS; + + Throw.prototype.compileNode = function(o) { + return [].concat(this.makeCode(this.tab + "throw "), this.expression.compileToFragments(o), this.makeCode(";")); + }; + + return Throw; + + })(Base); + + exports.Existence = Existence = (function(superClass1) { + extend1(Existence, superClass1); + + function Existence(expression) { + this.expression = expression; + } + + Existence.prototype.children = ['expression']; + + Existence.prototype.invert = NEGATE; + + Existence.prototype.compileNode = function(o) { + var cmp, cnj, code, ref3; + this.expression.front = this.front; + code = this.expression.compile(o, LEVEL_OP); + if (this.expression.unwrap() instanceof IdentifierLiteral && !o.scope.check(code)) { + ref3 = this.negated ? ['===', '||'] : ['!==', '&&'], cmp = ref3[0], cnj = ref3[1]; + code = "typeof " + code + " " + cmp + " \"undefined\" " + cnj + " " + code + " " + cmp + " null"; + } else { + code = code + " " + (this.negated ? '==' : '!=') + " null"; + } + return [this.makeCode(o.level <= LEVEL_COND ? code : "(" + code + ")")]; + }; + + return Existence; + + })(Base); + + exports.Parens = Parens = (function(superClass1) { + extend1(Parens, superClass1); + + function Parens(body1) { + this.body = body1; + } + + Parens.prototype.children = ['body']; + + Parens.prototype.unwrap = function() { + return this.body; + }; + + Parens.prototype.isComplex = function() { + return this.body.isComplex(); + }; + + Parens.prototype.compileNode = function(o) { + var bare, expr, fragments; + expr = this.body.unwrap(); + if (expr instanceof Value && expr.isAtomic()) { + expr.front = this.front; + return expr.compileToFragments(o); + } + fragments = expr.compileToFragments(o, LEVEL_PAREN); + bare = o.level < LEVEL_OP && (expr instanceof Op || expr instanceof Call || (expr instanceof For && expr.returns)) && (o.level < LEVEL_COND || fragments.length <= 3); + if (bare) { + return fragments; + } else { + return this.wrapInBraces(fragments); + } + }; + + return Parens; + + })(Base); + + exports.StringWithInterpolations = StringWithInterpolations = (function(superClass1) { + extend1(StringWithInterpolations, superClass1); + + function StringWithInterpolations() { + return StringWithInterpolations.__super__.constructor.apply(this, arguments); + } + + StringWithInterpolations.prototype.compileNode = function(o) { + var element, elements, expr, fragments, j, len1, value; + if (!o.inTaggedTemplateCall) { + return StringWithInterpolations.__super__.compileNode.apply(this, arguments); + } + expr = this.body.unwrap(); + elements = []; + expr.traverseChildren(false, function(node) { + if (node instanceof StringLiteral) { + elements.push(node); + return true; + } else if (node instanceof Parens) { + elements.push(node); + return false; + } + return true; + }); + fragments = []; + fragments.push(this.makeCode('`')); + for (j = 0, len1 = elements.length; j < len1; j++) { + element = elements[j]; + if (element instanceof StringLiteral) { + value = element.value.slice(1, -1); + value = value.replace(/(\\*)(`|\$\{)/g, function(match, backslashes, toBeEscaped) { + if (backslashes.length % 2 === 0) { + return backslashes + "\\" + toBeEscaped; + } else { + return match; + } + }); + fragments.push(this.makeCode(value)); + } else { + fragments.push(this.makeCode('${')); + fragments.push.apply(fragments, element.compileToFragments(o, LEVEL_PAREN)); + fragments.push(this.makeCode('}')); + } + } + fragments.push(this.makeCode('`')); + return fragments; + }; + + return StringWithInterpolations; + + })(Parens); + + exports.For = For = (function(superClass1) { + extend1(For, superClass1); + + function For(body, source) { + var ref3; + this.source = source.source, this.guard = source.guard, this.step = source.step, this.name = source.name, this.index = source.index; + this.body = Block.wrap([body]); + this.own = !!source.own; + this.object = !!source.object; + this.from = !!source.from; + if (this.from && this.index) { + this.index.error('cannot use index with for-from'); + } + if (this.own && !this.object) { + source.ownTag.error("cannot use own with for-" + (this.from ? 'from' : 'in')); + } + if (this.object) { + ref3 = [this.index, this.name], this.name = ref3[0], this.index = ref3[1]; + } + if (this.index instanceof Value && !this.index.isAssignable()) { + this.index.error('index cannot be a pattern matching expression'); + } + this.range = this.source instanceof Value && this.source.base instanceof Range && !this.source.properties.length && !this.from; + this.pattern = this.name instanceof Value; + if (this.range && this.index) { + this.index.error('indexes do not apply to range loops'); + } + if (this.range && this.pattern) { + this.name.error('cannot pattern match over range loops'); + } + this.returns = false; + } + + For.prototype.children = ['body', 'source', 'guard', 'step']; + + For.prototype.compileNode = function(o) { + var body, bodyFragments, compare, compareDown, declare, declareDown, defPart, defPartFragments, down, forPartFragments, guardPart, idt1, increment, index, ivar, kvar, kvarAssign, last, lvar, name, namePart, ref, ref3, ref4, resultPart, returnResult, rvar, scope, source, step, stepNum, stepVar, svar, varPart; + body = Block.wrap([this.body]); + ref3 = body.expressions, last = ref3[ref3.length - 1]; + if ((last != null ? last.jumps() : void 0) instanceof Return) { + this.returns = false; + } + source = this.range ? this.source.base : this.source; + scope = o.scope; + if (!this.pattern) { + name = this.name && (this.name.compile(o, LEVEL_LIST)); + } + index = this.index && (this.index.compile(o, LEVEL_LIST)); + if (name && !this.pattern) { + scope.find(name); + } + if (index && !(this.index instanceof Value)) { + scope.find(index); + } + if (this.returns) { + rvar = scope.freeVariable('results'); + } + if (this.from) { + if (this.pattern) { + ivar = scope.freeVariable('x', { + single: true + }); + } + } else { + ivar = (this.object && index) || scope.freeVariable('i', { + single: true + }); + } + kvar = ((this.range || this.from) && name) || index || ivar; + kvarAssign = kvar !== ivar ? kvar + " = " : ""; + if (this.step && !this.range) { + ref4 = this.cacheToCodeFragments(this.step.cache(o, LEVEL_LIST, isComplexOrAssignable)), step = ref4[0], stepVar = ref4[1]; + if (this.step.isNumber()) { + stepNum = Number(stepVar); + } + } + if (this.pattern) { + name = ivar; + } + varPart = ''; + guardPart = ''; + defPart = ''; + idt1 = this.tab + TAB; + if (this.range) { + forPartFragments = source.compileToFragments(merge(o, { + index: ivar, + name: name, + step: this.step, + isComplex: isComplexOrAssignable + })); + } else { + svar = this.source.compile(o, LEVEL_LIST); + if ((name || this.own) && !(this.source.unwrap() instanceof IdentifierLiteral)) { + defPart += "" + this.tab + (ref = scope.freeVariable('ref')) + " = " + svar + ";\n"; + svar = ref; + } + if (name && !this.pattern && !this.from) { + namePart = name + " = " + svar + "[" + kvar + "]"; + } + if (!this.object && !this.from) { + if (step !== stepVar) { + defPart += "" + this.tab + step + ";\n"; + } + down = stepNum < 0; + if (!(this.step && (stepNum != null) && down)) { + lvar = scope.freeVariable('len'); + } + declare = "" + kvarAssign + ivar + " = 0, " + lvar + " = " + svar + ".length"; + declareDown = "" + kvarAssign + ivar + " = " + svar + ".length - 1"; + compare = ivar + " < " + lvar; + compareDown = ivar + " >= 0"; + if (this.step) { + if (stepNum != null) { + if (down) { + compare = compareDown; + declare = declareDown; + } + } else { + compare = stepVar + " > 0 ? " + compare + " : " + compareDown; + declare = "(" + stepVar + " > 0 ? (" + declare + ") : " + declareDown + ")"; + } + increment = ivar + " += " + stepVar; + } else { + increment = "" + (kvar !== ivar ? "++" + ivar : ivar + "++"); + } + forPartFragments = [this.makeCode(declare + "; " + compare + "; " + kvarAssign + increment)]; + } + } + if (this.returns) { + resultPart = "" + this.tab + rvar + " = [];\n"; + returnResult = "\n" + this.tab + "return " + rvar + ";"; + body.makeReturn(rvar); + } + if (this.guard) { + if (body.expressions.length > 1) { + body.expressions.unshift(new If((new Parens(this.guard)).invert(), new StatementLiteral("continue"))); + } else { + if (this.guard) { + body = Block.wrap([new If(this.guard, body)]); + } + } + } + if (this.pattern) { + body.expressions.unshift(new Assign(this.name, this.from ? new IdentifierLiteral(kvar) : new Literal(svar + "[" + kvar + "]"))); + } + defPartFragments = [].concat(this.makeCode(defPart), this.pluckDirectCall(o, body)); + if (namePart) { + varPart = "\n" + idt1 + namePart + ";"; + } + if (this.object) { + forPartFragments = [this.makeCode(kvar + " in " + svar)]; + if (this.own) { + guardPart = "\n" + idt1 + "if (!" + (utility('hasProp', o)) + ".call(" + svar + ", " + kvar + ")) continue;"; + } + } else if (this.from) { + forPartFragments = [this.makeCode(kvar + " of " + svar)]; + } + bodyFragments = body.compileToFragments(merge(o, { + indent: idt1 + }), LEVEL_TOP); + if (bodyFragments && bodyFragments.length > 0) { + bodyFragments = [].concat(this.makeCode("\n"), bodyFragments, this.makeCode("\n")); + } + return [].concat(defPartFragments, this.makeCode("" + (resultPart || '') + this.tab + "for ("), forPartFragments, this.makeCode(") {" + guardPart + varPart), bodyFragments, this.makeCode(this.tab + "}" + (returnResult || ''))); + }; + + For.prototype.pluckDirectCall = function(o, body) { + var base, defs, expr, fn, idx, j, len1, ref, ref3, ref4, ref5, ref6, ref7, ref8, ref9, val; + defs = []; + ref3 = body.expressions; + for (idx = j = 0, len1 = ref3.length; j < len1; idx = ++j) { + expr = ref3[idx]; + expr = expr.unwrapAll(); + if (!(expr instanceof Call)) { + continue; + } + val = (ref4 = expr.variable) != null ? ref4.unwrapAll() : void 0; + if (!((val instanceof Code) || (val instanceof Value && ((ref5 = val.base) != null ? ref5.unwrapAll() : void 0) instanceof Code && val.properties.length === 1 && ((ref6 = (ref7 = val.properties[0].name) != null ? ref7.value : void 0) === 'call' || ref6 === 'apply')))) { + continue; + } + fn = ((ref8 = val.base) != null ? ref8.unwrapAll() : void 0) || val; + ref = new IdentifierLiteral(o.scope.freeVariable('fn')); + base = new Value(ref); + if (val.base) { + ref9 = [base, val], val.base = ref9[0], base = ref9[1]; + } + body.expressions[idx] = new Call(base, expr.args); + defs = defs.concat(this.makeCode(this.tab), new Assign(ref, fn).compileToFragments(o, LEVEL_TOP), this.makeCode(';\n')); + } + return defs; + }; + + return For; + + })(While); + + exports.Switch = Switch = (function(superClass1) { + extend1(Switch, superClass1); + + function Switch(subject, cases, otherwise) { + this.subject = subject; + this.cases = cases; + this.otherwise = otherwise; + } + + Switch.prototype.children = ['subject', 'cases', 'otherwise']; + + Switch.prototype.isStatement = YES; + + Switch.prototype.jumps = function(o) { + var block, conds, j, jumpNode, len1, ref3, ref4, ref5; + if (o == null) { + o = { + block: true + }; + } + ref3 = this.cases; + for (j = 0, len1 = ref3.length; j < len1; j++) { + ref4 = ref3[j], conds = ref4[0], block = ref4[1]; + if (jumpNode = block.jumps(o)) { + return jumpNode; + } + } + return (ref5 = this.otherwise) != null ? ref5.jumps(o) : void 0; + }; + + Switch.prototype.makeReturn = function(res) { + var j, len1, pair, ref3, ref4; + ref3 = this.cases; + for (j = 0, len1 = ref3.length; j < len1; j++) { + pair = ref3[j]; + pair[1].makeReturn(res); + } + if (res) { + this.otherwise || (this.otherwise = new Block([new Literal('void 0')])); + } + if ((ref4 = this.otherwise) != null) { + ref4.makeReturn(res); + } + return this; + }; + + Switch.prototype.compileNode = function(o) { + var block, body, cond, conditions, expr, fragments, i, idt1, idt2, j, k, len1, len2, ref3, ref4, ref5; + idt1 = o.indent + TAB; + idt2 = o.indent = idt1 + TAB; + fragments = [].concat(this.makeCode(this.tab + "switch ("), (this.subject ? this.subject.compileToFragments(o, LEVEL_PAREN) : this.makeCode("false")), this.makeCode(") {\n")); + ref3 = this.cases; + for (i = j = 0, len1 = ref3.length; j < len1; i = ++j) { + ref4 = ref3[i], conditions = ref4[0], block = ref4[1]; + ref5 = flatten([conditions]); + for (k = 0, len2 = ref5.length; k < len2; k++) { + cond = ref5[k]; + if (!this.subject) { + cond = cond.invert(); + } + fragments = fragments.concat(this.makeCode(idt1 + "case "), cond.compileToFragments(o, LEVEL_PAREN), this.makeCode(":\n")); + } + if ((body = block.compileToFragments(o, LEVEL_TOP)).length > 0) { + fragments = fragments.concat(body, this.makeCode('\n')); + } + if (i === this.cases.length - 1 && !this.otherwise) { + break; + } + expr = this.lastNonComment(block.expressions); + if (expr instanceof Return || (expr instanceof Literal && expr.jumps() && expr.value !== 'debugger')) { + continue; + } + fragments.push(cond.makeCode(idt2 + 'break;\n')); + } + if (this.otherwise && this.otherwise.expressions.length) { + fragments.push.apply(fragments, [this.makeCode(idt1 + "default:\n")].concat(slice.call(this.otherwise.compileToFragments(o, LEVEL_TOP)), [this.makeCode("\n")])); + } + fragments.push(this.makeCode(this.tab + '}')); + return fragments; + }; + + return Switch; + + })(Base); + + exports.If = If = (function(superClass1) { + extend1(If, superClass1); + + function If(condition, body1, options) { + this.body = body1; + if (options == null) { + options = {}; + } + this.condition = options.type === 'unless' ? condition.invert() : condition; + this.elseBody = null; + this.isChain = false; + this.soak = options.soak; + } + + If.prototype.children = ['condition', 'body', 'elseBody']; + + If.prototype.bodyNode = function() { + var ref3; + return (ref3 = this.body) != null ? ref3.unwrap() : void 0; + }; + + If.prototype.elseBodyNode = function() { + var ref3; + return (ref3 = this.elseBody) != null ? ref3.unwrap() : void 0; + }; + + If.prototype.addElse = function(elseBody) { + if (this.isChain) { + this.elseBodyNode().addElse(elseBody); + } else { + this.isChain = elseBody instanceof If; + this.elseBody = this.ensureBlock(elseBody); + this.elseBody.updateLocationDataIfMissing(elseBody.locationData); + } + return this; + }; + + If.prototype.isStatement = function(o) { + var ref3; + return (o != null ? o.level : void 0) === LEVEL_TOP || this.bodyNode().isStatement(o) || ((ref3 = this.elseBodyNode()) != null ? ref3.isStatement(o) : void 0); + }; + + If.prototype.jumps = function(o) { + var ref3; + return this.body.jumps(o) || ((ref3 = this.elseBody) != null ? ref3.jumps(o) : void 0); + }; + + If.prototype.compileNode = function(o) { + if (this.isStatement(o)) { + return this.compileStatement(o); + } else { + return this.compileExpression(o); + } + }; + + If.prototype.makeReturn = function(res) { + if (res) { + this.elseBody || (this.elseBody = new Block([new Literal('void 0')])); + } + this.body && (this.body = new Block([this.body.makeReturn(res)])); + this.elseBody && (this.elseBody = new Block([this.elseBody.makeReturn(res)])); + return this; + }; + + If.prototype.ensureBlock = function(node) { + if (node instanceof Block) { + return node; + } else { + return new Block([node]); + } + }; + + If.prototype.compileStatement = function(o) { + var answer, body, child, cond, exeq, ifPart, indent; + child = del(o, 'chainChild'); + exeq = del(o, 'isExistentialEquals'); + if (exeq) { + return new If(this.condition.invert(), this.elseBodyNode(), { + type: 'if' + }).compileToFragments(o); + } + indent = o.indent + TAB; + cond = this.condition.compileToFragments(o, LEVEL_PAREN); + body = this.ensureBlock(this.body).compileToFragments(merge(o, { + indent: indent + })); + ifPart = [].concat(this.makeCode("if ("), cond, this.makeCode(") {\n"), body, this.makeCode("\n" + this.tab + "}")); + if (!child) { + ifPart.unshift(this.makeCode(this.tab)); + } + if (!this.elseBody) { + return ifPart; + } + answer = ifPart.concat(this.makeCode(' else ')); + if (this.isChain) { + o.chainChild = true; + answer = answer.concat(this.elseBody.unwrap().compileToFragments(o, LEVEL_TOP)); + } else { + answer = answer.concat(this.makeCode("{\n"), this.elseBody.compileToFragments(merge(o, { + indent: indent + }), LEVEL_TOP), this.makeCode("\n" + this.tab + "}")); + } + return answer; + }; + + If.prototype.compileExpression = function(o) { + var alt, body, cond, fragments; + cond = this.condition.compileToFragments(o, LEVEL_COND); + body = this.bodyNode().compileToFragments(o, LEVEL_LIST); + alt = this.elseBodyNode() ? this.elseBodyNode().compileToFragments(o, LEVEL_LIST) : [this.makeCode('void 0')]; + fragments = cond.concat(this.makeCode(" ? "), body, this.makeCode(" : "), alt); + if (o.level >= LEVEL_COND) { + return this.wrapInBraces(fragments); + } else { + return fragments; + } + }; + + If.prototype.unfoldSoak = function() { + return this.soak && this; + }; + + return If; + + })(Base); + + UTILITIES = { + extend: function(o) { + return "function(child, parent) { for (var key in parent) { if (" + (utility('hasProp', o)) + ".call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }"; + }, + bind: function() { + return 'function(fn, me){ return function(){ return fn.apply(me, arguments); }; }'; + }, + indexOf: function() { + return "[].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }"; + }, + modulo: function() { + return "function(a, b) { return (+a % (b = +b) + b) % b; }"; + }, + hasProp: function() { + return '{}.hasOwnProperty'; + }, + slice: function() { + return '[].slice'; + } + }; + + LEVEL_TOP = 1; + + LEVEL_PAREN = 2; + + LEVEL_LIST = 3; + + LEVEL_COND = 4; + + LEVEL_OP = 5; + + LEVEL_ACCESS = 6; + + TAB = ' '; + + SIMPLENUM = /^[+-]?\d+$/; + + utility = function(name, o) { + var ref, root; + root = o.scope.root; + if (name in root.utilities) { + return root.utilities[name]; + } else { + ref = root.freeVariable(name); + root.assign(ref, UTILITIES[name](o)); + return root.utilities[name] = ref; + } + }; + + multident = function(code, tab) { + code = code.replace(/\n/g, '$&' + tab); + return code.replace(/\s+$/, ''); + }; + + isLiteralArguments = function(node) { + return node instanceof IdentifierLiteral && node.value === 'arguments'; + }; + + isLiteralThis = function(node) { + return node instanceof ThisLiteral || (node instanceof Code && node.bound) || node instanceof SuperCall; + }; + + isComplexOrAssignable = function(node) { + return node.isComplex() || (typeof node.isAssignable === "function" ? node.isAssignable() : void 0); + }; + + unfoldSoak = function(o, parent, name) { + var ifn; + if (!(ifn = parent[name].unfoldSoak(o))) { + return; + } + parent[name] = ifn.body; + ifn.body = new Value(parent); + return ifn; + }; + +}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/optparse.js b/deploy/node_modules/coffee-script/lib/coffee-script/optparse.js new file mode 100644 index 0000000..4c5624f --- /dev/null +++ b/deploy/node_modules/coffee-script/lib/coffee-script/optparse.js @@ -0,0 +1,139 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var LONG_FLAG, MULTI_FLAG, OPTIONAL, OptionParser, SHORT_FLAG, buildRule, buildRules, normalizeArguments, repeat; + + repeat = require('./helpers').repeat; + + exports.OptionParser = OptionParser = (function() { + function OptionParser(rules, banner) { + this.banner = banner; + this.rules = buildRules(rules); + } + + OptionParser.prototype.parse = function(args) { + var arg, i, isOption, j, k, len, len1, matchedRule, options, originalArgs, pos, ref, rule, seenNonOptionArg, skippingArgument, value; + options = { + "arguments": [] + }; + skippingArgument = false; + originalArgs = args; + args = normalizeArguments(args); + for (i = j = 0, len = args.length; j < len; i = ++j) { + arg = args[i]; + if (skippingArgument) { + skippingArgument = false; + continue; + } + if (arg === '--') { + pos = originalArgs.indexOf('--'); + options["arguments"] = options["arguments"].concat(originalArgs.slice(pos + 1)); + break; + } + isOption = !!(arg.match(LONG_FLAG) || arg.match(SHORT_FLAG)); + seenNonOptionArg = options["arguments"].length > 0; + if (!seenNonOptionArg) { + matchedRule = false; + ref = this.rules; + for (k = 0, len1 = ref.length; k < len1; k++) { + rule = ref[k]; + if (rule.shortFlag === arg || rule.longFlag === arg) { + value = true; + if (rule.hasArgument) { + skippingArgument = true; + value = args[i + 1]; + } + options[rule.name] = rule.isList ? (options[rule.name] || []).concat(value) : value; + matchedRule = true; + break; + } + } + if (isOption && !matchedRule) { + throw new Error("unrecognized option: " + arg); + } + } + if (seenNonOptionArg || !isOption) { + options["arguments"].push(arg); + } + } + return options; + }; + + OptionParser.prototype.help = function() { + var j, len, letPart, lines, ref, rule, spaces; + lines = []; + if (this.banner) { + lines.unshift(this.banner + "\n"); + } + ref = this.rules; + for (j = 0, len = ref.length; j < len; j++) { + rule = ref[j]; + spaces = 15 - rule.longFlag.length; + spaces = spaces > 0 ? repeat(' ', spaces) : ''; + letPart = rule.shortFlag ? rule.shortFlag + ', ' : ' '; + lines.push(' ' + letPart + rule.longFlag + spaces + rule.description); + } + return "\n" + (lines.join('\n')) + "\n"; + }; + + return OptionParser; + + })(); + + LONG_FLAG = /^(--\w[\w\-]*)/; + + SHORT_FLAG = /^(-\w)$/; + + MULTI_FLAG = /^-(\w{2,})/; + + OPTIONAL = /\[(\w+(\*?))\]/; + + buildRules = function(rules) { + var j, len, results, tuple; + results = []; + for (j = 0, len = rules.length; j < len; j++) { + tuple = rules[j]; + if (tuple.length < 3) { + tuple.unshift(null); + } + results.push(buildRule.apply(null, tuple)); + } + return results; + }; + + buildRule = function(shortFlag, longFlag, description, options) { + var match; + if (options == null) { + options = {}; + } + match = longFlag.match(OPTIONAL); + longFlag = longFlag.match(LONG_FLAG)[1]; + return { + name: longFlag.substr(2), + shortFlag: shortFlag, + longFlag: longFlag, + description: description, + hasArgument: !!(match && match[1]), + isList: !!(match && match[2]) + }; + }; + + normalizeArguments = function(args) { + var arg, j, k, l, len, len1, match, ref, result; + args = args.slice(0); + result = []; + for (j = 0, len = args.length; j < len; j++) { + arg = args[j]; + if (match = arg.match(MULTI_FLAG)) { + ref = match[1].split(''); + for (k = 0, len1 = ref.length; k < len1; k++) { + l = ref[k]; + result.push('-' + l); + } + } else { + result.push(arg); + } + } + return result; + }; + +}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/parser.js b/deploy/node_modules/coffee-script/lib/coffee-script/parser.js new file mode 100755 index 0000000..e8c11b5 --- /dev/null +++ b/deploy/node_modules/coffee-script/lib/coffee-script/parser.js @@ -0,0 +1,891 @@ +/* parser generated by jison 0.4.17 */ +/* + Returns a Parser object of the following structure: + + Parser: { + yy: {} + } + + Parser.prototype: { + yy: {}, + trace: function(), + symbols_: {associative list: name ==> number}, + terminals_: {associative list: number ==> name}, + productions_: [...], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), + table: [...], + defaultActions: {...}, + parseError: function(str, hash), + parse: function(input), + + lexer: { + EOF: 1, + parseError: function(str, hash), + setInput: function(input), + input: function(), + unput: function(str), + more: function(), + less: function(n), + pastInput: function(), + upcomingInput: function(), + showPosition: function(), + test_match: function(regex_match_array, rule_index), + next: function(), + lex: function(), + begin: function(condition), + popState: function(), + _currentRules: function(), + topState: function(), + pushState: function(condition), + + options: { + ranges: boolean (optional: true ==> token location info will include a .range[] member) + flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) + backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) + }, + + performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), + rules: [...], + conditions: {associative list: name ==> set}, + } + } + + + token location info (@$, _$, etc.): { + first_line: n, + last_line: n, + first_column: n, + last_column: n, + range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) + } + + + the parseError function receives a 'hash' object with these members for lexer and parser errors: { + text: (matched text) + token: (the produced terminal token, if any) + line: (yylineno) + } + while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { + loc: (yylloc) + expected: (string describing the set of expected tokens) + recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) + } +*/ +var parser = (function(){ +var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,22],$V1=[1,25],$V2=[1,83],$V3=[1,79],$V4=[1,84],$V5=[1,85],$V6=[1,81],$V7=[1,82],$V8=[1,56],$V9=[1,58],$Va=[1,59],$Vb=[1,60],$Vc=[1,61],$Vd=[1,62],$Ve=[1,49],$Vf=[1,50],$Vg=[1,32],$Vh=[1,68],$Vi=[1,69],$Vj=[1,78],$Vk=[1,47],$Vl=[1,51],$Vm=[1,52],$Vn=[1,67],$Vo=[1,65],$Vp=[1,66],$Vq=[1,64],$Vr=[1,42],$Vs=[1,48],$Vt=[1,63],$Vu=[1,73],$Vv=[1,74],$Vw=[1,75],$Vx=[1,76],$Vy=[1,46],$Vz=[1,72],$VA=[1,34],$VB=[1,35],$VC=[1,36],$VD=[1,37],$VE=[1,38],$VF=[1,39],$VG=[1,86],$VH=[1,6,32,42,131],$VI=[1,101],$VJ=[1,89],$VK=[1,88],$VL=[1,87],$VM=[1,90],$VN=[1,91],$VO=[1,92],$VP=[1,93],$VQ=[1,94],$VR=[1,95],$VS=[1,96],$VT=[1,97],$VU=[1,98],$VV=[1,99],$VW=[1,100],$VX=[1,104],$VY=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$VZ=[2,167],$V_=[1,110],$V$=[1,111],$V01=[1,112],$V11=[1,113],$V21=[1,115],$V31=[1,116],$V41=[1,109],$V51=[1,6,32,42,131,133,135,139,156],$V61=[2,27],$V71=[1,123],$V81=[1,121],$V91=[1,6,31,32,40,41,42,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$Va1=[2,95],$Vb1=[1,6,31,32,42,46,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$Vc1=[2,74],$Vd1=[1,128],$Ve1=[1,133],$Vf1=[1,134],$Vg1=[1,136],$Vh1=[1,6,31,32,40,41,42,55,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$Vi1=[2,92],$Vj1=[1,6,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$Vk1=[2,64],$Vl1=[1,161],$Vm1=[1,167],$Vn1=[1,179],$Vo1=[1,181],$Vp1=[1,176],$Vq1=[1,183],$Vr1=[1,185],$Vs1=[1,6,31,32,40,41,42,55,66,71,74,82,83,84,85,87,89,90,94,96,113,114,115,120,122,131,133,134,135,139,140,156,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175],$Vt1=[2,111],$Vu1=[1,6,31,32,40,41,42,58,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$Vv1=[1,6,31,32,40,41,42,46,58,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$Vw1=[40,41,114],$Vx1=[1,242],$Vy1=[1,241],$Vz1=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156],$VA1=[2,72],$VB1=[1,251],$VC1=[6,31,32,66,71],$VD1=[6,31,32,55,66,71,74],$VE1=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,159,160,164,166,167,168,169,170,171,172,173,174],$VF1=[40,41,82,83,84,85,87,90,113,114],$VG1=[1,270],$VH1=[2,62],$VI1=[1,281],$VJ1=[1,283],$VK1=[1,288],$VL1=[1,290],$VM1=[2,188],$VN1=[1,6,31,32,40,41,42,55,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,146,147,148,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$VO1=[1,299],$VP1=[6,31,32,71,115,120],$VQ1=[1,6,31,32,40,41,42,55,58,66,71,74,82,83,84,85,87,89,90,94,96,113,114,115,120,122,131,133,134,135,139,140,146,147,148,156,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175],$VR1=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,140,156],$VS1=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,134,140,156],$VT1=[146,147,148],$VU1=[71,146,147,148],$VV1=[6,31,94],$VW1=[1,313],$VX1=[6,31,32,71,94],$VY1=[6,31,32,58,71,94],$VZ1=[6,31,32,55,58,71,94],$V_1=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,159,160,166,167,168,169,170,171,172,173,174],$V$1=[12,28,34,38,40,41,44,45,48,49,50,51,52,53,61,63,64,68,69,89,92,95,97,105,112,117,118,119,125,129,130,133,135,137,139,149,155,157,158,159,160,161,162],$V02=[2,177],$V12=[6,31,32],$V22=[2,73],$V32=[1,325],$V42=[1,326],$V52=[1,6,31,32,42,66,71,74,89,94,115,120,122,127,128,131,133,134,135,139,140,151,153,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$V62=[32,151,153],$V72=[1,6,32,42,66,71,74,89,94,115,120,122,131,134,140,156],$V82=[1,353],$V92=[1,359],$Va2=[1,6,32,42,131,156],$Vb2=[2,87],$Vc2=[1,370],$Vd2=[1,371],$Ve2=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,151,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$Vf2=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,135,139,140,156],$Vg2=[1,384],$Vh2=[1,385],$Vi2=[6,31,32,94],$Vj2=[6,31,32,71],$Vk2=[1,6,31,32,42,66,71,74,89,94,115,120,122,127,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$Vl2=[31,71],$Vm2=[1,411],$Vn2=[1,412],$Vo2=[1,418],$Vp2=[1,419]; +var parser = {trace: function trace() { }, +yy: {}, +symbols_: {"error":2,"Root":3,"Body":4,"Line":5,"TERMINATOR":6,"Expression":7,"Statement":8,"YieldReturn":9,"Return":10,"Comment":11,"STATEMENT":12,"Import":13,"Export":14,"Value":15,"Invocation":16,"Code":17,"Operation":18,"Assign":19,"If":20,"Try":21,"While":22,"For":23,"Switch":24,"Class":25,"Throw":26,"Yield":27,"YIELD":28,"FROM":29,"Block":30,"INDENT":31,"OUTDENT":32,"Identifier":33,"IDENTIFIER":34,"Property":35,"PROPERTY":36,"AlphaNumeric":37,"NUMBER":38,"String":39,"STRING":40,"STRING_START":41,"STRING_END":42,"Regex":43,"REGEX":44,"REGEX_START":45,"REGEX_END":46,"Literal":47,"JS":48,"UNDEFINED":49,"NULL":50,"BOOL":51,"INFINITY":52,"NAN":53,"Assignable":54,"=":55,"AssignObj":56,"ObjAssignable":57,":":58,"SimpleObjAssignable":59,"ThisProperty":60,"RETURN":61,"Object":62,"HERECOMMENT":63,"PARAM_START":64,"ParamList":65,"PARAM_END":66,"FuncGlyph":67,"->":68,"=>":69,"OptComma":70,",":71,"Param":72,"ParamVar":73,"...":74,"Array":75,"Splat":76,"SimpleAssignable":77,"Accessor":78,"Parenthetical":79,"Range":80,"This":81,".":82,"?.":83,"::":84,"?::":85,"Index":86,"INDEX_START":87,"IndexValue":88,"INDEX_END":89,"INDEX_SOAK":90,"Slice":91,"{":92,"AssignList":93,"}":94,"CLASS":95,"EXTENDS":96,"IMPORT":97,"ImportDefaultSpecifier":98,"ImportNamespaceSpecifier":99,"ImportSpecifierList":100,"ImportSpecifier":101,"AS":102,"DEFAULT":103,"IMPORT_ALL":104,"EXPORT":105,"ExportSpecifierList":106,"EXPORT_ALL":107,"ExportSpecifier":108,"OptFuncExist":109,"Arguments":110,"Super":111,"SUPER":112,"FUNC_EXIST":113,"CALL_START":114,"CALL_END":115,"ArgList":116,"THIS":117,"@":118,"[":119,"]":120,"RangeDots":121,"..":122,"Arg":123,"SimpleArgs":124,"TRY":125,"Catch":126,"FINALLY":127,"CATCH":128,"THROW":129,"(":130,")":131,"WhileSource":132,"WHILE":133,"WHEN":134,"UNTIL":135,"Loop":136,"LOOP":137,"ForBody":138,"FOR":139,"BY":140,"ForStart":141,"ForSource":142,"ForVariables":143,"OWN":144,"ForValue":145,"FORIN":146,"FOROF":147,"FORFROM":148,"SWITCH":149,"Whens":150,"ELSE":151,"When":152,"LEADING_WHEN":153,"IfBlock":154,"IF":155,"POST_IF":156,"UNARY":157,"UNARY_MATH":158,"-":159,"+":160,"--":161,"++":162,"?":163,"MATH":164,"**":165,"SHIFT":166,"COMPARE":167,"&":168,"^":169,"|":170,"&&":171,"||":172,"BIN?":173,"RELATION":174,"COMPOUND_ASSIGN":175,"$accept":0,"$end":1}, +terminals_: {2:"error",6:"TERMINATOR",12:"STATEMENT",28:"YIELD",29:"FROM",31:"INDENT",32:"OUTDENT",34:"IDENTIFIER",36:"PROPERTY",38:"NUMBER",40:"STRING",41:"STRING_START",42:"STRING_END",44:"REGEX",45:"REGEX_START",46:"REGEX_END",48:"JS",49:"UNDEFINED",50:"NULL",51:"BOOL",52:"INFINITY",53:"NAN",55:"=",58:":",61:"RETURN",63:"HERECOMMENT",64:"PARAM_START",66:"PARAM_END",68:"->",69:"=>",71:",",74:"...",82:".",83:"?.",84:"::",85:"?::",87:"INDEX_START",89:"INDEX_END",90:"INDEX_SOAK",92:"{",94:"}",95:"CLASS",96:"EXTENDS",97:"IMPORT",102:"AS",103:"DEFAULT",104:"IMPORT_ALL",105:"EXPORT",107:"EXPORT_ALL",112:"SUPER",113:"FUNC_EXIST",114:"CALL_START",115:"CALL_END",117:"THIS",118:"@",119:"[",120:"]",122:"..",125:"TRY",127:"FINALLY",128:"CATCH",129:"THROW",130:"(",131:")",133:"WHILE",134:"WHEN",135:"UNTIL",137:"LOOP",139:"FOR",140:"BY",144:"OWN",146:"FORIN",147:"FOROF",148:"FORFROM",149:"SWITCH",151:"ELSE",153:"LEADING_WHEN",155:"IF",156:"POST_IF",157:"UNARY",158:"UNARY_MATH",159:"-",160:"+",161:"--",162:"++",163:"?",164:"MATH",165:"**",166:"SHIFT",167:"COMPARE",168:"&",169:"^",170:"|",171:"&&",172:"||",173:"BIN?",174:"RELATION",175:"COMPOUND_ASSIGN"}, +productions_: [0,[3,0],[3,1],[4,1],[4,3],[4,2],[5,1],[5,1],[5,1],[8,1],[8,1],[8,1],[8,1],[8,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[27,1],[27,2],[27,3],[30,2],[30,3],[33,1],[35,1],[37,1],[37,1],[39,1],[39,3],[43,1],[43,3],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[19,3],[19,4],[19,5],[56,1],[56,3],[56,5],[56,3],[56,5],[56,1],[59,1],[59,1],[59,1],[57,1],[57,1],[10,2],[10,4],[10,1],[9,3],[9,2],[11,1],[17,5],[17,2],[67,1],[67,1],[70,0],[70,1],[65,0],[65,1],[65,3],[65,4],[65,6],[72,1],[72,2],[72,3],[72,1],[73,1],[73,1],[73,1],[73,1],[76,2],[77,1],[77,2],[77,2],[77,1],[54,1],[54,1],[54,1],[15,1],[15,1],[15,1],[15,1],[15,1],[78,2],[78,2],[78,2],[78,2],[78,1],[78,1],[86,3],[86,2],[88,1],[88,1],[62,4],[93,0],[93,1],[93,3],[93,4],[93,6],[25,1],[25,2],[25,3],[25,4],[25,2],[25,3],[25,4],[25,5],[13,2],[13,4],[13,4],[13,5],[13,7],[13,6],[13,9],[100,1],[100,3],[100,4],[100,4],[100,6],[101,1],[101,3],[101,1],[101,3],[98,1],[99,3],[14,3],[14,5],[14,2],[14,4],[14,5],[14,6],[14,3],[14,4],[14,7],[106,1],[106,3],[106,4],[106,4],[106,6],[108,1],[108,3],[108,3],[108,1],[108,3],[16,3],[16,3],[16,3],[16,1],[111,1],[111,2],[109,0],[109,1],[110,2],[110,4],[81,1],[81,1],[60,2],[75,2],[75,4],[121,1],[121,1],[80,5],[91,3],[91,2],[91,2],[91,1],[116,1],[116,3],[116,4],[116,4],[116,6],[123,1],[123,1],[123,1],[124,1],[124,3],[21,2],[21,3],[21,4],[21,5],[126,3],[126,3],[126,2],[26,2],[79,3],[79,5],[132,2],[132,4],[132,2],[132,4],[22,2],[22,2],[22,2],[22,1],[136,2],[136,2],[23,2],[23,2],[23,2],[138,2],[138,4],[138,2],[141,2],[141,3],[145,1],[145,1],[145,1],[145,1],[143,1],[143,3],[142,2],[142,2],[142,4],[142,4],[142,4],[142,6],[142,6],[142,2],[142,4],[24,5],[24,7],[24,4],[24,6],[150,1],[150,2],[152,3],[152,4],[154,3],[154,5],[20,1],[20,3],[20,3],[20,3],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,5],[18,4],[18,3]], +performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { +/* this == yyval */ + +var $0 = $$.length - 1; +switch (yystate) { +case 1: +return this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Block); +break; +case 2: +return this.$ = $$[$0]; +break; +case 3: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(yy.Block.wrap([$$[$0]])); +break; +case 4: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].push($$[$0])); +break; +case 5: +this.$ = $$[$0-1]; +break; +case 6: case 7: case 8: case 9: case 10: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 35: case 40: case 42: case 56: case 57: case 58: case 59: case 60: case 61: case 72: case 73: case 83: case 84: case 85: case 86: case 91: case 92: case 95: case 99: case 105: case 164: case 188: case 189: case 191: case 221: case 222: case 240: case 246: +this.$ = $$[$0]; +break; +case 11: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.StatementLiteral($$[$0])); +break; +case 27: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Op($$[$0], new yy.Value(new yy.Literal('')))); +break; +case 28: case 250: case 251: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op($$[$0-1], $$[$0])); +break; +case 29: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-2].concat($$[$0-1]), $$[$0])); +break; +case 30: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Block); +break; +case 31: case 106: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-1]); +break; +case 32: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.IdentifierLiteral($$[$0])); +break; +case 33: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.PropertyName($$[$0])); +break; +case 34: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.NumberLiteral($$[$0])); +break; +case 36: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.StringLiteral($$[$0])); +break; +case 37: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.StringWithInterpolations($$[$0-1])); +break; +case 38: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.RegexLiteral($$[$0])); +break; +case 39: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.RegexWithInterpolations($$[$0-1].args)); +break; +case 41: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.PassthroughLiteral($$[$0])); +break; +case 43: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.UndefinedLiteral); +break; +case 44: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.NullLiteral); +break; +case 45: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.BooleanLiteral($$[$0])); +break; +case 46: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.InfinityLiteral($$[$0])); +break; +case 47: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.NaNLiteral); +break; +case 48: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign($$[$0-2], $$[$0])); +break; +case 49: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Assign($$[$0-3], $$[$0])); +break; +case 50: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign($$[$0-4], $$[$0-1])); +break; +case 51: case 88: case 93: case 94: case 96: case 97: case 98: case 223: case 224: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0])); +break; +case 52: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-2])(new yy.Value($$[$0-2])), $$[$0], 'object', { + operatorToken: yy.addLocationDataFn(_$[$0-1])(new yy.Literal($$[$0-1])) + })); +break; +case 53: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-4])(new yy.Value($$[$0-4])), $$[$0-1], 'object', { + operatorToken: yy.addLocationDataFn(_$[$0-3])(new yy.Literal($$[$0-3])) + })); +break; +case 54: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-2])(new yy.Value($$[$0-2])), $$[$0], null, { + operatorToken: yy.addLocationDataFn(_$[$0-1])(new yy.Literal($$[$0-1])) + })); +break; +case 55: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-4])(new yy.Value($$[$0-4])), $$[$0-1], null, { + operatorToken: yy.addLocationDataFn(_$[$0-3])(new yy.Literal($$[$0-3])) + })); +break; +case 62: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Return($$[$0])); +break; +case 63: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Return(new yy.Value($$[$0-1]))); +break; +case 64: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Return); +break; +case 65: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.YieldReturn($$[$0])); +break; +case 66: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.YieldReturn); +break; +case 67: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Comment($$[$0])); +break; +case 68: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Code($$[$0-3], $$[$0], $$[$0-1])); +break; +case 69: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Code([], $$[$0], $$[$0-1])); +break; +case 70: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])('func'); +break; +case 71: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])('boundfunc'); +break; +case 74: case 111: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([]); +break; +case 75: case 112: case 131: case 151: case 183: case 225: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]); +break; +case 76: case 113: case 132: case 152: case 184: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].concat($$[$0])); +break; +case 77: case 114: case 133: case 153: case 185: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-3].concat($$[$0])); +break; +case 78: case 115: case 135: case 155: case 187: +this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])($$[$0-5].concat($$[$0-2])); +break; +case 79: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Param($$[$0])); +break; +case 80: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Param($$[$0-1], null, true)); +break; +case 81: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Param($$[$0-2], $$[$0])); +break; +case 82: case 190: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Expansion); +break; +case 87: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Splat($$[$0-1])); +break; +case 89: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].add($$[$0])); +break; +case 90: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Value($$[$0-1], [].concat($$[$0]))); +break; +case 100: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Access($$[$0])); +break; +case 101: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Access($$[$0], 'soak')); +break; +case 102: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Access(new yy.PropertyName('prototype'))), yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))]); +break; +case 103: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Access(new yy.PropertyName('prototype'), 'soak')), yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))]); +break; +case 104: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Access(new yy.PropertyName('prototype'))); +break; +case 107: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(yy.extend($$[$0], { + soak: true + })); +break; +case 108: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Index($$[$0])); +break; +case 109: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Slice($$[$0])); +break; +case 110: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Obj($$[$0-2], $$[$0-3].generated)); +break; +case 116: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Class); +break; +case 117: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Class(null, null, $$[$0])); +break; +case 118: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Class(null, $$[$0])); +break; +case 119: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Class(null, $$[$0-1], $$[$0])); +break; +case 120: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Class($$[$0])); +break; +case 121: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Class($$[$0-1], null, $$[$0])); +break; +case 122: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Class($$[$0-2], $$[$0])); +break; +case 123: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Class($$[$0-3], $$[$0-1], $$[$0])); +break; +case 124: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.ImportDeclaration(null, $$[$0])); +break; +case 125: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause($$[$0-2], null), $$[$0])); +break; +case 126: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause(null, $$[$0-2]), $$[$0])); +break; +case 127: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause(null, new yy.ImportSpecifierList([])), $$[$0])); +break; +case 128: +this.$ = yy.addLocationDataFn(_$[$0-6], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause(null, new yy.ImportSpecifierList($$[$0-4])), $$[$0])); +break; +case 129: +this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause($$[$0-4], $$[$0-2]), $$[$0])); +break; +case 130: +this.$ = yy.addLocationDataFn(_$[$0-8], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause($$[$0-7], new yy.ImportSpecifierList($$[$0-4])), $$[$0])); +break; +case 134: case 154: case 170: case 186: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-2]); +break; +case 136: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.ImportSpecifier($$[$0])); +break; +case 137: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ImportSpecifier($$[$0-2], $$[$0])); +break; +case 138: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.ImportSpecifier(new yy.Literal($$[$0]))); +break; +case 139: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ImportSpecifier(new yy.Literal($$[$0-2]), $$[$0])); +break; +case 140: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.ImportDefaultSpecifier($$[$0])); +break; +case 141: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ImportNamespaceSpecifier(new yy.Literal($$[$0-2]), $$[$0])); +break; +case 142: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([]))); +break; +case 143: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-2]))); +break; +case 144: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.ExportNamedDeclaration($$[$0])); +break; +case 145: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.ExportNamedDeclaration(new yy.Assign($$[$0-2], $$[$0], null, { + moduleDeclaration: 'export' + }))); +break; +case 146: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.ExportNamedDeclaration(new yy.Assign($$[$0-3], $$[$0], null, { + moduleDeclaration: 'export' + }))); +break; +case 147: +this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])(new yy.ExportNamedDeclaration(new yy.Assign($$[$0-4], $$[$0-1], null, { + moduleDeclaration: 'export' + }))); +break; +case 148: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ExportDefaultDeclaration($$[$0])); +break; +case 149: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.ExportAllDeclaration(new yy.Literal($$[$0-2]), $$[$0])); +break; +case 150: +this.$ = yy.addLocationDataFn(_$[$0-6], _$[$0])(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-4]), $$[$0])); +break; +case 156: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.ExportSpecifier($$[$0])); +break; +case 157: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ExportSpecifier($$[$0-2], $$[$0])); +break; +case 158: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ExportSpecifier($$[$0-2], new yy.Literal($$[$0]))); +break; +case 159: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.ExportSpecifier(new yy.Literal($$[$0]))); +break; +case 160: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ExportSpecifier(new yy.Literal($$[$0-2]), $$[$0])); +break; +case 161: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.TaggedTemplateCall($$[$0-2], $$[$0], $$[$0-1])); +break; +case 162: case 163: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Call($$[$0-2], $$[$0], $$[$0-1])); +break; +case 165: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.SuperCall); +break; +case 166: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.SuperCall($$[$0])); +break; +case 167: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(false); +break; +case 168: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(true); +break; +case 169: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([]); +break; +case 171: case 172: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value(new yy.ThisLiteral)); +break; +case 173: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Value(yy.addLocationDataFn(_$[$0-1])(new yy.ThisLiteral), [yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))], 'this')); +break; +case 174: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Arr([])); +break; +case 175: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Arr($$[$0-2])); +break; +case 176: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])('inclusive'); +break; +case 177: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])('exclusive'); +break; +case 178: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Range($$[$0-3], $$[$0-1], $$[$0-2])); +break; +case 179: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Range($$[$0-2], $$[$0], $$[$0-1])); +break; +case 180: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Range($$[$0-1], null, $$[$0])); +break; +case 181: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Range(null, $$[$0], $$[$0-1])); +break; +case 182: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Range(null, null, $$[$0])); +break; +case 192: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([].concat($$[$0-2], $$[$0])); +break; +case 193: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Try($$[$0])); +break; +case 194: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Try($$[$0-1], $$[$0][0], $$[$0][1])); +break; +case 195: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Try($$[$0-2], null, null, $$[$0])); +break; +case 196: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Try($$[$0-3], $$[$0-2][0], $$[$0-2][1], $$[$0])); +break; +case 197: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([$$[$0-1], $$[$0]]); +break; +case 198: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Value($$[$0-1])), $$[$0]]); +break; +case 199: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([null, $$[$0]]); +break; +case 200: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Throw($$[$0])); +break; +case 201: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Parens($$[$0-1])); +break; +case 202: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Parens($$[$0-2])); +break; +case 203: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While($$[$0])); +break; +case 204: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.While($$[$0-2], { + guard: $$[$0] + })); +break; +case 205: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While($$[$0], { + invert: true + })); +break; +case 206: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.While($$[$0-2], { + invert: true, + guard: $$[$0] + })); +break; +case 207: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].addBody($$[$0])); +break; +case 208: case 209: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0].addBody(yy.addLocationDataFn(_$[$0-1])(yy.Block.wrap([$$[$0-1]])))); +break; +case 210: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])($$[$0]); +break; +case 211: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While(yy.addLocationDataFn(_$[$0-1])(new yy.BooleanLiteral('true'))).addBody($$[$0])); +break; +case 212: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While(yy.addLocationDataFn(_$[$0-1])(new yy.BooleanLiteral('true'))).addBody(yy.addLocationDataFn(_$[$0])(yy.Block.wrap([$$[$0]])))); +break; +case 213: case 214: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0-1], $$[$0])); +break; +case 215: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0], $$[$0-1])); +break; +case 216: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({ + source: yy.addLocationDataFn(_$[$0])(new yy.Value($$[$0])) + }); +break; +case 217: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({ + source: yy.addLocationDataFn(_$[$0-2])(new yy.Value($$[$0-2])), + step: $$[$0] + }); +break; +case 218: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])((function () { + $$[$0].own = $$[$0-1].own; + $$[$0].ownTag = $$[$0-1].ownTag; + $$[$0].name = $$[$0-1][0]; + $$[$0].index = $$[$0-1][1]; + return $$[$0]; + }())); +break; +case 219: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0]); +break; +case 220: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () { + $$[$0].own = true; + $$[$0].ownTag = yy.addLocationDataFn(_$[$0-1])(new yy.Literal($$[$0-1])); + return $$[$0]; + }())); +break; +case 226: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([$$[$0-2], $$[$0]]); +break; +case 227: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({ + source: $$[$0] + }); +break; +case 228: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({ + source: $$[$0], + object: true + }); +break; +case 229: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({ + source: $$[$0-2], + guard: $$[$0] + }); +break; +case 230: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({ + source: $$[$0-2], + guard: $$[$0], + object: true + }); +break; +case 231: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({ + source: $$[$0-2], + step: $$[$0] + }); +break; +case 232: +this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])({ + source: $$[$0-4], + guard: $$[$0-2], + step: $$[$0] + }); +break; +case 233: +this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])({ + source: $$[$0-4], + step: $$[$0-2], + guard: $$[$0] + }); +break; +case 234: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({ + source: $$[$0], + from: true + }); +break; +case 235: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({ + source: $$[$0-2], + guard: $$[$0], + from: true + }); +break; +case 236: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Switch($$[$0-3], $$[$0-1])); +break; +case 237: +this.$ = yy.addLocationDataFn(_$[$0-6], _$[$0])(new yy.Switch($$[$0-5], $$[$0-3], $$[$0-1])); +break; +case 238: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Switch(null, $$[$0-1])); +break; +case 239: +this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])(new yy.Switch(null, $$[$0-3], $$[$0-1])); +break; +case 241: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].concat($$[$0])); +break; +case 242: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([[$$[$0-1], $$[$0]]]); +break; +case 243: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])([[$$[$0-2], $$[$0-1]]]); +break; +case 244: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0-1], $$[$0], { + type: $$[$0-2] + })); +break; +case 245: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])($$[$0-4].addElse(yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0-1], $$[$0], { + type: $$[$0-2] + })))); +break; +case 247: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].addElse($$[$0])); +break; +case 248: case 249: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0], yy.addLocationDataFn(_$[$0-2])(yy.Block.wrap([$$[$0-2]])), { + type: $$[$0-1], + statement: true + })); +break; +case 252: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('-', $$[$0])); +break; +case 253: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('+', $$[$0])); +break; +case 254: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('--', $$[$0])); +break; +case 255: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('++', $$[$0])); +break; +case 256: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('--', $$[$0-1], null, true)); +break; +case 257: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('++', $$[$0-1], null, true)); +break; +case 258: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Existence($$[$0-1])); +break; +case 259: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op('+', $$[$0-2], $$[$0])); +break; +case 260: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op('-', $$[$0-2], $$[$0])); +break; +case 261: case 262: case 263: case 264: case 265: case 266: case 267: case 268: case 269: case 270: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-1], $$[$0-2], $$[$0])); +break; +case 271: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () { + if ($$[$0-1].charAt(0) === '!') { + return new yy.Op($$[$0-1].slice(1), $$[$0-2], $$[$0]).invert(); + } else { + return new yy.Op($$[$0-1], $$[$0-2], $$[$0]); + } + }())); +break; +case 272: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign($$[$0-2], $$[$0], $$[$0-1])); +break; +case 273: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign($$[$0-4], $$[$0-1], $$[$0-3])); +break; +case 274: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Assign($$[$0-3], $$[$0], $$[$0-2])); +break; +case 275: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Extends($$[$0-2], $$[$0])); +break; +} +}, +table: [{1:[2,1],3:1,4:2,5:3,7:4,8:5,9:6,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{1:[3]},{1:[2,2],6:$VG},o($VH,[2,3]),o($VH,[2,6],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VH,[2,7],{141:77,132:105,138:106,133:$Vu,135:$Vv,139:$Vx,156:$VX}),o($VH,[2,8]),o($VY,[2,14],{109:107,78:108,86:114,40:$VZ,41:$VZ,114:$VZ,82:$V_,83:$V$,84:$V01,85:$V11,87:$V21,90:$V31,113:$V41}),o($VY,[2,15],{86:114,109:117,78:118,82:$V_,83:$V$,84:$V01,85:$V11,87:$V21,90:$V31,113:$V41,114:$VZ}),o($VY,[2,16]),o($VY,[2,17]),o($VY,[2,18]),o($VY,[2,19]),o($VY,[2,20]),o($VY,[2,21]),o($VY,[2,22]),o($VY,[2,23]),o($VY,[2,24]),o($VY,[2,25]),o($VY,[2,26]),o($V51,[2,9]),o($V51,[2,10]),o($V51,[2,11]),o($V51,[2,12]),o($V51,[2,13]),o([1,6,32,42,131,133,135,139,156,163,164,165,166,167,168,169,170,171,172,173,174],$V61,{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,7:120,8:122,12:$V0,28:$V71,29:$V81,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:[1,119],63:$Vf,64:$Vg,68:$Vh,69:$Vi,92:$Vj,95:$Vk,97:$Vl,105:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,137:$Vw,149:$Vy,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF}),o($V91,$Va1,{55:[1,124]}),o($V91,[2,96]),o($V91,[2,97]),o($V91,[2,98]),o($V91,[2,99]),o($Vb1,[2,164]),o([6,31,66,71],$Vc1,{65:125,72:126,73:127,33:129,60:130,75:131,62:132,34:$V2,74:$Vd1,92:$Vj,118:$Ve1,119:$Vf1}),{30:135,31:$Vg1},{7:137,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:138,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:139,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:140,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{15:142,16:143,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:144,60:71,62:54,75:53,77:141,79:28,80:29,81:30,92:$Vj,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,130:$Vt},{15:142,16:143,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:144,60:71,62:54,75:53,77:145,79:28,80:29,81:30,92:$Vj,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,130:$Vt},o($Vh1,$Vi1,{96:[1,149],161:[1,146],162:[1,147],175:[1,148]}),o($VY,[2,246],{151:[1,150]}),{30:151,31:$Vg1},{30:152,31:$Vg1},o($VY,[2,210]),{30:153,31:$Vg1},{7:154,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:[1,155],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($Vj1,[2,116],{47:27,79:28,80:29,81:30,111:31,75:53,62:54,37:55,43:57,33:70,60:71,39:80,15:142,16:143,54:144,30:156,77:158,31:$Vg1,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,92:$Vj,96:[1,157],112:$Vn,117:$Vo,118:$Vp,119:$Vq,130:$Vt}),{7:159,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($V51,$Vk1,{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,8:122,7:160,12:$V0,28:$V71,31:$Vl1,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:$Ve,63:$Vf,64:$Vg,68:$Vh,69:$Vi,92:$Vj,95:$Vk,97:$Vl,105:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,137:$Vw,149:$Vy,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF}),o([1,6,31,32,42,71,94,131,133,135,139,156],[2,67]),{33:166,34:$V2,39:162,40:$V4,41:$V5,92:[1,165],98:163,99:164,104:$Vm1},{25:169,33:170,34:$V2,92:[1,168],95:$Vk,103:[1,171],107:[1,172]},o($Vh1,[2,93]),o($Vh1,[2,94]),o($V91,[2,40]),o($V91,[2,41]),o($V91,[2,42]),o($V91,[2,43]),o($V91,[2,44]),o($V91,[2,45]),o($V91,[2,46]),o($V91,[2,47]),{4:173,5:3,7:4,8:5,9:6,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V1,31:[1,174],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:175,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:$Vn1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,74:$Vo1,75:53,76:180,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,116:177,117:$Vo,118:$Vp,119:$Vq,120:$Vp1,123:178,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($V91,[2,171]),o($V91,[2,172],{35:182,36:$Vq1}),o([1,6,31,32,42,46,66,71,74,82,83,84,85,87,89,90,94,113,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],[2,165],{110:184,114:$Vr1}),{31:[2,70]},{31:[2,71]},o($Vs1,[2,88]),o($Vs1,[2,91]),{7:186,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:187,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:188,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:190,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,30:189,31:$Vg1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{33:195,34:$V2,60:196,62:198,75:197,80:191,92:$Vj,118:$Ve1,119:$Vq,143:192,144:[1,193],145:194},{142:199,146:[1,200],147:[1,201],148:[1,202]},o([6,31,71,94],$Vt1,{39:80,93:203,56:204,57:205,59:206,11:207,37:208,33:209,35:210,60:211,34:$V2,36:$Vq1,38:$V3,40:$V4,41:$V5,63:$Vf,118:$Ve1}),o($Vu1,[2,34]),o($Vu1,[2,35]),o($V91,[2,38]),{15:142,16:212,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:144,60:71,62:54,75:53,77:213,79:28,80:29,81:30,92:$Vj,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,130:$Vt},o([1,6,29,31,32,40,41,42,55,58,66,71,74,82,83,84,85,87,89,90,94,96,102,113,114,115,120,122,131,133,134,135,139,140,146,147,148,156,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175],[2,32]),o($Vv1,[2,36]),{4:214,5:3,7:4,8:5,9:6,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VH,[2,5],{7:4,8:5,9:6,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,5:215,12:$V0,28:$V1,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:$Ve,63:$Vf,64:$Vg,68:$Vh,69:$Vi,92:$Vj,95:$Vk,97:$Vl,105:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,133:$Vu,135:$Vv,137:$Vw,139:$Vx,149:$Vy,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF}),o($VY,[2,258]),{7:216,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:217,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:218,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:219,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:220,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:221,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:222,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:223,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:224,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:225,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:226,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:227,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:228,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:229,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VY,[2,209]),o($VY,[2,214]),{7:230,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VY,[2,208]),o($VY,[2,213]),{39:231,40:$V4,41:$V5,110:232,114:$Vr1},o($Vs1,[2,89]),o($Vw1,[2,168]),{35:233,36:$Vq1},{35:234,36:$Vq1},o($Vs1,[2,104],{35:235,36:$Vq1}),{35:236,36:$Vq1},o($Vs1,[2,105]),{7:238,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,74:$Vx1,75:53,77:40,79:28,80:29,81:30,88:237,91:239,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,121:240,122:$Vy1,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{86:243,87:$V21,90:$V31},{110:244,114:$Vr1},o($Vs1,[2,90]),o($VH,[2,66],{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,8:122,7:245,12:$V0,28:$V71,31:$Vl1,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:$Ve,63:$Vf,64:$Vg,68:$Vh,69:$Vi,92:$Vj,95:$Vk,97:$Vl,105:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,133:$Vk1,135:$Vk1,139:$Vk1,156:$Vk1,137:$Vw,149:$Vy,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF}),o($Vz1,[2,28],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{7:246,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{132:105,133:$Vu,135:$Vv,138:106,139:$Vx,141:77,156:$VX},o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,163,164,165,166,167,168,169,170,171,172,173,174],$V61,{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,7:120,8:122,12:$V0,28:$V71,29:$V81,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:$Ve,63:$Vf,64:$Vg,68:$Vh,69:$Vi,92:$Vj,95:$Vk,97:$Vl,105:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,137:$Vw,149:$Vy,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF}),{6:[1,248],7:247,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:[1,249],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o([6,31],$VA1,{70:252,66:[1,250],71:$VB1}),o($VC1,[2,75]),o($VC1,[2,79],{55:[1,254],74:[1,253]}),o($VC1,[2,82]),o($VD1,[2,83]),o($VD1,[2,84]),o($VD1,[2,85]),o($VD1,[2,86]),{35:182,36:$Vq1},{7:255,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:$Vn1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,74:$Vo1,75:53,76:180,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,116:177,117:$Vo,118:$Vp,119:$Vq,120:$Vp1,123:178,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VY,[2,69]),{4:257,5:3,7:4,8:5,9:6,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V1,32:[1,256],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,159,160,164,165,166,167,168,169,170,171,172,173,174],[2,250],{141:77,132:102,138:103,163:$VL}),o($VE1,[2,251],{141:77,132:102,138:103,163:$VL,165:$VN}),o($VE1,[2,252],{141:77,132:102,138:103,163:$VL,165:$VN}),o($VE1,[2,253],{141:77,132:102,138:103,163:$VL,165:$VN}),o($VY,[2,254],{40:$Vi1,41:$Vi1,82:$Vi1,83:$Vi1,84:$Vi1,85:$Vi1,87:$Vi1,90:$Vi1,113:$Vi1,114:$Vi1}),o($Vw1,$VZ,{109:107,78:108,86:114,82:$V_,83:$V$,84:$V01,85:$V11,87:$V21,90:$V31,113:$V41}),{78:118,82:$V_,83:$V$,84:$V01,85:$V11,86:114,87:$V21,90:$V31,109:117,113:$V41,114:$VZ},o($VF1,$Va1),o($VY,[2,255],{40:$Vi1,41:$Vi1,82:$Vi1,83:$Vi1,84:$Vi1,85:$Vi1,87:$Vi1,90:$Vi1,113:$Vi1,114:$Vi1}),o($VY,[2,256]),o($VY,[2,257]),{6:[1,260],7:258,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:[1,259],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:261,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{30:262,31:$Vg1,155:[1,263]},o($VY,[2,193],{126:264,127:[1,265],128:[1,266]}),o($VY,[2,207]),o($VY,[2,215]),{31:[1,267],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},{150:268,152:269,153:$VG1},o($VY,[2,117]),{7:271,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($Vj1,[2,120],{30:272,31:$Vg1,40:$Vi1,41:$Vi1,82:$Vi1,83:$Vi1,84:$Vi1,85:$Vi1,87:$Vi1,90:$Vi1,113:$Vi1,114:$Vi1,96:[1,273]}),o($Vz1,[2,200],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($V51,$VH1,{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{62:274,92:$Vj},o($V51,[2,124]),{29:[1,275],71:[1,276]},{29:[1,277]},{31:$VI1,33:282,34:$V2,94:[1,278],100:279,101:280,103:$VJ1},o([29,71],[2,140]),{102:[1,284]},{31:$VK1,33:289,34:$V2,94:[1,285],103:$VL1,106:286,108:287},o($V51,[2,144]),{55:[1,291]},{7:292,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{29:[1,293]},{6:$VG,131:[1,294]},{4:295,5:3,7:4,8:5,9:6,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o([6,31,71,120],$VM1,{141:77,132:102,138:103,121:296,74:[1,297],122:$Vy1,133:$Vu,135:$Vv,139:$Vx,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VN1,[2,174]),o([6,31,120],$VA1,{70:298,71:$VO1}),o($VP1,[2,183]),{7:255,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:$Vn1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,74:$Vo1,75:53,76:180,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,116:300,117:$Vo,118:$Vp,119:$Vq,123:178,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VP1,[2,189]),o($VP1,[2,190]),o($VQ1,[2,173]),o($VQ1,[2,33]),o($Vb1,[2,166]),{7:255,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:$Vn1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,74:$Vo1,75:53,76:180,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,115:[1,301],116:302,117:$Vo,118:$Vp,119:$Vq,123:178,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{30:303,31:$Vg1,132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},o($VR1,[2,203],{141:77,132:102,138:103,133:$Vu,134:[1,304],135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VR1,[2,205],{141:77,132:102,138:103,133:$Vu,134:[1,305],135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VY,[2,211]),o($VS1,[2,212],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],[2,216],{140:[1,306]}),o($VT1,[2,219]),{33:195,34:$V2,60:196,62:198,75:197,92:$Vj,118:$Ve1,119:$Vf1,143:307,145:194},o($VT1,[2,225],{71:[1,308]}),o($VU1,[2,221]),o($VU1,[2,222]),o($VU1,[2,223]),o($VU1,[2,224]),o($VY,[2,218]),{7:309,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:310,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:311,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VV1,$VA1,{70:312,71:$VW1}),o($VX1,[2,112]),o($VX1,[2,51],{58:[1,314]}),o($VY1,[2,60],{55:[1,315]}),o($VX1,[2,56]),o($VY1,[2,61]),o($VZ1,[2,57]),o($VZ1,[2,58]),o($VZ1,[2,59]),{46:[1,316],78:118,82:$V_,83:$V$,84:$V01,85:$V11,86:114,87:$V21,90:$V31,109:117,113:$V41,114:$VZ},o($VF1,$Vi1),{6:$VG,42:[1,317]},o($VH,[2,4]),o($V_1,[2,259],{141:77,132:102,138:103,163:$VL,164:$VM,165:$VN}),o($V_1,[2,260],{141:77,132:102,138:103,163:$VL,164:$VM,165:$VN}),o($VE1,[2,261],{141:77,132:102,138:103,163:$VL,165:$VN}),o($VE1,[2,262],{141:77,132:102,138:103,163:$VL,165:$VN}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,166,167,168,169,170,171,172,173,174],[2,263],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,167,168,169,170,171,172,173],[2,264],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,174:$VW}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,168,169,170,171,172,173],[2,265],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,174:$VW}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,169,170,171,172,173],[2,266],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,174:$VW}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,170,171,172,173],[2,267],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,174:$VW}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,171,172,173],[2,268],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,174:$VW}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,172,173],[2,269],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,174:$VW}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,173],[2,270],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,174:$VW}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,167,168,169,170,171,172,173,174],[2,271],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO}),o($VS1,[2,249],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VS1,[2,248],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vb1,[2,161]),o($Vb1,[2,162]),o($Vs1,[2,100]),o($Vs1,[2,101]),o($Vs1,[2,102]),o($Vs1,[2,103]),{89:[1,318]},{74:$Vx1,89:[2,108],121:319,122:$Vy1,132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},{89:[2,109]},{7:320,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,89:[2,182],92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($V$1,[2,176]),o($V$1,$V02),o($Vs1,[2,107]),o($Vb1,[2,163]),o($VH,[2,65],{141:77,132:102,138:103,133:$VH1,135:$VH1,139:$VH1,156:$VH1,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vz1,[2,29],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vz1,[2,48],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{7:321,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:322,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{67:323,68:$Vh,69:$Vi},o($V12,$V22,{73:127,33:129,60:130,75:131,62:132,72:324,34:$V2,74:$Vd1,92:$Vj,118:$Ve1,119:$Vf1}),{6:$V32,31:$V42},o($VC1,[2,80]),{7:327,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VP1,$VM1,{141:77,132:102,138:103,74:[1,328],133:$Vu,135:$Vv,139:$Vx,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($V52,[2,30]),{6:$VG,32:[1,329]},o($Vz1,[2,272],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{7:330,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:331,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($Vz1,[2,275],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VY,[2,247]),{7:332,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VY,[2,194],{127:[1,333]}),{30:334,31:$Vg1},{30:337,31:$Vg1,33:335,34:$V2,62:336,92:$Vj},{150:338,152:269,153:$VG1},{32:[1,339],151:[1,340],152:341,153:$VG1},o($V62,[2,240]),{7:343,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,124:342,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($V72,[2,118],{141:77,132:102,138:103,30:344,31:$Vg1,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VY,[2,121]),{7:345,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{32:[1,346]},{39:347,40:$V4,41:$V5},{92:[1,349],99:348,104:$Vm1},{39:350,40:$V4,41:$V5},{29:[1,351]},o($VV1,$VA1,{70:352,71:$V82}),o($VX1,[2,131]),{31:$VI1,33:282,34:$V2,100:354,101:280,103:$VJ1},o($VX1,[2,136],{102:[1,355]}),o($VX1,[2,138],{102:[1,356]}),{33:357,34:$V2},o($V51,[2,142]),o($VV1,$VA1,{70:358,71:$V92}),o($VX1,[2,151]),{31:$VK1,33:289,34:$V2,103:$VL1,106:360,108:287},o($VX1,[2,156],{102:[1,361]}),o($VX1,[2,159],{102:[1,362]}),{6:[1,364],7:363,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:[1,365],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($Va2,[2,148],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{39:366,40:$V4,41:$V5},o($V91,[2,201]),{6:$VG,32:[1,367]},{7:368,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o([12,28,34,38,40,41,44,45,48,49,50,51,52,53,61,63,64,68,69,92,95,97,105,112,117,118,119,125,129,130,133,135,137,139,149,155,157,158,159,160,161,162],$V02,{6:$Vb2,31:$Vb2,71:$Vb2,120:$Vb2}),{6:$Vc2,31:$Vd2,120:[1,369]},o([6,31,32,115,120],$V22,{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,8:122,76:180,7:255,123:372,12:$V0,28:$V71,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:$Ve,63:$Vf,64:$Vg,68:$Vh,69:$Vi,74:$Vo1,92:$Vj,95:$Vk,97:$Vl,105:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,133:$Vu,135:$Vv,137:$Vw,139:$Vx,149:$Vy,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF}),o($V12,$VA1,{70:373,71:$VO1}),o($Vb1,[2,169]),o([6,31,115],$VA1,{70:374,71:$VO1}),o($Ve2,[2,244]),{7:375,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:376,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:377,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VT1,[2,220]),{33:195,34:$V2,60:196,62:198,75:197,92:$Vj,118:$Ve1,119:$Vf1,145:378},o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,135,139,156],[2,227],{141:77,132:102,138:103,134:[1,379],140:[1,380],159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vf2,[2,228],{141:77,132:102,138:103,134:[1,381],159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vf2,[2,234],{141:77,132:102,138:103,134:[1,382],159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{6:$Vg2,31:$Vh2,94:[1,383]},o($Vi2,$V22,{39:80,57:205,59:206,11:207,37:208,33:209,35:210,60:211,56:386,34:$V2,36:$Vq1,38:$V3,40:$V4,41:$V5,63:$Vf,118:$Ve1}),{7:387,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:[1,388],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:389,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:[1,390],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($V91,[2,39]),o($Vv1,[2,37]),o($Vs1,[2,106]),{7:391,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,89:[2,180],92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{89:[2,181],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},o($Vz1,[2,49],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{32:[1,392],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},{30:393,31:$Vg1},o($VC1,[2,76]),{33:129,34:$V2,60:130,62:132,72:394,73:127,74:$Vd1,75:131,92:$Vj,118:$Ve1,119:$Vf1},o($Vj2,$Vc1,{72:126,73:127,33:129,60:130,75:131,62:132,65:395,34:$V2,74:$Vd1,92:$Vj,118:$Ve1,119:$Vf1}),o($VC1,[2,81],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VP1,$Vb2),o($V52,[2,31]),{32:[1,396],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},o($Vz1,[2,274],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{30:397,31:$Vg1,132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},{30:398,31:$Vg1},o($VY,[2,195]),{30:399,31:$Vg1},{30:400,31:$Vg1},o($Vk2,[2,199]),{32:[1,401],151:[1,402],152:341,153:$VG1},o($VY,[2,238]),{30:403,31:$Vg1},o($V62,[2,241]),{30:404,31:$Vg1,71:[1,405]},o($Vl2,[2,191],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VY,[2,119]),o($V72,[2,122],{141:77,132:102,138:103,30:406,31:$Vg1,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($V51,[2,63]),o($V51,[2,125]),{29:[1,407]},{31:$VI1,33:282,34:$V2,100:408,101:280,103:$VJ1},o($V51,[2,126]),{39:409,40:$V4,41:$V5},{6:$Vm2,31:$Vn2,94:[1,410]},o($Vi2,$V22,{33:282,101:413,34:$V2,103:$VJ1}),o($V12,$VA1,{70:414,71:$V82}),{33:415,34:$V2},{33:416,34:$V2},{29:[2,141]},{6:$Vo2,31:$Vp2,94:[1,417]},o($Vi2,$V22,{33:289,108:420,34:$V2,103:$VL1}),o($V12,$VA1,{70:421,71:$V92}),{33:422,34:$V2,103:[1,423]},{33:424,34:$V2},o($Va2,[2,145],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{7:425,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:426,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($V51,[2,149]),{131:[1,427]},{120:[1,428],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},o($VN1,[2,175]),{7:255,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,74:$Vo1,75:53,76:180,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,123:429,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:255,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:$Vn1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,74:$Vo1,75:53,76:180,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,116:430,117:$Vo,118:$Vp,119:$Vq,123:178,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VP1,[2,184]),{6:$Vc2,31:$Vd2,32:[1,431]},{6:$Vc2,31:$Vd2,115:[1,432]},o($VS1,[2,204],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VS1,[2,206],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VS1,[2,217],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VT1,[2,226]),{7:433,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:434,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:435,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:436,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VN1,[2,110]),{11:207,33:209,34:$V2,35:210,36:$Vq1,37:208,38:$V3,39:80,40:$V4,41:$V5,56:437,57:205,59:206,60:211,63:$Vf,118:$Ve1},o($Vj2,$Vt1,{39:80,56:204,57:205,59:206,11:207,37:208,33:209,35:210,60:211,93:438,34:$V2,36:$Vq1,38:$V3,40:$V4,41:$V5,63:$Vf,118:$Ve1}),o($VX1,[2,113]),o($VX1,[2,52],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{7:439,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VX1,[2,54],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{7:440,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{89:[2,179],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},o($VY,[2,50]),o($VY,[2,68]),o($VC1,[2,77]),o($V12,$VA1,{70:441,71:$VB1}),o($VY,[2,273]),o($Ve2,[2,245]),o($VY,[2,196]),o($Vk2,[2,197]),o($Vk2,[2,198]),o($VY,[2,236]),{30:442,31:$Vg1},{32:[1,443]},o($V62,[2,242],{6:[1,444]}),{7:445,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VY,[2,123]),{39:446,40:$V4,41:$V5},o($VV1,$VA1,{70:447,71:$V82}),o($V51,[2,127]),{29:[1,448]},{33:282,34:$V2,101:449,103:$VJ1},{31:$VI1,33:282,34:$V2,100:450,101:280,103:$VJ1},o($VX1,[2,132]),{6:$Vm2,31:$Vn2,32:[1,451]},o($VX1,[2,137]),o($VX1,[2,139]),o($V51,[2,143],{29:[1,452]}),{33:289,34:$V2,103:$VL1,108:453},{31:$VK1,33:289,34:$V2,103:$VL1,106:454,108:287},o($VX1,[2,152]),{6:$Vo2,31:$Vp2,32:[1,455]},o($VX1,[2,157]),o($VX1,[2,158]),o($VX1,[2,160]),o($Va2,[2,146],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{32:[1,456],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},o($V91,[2,202]),o($V91,[2,178]),o($VP1,[2,185]),o($V12,$VA1,{70:457,71:$VO1}),o($VP1,[2,186]),o($Vb1,[2,170]),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,156],[2,229],{141:77,132:102,138:103,140:[1,458],159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vf2,[2,231],{141:77,132:102,138:103,134:[1,459],159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vz1,[2,230],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vz1,[2,235],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VX1,[2,114]),o($V12,$VA1,{70:460,71:$VW1}),{32:[1,461],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},{32:[1,462],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},{6:$V32,31:$V42,32:[1,463]},{32:[1,464]},o($VY,[2,239]),o($V62,[2,243]),o($Vl2,[2,192],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($V51,[2,129]),{6:$Vm2,31:$Vn2,94:[1,465]},{39:466,40:$V4,41:$V5},o($VX1,[2,133]),o($V12,$VA1,{70:467,71:$V82}),o($VX1,[2,134]),{39:468,40:$V4,41:$V5},o($VX1,[2,153]),o($V12,$VA1,{70:469,71:$V92}),o($VX1,[2,154]),o($V51,[2,147]),{6:$Vc2,31:$Vd2,32:[1,470]},{7:471,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:472,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{6:$Vg2,31:$Vh2,32:[1,473]},o($VX1,[2,53]),o($VX1,[2,55]),o($VC1,[2,78]),o($VY,[2,237]),{29:[1,474]},o($V51,[2,128]),{6:$Vm2,31:$Vn2,32:[1,475]},o($V51,[2,150]),{6:$Vo2,31:$Vp2,32:[1,476]},o($VP1,[2,187]),o($Vz1,[2,232],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vz1,[2,233],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VX1,[2,115]),{39:477,40:$V4,41:$V5},o($VX1,[2,135]),o($VX1,[2,155]),o($V51,[2,130])], +defaultActions: {68:[2,70],69:[2,71],239:[2,109],357:[2,141]}, +parseError: function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + function _parseError (msg, hash) { + this.message = msg; + this.hash = hash; + } + _parseError.prototype = Error; + + throw new _parseError(str, hash); + } +}, +parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer; + sharedState.yy.parser = this; + if (typeof lexer.yylloc == 'undefined') { + lexer.yylloc = {}; + } + var yyloc = lexer.yylloc; + lstack.push(yyloc); + var ranges = lexer.options && lexer.options.ranges; + if (typeof sharedState.yy.parseError === 'function') { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + _token_stack: + var lex = function () { + var token; + token = lexer.lex() || EOF; + if (typeof token !== 'number') { + token = self.symbols_[token] || token; + } + return token; + }; + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == 'undefined') { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === 'undefined' || !action.length || !action[0]) { + var errStr = ''; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push('\'' + this.terminals_[p] + '\''); + } + } + if (lexer.showPosition) { + errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; + } else { + errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); + } + this.parseError(errStr, { + text: lexer.match, + token: this.terminals_[symbol] || symbol, + line: lexer.yylineno, + loc: yyloc, + expected: expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer.yytext); + lstack.push(lexer.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer.yyleng; + yytext = lexer.yytext; + yylineno = lexer.yylineno; + yyloc = lexer.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== 'undefined') { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; +}}; + +function Parser () { + this.yy = {}; +} +Parser.prototype = parser;parser.Parser = Parser; +return new Parser; +})(); + + +if (typeof require !== 'undefined' && typeof exports !== 'undefined') { +exports.parser = parser; +exports.Parser = parser.Parser; +exports.parse = function () { return parser.parse.apply(parser, arguments); }; +exports.main = function commonjsMain(args) { + if (!args[1]) { + console.log('Usage: '+args[0]+' FILE'); + process.exit(1); + } + var source = ''; + var fs = require('fs'); + if (typeof fs !== 'undefined' && fs !== null) + source = fs.readFileSync(require('path').normalize(args[1]), "utf8"); + return exports.parser.parse(source); +}; +if (typeof module !== 'undefined' && require.main === module) { + exports.main(process.argv.slice(1)); +} +} \ No newline at end of file diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/register.js b/deploy/node_modules/coffee-script/lib/coffee-script/register.js new file mode 100644 index 0000000..7d36ffc --- /dev/null +++ b/deploy/node_modules/coffee-script/lib/coffee-script/register.js @@ -0,0 +1,66 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var CoffeeScript, Module, binary, child_process, ext, findExtension, fork, helpers, i, len, loadFile, path, ref; + + CoffeeScript = require('./coffee-script'); + + child_process = require('child_process'); + + helpers = require('./helpers'); + + path = require('path'); + + loadFile = function(module, filename) { + var answer; + answer = CoffeeScript._compileFile(filename, false, true); + return module._compile(answer, filename); + }; + + if (require.extensions) { + ref = CoffeeScript.FILE_EXTENSIONS; + for (i = 0, len = ref.length; i < len; i++) { + ext = ref[i]; + require.extensions[ext] = loadFile; + } + Module = require('module'); + findExtension = function(filename) { + var curExtension, extensions; + extensions = path.basename(filename).split('.'); + if (extensions[0] === '') { + extensions.shift(); + } + while (extensions.shift()) { + curExtension = '.' + extensions.join('.'); + if (Module._extensions[curExtension]) { + return curExtension; + } + } + return '.js'; + }; + Module.prototype.load = function(filename) { + var extension; + this.filename = filename; + this.paths = Module._nodeModulePaths(path.dirname(filename)); + extension = findExtension(filename); + Module._extensions[extension](this, filename); + return this.loaded = true; + }; + } + + if (child_process) { + fork = child_process.fork; + binary = require.resolve('../../bin/coffee'); + child_process.fork = function(path, args, options) { + if (helpers.isCoffee(path)) { + if (!Array.isArray(args)) { + options = args || {}; + args = []; + } + args = [path].concat(args); + path = binary; + } + return fork(path, args, options); + }; + } + +}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/repl.js b/deploy/node_modules/coffee-script/lib/coffee-script/repl.js new file mode 100644 index 0000000..e74fe5e --- /dev/null +++ b/deploy/node_modules/coffee-script/lib/coffee-script/repl.js @@ -0,0 +1,203 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var CoffeeScript, addHistory, addMultilineHandler, fs, getCommandId, merge, nodeREPL, path, ref, replDefaults, runInContext, updateSyntaxError, vm; + + fs = require('fs'); + + path = require('path'); + + vm = require('vm'); + + nodeREPL = require('repl'); + + CoffeeScript = require('./coffee-script'); + + ref = require('./helpers'), merge = ref.merge, updateSyntaxError = ref.updateSyntaxError; + + replDefaults = { + prompt: 'coffee> ', + historyFile: process.env.HOME ? path.join(process.env.HOME, '.coffee_history') : void 0, + historyMaxInputSize: 10240, + "eval": function(input, context, filename, cb) { + var Assign, Block, Literal, Value, ast, err, js, ref1, referencedVars, token, tokens; + input = input.replace(/\uFF00/g, '\n'); + input = input.replace(/^\(([\s\S]*)\n\)$/m, '$1'); + input = input.replace(/^\s*try\s*{([\s\S]*)}\s*catch.*$/m, '$1'); + ref1 = require('./nodes'), Block = ref1.Block, Assign = ref1.Assign, Value = ref1.Value, Literal = ref1.Literal; + try { + tokens = CoffeeScript.tokens(input); + referencedVars = (function() { + var i, len, results; + results = []; + for (i = 0, len = tokens.length; i < len; i++) { + token = tokens[i]; + if (token[0] === 'IDENTIFIER') { + results.push(token[1]); + } + } + return results; + })(); + ast = CoffeeScript.nodes(tokens); + ast = new Block([new Assign(new Value(new Literal('__')), ast, '=')]); + js = ast.compile({ + bare: true, + locals: Object.keys(context), + referencedVars: referencedVars + }); + return cb(null, runInContext(js, context, filename)); + } catch (error) { + err = error; + updateSyntaxError(err, input); + return cb(err); + } + } + }; + + runInContext = function(js, context, filename) { + if (context === global) { + return vm.runInThisContext(js, filename); + } else { + return vm.runInContext(js, context, filename); + } + }; + + addMultilineHandler = function(repl) { + var inputStream, multiline, nodeLineListener, origPrompt, outputStream, ref1, rli; + rli = repl.rli, inputStream = repl.inputStream, outputStream = repl.outputStream; + origPrompt = (ref1 = repl._prompt) != null ? ref1 : repl.prompt; + multiline = { + enabled: false, + initialPrompt: origPrompt.replace(/^[^> ]*/, function(x) { + return x.replace(/./g, '-'); + }), + prompt: origPrompt.replace(/^[^> ]*>?/, function(x) { + return x.replace(/./g, '.'); + }), + buffer: '' + }; + nodeLineListener = rli.listeners('line')[0]; + rli.removeListener('line', nodeLineListener); + rli.on('line', function(cmd) { + if (multiline.enabled) { + multiline.buffer += cmd + "\n"; + rli.setPrompt(multiline.prompt); + rli.prompt(true); + } else { + rli.setPrompt(origPrompt); + nodeLineListener(cmd); + } + }); + return inputStream.on('keypress', function(char, key) { + if (!(key && key.ctrl && !key.meta && !key.shift && key.name === 'v')) { + return; + } + if (multiline.enabled) { + if (!multiline.buffer.match(/\n/)) { + multiline.enabled = !multiline.enabled; + rli.setPrompt(origPrompt); + rli.prompt(true); + return; + } + if ((rli.line != null) && !rli.line.match(/^\s*$/)) { + return; + } + multiline.enabled = !multiline.enabled; + rli.line = ''; + rli.cursor = 0; + rli.output.cursorTo(0); + rli.output.clearLine(1); + multiline.buffer = multiline.buffer.replace(/\n/g, '\uFF00'); + rli.emit('line', multiline.buffer); + multiline.buffer = ''; + } else { + multiline.enabled = !multiline.enabled; + rli.setPrompt(multiline.initialPrompt); + rli.prompt(true); + } + }); + }; + + addHistory = function(repl, filename, maxSize) { + var buffer, fd, lastLine, readFd, size, stat; + lastLine = null; + try { + stat = fs.statSync(filename); + size = Math.min(maxSize, stat.size); + readFd = fs.openSync(filename, 'r'); + buffer = new Buffer(size); + fs.readSync(readFd, buffer, 0, size, stat.size - size); + fs.closeSync(readFd); + repl.rli.history = buffer.toString().split('\n').reverse(); + if (stat.size > maxSize) { + repl.rli.history.pop(); + } + if (repl.rli.history[0] === '') { + repl.rli.history.shift(); + } + repl.rli.historyIndex = -1; + lastLine = repl.rli.history[0]; + } catch (error) {} + fd = fs.openSync(filename, 'a'); + repl.rli.addListener('line', function(code) { + if (code && code.length && code !== '.history' && code !== '.exit' && lastLine !== code) { + fs.writeSync(fd, code + "\n"); + return lastLine = code; + } + }); + repl.on('exit', function() { + return fs.closeSync(fd); + }); + return repl.commands[getCommandId(repl, 'history')] = { + help: 'Show command history', + action: function() { + repl.outputStream.write((repl.rli.history.slice(0).reverse().join('\n')) + "\n"); + return repl.displayPrompt(); + } + }; + }; + + getCommandId = function(repl, commandName) { + var commandsHaveLeadingDot; + commandsHaveLeadingDot = repl.commands['.help'] != null; + if (commandsHaveLeadingDot) { + return "." + commandName; + } else { + return commandName; + } + }; + + module.exports = { + start: function(opts) { + var build, major, minor, ref1, repl; + if (opts == null) { + opts = {}; + } + ref1 = process.versions.node.split('.').map(function(n) { + return parseInt(n, 10); + }), major = ref1[0], minor = ref1[1], build = ref1[2]; + if (major === 0 && minor < 8) { + console.warn("Node 0.8.0+ required for CoffeeScript REPL"); + process.exit(1); + } + CoffeeScript.register(); + process.argv = ['coffee'].concat(process.argv.slice(2)); + opts = merge(replDefaults, opts); + repl = nodeREPL.start(opts); + if (opts.prelude) { + runInContext(opts.prelude, repl.context, 'prelude'); + } + repl.on('exit', function() { + if (!repl.rli.closed) { + return repl.outputStream.write('\n'); + } + }); + addMultilineHandler(repl); + if (opts.historyFile) { + addHistory(repl, opts.historyFile, opts.historyMaxInputSize); + } + repl.commands[getCommandId(repl, 'load')].help = 'Load code from a file into this REPL session'; + return repl; + } + }; + +}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/rewriter.js b/deploy/node_modules/coffee-script/lib/coffee-script/rewriter.js new file mode 100644 index 0000000..b0e25e1 --- /dev/null +++ b/deploy/node_modules/coffee-script/lib/coffee-script/rewriter.js @@ -0,0 +1,537 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var BALANCED_PAIRS, CALL_CLOSERS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, Rewriter, SINGLE_CLOSERS, SINGLE_LINERS, generate, k, left, len, ref, rite, + indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, + slice = [].slice; + + generate = function(tag, value, origin) { + var tok; + tok = [tag, value]; + tok.generated = true; + if (origin) { + tok.origin = origin; + } + return tok; + }; + + exports.Rewriter = Rewriter = (function() { + function Rewriter() {} + + Rewriter.prototype.rewrite = function(tokens1) { + this.tokens = tokens1; + this.removeLeadingNewlines(); + this.closeOpenCalls(); + this.closeOpenIndexes(); + this.normalizeLines(); + this.tagPostfixConditionals(); + this.addImplicitBracesAndParens(); + this.addLocationDataToGeneratedTokens(); + this.fixOutdentLocationData(); + return this.tokens; + }; + + Rewriter.prototype.scanTokens = function(block) { + var i, token, tokens; + tokens = this.tokens; + i = 0; + while (token = tokens[i]) { + i += block.call(this, token, i, tokens); + } + return true; + }; + + Rewriter.prototype.detectEnd = function(i, condition, action) { + var levels, ref, ref1, token, tokens; + tokens = this.tokens; + levels = 0; + while (token = tokens[i]) { + if (levels === 0 && condition.call(this, token, i)) { + return action.call(this, token, i); + } + if (!token || levels < 0) { + return action.call(this, token, i - 1); + } + if (ref = token[0], indexOf.call(EXPRESSION_START, ref) >= 0) { + levels += 1; + } else if (ref1 = token[0], indexOf.call(EXPRESSION_END, ref1) >= 0) { + levels -= 1; + } + i += 1; + } + return i - 1; + }; + + Rewriter.prototype.removeLeadingNewlines = function() { + var i, k, len, ref, tag; + ref = this.tokens; + for (i = k = 0, len = ref.length; k < len; i = ++k) { + tag = ref[i][0]; + if (tag !== 'TERMINATOR') { + break; + } + } + if (i) { + return this.tokens.splice(0, i); + } + }; + + Rewriter.prototype.closeOpenCalls = function() { + var action, condition; + condition = function(token, i) { + var ref; + return ((ref = token[0]) === ')' || ref === 'CALL_END') || token[0] === 'OUTDENT' && this.tag(i - 1) === ')'; + }; + action = function(token, i) { + return this.tokens[token[0] === 'OUTDENT' ? i - 1 : i][0] = 'CALL_END'; + }; + return this.scanTokens(function(token, i) { + if (token[0] === 'CALL_START') { + this.detectEnd(i + 1, condition, action); + } + return 1; + }); + }; + + Rewriter.prototype.closeOpenIndexes = function() { + var action, condition; + condition = function(token, i) { + var ref; + return (ref = token[0]) === ']' || ref === 'INDEX_END'; + }; + action = function(token, i) { + return token[0] = 'INDEX_END'; + }; + return this.scanTokens(function(token, i) { + if (token[0] === 'INDEX_START') { + this.detectEnd(i + 1, condition, action); + } + return 1; + }); + }; + + Rewriter.prototype.indexOfTag = function() { + var fuzz, i, j, k, pattern, ref, ref1; + i = arguments[0], pattern = 2 <= arguments.length ? slice.call(arguments, 1) : []; + fuzz = 0; + for (j = k = 0, ref = pattern.length; 0 <= ref ? k < ref : k > ref; j = 0 <= ref ? ++k : --k) { + while (this.tag(i + j + fuzz) === 'HERECOMMENT') { + fuzz += 2; + } + if (pattern[j] == null) { + continue; + } + if (typeof pattern[j] === 'string') { + pattern[j] = [pattern[j]]; + } + if (ref1 = this.tag(i + j + fuzz), indexOf.call(pattern[j], ref1) < 0) { + return -1; + } + } + return i + j + fuzz - 1; + }; + + Rewriter.prototype.looksObjectish = function(j) { + var end, index; + if (this.indexOfTag(j, '@', null, ':') > -1 || this.indexOfTag(j, null, ':') > -1) { + return true; + } + index = this.indexOfTag(j, EXPRESSION_START); + if (index > -1) { + end = null; + this.detectEnd(index + 1, (function(token) { + var ref; + return ref = token[0], indexOf.call(EXPRESSION_END, ref) >= 0; + }), (function(token, i) { + return end = i; + })); + if (this.tag(end + 1) === ':') { + return true; + } + } + return false; + }; + + Rewriter.prototype.findTagsBackwards = function(i, tags) { + var backStack, ref, ref1, ref2, ref3, ref4, ref5; + backStack = []; + while (i >= 0 && (backStack.length || (ref2 = this.tag(i), indexOf.call(tags, ref2) < 0) && ((ref3 = this.tag(i), indexOf.call(EXPRESSION_START, ref3) < 0) || this.tokens[i].generated) && (ref4 = this.tag(i), indexOf.call(LINEBREAKS, ref4) < 0))) { + if (ref = this.tag(i), indexOf.call(EXPRESSION_END, ref) >= 0) { + backStack.push(this.tag(i)); + } + if ((ref1 = this.tag(i), indexOf.call(EXPRESSION_START, ref1) >= 0) && backStack.length) { + backStack.pop(); + } + i -= 1; + } + return ref5 = this.tag(i), indexOf.call(tags, ref5) >= 0; + }; + + Rewriter.prototype.addImplicitBracesAndParens = function() { + var stack, start; + stack = []; + start = null; + return this.scanTokens(function(token, i, tokens) { + var endImplicitCall, endImplicitObject, forward, inImplicit, inImplicitCall, inImplicitControl, inImplicitObject, isImplicit, isImplicitCall, isImplicitObject, k, newLine, nextTag, offset, prevTag, prevToken, ref, ref1, ref2, ref3, ref4, ref5, s, sameLine, stackIdx, stackItem, stackTag, stackTop, startIdx, startImplicitCall, startImplicitObject, startsLine, tag; + tag = token[0]; + prevTag = (prevToken = i > 0 ? tokens[i - 1] : [])[0]; + nextTag = (i < tokens.length - 1 ? tokens[i + 1] : [])[0]; + stackTop = function() { + return stack[stack.length - 1]; + }; + startIdx = i; + forward = function(n) { + return i - startIdx + n; + }; + isImplicit = function(stackItem) { + var ref; + return stackItem != null ? (ref = stackItem[2]) != null ? ref.ours : void 0 : void 0; + }; + isImplicitObject = function(stackItem) { + return isImplicit(stackItem) && (stackItem != null ? stackItem[0] : void 0) === '{'; + }; + isImplicitCall = function(stackItem) { + return isImplicit(stackItem) && (stackItem != null ? stackItem[0] : void 0) === '('; + }; + inImplicit = function() { + return isImplicit(stackTop()); + }; + inImplicitCall = function() { + return isImplicitCall(stackTop()); + }; + inImplicitObject = function() { + return isImplicitObject(stackTop()); + }; + inImplicitControl = function() { + var ref; + return inImplicit && ((ref = stackTop()) != null ? ref[0] : void 0) === 'CONTROL'; + }; + startImplicitCall = function(j) { + var idx; + idx = j != null ? j : i; + stack.push([ + '(', idx, { + ours: true + } + ]); + tokens.splice(idx, 0, generate('CALL_START', '(', ['', 'implicit function call', token[2]])); + if (j == null) { + return i += 1; + } + }; + endImplicitCall = function() { + stack.pop(); + tokens.splice(i, 0, generate('CALL_END', ')', ['', 'end of input', token[2]])); + return i += 1; + }; + startImplicitObject = function(j, startsLine) { + var idx, val; + if (startsLine == null) { + startsLine = true; + } + idx = j != null ? j : i; + stack.push([ + '{', idx, { + sameLine: true, + startsLine: startsLine, + ours: true + } + ]); + val = new String('{'); + val.generated = true; + tokens.splice(idx, 0, generate('{', val, token)); + if (j == null) { + return i += 1; + } + }; + endImplicitObject = function(j) { + j = j != null ? j : i; + stack.pop(); + tokens.splice(j, 0, generate('}', '}', token)); + return i += 1; + }; + if (inImplicitCall() && (tag === 'IF' || tag === 'TRY' || tag === 'FINALLY' || tag === 'CATCH' || tag === 'CLASS' || tag === 'SWITCH')) { + stack.push([ + 'CONTROL', i, { + ours: true + } + ]); + return forward(1); + } + if (tag === 'INDENT' && inImplicit()) { + if (prevTag !== '=>' && prevTag !== '->' && prevTag !== '[' && prevTag !== '(' && prevTag !== ',' && prevTag !== '{' && prevTag !== 'TRY' && prevTag !== 'ELSE' && prevTag !== '=') { + while (inImplicitCall()) { + endImplicitCall(); + } + } + if (inImplicitControl()) { + stack.pop(); + } + stack.push([tag, i]); + return forward(1); + } + if (indexOf.call(EXPRESSION_START, tag) >= 0) { + stack.push([tag, i]); + return forward(1); + } + if (indexOf.call(EXPRESSION_END, tag) >= 0) { + while (inImplicit()) { + if (inImplicitCall()) { + endImplicitCall(); + } else if (inImplicitObject()) { + endImplicitObject(); + } else { + stack.pop(); + } + } + start = stack.pop(); + } + if ((indexOf.call(IMPLICIT_FUNC, tag) >= 0 && token.spaced || tag === '?' && i > 0 && !tokens[i - 1].spaced) && (indexOf.call(IMPLICIT_CALL, nextTag) >= 0 || indexOf.call(IMPLICIT_UNSPACED_CALL, nextTag) >= 0 && !((ref = tokens[i + 1]) != null ? ref.spaced : void 0) && !((ref1 = tokens[i + 1]) != null ? ref1.newLine : void 0))) { + if (tag === '?') { + tag = token[0] = 'FUNC_EXIST'; + } + startImplicitCall(i + 1); + return forward(2); + } + if (indexOf.call(IMPLICIT_FUNC, tag) >= 0 && this.indexOfTag(i + 1, 'INDENT') > -1 && this.looksObjectish(i + 2) && !this.findTagsBackwards(i, ['CLASS', 'EXTENDS', 'IF', 'CATCH', 'SWITCH', 'LEADING_WHEN', 'FOR', 'WHILE', 'UNTIL'])) { + startImplicitCall(i + 1); + stack.push(['INDENT', i + 2]); + return forward(3); + } + if (tag === ':') { + s = (function() { + var ref2; + switch (false) { + case ref2 = this.tag(i - 1), indexOf.call(EXPRESSION_END, ref2) < 0: + return start[1]; + case this.tag(i - 2) !== '@': + return i - 2; + default: + return i - 1; + } + }).call(this); + while (this.tag(s - 2) === 'HERECOMMENT') { + s -= 2; + } + this.insideForDeclaration = nextTag === 'FOR'; + startsLine = s === 0 || (ref2 = this.tag(s - 1), indexOf.call(LINEBREAKS, ref2) >= 0) || tokens[s - 1].newLine; + if (stackTop()) { + ref3 = stackTop(), stackTag = ref3[0], stackIdx = ref3[1]; + if ((stackTag === '{' || stackTag === 'INDENT' && this.tag(stackIdx - 1) === '{') && (startsLine || this.tag(s - 1) === ',' || this.tag(s - 1) === '{')) { + return forward(1); + } + } + startImplicitObject(s, !!startsLine); + return forward(2); + } + if (indexOf.call(LINEBREAKS, tag) >= 0) { + for (k = stack.length - 1; k >= 0; k += -1) { + stackItem = stack[k]; + if (!isImplicit(stackItem)) { + break; + } + if (isImplicitObject(stackItem)) { + stackItem[2].sameLine = false; + } + } + } + newLine = prevTag === 'OUTDENT' || prevToken.newLine; + if (indexOf.call(IMPLICIT_END, tag) >= 0 || indexOf.call(CALL_CLOSERS, tag) >= 0 && newLine) { + while (inImplicit()) { + ref4 = stackTop(), stackTag = ref4[0], stackIdx = ref4[1], (ref5 = ref4[2], sameLine = ref5.sameLine, startsLine = ref5.startsLine); + if (inImplicitCall() && prevTag !== ',') { + endImplicitCall(); + } else if (inImplicitObject() && !this.insideForDeclaration && sameLine && tag !== 'TERMINATOR' && prevTag !== ':') { + endImplicitObject(); + } else if (inImplicitObject() && tag === 'TERMINATOR' && prevTag !== ',' && !(startsLine && this.looksObjectish(i + 1))) { + if (nextTag === 'HERECOMMENT') { + return forward(1); + } + endImplicitObject(); + } else { + break; + } + } + } + if (tag === ',' && !this.looksObjectish(i + 1) && inImplicitObject() && !this.insideForDeclaration && (nextTag !== 'TERMINATOR' || !this.looksObjectish(i + 2))) { + offset = nextTag === 'OUTDENT' ? 1 : 0; + while (inImplicitObject()) { + endImplicitObject(i + offset); + } + } + return forward(1); + }); + }; + + Rewriter.prototype.addLocationDataToGeneratedTokens = function() { + return this.scanTokens(function(token, i, tokens) { + var column, line, nextLocation, prevLocation, ref, ref1; + if (token[2]) { + return 1; + } + if (!(token.generated || token.explicit)) { + return 1; + } + if (token[0] === '{' && (nextLocation = (ref = tokens[i + 1]) != null ? ref[2] : void 0)) { + line = nextLocation.first_line, column = nextLocation.first_column; + } else if (prevLocation = (ref1 = tokens[i - 1]) != null ? ref1[2] : void 0) { + line = prevLocation.last_line, column = prevLocation.last_column; + } else { + line = column = 0; + } + token[2] = { + first_line: line, + first_column: column, + last_line: line, + last_column: column + }; + return 1; + }); + }; + + Rewriter.prototype.fixOutdentLocationData = function() { + return this.scanTokens(function(token, i, tokens) { + var prevLocationData; + if (!(token[0] === 'OUTDENT' || (token.generated && token[0] === 'CALL_END') || (token.generated && token[0] === '}'))) { + return 1; + } + prevLocationData = tokens[i - 1][2]; + token[2] = { + first_line: prevLocationData.last_line, + first_column: prevLocationData.last_column, + last_line: prevLocationData.last_line, + last_column: prevLocationData.last_column + }; + return 1; + }); + }; + + Rewriter.prototype.normalizeLines = function() { + var action, condition, indent, outdent, starter; + starter = indent = outdent = null; + condition = function(token, i) { + var ref, ref1, ref2, ref3; + return token[1] !== ';' && (ref = token[0], indexOf.call(SINGLE_CLOSERS, ref) >= 0) && !(token[0] === 'TERMINATOR' && (ref1 = this.tag(i + 1), indexOf.call(EXPRESSION_CLOSE, ref1) >= 0)) && !(token[0] === 'ELSE' && starter !== 'THEN') && !(((ref2 = token[0]) === 'CATCH' || ref2 === 'FINALLY') && (starter === '->' || starter === '=>')) || (ref3 = token[0], indexOf.call(CALL_CLOSERS, ref3) >= 0) && (this.tokens[i - 1].newLine || this.tokens[i - 1][0] === 'OUTDENT'); + }; + action = function(token, i) { + return this.tokens.splice((this.tag(i - 1) === ',' ? i - 1 : i), 0, outdent); + }; + return this.scanTokens(function(token, i, tokens) { + var j, k, ref, ref1, ref2, tag; + tag = token[0]; + if (tag === 'TERMINATOR') { + if (this.tag(i + 1) === 'ELSE' && this.tag(i - 1) !== 'OUTDENT') { + tokens.splice.apply(tokens, [i, 1].concat(slice.call(this.indentation()))); + return 1; + } + if (ref = this.tag(i + 1), indexOf.call(EXPRESSION_CLOSE, ref) >= 0) { + tokens.splice(i, 1); + return 0; + } + } + if (tag === 'CATCH') { + for (j = k = 1; k <= 2; j = ++k) { + if (!((ref1 = this.tag(i + j)) === 'OUTDENT' || ref1 === 'TERMINATOR' || ref1 === 'FINALLY')) { + continue; + } + tokens.splice.apply(tokens, [i + j, 0].concat(slice.call(this.indentation()))); + return 2 + j; + } + } + if (indexOf.call(SINGLE_LINERS, tag) >= 0 && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF')) { + starter = tag; + ref2 = this.indentation(tokens[i]), indent = ref2[0], outdent = ref2[1]; + if (starter === 'THEN') { + indent.fromThen = true; + } + tokens.splice(i + 1, 0, indent); + this.detectEnd(i + 2, condition, action); + if (tag === 'THEN') { + tokens.splice(i, 1); + } + return 1; + } + return 1; + }); + }; + + Rewriter.prototype.tagPostfixConditionals = function() { + var action, condition, original; + original = null; + condition = function(token, i) { + var prevTag, tag; + tag = token[0]; + prevTag = this.tokens[i - 1][0]; + return tag === 'TERMINATOR' || (tag === 'INDENT' && indexOf.call(SINGLE_LINERS, prevTag) < 0); + }; + action = function(token, i) { + if (token[0] !== 'INDENT' || (token.generated && !token.fromThen)) { + return original[0] = 'POST_' + original[0]; + } + }; + return this.scanTokens(function(token, i) { + if (token[0] !== 'IF') { + return 1; + } + original = token; + this.detectEnd(i + 1, condition, action); + return 1; + }); + }; + + Rewriter.prototype.indentation = function(origin) { + var indent, outdent; + indent = ['INDENT', 2]; + outdent = ['OUTDENT', 2]; + if (origin) { + indent.generated = outdent.generated = true; + indent.origin = outdent.origin = origin; + } else { + indent.explicit = outdent.explicit = true; + } + return [indent, outdent]; + }; + + Rewriter.prototype.generate = generate; + + Rewriter.prototype.tag = function(i) { + var ref; + return (ref = this.tokens[i]) != null ? ref[0] : void 0; + }; + + return Rewriter; + + })(); + + BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'], ['CALL_START', 'CALL_END'], ['PARAM_START', 'PARAM_END'], ['INDEX_START', 'INDEX_END'], ['STRING_START', 'STRING_END'], ['REGEX_START', 'REGEX_END']]; + + exports.INVERSES = INVERSES = {}; + + EXPRESSION_START = []; + + EXPRESSION_END = []; + + for (k = 0, len = BALANCED_PAIRS.length; k < len; k++) { + ref = BALANCED_PAIRS[k], left = ref[0], rite = ref[1]; + EXPRESSION_START.push(INVERSES[rite] = left); + EXPRESSION_END.push(INVERSES[left] = rite); + } + + EXPRESSION_CLOSE = ['CATCH', 'THEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_END); + + IMPLICIT_FUNC = ['IDENTIFIER', 'PROPERTY', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS']; + + IMPLICIT_CALL = ['IDENTIFIER', 'PROPERTY', 'NUMBER', 'INFINITY', 'NAN', 'STRING', 'STRING_START', 'REGEX', 'REGEX_START', 'JS', 'NEW', 'PARAM_START', 'CLASS', 'IF', 'TRY', 'SWITCH', 'THIS', 'UNDEFINED', 'NULL', 'BOOL', 'UNARY', 'YIELD', 'UNARY_MATH', 'SUPER', 'THROW', '@', '->', '=>', '[', '(', '{', '--', '++']; + + IMPLICIT_UNSPACED_CALL = ['+', '-']; + + IMPLICIT_END = ['POST_IF', 'FOR', 'WHILE', 'UNTIL', 'WHEN', 'BY', 'LOOP', 'TERMINATOR']; + + SINGLE_LINERS = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN']; + + SINGLE_CLOSERS = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN']; + + LINEBREAKS = ['TERMINATOR', 'INDENT', 'OUTDENT']; + + CALL_CLOSERS = ['.', '?.', '::', '?::']; + +}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/scope.js b/deploy/node_modules/coffee-script/lib/coffee-script/scope.js new file mode 100644 index 0000000..cd24739 --- /dev/null +++ b/deploy/node_modules/coffee-script/lib/coffee-script/scope.js @@ -0,0 +1,165 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var Scope, + indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + exports.Scope = Scope = (function() { + function Scope(parent, expressions, method, referencedVars) { + var ref, ref1; + this.parent = parent; + this.expressions = expressions; + this.method = method; + this.referencedVars = referencedVars; + this.variables = [ + { + name: 'arguments', + type: 'arguments' + } + ]; + this.positions = {}; + if (!this.parent) { + this.utilities = {}; + } + this.root = (ref = (ref1 = this.parent) != null ? ref1.root : void 0) != null ? ref : this; + } + + Scope.prototype.add = function(name, type, immediate) { + if (this.shared && !immediate) { + return this.parent.add(name, type, immediate); + } + if (Object.prototype.hasOwnProperty.call(this.positions, name)) { + return this.variables[this.positions[name]].type = type; + } else { + return this.positions[name] = this.variables.push({ + name: name, + type: type + }) - 1; + } + }; + + Scope.prototype.namedMethod = function() { + var ref; + if (((ref = this.method) != null ? ref.name : void 0) || !this.parent) { + return this.method; + } + return this.parent.namedMethod(); + }; + + Scope.prototype.find = function(name, type) { + if (type == null) { + type = 'var'; + } + if (this.check(name)) { + return true; + } + this.add(name, type); + return false; + }; + + Scope.prototype.parameter = function(name) { + if (this.shared && this.parent.check(name, true)) { + return; + } + return this.add(name, 'param'); + }; + + Scope.prototype.check = function(name) { + var ref; + return !!(this.type(name) || ((ref = this.parent) != null ? ref.check(name) : void 0)); + }; + + Scope.prototype.temporary = function(name, index, single) { + var diff, endCode, letter, newCode, num, startCode; + if (single == null) { + single = false; + } + if (single) { + startCode = name.charCodeAt(0); + endCode = 'z'.charCodeAt(0); + diff = endCode - startCode; + newCode = startCode + index % (diff + 1); + letter = String.fromCharCode(newCode); + num = Math.floor(index / (diff + 1)); + return "" + letter + (num || ''); + } else { + return "" + name + (index || ''); + } + }; + + Scope.prototype.type = function(name) { + var i, len, ref, v; + ref = this.variables; + for (i = 0, len = ref.length; i < len; i++) { + v = ref[i]; + if (v.name === name) { + return v.type; + } + } + return null; + }; + + Scope.prototype.freeVariable = function(name, options) { + var index, ref, temp; + if (options == null) { + options = {}; + } + index = 0; + while (true) { + temp = this.temporary(name, index, options.single); + if (!(this.check(temp) || indexOf.call(this.root.referencedVars, temp) >= 0)) { + break; + } + index++; + } + if ((ref = options.reserve) != null ? ref : true) { + this.add(temp, 'var', true); + } + return temp; + }; + + Scope.prototype.assign = function(name, value) { + this.add(name, { + value: value, + assigned: true + }, true); + return this.hasAssignments = true; + }; + + Scope.prototype.hasDeclarations = function() { + return !!this.declaredVariables().length; + }; + + Scope.prototype.declaredVariables = function() { + var v; + return ((function() { + var i, len, ref, results; + ref = this.variables; + results = []; + for (i = 0, len = ref.length; i < len; i++) { + v = ref[i]; + if (v.type === 'var') { + results.push(v.name); + } + } + return results; + }).call(this)).sort(); + }; + + Scope.prototype.assignedVariables = function() { + var i, len, ref, results, v; + ref = this.variables; + results = []; + for (i = 0, len = ref.length; i < len; i++) { + v = ref[i]; + if (v.type.assigned) { + results.push(v.name + " = " + v.type.value); + } + } + return results; + }; + + return Scope; + + })(); + +}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/sourcemap.js b/deploy/node_modules/coffee-script/lib/coffee-script/sourcemap.js new file mode 100644 index 0000000..56b86a8 --- /dev/null +++ b/deploy/node_modules/coffee-script/lib/coffee-script/sourcemap.js @@ -0,0 +1,161 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var LineMap, SourceMap; + + LineMap = (function() { + function LineMap(line1) { + this.line = line1; + this.columns = []; + } + + LineMap.prototype.add = function(column, arg, options) { + var sourceColumn, sourceLine; + sourceLine = arg[0], sourceColumn = arg[1]; + if (options == null) { + options = {}; + } + if (this.columns[column] && options.noReplace) { + return; + } + return this.columns[column] = { + line: this.line, + column: column, + sourceLine: sourceLine, + sourceColumn: sourceColumn + }; + }; + + LineMap.prototype.sourceLocation = function(column) { + var mapping; + while (!((mapping = this.columns[column]) || (column <= 0))) { + column--; + } + return mapping && [mapping.sourceLine, mapping.sourceColumn]; + }; + + return LineMap; + + })(); + + SourceMap = (function() { + var BASE64_CHARS, VLQ_CONTINUATION_BIT, VLQ_SHIFT, VLQ_VALUE_MASK; + + function SourceMap() { + this.lines = []; + } + + SourceMap.prototype.add = function(sourceLocation, generatedLocation, options) { + var base, column, line, lineMap; + if (options == null) { + options = {}; + } + line = generatedLocation[0], column = generatedLocation[1]; + lineMap = ((base = this.lines)[line] || (base[line] = new LineMap(line))); + return lineMap.add(column, sourceLocation, options); + }; + + SourceMap.prototype.sourceLocation = function(arg) { + var column, line, lineMap; + line = arg[0], column = arg[1]; + while (!((lineMap = this.lines[line]) || (line <= 0))) { + line--; + } + return lineMap && lineMap.sourceLocation(column); + }; + + SourceMap.prototype.generate = function(options, code) { + var buffer, i, j, lastColumn, lastSourceColumn, lastSourceLine, len, len1, lineMap, lineNumber, mapping, needComma, ref, ref1, v3, writingline; + if (options == null) { + options = {}; + } + if (code == null) { + code = null; + } + writingline = 0; + lastColumn = 0; + lastSourceLine = 0; + lastSourceColumn = 0; + needComma = false; + buffer = ""; + ref = this.lines; + for (lineNumber = i = 0, len = ref.length; i < len; lineNumber = ++i) { + lineMap = ref[lineNumber]; + if (lineMap) { + ref1 = lineMap.columns; + for (j = 0, len1 = ref1.length; j < len1; j++) { + mapping = ref1[j]; + if (!(mapping)) { + continue; + } + while (writingline < mapping.line) { + lastColumn = 0; + needComma = false; + buffer += ";"; + writingline++; + } + if (needComma) { + buffer += ","; + needComma = false; + } + buffer += this.encodeVlq(mapping.column - lastColumn); + lastColumn = mapping.column; + buffer += this.encodeVlq(0); + buffer += this.encodeVlq(mapping.sourceLine - lastSourceLine); + lastSourceLine = mapping.sourceLine; + buffer += this.encodeVlq(mapping.sourceColumn - lastSourceColumn); + lastSourceColumn = mapping.sourceColumn; + needComma = true; + } + } + } + v3 = { + version: 3, + file: options.generatedFile || '', + sourceRoot: options.sourceRoot || '', + sources: options.sourceFiles || [''], + names: [], + mappings: buffer + }; + if (options.inlineMap) { + v3.sourcesContent = [code]; + } + return v3; + }; + + VLQ_SHIFT = 5; + + VLQ_CONTINUATION_BIT = 1 << VLQ_SHIFT; + + VLQ_VALUE_MASK = VLQ_CONTINUATION_BIT - 1; + + SourceMap.prototype.encodeVlq = function(value) { + var answer, nextChunk, signBit, valueToEncode; + answer = ''; + signBit = value < 0 ? 1 : 0; + valueToEncode = (Math.abs(value) << 1) + signBit; + while (valueToEncode || !answer) { + nextChunk = valueToEncode & VLQ_VALUE_MASK; + valueToEncode = valueToEncode >> VLQ_SHIFT; + if (valueToEncode) { + nextChunk |= VLQ_CONTINUATION_BIT; + } + answer += this.encodeBase64(nextChunk); + } + return answer; + }; + + BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + + SourceMap.prototype.encodeBase64 = function(value) { + return BASE64_CHARS[value] || (function() { + throw new Error("Cannot Base64 encode value: " + value); + })(); + }; + + return SourceMap; + + })(); + + module.exports = SourceMap; + +}).call(this); diff --git a/deploy/node_modules/coffee-script/package.json b/deploy/node_modules/coffee-script/package.json new file mode 100644 index 0000000..fddab8e --- /dev/null +++ b/deploy/node_modules/coffee-script/package.json @@ -0,0 +1,77 @@ +{ + "_from": "coffee-script@~1", + "_id": "coffee-script@1.12.7", + "_inBundle": false, + "_integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", + "_location": "/coffee-script", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "coffee-script@~1", + "name": "coffee-script", + "escapedName": "coffee-script", + "rawSpec": "~1", + "saveSpec": null, + "fetchSpec": "~1" + }, + "_requiredBy": [ + "/" + ], + "_resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "_shasum": "c05dae0cb79591d05b3070a8433a98c9a89ccc53", + "_spec": "coffee-script@~1", + "_where": "/Users/prophesi/Projects/websocket-kinect/deploy", + "author": { + "name": "Jeremy Ashkenas" + }, + "bin": { + "coffee": "./bin/coffee", + "cake": "./bin/cake" + }, + "bugs": { + "url": "https://github.com/jashkenas/coffeescript/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Unfancy JavaScript", + "devDependencies": { + "docco": "~0.7.0", + "google-closure-compiler-js": "^20170626.0.0", + "highlight.js": "~9.12.0", + "jison": ">=0.4.17", + "markdown-it": "^8.3.1", + "underscore": "~1.8.3" + }, + "directories": { + "lib": "./lib/coffee-script" + }, + "engines": { + "node": ">=0.8.0" + }, + "files": [ + "bin", + "lib", + "register.js", + "repl.js" + ], + "homepage": "http://coffeescript.org", + "keywords": [ + "javascript", + "language", + "coffeescript", + "compiler" + ], + "license": "MIT", + "main": "./lib/coffee-script/coffee-script", + "name": "coffee-script", + "repository": { + "type": "git", + "url": "git://github.com/jashkenas/coffeescript.git" + }, + "scripts": { + "test": "node ./bin/cake test", + "test-harmony": "node --harmony ./bin/cake test" + }, + "version": "1.12.7" +} diff --git a/deploy/node_modules/coffee-script/register.js b/deploy/node_modules/coffee-script/register.js new file mode 100644 index 0000000..97b33d7 --- /dev/null +++ b/deploy/node_modules/coffee-script/register.js @@ -0,0 +1 @@ +require('./lib/coffee-script/register'); diff --git a/deploy/node_modules/coffee-script/repl.js b/deploy/node_modules/coffee-script/repl.js new file mode 100644 index 0000000..d2706a7 --- /dev/null +++ b/deploy/node_modules/coffee-script/repl.js @@ -0,0 +1 @@ +module.exports = require('./lib/coffee-script/repl'); diff --git a/deploy/node_modules/debug/.coveralls.yml b/deploy/node_modules/debug/.coveralls.yml new file mode 100644 index 0000000..20a7068 --- /dev/null +++ b/deploy/node_modules/debug/.coveralls.yml @@ -0,0 +1 @@ +repo_token: SIAeZjKYlHK74rbcFvNHMUzjRiMpflxve diff --git a/deploy/node_modules/debug/.eslintrc b/deploy/node_modules/debug/.eslintrc new file mode 100644 index 0000000..8a37ae2 --- /dev/null +++ b/deploy/node_modules/debug/.eslintrc @@ -0,0 +1,11 @@ +{ + "env": { + "browser": true, + "node": true + }, + "rules": { + "no-console": 0, + "no-empty": [1, { "allowEmptyCatch": true }] + }, + "extends": "eslint:recommended" +} diff --git a/deploy/node_modules/debug/.npmignore b/deploy/node_modules/debug/.npmignore new file mode 100644 index 0000000..5f60eec --- /dev/null +++ b/deploy/node_modules/debug/.npmignore @@ -0,0 +1,9 @@ +support +test +examples +example +*.sock +dist +yarn.lock +coverage +bower.json diff --git a/deploy/node_modules/debug/.travis.yml b/deploy/node_modules/debug/.travis.yml new file mode 100644 index 0000000..6c6090c --- /dev/null +++ b/deploy/node_modules/debug/.travis.yml @@ -0,0 +1,14 @@ + +language: node_js +node_js: + - "6" + - "5" + - "4" + +install: + - make node_modules + +script: + - make lint + - make test + - make coveralls diff --git a/deploy/node_modules/debug/CHANGELOG.md b/deploy/node_modules/debug/CHANGELOG.md new file mode 100644 index 0000000..a1a270c --- /dev/null +++ b/deploy/node_modules/debug/CHANGELOG.md @@ -0,0 +1,357 @@ + +2.6.8 / 2017-05-18 +================== + + * Fix: Check for undefined on browser globals (#462, @marbemac) + +2.6.7 / 2017-05-16 +================== + + * Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom) + * Fix: Inline extend function in node implementation (#452, @dougwilson) + * Docs: Fix typo (#455, @msasad) + +2.6.5 / 2017-04-27 +================== + + * Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek) + * Misc: clean up browser reference checks (#447, @thebigredgeek) + * Misc: add npm-debug.log to .gitignore (@thebigredgeek) + + +2.6.4 / 2017-04-20 +================== + + * Fix: bug that would occure if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo) + * Chore: ignore bower.json in npm installations. (#437, @joaovieira) + * Misc: update "ms" to v0.7.3 (@tootallnate) + +2.6.3 / 2017-03-13 +================== + + * Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts) + * Docs: Changelog fix (@thebigredgeek) + +2.6.2 / 2017-03-10 +================== + + * Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin) + * Docs: Add backers and sponsors from Open Collective (#422, @piamancini) + * Docs: Add Slackin invite badge (@tootallnate) + +2.6.1 / 2017-02-10 +================== + + * Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error + * Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0) + * Fix: IE8 "Expected identifier" error (#414, @vgoma) + * Fix: Namespaces would not disable once enabled (#409, @musikov) + +2.6.0 / 2016-12-28 +================== + + * Fix: added better null pointer checks for browser useColors (@thebigredgeek) + * Improvement: removed explicit `window.debug` export (#404, @tootallnate) + * Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate) + +2.5.2 / 2016-12-25 +================== + + * Fix: reference error on window within webworkers (#393, @KlausTrainer) + * Docs: fixed README typo (#391, @lurch) + * Docs: added notice about v3 api discussion (@thebigredgeek) + +2.5.1 / 2016-12-20 +================== + + * Fix: babel-core compatibility + +2.5.0 / 2016-12-20 +================== + + * Fix: wrong reference in bower file (@thebigredgeek) + * Fix: webworker compatibility (@thebigredgeek) + * Fix: output formatting issue (#388, @kribblo) + * Fix: babel-loader compatibility (#383, @escwald) + * Misc: removed built asset from repo and publications (@thebigredgeek) + * Misc: moved source files to /src (#378, @yamikuronue) + * Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue) + * Test: coveralls integration (#378, @yamikuronue) + * Docs: simplified language in the opening paragraph (#373, @yamikuronue) + +2.4.5 / 2016-12-17 +================== + + * Fix: `navigator` undefined in Rhino (#376, @jochenberger) + * Fix: custom log function (#379, @hsiliev) + * Improvement: bit of cleanup + linting fixes (@thebigredgeek) + * Improvement: rm non-maintainted `dist/` dir (#375, @freewil) + * Docs: simplified language in the opening paragraph. (#373, @yamikuronue) + +2.4.4 / 2016-12-14 +================== + + * Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts) + +2.4.3 / 2016-12-14 +================== + + * Fix: navigation.userAgent error for react native (#364, @escwald) + +2.4.2 / 2016-12-14 +================== + + * Fix: browser colors (#367, @tootallnate) + * Misc: travis ci integration (@thebigredgeek) + * Misc: added linting and testing boilerplate with sanity check (@thebigredgeek) + +2.4.1 / 2016-12-13 +================== + + * Fix: typo that broke the package (#356) + +2.4.0 / 2016-12-13 +================== + + * Fix: bower.json references unbuilt src entry point (#342, @justmatt) + * Fix: revert "handle regex special characters" (@tootallnate) + * Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate) + * Feature: %O`(big O) pretty-prints objects (#322, @tootallnate) + * Improvement: allow colors in workers (#335, @botverse) + * Improvement: use same color for same namespace. (#338, @lchenay) + +2.3.3 / 2016-11-09 +================== + + * Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne) + * Fix: Returning `localStorage` saved values (#331, Levi Thomason) + * Improvement: Don't create an empty object when no `process` (Nathan Rajlich) + +2.3.2 / 2016-11-09 +================== + + * Fix: be super-safe in index.js as well (@TooTallNate) + * Fix: should check whether process exists (Tom Newby) + +2.3.1 / 2016-11-09 +================== + + * Fix: Added electron compatibility (#324, @paulcbetts) + * Improvement: Added performance optimizations (@tootallnate) + * Readme: Corrected PowerShell environment variable example (#252, @gimre) + * Misc: Removed yarn lock file from source control (#321, @fengmk2) + +2.3.0 / 2016-11-07 +================== + + * Fix: Consistent placement of ms diff at end of output (#215, @gorangajic) + * Fix: Escaping of regex special characters in namespace strings (#250, @zacronos) + * Fix: Fixed bug causing crash on react-native (#282, @vkarpov15) + * Feature: Enabled ES6+ compatible import via default export (#212 @bucaran) + * Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom) + * Package: Update "ms" to 0.7.2 (#315, @DevSide) + * Package: removed superfluous version property from bower.json (#207 @kkirsche) + * Readme: fix USE_COLORS to DEBUG_COLORS + * Readme: Doc fixes for format string sugar (#269, @mlucool) + * Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0) + * Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable) + * Readme: better docs for browser support (#224, @matthewmueller) + * Tooling: Added yarn integration for development (#317, @thebigredgeek) + * Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek) + * Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman) + * Misc: Updated contributors (@thebigredgeek) + +2.2.0 / 2015-05-09 +================== + + * package: update "ms" to v0.7.1 (#202, @dougwilson) + * README: add logging to file example (#193, @DanielOchoa) + * README: fixed a typo (#191, @amir-s) + * browser: expose `storage` (#190, @stephenmathieson) + * Makefile: add a `distclean` target (#189, @stephenmathieson) + +2.1.3 / 2015-03-13 +================== + + * Updated stdout/stderr example (#186) + * Updated example/stdout.js to match debug current behaviour + * Renamed example/stderr.js to stdout.js + * Update Readme.md (#184) + * replace high intensity foreground color for bold (#182, #183) + +2.1.2 / 2015-03-01 +================== + + * dist: recompile + * update "ms" to v0.7.0 + * package: update "browserify" to v9.0.3 + * component: fix "ms.js" repo location + * changed bower package name + * updated documentation about using debug in a browser + * fix: security error on safari (#167, #168, @yields) + +2.1.1 / 2014-12-29 +================== + + * browser: use `typeof` to check for `console` existence + * browser: check for `console.log` truthiness (fix IE 8/9) + * browser: add support for Chrome apps + * Readme: added Windows usage remarks + * Add `bower.json` to properly support bower install + +2.1.0 / 2014-10-15 +================== + + * node: implement `DEBUG_FD` env variable support + * package: update "browserify" to v6.1.0 + * package: add "license" field to package.json (#135, @panuhorsmalahti) + +2.0.0 / 2014-09-01 +================== + + * package: update "browserify" to v5.11.0 + * node: use stderr rather than stdout for logging (#29, @stephenmathieson) + +1.0.4 / 2014-07-15 +================== + + * dist: recompile + * example: remove `console.info()` log usage + * example: add "Content-Type" UTF-8 header to browser example + * browser: place %c marker after the space character + * browser: reset the "content" color via `color: inherit` + * browser: add colors support for Firefox >= v31 + * debug: prefer an instance `log()` function over the global one (#119) + * Readme: update documentation about styled console logs for FF v31 (#116, @wryk) + +1.0.3 / 2014-07-09 +================== + + * Add support for multiple wildcards in namespaces (#122, @seegno) + * browser: fix lint + +1.0.2 / 2014-06-10 +================== + + * browser: update color palette (#113, @gscottolson) + * common: make console logging function configurable (#108, @timoxley) + * node: fix %o colors on old node <= 0.8.x + * Makefile: find node path using shell/which (#109, @timoxley) + +1.0.1 / 2014-06-06 +================== + + * browser: use `removeItem()` to clear localStorage + * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777) + * package: add "contributors" section + * node: fix comment typo + * README: list authors + +1.0.0 / 2014-06-04 +================== + + * make ms diff be global, not be scope + * debug: ignore empty strings in enable() + * node: make DEBUG_COLORS able to disable coloring + * *: export the `colors` array + * npmignore: don't publish the `dist` dir + * Makefile: refactor to use browserify + * package: add "browserify" as a dev dependency + * Readme: add Web Inspector Colors section + * node: reset terminal color for the debug content + * node: map "%o" to `util.inspect()` + * browser: map "%j" to `JSON.stringify()` + * debug: add custom "formatters" + * debug: use "ms" module for humanizing the diff + * Readme: add "bash" syntax highlighting + * browser: add Firebug color support + * browser: add colors for WebKit browsers + * node: apply log to `console` + * rewrite: abstract common logic for Node & browsers + * add .jshintrc file + +0.8.1 / 2014-04-14 +================== + + * package: re-add the "component" section + +0.8.0 / 2014-03-30 +================== + + * add `enable()` method for nodejs. Closes #27 + * change from stderr to stdout + * remove unnecessary index.js file + +0.7.4 / 2013-11-13 +================== + + * remove "browserify" key from package.json (fixes something in browserify) + +0.7.3 / 2013-10-30 +================== + + * fix: catch localStorage security error when cookies are blocked (Chrome) + * add debug(err) support. Closes #46 + * add .browser prop to package.json. Closes #42 + +0.7.2 / 2013-02-06 +================== + + * fix package.json + * fix: Mobile Safari (private mode) is broken with debug + * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript + +0.7.1 / 2013-02-05 +================== + + * add repository URL to package.json + * add DEBUG_COLORED to force colored output + * add browserify support + * fix component. Closes #24 + +0.7.0 / 2012-05-04 +================== + + * Added .component to package.json + * Added debug.component.js build + +0.6.0 / 2012-03-16 +================== + + * Added support for "-" prefix in DEBUG [Vinay Pulim] + * Added `.enabled` flag to the node version [TooTallNate] + +0.5.0 / 2012-02-02 +================== + + * Added: humanize diffs. Closes #8 + * Added `debug.disable()` to the CS variant + * Removed padding. Closes #10 + * Fixed: persist client-side variant again. Closes #9 + +0.4.0 / 2012-02-01 +================== + + * Added browser variant support for older browsers [TooTallNate] + * Added `debug.enable('project:*')` to browser variant [TooTallNate] + * Added padding to diff (moved it to the right) + +0.3.0 / 2012-01-26 +================== + + * Added millisecond diff when isatty, otherwise UTC string + +0.2.0 / 2012-01-22 +================== + + * Added wildcard support + +0.1.0 / 2011-12-02 +================== + + * Added: remove colors unless stderr isatty [TooTallNate] + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/deploy/node_modules/debug/LICENSE b/deploy/node_modules/debug/LICENSE new file mode 100644 index 0000000..658c933 --- /dev/null +++ b/deploy/node_modules/debug/LICENSE @@ -0,0 +1,19 @@ +(The MIT License) + +Copyright (c) 2014 TJ Holowaychuk + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the 'Software'), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/deploy/node_modules/debug/Makefile b/deploy/node_modules/debug/Makefile new file mode 100644 index 0000000..584da8b --- /dev/null +++ b/deploy/node_modules/debug/Makefile @@ -0,0 +1,50 @@ +# get Makefile directory name: http://stackoverflow.com/a/5982798/376773 +THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) +THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) + +# BIN directory +BIN := $(THIS_DIR)/node_modules/.bin + +# Path +PATH := node_modules/.bin:$(PATH) +SHELL := /bin/bash + +# applications +NODE ?= $(shell which node) +YARN ?= $(shell which yarn) +PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm)) +BROWSERIFY ?= $(NODE) $(BIN)/browserify + +.FORCE: + +install: node_modules + +node_modules: package.json + @NODE_ENV= $(PKG) install + @touch node_modules + +lint: .FORCE + eslint browser.js debug.js index.js node.js + +test-node: .FORCE + istanbul cover node_modules/mocha/bin/_mocha -- test/**.js + +test-browser: .FORCE + mkdir -p dist + + @$(BROWSERIFY) \ + --standalone debug \ + . > dist/debug.js + + karma start --single-run + rimraf dist + +test: .FORCE + concurrently \ + "make test-node" \ + "make test-browser" + +coveralls: + cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js + +.PHONY: all install clean distclean diff --git a/deploy/node_modules/debug/README.md b/deploy/node_modules/debug/README.md new file mode 100644 index 0000000..f67be6b --- /dev/null +++ b/deploy/node_modules/debug/README.md @@ -0,0 +1,312 @@ +# debug +[![Build Status](https://travis-ci.org/visionmedia/debug.svg?branch=master)](https://travis-ci.org/visionmedia/debug) [![Coverage Status](https://coveralls.io/repos/github/visionmedia/debug/badge.svg?branch=master)](https://coveralls.io/github/visionmedia/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers) +[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors) + + + +A tiny node.js debugging utility modelled after node core's debugging technique. + +**Discussion around the V3 API is under way [here](https://github.com/visionmedia/debug/issues/370)** + +## Installation + +```bash +$ npm install debug +``` + +## Usage + +`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole. + +Example _app.js_: + +```js +var debug = require('debug')('http') + , http = require('http') + , name = 'My App'; + +// fake app + +debug('booting %s', name); + +http.createServer(function(req, res){ + debug(req.method + ' ' + req.url); + res.end('hello\n'); +}).listen(3000, function(){ + debug('listening'); +}); + +// fake worker of some kind + +require('./worker'); +``` + +Example _worker.js_: + +```js +var debug = require('debug')('worker'); + +setInterval(function(){ + debug('doing some work'); +}, 1000); +``` + + The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: + + ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) + + ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png) + +#### Windows note + + On Windows the environment variable is set using the `set` command. + + ```cmd + set DEBUG=*,-not_this + ``` + + Note that PowerShell uses different syntax to set environment variables. + + ```cmd + $env:DEBUG = "*,-not_this" + ``` + +Then, run the program to be debugged as usual. + +## Millisecond diff + + When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. + + ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) + + When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: + + ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png) + +## Conventions + + If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". + +## Wildcards + + The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. + + You can also exclude specific debuggers by prefixing them with a "-" character. For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:". + +## Environment Variables + + When running through Node.js, you can set a few environment variables that will + change the behavior of the debug logging: + +| Name | Purpose | +|-----------|-------------------------------------------------| +| `DEBUG` | Enables/disables specific debugging namespaces. | +| `DEBUG_COLORS`| Whether or not to use colors in the debug output. | +| `DEBUG_DEPTH` | Object inspection depth. | +| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. | + + + __Note:__ The environment variables beginning with `DEBUG_` end up being + converted into an Options object that gets used with `%o`/`%O` formatters. + See the Node.js documentation for + [`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options) + for the complete list. + +## Formatters + + + Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. Below are the officially supported formatters: + +| Formatter | Representation | +|-----------|----------------| +| `%O` | Pretty-print an Object on multiple lines. | +| `%o` | Pretty-print an Object all on a single line. | +| `%s` | String. | +| `%d` | Number (both integer and float). | +| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. | +| `%%` | Single percent sign ('%'). This does not consume an argument. | + +### Custom formatters + + You can add custom formatters by extending the `debug.formatters` object. For example, if you wanted to add support for rendering a Buffer as hex with `%h`, you could do something like: + +```js +const createDebug = require('debug') +createDebug.formatters.h = (v) => { + return v.toString('hex') +} + +// …elsewhere +const debug = createDebug('foo') +debug('this is hex: %h', new Buffer('hello world')) +// foo this is hex: 68656c6c6f20776f726c6421 +0ms +``` + +## Browser support + You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify), + or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest), + if you don't want to build it yourself. + + Debug's enable state is currently persisted by `localStorage`. + Consider the situation shown below where you have `worker:a` and `worker:b`, + and wish to debug both. You can enable this using `localStorage.debug`: + +```js +localStorage.debug = 'worker:*' +``` + +And then refresh the page. + +```js +a = debug('worker:a'); +b = debug('worker:b'); + +setInterval(function(){ + a('doing some work'); +}, 1000); + +setInterval(function(){ + b('doing some work'); +}, 1200); +``` + +#### Web Inspector Colors + + Colors are also enabled on "Web Inspectors" that understand the `%c` formatting + option. These are WebKit web inspectors, Firefox ([since version + 31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) + and the Firebug plugin for Firefox (any version). + + Colored output looks something like: + + ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png) + + +## Output streams + + By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method: + +Example _stdout.js_: + +```js +var debug = require('debug'); +var error = debug('app:error'); + +// by default stderr is used +error('goes to stderr!'); + +var log = debug('app:log'); +// set this namespace to log via console.log +log.log = console.log.bind(console); // don't forget to bind to console! +log('goes to stdout'); +error('still goes to stderr!'); + +// set all output to go via console.info +// overrides all per-namespace log settings +debug.log = console.info.bind(console); +error('now goes to stdout via console.info'); +log('still goes to stdout, but via console.info now'); +``` + + +## Authors + + - TJ Holowaychuk + - Nathan Rajlich + - Andrew Rhyne + +## Backers + +Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## Sponsors + +Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## License + +(The MIT License) + +Copyright (c) 2014-2016 TJ Holowaychuk <tj@vision-media.ca> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/deploy/node_modules/debug/component.json b/deploy/node_modules/debug/component.json new file mode 100644 index 0000000..94cd36d --- /dev/null +++ b/deploy/node_modules/debug/component.json @@ -0,0 +1,19 @@ +{ + "name": "debug", + "repo": "visionmedia/debug", + "description": "small debugging utility", + "version": "2.6.8", + "keywords": [ + "debug", + "log", + "debugger" + ], + "main": "src/browser.js", + "scripts": [ + "src/browser.js", + "src/debug.js" + ], + "dependencies": { + "rauchg/ms.js": "0.7.1" + } +} diff --git a/deploy/node_modules/debug/karma.conf.js b/deploy/node_modules/debug/karma.conf.js new file mode 100644 index 0000000..103a82d --- /dev/null +++ b/deploy/node_modules/debug/karma.conf.js @@ -0,0 +1,70 @@ +// Karma configuration +// Generated on Fri Dec 16 2016 13:09:51 GMT+0000 (UTC) + +module.exports = function(config) { + config.set({ + + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '', + + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['mocha', 'chai', 'sinon'], + + + // list of files / patterns to load in the browser + files: [ + 'dist/debug.js', + 'test/*spec.js' + ], + + + // list of files to exclude + exclude: [ + 'src/node.js' + ], + + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + }, + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['progress'], + + + // web server port + port: 9876, + + + // enable / disable colors in the output (reporters and logs) + colors: true, + + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['PhantomJS'], + + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: false, + + // Concurrency level + // how many browser should be started simultaneous + concurrency: Infinity + }) +} diff --git a/deploy/node_modules/debug/node.js b/deploy/node_modules/debug/node.js new file mode 100644 index 0000000..7fc36fe --- /dev/null +++ b/deploy/node_modules/debug/node.js @@ -0,0 +1 @@ +module.exports = require('./src/node'); diff --git a/deploy/node_modules/debug/package.json b/deploy/node_modules/debug/package.json new file mode 100644 index 0000000..07cac13 --- /dev/null +++ b/deploy/node_modules/debug/package.json @@ -0,0 +1,88 @@ +{ + "_from": "debug@^2.2.0", + "_id": "debug@2.6.8", + "_inBundle": false, + "_integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "_location": "/debug", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "debug@^2.2.0", + "name": "debug", + "escapedName": "debug", + "rawSpec": "^2.2.0", + "saveSpec": null, + "fetchSpec": "^2.2.0" + }, + "_requiredBy": [ + "/websocket" + ], + "_resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "_shasum": "e731531ca2ede27d188222427da17821d68ff4fc", + "_spec": "debug@^2.2.0", + "_where": "/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/websocket", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "browser": "./src/browser.js", + "bugs": { + "url": "https://github.com/visionmedia/debug/issues" + }, + "bundleDependencies": false, + "component": { + "scripts": { + "debug/index.js": "browser.js", + "debug/debug.js": "debug.js" + } + }, + "contributors": [ + { + "name": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": "http://n8.io" + }, + { + "name": "Andrew Rhyne", + "email": "rhyneandrew@gmail.com" + } + ], + "dependencies": { + "ms": "2.0.0" + }, + "deprecated": false, + "description": "small debugging utility", + "devDependencies": { + "browserify": "9.0.3", + "chai": "^3.5.0", + "concurrently": "^3.1.0", + "coveralls": "^2.11.15", + "eslint": "^3.12.1", + "istanbul": "^0.4.5", + "karma": "^1.3.0", + "karma-chai": "^0.1.0", + "karma-mocha": "^1.3.0", + "karma-phantomjs-launcher": "^1.0.2", + "karma-sinon": "^1.0.5", + "mocha": "^3.2.0", + "mocha-lcov-reporter": "^1.2.0", + "rimraf": "^2.5.4", + "sinon": "^1.17.6", + "sinon-chai": "^2.8.0" + }, + "homepage": "https://github.com/visionmedia/debug#readme", + "keywords": [ + "debug", + "log", + "debugger" + ], + "license": "MIT", + "main": "./src/index.js", + "name": "debug", + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/debug.git" + }, + "version": "2.6.8" +} diff --git a/deploy/node_modules/debug/src/browser.js b/deploy/node_modules/debug/src/browser.js new file mode 100644 index 0000000..7106924 --- /dev/null +++ b/deploy/node_modules/debug/src/browser.js @@ -0,0 +1,185 @@ +/** + * This is the web browser implementation of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = require('./debug'); +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = 'undefined' != typeof chrome + && 'undefined' != typeof chrome.storage + ? chrome.storage.local + : localstorage(); + +/** + * Colors. + */ + +exports.colors = [ + 'lightseagreen', + 'forestgreen', + 'goldenrod', + 'dodgerblue', + 'darkorchid', + 'crimson' +]; + +/** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { + return true; + } + + // is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || + // double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); +} + +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + +exports.formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (err) { + return '[UnexpectedJSONParseError]: ' + err.message; + } +}; + + +/** + * Colorize log arguments if enabled. + * + * @api public + */ + +function formatArgs(args) { + var useColors = this.useColors; + + args[0] = (useColors ? '%c' : '') + + this.namespace + + (useColors ? ' %c' : ' ') + + args[0] + + (useColors ? '%c ' : ' ') + + '+' + exports.humanize(this.diff); + + if (!useColors) return; + + var c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit') + + // the final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + var index = 0; + var lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, function(match) { + if ('%%' === match) return; + index++; + if ('%c' === match) { + // we only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); +} + +/** + * Invokes `console.log()` when available. + * No-op when `console.log` is not a "function". + * + * @api public + */ + +function log() { + // this hackery is required for IE8/9, where + // the `console.log` function doesn't have 'apply' + return 'object' === typeof console + && console.log + && Function.prototype.apply.call(console.log, console, arguments); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + +function save(namespaces) { + try { + if (null == namespaces) { + exports.storage.removeItem('debug'); + } else { + exports.storage.debug = namespaces; + } + } catch(e) {} +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + var r; + try { + r = exports.storage.debug; + } catch(e) {} + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; +} + +/** + * Enable namespaces listed in `localStorage.debug` initially. + */ + +exports.enable(load()); + +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + +function localstorage() { + try { + return window.localStorage; + } catch (e) {} +} diff --git a/deploy/node_modules/debug/src/debug.js b/deploy/node_modules/debug/src/debug.js new file mode 100644 index 0000000..6a5e3fc --- /dev/null +++ b/deploy/node_modules/debug/src/debug.js @@ -0,0 +1,202 @@ + +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; +exports.coerce = coerce; +exports.disable = disable; +exports.enable = enable; +exports.enabled = enabled; +exports.humanize = require('ms'); + +/** + * The currently active debug mode names, and names to skip. + */ + +exports.names = []; +exports.skips = []; + +/** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + +exports.formatters = {}; + +/** + * Previous log timestamp. + */ + +var prevTime; + +/** + * Select a color. + * @param {String} namespace + * @return {Number} + * @api private + */ + +function selectColor(namespace) { + var hash = 0, i; + + for (i in namespace) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return exports.colors[Math.abs(hash) % exports.colors.length]; +} + +/** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + +function createDebug(namespace) { + + function debug() { + // disabled? + if (!debug.enabled) return; + + var self = debug; + + // set `diff` timestamp + var curr = +new Date(); + var ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + // turn the `arguments` into a proper Array + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + + args[0] = exports.coerce(args[0]); + + if ('string' !== typeof args[0]) { + // anything else let's inspect with %O + args.unshift('%O'); + } + + // apply any `formatters` transformations + var index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { + // if we encounter an escaped % then don't increase the array index + if (match === '%%') return match; + index++; + var formatter = exports.formatters[format]; + if ('function' === typeof formatter) { + var val = args[index]; + match = formatter.call(self, val); + + // now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // apply env-specific formatting (colors, etc.) + exports.formatArgs.call(self, args); + + var logFn = debug.log || exports.log || console.log.bind(console); + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.enabled = exports.enabled(namespace); + debug.useColors = exports.useColors(); + debug.color = selectColor(namespace); + + // env-specific initialization logic for debug instances + if ('function' === typeof exports.init) { + exports.init(debug); + } + + return debug; +} + +/** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + +function enable(namespaces) { + exports.save(namespaces); + + exports.names = []; + exports.skips = []; + + var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + var len = split.length; + + for (var i = 0; i < len; i++) { + if (!split[i]) continue; // ignore empty strings + namespaces = split[i].replace(/\*/g, '.*?'); + if (namespaces[0] === '-') { + exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + exports.names.push(new RegExp('^' + namespaces + '$')); + } + } +} + +/** + * Disable debug output. + * + * @api public + */ + +function disable() { + exports.enable(''); +} + +/** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + +function enabled(name) { + var i, len; + for (i = 0, len = exports.skips.length; i < len; i++) { + if (exports.skips[i].test(name)) { + return false; + } + } + for (i = 0, len = exports.names.length; i < len; i++) { + if (exports.names[i].test(name)) { + return true; + } + } + return false; +} + +/** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} diff --git a/deploy/node_modules/debug/src/index.js b/deploy/node_modules/debug/src/index.js new file mode 100644 index 0000000..e12cf4d --- /dev/null +++ b/deploy/node_modules/debug/src/index.js @@ -0,0 +1,10 @@ +/** + * Detect Electron renderer process, which is node, but we should + * treat as a browser. + */ + +if (typeof process !== 'undefined' && process.type === 'renderer') { + module.exports = require('./browser.js'); +} else { + module.exports = require('./node.js'); +} diff --git a/deploy/node_modules/debug/src/node.js b/deploy/node_modules/debug/src/node.js new file mode 100644 index 0000000..af61297 --- /dev/null +++ b/deploy/node_modules/debug/src/node.js @@ -0,0 +1,246 @@ +/** + * Module dependencies. + */ + +var tty = require('tty'); +var util = require('util'); + +/** + * This is the Node.js implementation of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = require('./debug'); +exports.init = init; +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; + +/** + * Colors. + */ + +exports.colors = [6, 2, 3, 4, 5, 1]; + +/** + * Build up the default `inspectOpts` object from the environment variables. + * + * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js + */ + +exports.inspectOpts = Object.keys(process.env).filter(function (key) { + return /^debug_/i.test(key); +}).reduce(function (obj, key) { + // camel-case + var prop = key + .substring(6) + .toLowerCase() + .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); + + // coerce string value into JS value + var val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) val = true; + else if (/^(no|off|false|disabled)$/i.test(val)) val = false; + else if (val === 'null') val = null; + else val = Number(val); + + obj[prop] = val; + return obj; +}, {}); + +/** + * The file descriptor to write the `debug()` calls to. + * Set the `DEBUG_FD` env variable to override with another value. i.e.: + * + * $ DEBUG_FD=3 node script.js 3>debug.log + */ + +var fd = parseInt(process.env.DEBUG_FD, 10) || 2; + +if (1 !== fd && 2 !== fd) { + util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')() +} + +var stream = 1 === fd ? process.stdout : + 2 === fd ? process.stderr : + createWritableStdioStream(fd); + +/** + * Is stdout a TTY? Colored output is enabled when `true`. + */ + +function useColors() { + return 'colors' in exports.inspectOpts + ? Boolean(exports.inspectOpts.colors) + : tty.isatty(fd); +} + +/** + * Map %o to `util.inspect()`, all on a single line. + */ + +exports.formatters.o = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts) + .replace(/\s*\n\s*/g, ' '); +}; + +/** + * Map %o to `util.inspect()`, allowing multiple lines if needed. + */ + +exports.formatters.O = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); +}; + +/** + * Adds ANSI color escape codes if enabled. + * + * @api public + */ + +function formatArgs(args) { + var name = this.namespace; + var useColors = this.useColors; + + if (useColors) { + var c = this.color; + var prefix = ' \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m'; + + args[0] = prefix + args[0].split('\n').join('\n' + prefix); + args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); + } else { + args[0] = new Date().toUTCString() + + ' ' + name + ' ' + args[0]; + } +} + +/** + * Invokes `util.format()` with the specified arguments and writes to `stream`. + */ + +function log() { + return stream.write(util.format.apply(util, arguments) + '\n'); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + +function save(namespaces) { + if (null == namespaces) { + // If you set a process.env field to null or undefined, it gets cast to the + // string 'null' or 'undefined'. Just delete instead. + delete process.env.DEBUG; + } else { + process.env.DEBUG = namespaces; + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + return process.env.DEBUG; +} + +/** + * Copied from `node/src/node.js`. + * + * XXX: It's lame that node doesn't expose this API out-of-the-box. It also + * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame. + */ + +function createWritableStdioStream (fd) { + var stream; + var tty_wrap = process.binding('tty_wrap'); + + // Note stream._type is used for test-module-load-list.js + + switch (tty_wrap.guessHandleType(fd)) { + case 'TTY': + stream = new tty.WriteStream(fd); + stream._type = 'tty'; + + // Hack to have stream not keep the event loop alive. + // See https://github.com/joyent/node/issues/1726 + if (stream._handle && stream._handle.unref) { + stream._handle.unref(); + } + break; + + case 'FILE': + var fs = require('fs'); + stream = new fs.SyncWriteStream(fd, { autoClose: false }); + stream._type = 'fs'; + break; + + case 'PIPE': + case 'TCP': + var net = require('net'); + stream = new net.Socket({ + fd: fd, + readable: false, + writable: true + }); + + // FIXME Should probably have an option in net.Socket to create a + // stream from an existing fd which is writable only. But for now + // we'll just add this hack and set the `readable` member to false. + // Test: ./node test/fixtures/echo.js < /etc/passwd + stream.readable = false; + stream.read = null; + stream._type = 'pipe'; + + // FIXME Hack to have stream not keep the event loop alive. + // See https://github.com/joyent/node/issues/1726 + if (stream._handle && stream._handle.unref) { + stream._handle.unref(); + } + break; + + default: + // Probably an error on in uv_guess_handle() + throw new Error('Implement me. Unknown stream file type!'); + } + + // For supporting legacy API we put the FD here. + stream.fd = fd; + + stream._isStdio = true; + + return stream; +} + +/** + * Init logic for `debug` instances. + * + * Create a new `inspectOpts` object in case `useColors` is set + * differently for a particular `debug` instance. + */ + +function init (debug) { + debug.inspectOpts = {}; + + var keys = Object.keys(exports.inspectOpts); + for (var i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; + } +} + +/** + * Enable namespaces listed in `process.env.DEBUG` initially. + */ + +exports.enable(load()); diff --git a/deploy/node_modules/inherits/LICENSE b/deploy/node_modules/inherits/LICENSE new file mode 100644 index 0000000..dea3013 --- /dev/null +++ b/deploy/node_modules/inherits/LICENSE @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + diff --git a/deploy/node_modules/inherits/README.md b/deploy/node_modules/inherits/README.md new file mode 100644 index 0000000..b1c5665 --- /dev/null +++ b/deploy/node_modules/inherits/README.md @@ -0,0 +1,42 @@ +Browser-friendly inheritance fully compatible with standard node.js +[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). + +This package exports standard `inherits` from node.js `util` module in +node environment, but also provides alternative browser-friendly +implementation through [browser +field](https://gist.github.com/shtylman/4339901). Alternative +implementation is a literal copy of standard one located in standalone +module to avoid requiring of `util`. It also has a shim for old +browsers with no `Object.create` support. + +While keeping you sure you are using standard `inherits` +implementation in node.js environment, it allows bundlers such as +[browserify](https://github.com/substack/node-browserify) to not +include full `util` package to your client code if all you need is +just `inherits` function. It worth, because browser shim for `util` +package is large and `inherits` is often the single function you need +from it. + +It's recommended to use this package instead of +`require('util').inherits` for any code that has chances to be used +not only in node.js but in browser too. + +## usage + +```js +var inherits = require('inherits'); +// then use exactly as the standard one +``` + +## note on version ~1.0 + +Version ~1.0 had completely different motivation and is not compatible +neither with 2.0 nor with standard node.js `inherits`. + +If you are using version ~1.0 and planning to switch to ~2.0, be +careful: + +* new version uses `super_` instead of `super` for referencing + superclass +* new version overwrites current prototype while old one preserves any + existing fields on it diff --git a/deploy/node_modules/inherits/inherits.js b/deploy/node_modules/inherits/inherits.js new file mode 100644 index 0000000..29f5e24 --- /dev/null +++ b/deploy/node_modules/inherits/inherits.js @@ -0,0 +1 @@ +module.exports = require('util').inherits diff --git a/deploy/node_modules/inherits/inherits_browser.js b/deploy/node_modules/inherits/inherits_browser.js new file mode 100644 index 0000000..c1e78a7 --- /dev/null +++ b/deploy/node_modules/inherits/inherits_browser.js @@ -0,0 +1,23 @@ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} diff --git a/deploy/node_modules/inherits/package.json b/deploy/node_modules/inherits/package.json new file mode 100644 index 0000000..445bd3f --- /dev/null +++ b/deploy/node_modules/inherits/package.json @@ -0,0 +1,54 @@ +{ + "_from": "inherits@2.0.1", + "_id": "inherits@2.0.1", + "_inBundle": false, + "_integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "_location": "/inherits", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "inherits@2.0.1", + "name": "inherits", + "escapedName": "inherits", + "rawSpec": "2.0.1", + "saveSpec": null, + "fetchSpec": "2.0.1" + }, + "_requiredBy": [ + "/util" + ], + "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", + "_spec": "inherits@2.0.1", + "_where": "/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/util", + "browser": "./inherits_browser.js", + "bugs": { + "url": "https://github.com/isaacs/inherits/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", + "homepage": "https://github.com/isaacs/inherits#readme", + "keywords": [ + "inheritance", + "class", + "klass", + "oop", + "object-oriented", + "inherits", + "browser", + "browserify" + ], + "license": "ISC", + "main": "./inherits.js", + "name": "inherits", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/inherits.git" + }, + "scripts": { + "test": "node test" + }, + "version": "2.0.1" +} diff --git a/deploy/node_modules/inherits/test.js b/deploy/node_modules/inherits/test.js new file mode 100644 index 0000000..fc53012 --- /dev/null +++ b/deploy/node_modules/inherits/test.js @@ -0,0 +1,25 @@ +var inherits = require('./inherits.js') +var assert = require('assert') + +function test(c) { + assert(c.constructor === Child) + assert(c.constructor.super_ === Parent) + assert(Object.getPrototypeOf(c) === Child.prototype) + assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) + assert(c instanceof Child) + assert(c instanceof Parent) +} + +function Child() { + Parent.call(this) + test(this) +} + +function Parent() {} + +inherits(Child, Parent) + +var c = new Child +test(c) + +console.log('ok') diff --git a/deploy/node_modules/is-typedarray/LICENSE.md b/deploy/node_modules/is-typedarray/LICENSE.md new file mode 100644 index 0000000..ee27ba4 --- /dev/null +++ b/deploy/node_modules/is-typedarray/LICENSE.md @@ -0,0 +1,18 @@ +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/deploy/node_modules/is-typedarray/README.md b/deploy/node_modules/is-typedarray/README.md new file mode 100644 index 0000000..2752863 --- /dev/null +++ b/deploy/node_modules/is-typedarray/README.md @@ -0,0 +1,16 @@ +# is-typedarray [![locked](http://badges.github.io/stability-badges/dist/locked.svg)](http://github.com/badges/stability-badges) + +Detect whether or not an object is a +[Typed Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays). + +## Usage + +[![NPM](https://nodei.co/npm/is-typedarray.png)](https://nodei.co/npm/is-typedarray/) + +### isTypedArray(array) + +Returns `true` when array is a Typed Array, and `false` when it is not. + +## License + +MIT. See [LICENSE.md](http://github.com/hughsk/is-typedarray/blob/master/LICENSE.md) for details. diff --git a/deploy/node_modules/is-typedarray/index.js b/deploy/node_modules/is-typedarray/index.js new file mode 100644 index 0000000..5859603 --- /dev/null +++ b/deploy/node_modules/is-typedarray/index.js @@ -0,0 +1,41 @@ +module.exports = isTypedArray +isTypedArray.strict = isStrictTypedArray +isTypedArray.loose = isLooseTypedArray + +var toString = Object.prototype.toString +var names = { + '[object Int8Array]': true + , '[object Int16Array]': true + , '[object Int32Array]': true + , '[object Uint8Array]': true + , '[object Uint8ClampedArray]': true + , '[object Uint16Array]': true + , '[object Uint32Array]': true + , '[object Float32Array]': true + , '[object Float64Array]': true +} + +function isTypedArray(arr) { + return ( + isStrictTypedArray(arr) + || isLooseTypedArray(arr) + ) +} + +function isStrictTypedArray(arr) { + return ( + arr instanceof Int8Array + || arr instanceof Int16Array + || arr instanceof Int32Array + || arr instanceof Uint8Array + || arr instanceof Uint8ClampedArray + || arr instanceof Uint16Array + || arr instanceof Uint32Array + || arr instanceof Float32Array + || arr instanceof Float64Array + ) +} + +function isLooseTypedArray(arr) { + return names[toString.call(arr)] +} diff --git a/deploy/node_modules/is-typedarray/package.json b/deploy/node_modules/is-typedarray/package.json new file mode 100644 index 0000000..50e6a85 --- /dev/null +++ b/deploy/node_modules/is-typedarray/package.json @@ -0,0 +1,59 @@ +{ + "_from": "is-typedarray@^1.0.0", + "_id": "is-typedarray@1.0.0", + "_inBundle": false, + "_integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "_location": "/is-typedarray", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "is-typedarray@^1.0.0", + "name": "is-typedarray", + "escapedName": "is-typedarray", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/typedarray-to-buffer" + ], + "_resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "_shasum": "e479c80858df0c1b11ddda6940f96011fcda4a9a", + "_spec": "is-typedarray@^1.0.0", + "_where": "/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/typedarray-to-buffer", + "author": { + "name": "Hugh Kennedy", + "email": "hughskennedy@gmail.com", + "url": "http://hughsk.io/" + }, + "bugs": { + "url": "https://github.com/hughsk/is-typedarray/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Detect whether or not an object is a Typed Array", + "devDependencies": { + "tape": "^2.13.1" + }, + "homepage": "https://github.com/hughsk/is-typedarray", + "keywords": [ + "typed", + "array", + "detect", + "is", + "util" + ], + "license": "MIT", + "main": "index.js", + "name": "is-typedarray", + "repository": { + "type": "git", + "url": "git://github.com/hughsk/is-typedarray.git" + }, + "scripts": { + "test": "node test" + }, + "version": "1.0.0" +} diff --git a/deploy/node_modules/is-typedarray/test.js b/deploy/node_modules/is-typedarray/test.js new file mode 100644 index 0000000..b0c176f --- /dev/null +++ b/deploy/node_modules/is-typedarray/test.js @@ -0,0 +1,34 @@ +var test = require('tape') +var ista = require('./') + +test('strict', function(t) { + t.ok(ista.strict(new Int8Array), 'Int8Array') + t.ok(ista.strict(new Int16Array), 'Int16Array') + t.ok(ista.strict(new Int32Array), 'Int32Array') + t.ok(ista.strict(new Uint8Array), 'Uint8Array') + t.ok(ista.strict(new Uint16Array), 'Uint16Array') + t.ok(ista.strict(new Uint32Array), 'Uint32Array') + t.ok(ista.strict(new Float32Array), 'Float32Array') + t.ok(ista.strict(new Float64Array), 'Float64Array') + + t.ok(!ista.strict(new Array), 'Array') + t.ok(!ista.strict([]), '[]') + + t.end() +}) + +test('loose', function(t) { + t.ok(ista.loose(new Int8Array), 'Int8Array') + t.ok(ista.loose(new Int16Array), 'Int16Array') + t.ok(ista.loose(new Int32Array), 'Int32Array') + t.ok(ista.loose(new Uint8Array), 'Uint8Array') + t.ok(ista.loose(new Uint16Array), 'Uint16Array') + t.ok(ista.loose(new Uint32Array), 'Uint32Array') + t.ok(ista.loose(new Float32Array), 'Float32Array') + t.ok(ista.loose(new Float64Array), 'Float64Array') + + t.ok(!ista.loose(new Array), 'Array') + t.ok(!ista.loose([]), '[]') + + t.end() +}) diff --git a/deploy/node_modules/ms/index.js b/deploy/node_modules/ms/index.js new file mode 100644 index 0000000..6a522b1 --- /dev/null +++ b/deploy/node_modules/ms/index.js @@ -0,0 +1,152 @@ +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +module.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isNaN(val) === false) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + if (ms >= d) { + return Math.round(ms / d) + 'd'; + } + if (ms >= h) { + return Math.round(ms / h) + 'h'; + } + if (ms >= m) { + return Math.round(ms / m) + 'm'; + } + if (ms >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + return plural(ms, d, 'day') || + plural(ms, h, 'hour') || + plural(ms, m, 'minute') || + plural(ms, s, 'second') || + ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, n, name) { + if (ms < n) { + return; + } + if (ms < n * 1.5) { + return Math.floor(ms / n) + ' ' + name; + } + return Math.ceil(ms / n) + ' ' + name + 's'; +} diff --git a/deploy/node_modules/ms/license.md b/deploy/node_modules/ms/license.md new file mode 100644 index 0000000..69b6125 --- /dev/null +++ b/deploy/node_modules/ms/license.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Zeit, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/deploy/node_modules/ms/package.json b/deploy/node_modules/ms/package.json new file mode 100644 index 0000000..1885b66 --- /dev/null +++ b/deploy/node_modules/ms/package.json @@ -0,0 +1,69 @@ +{ + "_from": "ms@2.0.0", + "_id": "ms@2.0.0", + "_inBundle": false, + "_integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "_location": "/ms", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "ms@2.0.0", + "name": "ms", + "escapedName": "ms", + "rawSpec": "2.0.0", + "saveSpec": null, + "fetchSpec": "2.0.0" + }, + "_requiredBy": [ + "/debug" + ], + "_resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "_shasum": "5608aeadfc00be6c2901df5f9861788de0d597c8", + "_spec": "ms@2.0.0", + "_where": "/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/debug", + "bugs": { + "url": "https://github.com/zeit/ms/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Tiny milisecond conversion utility", + "devDependencies": { + "eslint": "3.19.0", + "expect.js": "0.3.1", + "husky": "0.13.3", + "lint-staged": "3.4.1", + "mocha": "3.4.1" + }, + "eslintConfig": { + "extends": "eslint:recommended", + "env": { + "node": true, + "es6": true + } + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/zeit/ms#readme", + "license": "MIT", + "lint-staged": { + "*.js": [ + "npm run lint", + "prettier --single-quote --write", + "git add" + ] + }, + "main": "./index", + "name": "ms", + "repository": { + "type": "git", + "url": "git+https://github.com/zeit/ms.git" + }, + "scripts": { + "lint": "eslint lib/* bin/*", + "precommit": "lint-staged", + "test": "mocha tests.js" + }, + "version": "2.0.0" +} diff --git a/deploy/node_modules/ms/readme.md b/deploy/node_modules/ms/readme.md new file mode 100644 index 0000000..84a9974 --- /dev/null +++ b/deploy/node_modules/ms/readme.md @@ -0,0 +1,51 @@ +# ms + +[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms) +[![Slack Channel](http://zeit-slackin.now.sh/badge.svg)](https://zeit.chat/) + +Use this package to easily convert various time formats to milliseconds. + +## Examples + +```js +ms('2 days') // 172800000 +ms('1d') // 86400000 +ms('10h') // 36000000 +ms('2.5 hrs') // 9000000 +ms('2h') // 7200000 +ms('1m') // 60000 +ms('5s') // 5000 +ms('1y') // 31557600000 +ms('100') // 100 +``` + +### Convert from milliseconds + +```js +ms(60000) // "1m" +ms(2 * 60000) // "2m" +ms(ms('10 hours')) // "10h" +``` + +### Time format written-out + +```js +ms(60000, { long: true }) // "1 minute" +ms(2 * 60000, { long: true }) // "2 minutes" +ms(ms('10 hours'), { long: true }) // "10 hours" +``` + +## Features + +- Works both in [node](https://nodejs.org) and in the browser. +- If a number is supplied to `ms`, a string with a unit is returned. +- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`). +- If you pass a string with a number and a valid unit, the number of equivalent ms is returned. + +## Caught a bug? + +1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device +2. Link the package to the global module directory: `npm link` +3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, node will now use your clone of ms! + +As always, you can run the tests using: `npm test` diff --git a/deploy/node_modules/nan/CHANGELOG.md b/deploy/node_modules/nan/CHANGELOG.md new file mode 100644 index 0000000..ea3b70f --- /dev/null +++ b/deploy/node_modules/nan/CHANGELOG.md @@ -0,0 +1,458 @@ +# NAN ChangeLog + +**Version 2.7.0: current Node 8.4.0, Node 12: 0.12.18, Node 10: 0.10.48, iojs: 3.3.1** + +### 2.7.0 Aug 30 2017 + + - Feature: Add Nan::To() overload. b93280670c9f6da42ed4cf6cbf085ffdd87bd65b + - Bugfix: Fix ternary in Nan::MaybeLocal::FromMaybe(). 79a26f7d362e756a9524e672a82c3d603b542867 + +### 2.6.2 Apr 12 2017 + + - Bugfix: Fix v8::JSON::Parse() deprecation warning. 87f6a3c65815fa062296a994cc863e2fa124867d + +### 2.6.1 Apr 6 2017 + + - Bugfix: nan_json.h: fix build breakage in Node 6 ac8d47dc3c10bfbf3f15a6b951633120c0ee6d51 + +### 2.6.0 Apr 6 2017 + + - Feature: nan: add support for JSON::Parse & Stringify b533226c629cce70e1932a873bb6f849044a56c5 + +### 2.5.1 Jan 23 2017 + + - Bugfix: Fix disappearing handle for private value 6a80995694f162ef63dbc9948fbefd45d4485aa0 + - Bugfix: Add missing scopes a93b8bae6bc7d32a170db6e89228b7f60ee57112 + - Bugfix: Use string::data instead of string::front in NewOneByteString d5f920371e67e1f3b268295daee6e83af86b6e50 + +### 2.5.0 Dec 21 2016 + + - Feature: Support Private accessors a86255cb357e8ad8ccbf1f6a4a901c921e39a178 + - Bugfix: Abort in delete operators that shouldn't be called 0fe38215ff8581703967dfd26c12793feb960018 + +### 2.4.0 Jul 10 2016 + + - Feature: Rewrite Callback to add Callback::Reset c4cf44d61f8275cd5f7b0c911d7a806d4004f649 + - Feature: AsyncProgressWorker: add template types for .send 1242c9a11a7ed481c8f08ec06316385cacc513d0 + - Bugfix: Add constness to old Persistent comparison operators bd43cb9982c7639605d60fd073efe8cae165d9b2 + +### 2.3.5 May 31 2016 + + - Bugfix: Replace NAN_INLINE with 'inline' keyword. 71819d8725f822990f439479c9aba3b240804909 + +### 2.3.4 May 31 2016 + + - Bugfix: Remove V8 deprecation warnings 0592fb0a47f3a1c7763087ebea8e1138829f24f9 + - Bugfix: Fix new versions not to use WeakCallbackInfo::IsFirstPass 615c19d9e03d4be2049c10db0151edbc3b229246 + - Bugfix: Make ObjectWrap::handle() const d19af99595587fe7a26bd850af6595c2a7145afc + - Bugfix: Fix compilation errors related to 0592fb0a47f3a1c7763087ebea8e1138829f24f9 e9191c525b94f652718325e28610a1adcf90fed8 + +### 2.3.3 May 4 2016 + + - Bugfix: Refactor SetMethod() to deal with v8::Templates (#566) b9083cf6d5de6ebe6bcb49c7502fbb7c0d9ddda8 + +### 2.3.2 Apr 27 2016 + + - Bugfix: Fix compilation on outdated versions due to Handle removal f8b7c875d04d425a41dfd4f3f8345bc3a11e6c52 + +### 2.3.1 Apr 27 2016 + + - Bugfix: Don't use deprecated v8::Template::Set() in SetMethod a90951e9ea70fa1b3836af4b925322919159100e + +### 2.3.0 Apr 27 2016 + + - Feature: added Signal() for invoking async callbacks without sending data from AsyncProgressWorker d8adba45f20e077d00561b20199133620c990b38 + - Bugfix: Don't use deprecated v8::Template::Set() 00dacf0a4b86027415867fa7f1059acc499dcece + +### 2.2.1 Mar 29 2016 + + - Bugfix: Use NewFromUnsigned in ReturnValue::Set(uint32_t i) for pre_12 3a18f9bdce29826e0e4c217854bc476918241a58 + - Performance: Remove unneeeded nullptr checks b715ef44887931c94f0d1605b3b1a4156eebece9 + +### 2.2.0 Jan 9 2016 + + - Feature: Add Function::Call wrapper 4c157474dacf284d125c324177b45aa5dabc08c6 + - Feature: Rename GC*logueCallback to GCCallback for > 4.0 3603435109f981606d300eb88004ca101283acec + - Bugfix: Fix Global::Pass for old versions 367e82a60fbaa52716232cc89db1cc3f685d77d9 + - Bugfix: Remove weird MaybeLocal wrapping of what already is a MaybeLocal 23b4590db10c2ba66aee2338aebe9751c4cb190b + +### 2.1.0 Oct 8 2015 + + - Deprecation: Deprecate NanErrnoException in favor of ErrnoException 0af1ca4cf8b3f0f65ed31bc63a663ab3319da55c + - Feature: added helper class for accessing contents of typedarrays 17b51294c801e534479d5463697a73462d0ca555 + - Feature: [Maybe types] Add MakeMaybe(...) 48d7b53d9702b0c7a060e69ea10fea8fb48d814d + - Feature: new: allow utf16 string with length 66ac6e65c8ab9394ef588adfc59131b3b9d8347b + - Feature: Introduce SetCallHandler and SetCallAsFunctionHandler 7764a9a115d60ba10dc24d86feb0fbc9b4f75537 + - Bugfix: Enable creating Locals from Globals under Node 0.10. 9bf9b8b190821af889790fdc18ace57257e4f9ff + - Bugfix: Fix issue #462 where PropertyCallbackInfo data is not stored safely. 55f50adedd543098526c7b9f4fffd607d3f9861f + +### 2.0.9 Sep 8 2015 + + - Bugfix: EscapableHandleScope in Nan::NewBuffer for Node 0.8 and 0.10 b1654d7 + +### 2.0.8 Aug 28 2015 + + - Work around duplicate linking bug in clang 11902da + +### 2.0.7 Aug 26 2015 + + - Build: Repackage + +### 2.0.6 Aug 26 2015 + + - Bugfix: Properly handle null callback in FunctionTemplate factory 6e99cb1 + - Bugfix: Remove unused static std::map instances 525bddc + - Bugfix: Make better use of maybe versions of APIs bfba85b + - Bugfix: Fix shadowing issues with handle in ObjectWrap 0a9072d + +### 2.0.5 Aug 10 2015 + + - Bugfix: Reimplement weak callback in ObjectWrap 98d38c1 + - Bugfix: Make sure callback classes are not assignable, copyable or movable 81f9b1d + +### 2.0.4 Aug 6 2015 + + - Build: Repackage + +### 2.0.3 Aug 6 2015 + + - Bugfix: Don't use clang++ / g++ syntax extension. 231450e + +### 2.0.2 Aug 6 2015 + + - Build: Repackage + +### 2.0.1 Aug 6 2015 + + - Bugfix: Add workaround for missing REPLACE_INVALID_UTF8 60d6687 + - Bugfix: Reimplement ObjectWrap from scratch to prevent memory leaks 6484601 + - Bugfix: Fix Persistent leak in FunctionCallbackInfo and PropertyCallbackInfo 641ef5f + - Bugfix: Add missing overload for Nan::NewInstance that takes argc/argv 29450ed + +### 2.0.0 Jul 31 2015 + + - Change: Renamed identifiers with leading underscores b5932b4 + - Change: Replaced NanObjectWrapHandle with class NanObjectWrap 464f1e1 + - Change: Replace NanScope and NanEscpableScope macros with classes 47751c4 + - Change: Rename NanNewBufferHandle to NanNewBuffer 6745f99 + - Change: Rename NanBufferUse to NanNewBuffer 3e8b0a5 + - Change: Rename NanNewBuffer to NanCopyBuffer d6af78d + - Change: Remove Nan prefix from all names 72d1f67 + - Change: Update Buffer API for new upstream changes d5d3291 + - Change: Rename Scope and EscapableScope to HandleScope and EscapableHandleScope 21a7a6a + - Change: Get rid of Handles e6c0daf + - Feature: Support io.js 3 with V8 4.4 + - Feature: Introduce NanPersistent 7fed696 + - Feature: Introduce NanGlobal 4408da1 + - Feature: Added NanTryCatch 10f1ca4 + - Feature: Update for V8 v4.3 4b6404a + - Feature: Introduce NanNewOneByteString c543d32 + - Feature: Introduce namespace Nan 67ed1b1 + - Removal: Remove NanLocker and NanUnlocker dd6e401 + - Removal: Remove string converters, except NanUtf8String, which now follows the node implementation b5d00a9 + - Removal: Remove NanReturn* macros d90a25c + - Removal: Remove HasInstance e8f84fe + + +### 1.9.0 Jul 31 2015 + + - Feature: Added `NanFatalException` 81d4a2c + - Feature: Added more error types 4265f06 + - Feature: Added dereference and function call operators to NanCallback c4b2ed0 + - Feature: Added indexed GetFromPersistent and SaveToPersistent edd510c + - Feature: Added more overloads of SaveToPersistent and GetFromPersistent 8b1cef6 + - Feature: Added NanErrnoException dd87d9e + - Correctness: Prevent assign, copy, and move for classes that do not support it 1f55c59, 4b808cb, c96d9b2, fba4a29, 3357130 + - Deprecation: Deprecate `NanGetPointerSafe` and `NanSetPointerSafe` 81d4a2c + - Deprecation: Deprecate `NanBooleanOptionValue` and `NanUInt32OptionValue` 0ad254b + +### 1.8.4 Apr 26 2015 + + - Build: Repackage + +### 1.8.3 Apr 26 2015 + + - Bugfix: Include missing header 1af8648 + +### 1.8.2 Apr 23 2015 + + - Build: Repackage + +### 1.8.1 Apr 23 2015 + + - Bugfix: NanObjectWrapHandle should take a pointer 155f1d3 + +### 1.8.0 Apr 23 2015 + + - Feature: Allow primitives with NanReturnValue 2e4475e + - Feature: Added comparison operators to NanCallback 55b075e + - Feature: Backport thread local storage 15bb7fa + - Removal: Remove support for signatures with arguments 8a2069d + - Correcteness: Replaced NanObjectWrapHandle macro with function 0bc6d59 + +### 1.7.0 Feb 28 2015 + + - Feature: Made NanCallback::Call accept optional target 8d54da7 + - Feature: Support atom-shell 0.21 0b7f1bb + +### 1.6.2 Feb 6 2015 + + - Bugfix: NanEncode: fix argument type for node::Encode on io.js 2be8639 + +### 1.6.1 Jan 23 2015 + + - Build: version bump + +### 1.5.3 Jan 23 2015 + + - Build: repackage + +### 1.6.0 Jan 23 2015 + + - Deprecated `NanNewContextHandle` in favor of `NanNew` 49259af + - Support utility functions moved in newer v8 versions (Node 0.11.15, io.js 1.0) a0aa179 + - Added `NanEncode`, `NanDecodeBytes` and `NanDecodeWrite` 75e6fb9 + +### 1.5.2 Jan 23 2015 + + - Bugfix: Fix non-inline definition build error with clang++ 21d96a1, 60fadd4 + - Bugfix: Readded missing String constructors 18d828f + - Bugfix: Add overload handling NanNew(..) 5ef813b + - Bugfix: Fix uv_work_cb versioning 997e4ae + - Bugfix: Add function factory and test 4eca89c + - Bugfix: Add object template factory and test cdcb951 + - Correctness: Lifted an io.js related typedef c9490be + - Correctness: Make explicit downcasts of String lengths 00074e6 + - Windows: Limit the scope of disabled warning C4530 83d7deb + +### 1.5.1 Jan 15 2015 + + - Build: version bump + +### 1.4.3 Jan 15 2015 + + - Build: version bump + +### 1.4.2 Jan 15 2015 + + - Feature: Support io.js 0dbc5e8 + +### 1.5.0 Jan 14 2015 + + - Feature: Support io.js b003843 + - Correctness: Improved NanNew internals 9cd4f6a + - Feature: Implement progress to NanAsyncWorker 8d6a160 + +### 1.4.1 Nov 8 2014 + + - Bugfix: Handle DEBUG definition correctly + - Bugfix: Accept int as Boolean + +### 1.4.0 Nov 1 2014 + + - Feature: Added NAN_GC_CALLBACK 6a5c245 + - Performance: Removed unnecessary local handle creation 18a7243, 41fe2f8 + - Correctness: Added constness to references in NanHasInstance 02c61cd + - Warnings: Fixed spurious warnings from -Wundef and -Wshadow, 541b122, 99d8cb6 + - Windoze: Shut Visual Studio up when compiling 8d558c1 + - License: Switch to plain MIT from custom hacked MIT license 11de983 + - Build: Added test target to Makefile e232e46 + - Performance: Removed superfluous scope in NanAsyncWorker f4b7821 + - Sugar/Feature: Added NanReturnThis() and NanReturnHolder() shorthands 237a5ff, d697208 + - Feature: Added suitable overload of NanNew for v8::Integer::NewFromUnsigned b27b450 + +### 1.3.0 Aug 2 2014 + + - Added NanNew(std::string) + - Added NanNew(std::string&) + - Added NanAsciiString helper class + - Added NanUtf8String helper class + - Added NanUcs2String helper class + - Deprecated NanRawString() + - Deprecated NanCString() + - Added NanGetIsolateData(v8::Isolate *isolate) + - Added NanMakeCallback(v8::Handle target, v8::Handle func, int argc, v8::Handle* argv) + - Added NanMakeCallback(v8::Handle target, v8::Handle symbol, int argc, v8::Handle* argv) + - Added NanMakeCallback(v8::Handle target, const char* method, int argc, v8::Handle* argv) + - Added NanSetTemplate(v8::Handle templ, v8::Handle name , v8::Handle value, v8::PropertyAttribute attributes) + - Added NanSetPrototypeTemplate(v8::Local templ, v8::Handle name, v8::Handle value, v8::PropertyAttribute attributes) + - Added NanSetInstanceTemplate(v8::Local templ, const char *name, v8::Handle value) + - Added NanSetInstanceTemplate(v8::Local templ, v8::Handle name, v8::Handle value, v8::PropertyAttribute attributes) + +### 1.2.0 Jun 5 2014 + + - Add NanSetPrototypeTemplate + - Changed NAN_WEAK_CALLBACK internals, switched _NanWeakCallbackData to class, + introduced _NanWeakCallbackDispatcher + - Removed -Wno-unused-local-typedefs from test builds + - Made test builds Windows compatible ('Sleep()') + +### 1.1.2 May 28 2014 + + - Release to fix more stuff-ups in 1.1.1 + +### 1.1.1 May 28 2014 + + - Release to fix version mismatch in nan.h and lack of changelog entry for 1.1.0 + +### 1.1.0 May 25 2014 + + - Remove nan_isolate, use v8::Isolate::GetCurrent() internally instead + - Additional explicit overloads for NanNew(): (char*,int), (uint8_t*[,int]), + (uint16_t*[,int), double, int, unsigned int, bool, v8::String::ExternalStringResource*, + v8::String::ExternalAsciiStringResource* + - Deprecate NanSymbol() + - Added SetErrorMessage() and ErrorMessage() to NanAsyncWorker + +### 1.0.0 May 4 2014 + + - Heavy API changes for V8 3.25 / Node 0.11.13 + - Use cpplint.py + - Removed NanInitPersistent + - Removed NanPersistentToLocal + - Removed NanFromV8String + - Removed NanMakeWeak + - Removed NanNewLocal + - Removed NAN_WEAK_CALLBACK_OBJECT + - Removed NAN_WEAK_CALLBACK_DATA + - Introduce NanNew, replaces NanNewLocal, NanPersistentToLocal, adds many overloaded typed versions + - Introduce NanUndefined, NanNull, NanTrue and NanFalse + - Introduce NanEscapableScope and NanEscapeScope + - Introduce NanMakeWeakPersistent (requires a special callback to work on both old and new node) + - Introduce NanMakeCallback for node::MakeCallback + - Introduce NanSetTemplate + - Introduce NanGetCurrentContext + - Introduce NanCompileScript and NanRunScript + - Introduce NanAdjustExternalMemory + - Introduce NanAddGCEpilogueCallback, NanAddGCPrologueCallback, NanRemoveGCEpilogueCallback, NanRemoveGCPrologueCallback + - Introduce NanGetHeapStatistics + - Rename NanAsyncWorker#SavePersistent() to SaveToPersistent() + +### 0.8.0 Jan 9 2014 + + - NanDispose -> NanDisposePersistent, deprecate NanDispose + - Extract _NAN_*_RETURN_TYPE, pull up NAN_*() + +### 0.7.1 Jan 9 2014 + + - Fixes to work against debug builds of Node + - Safer NanPersistentToLocal (avoid reinterpret_cast) + - Speed up common NanRawString case by only extracting flattened string when necessary + +### 0.7.0 Dec 17 2013 + + - New no-arg form of NanCallback() constructor. + - NanCallback#Call takes Handle rather than Local + - Removed deprecated NanCallback#Run method, use NanCallback#Call instead + - Split off _NAN_*_ARGS_TYPE from _NAN_*_ARGS + - Restore (unofficial) Node 0.6 compatibility at NanCallback#Call() + - Introduce NanRawString() for char* (or appropriate void*) from v8::String + (replacement for NanFromV8String) + - Introduce NanCString() for null-terminated char* from v8::String + +### 0.6.0 Nov 21 2013 + + - Introduce NanNewLocal(v8::Handle value) for use in place of + v8::Local::New(...) since v8 started requiring isolate in Node 0.11.9 + +### 0.5.2 Nov 16 2013 + + - Convert SavePersistent and GetFromPersistent in NanAsyncWorker from protected and public + +### 0.5.1 Nov 12 2013 + + - Use node::MakeCallback() instead of direct v8::Function::Call() + +### 0.5.0 Nov 11 2013 + + - Added @TooTallNate as collaborator + - New, much simpler, "include_dirs" for binding.gyp + - Added full range of NAN_INDEX_* macros to match NAN_PROPERTY_* macros + +### 0.4.4 Nov 2 2013 + + - Isolate argument from v8::Persistent::MakeWeak removed for 0.11.8+ + +### 0.4.3 Nov 2 2013 + + - Include node_object_wrap.h, removed from node.h for Node 0.11.8. + +### 0.4.2 Nov 2 2013 + + - Handle deprecation of v8::Persistent::Dispose(v8::Isolate* isolate)) for + Node 0.11.8 release. + +### 0.4.1 Sep 16 2013 + + - Added explicit `#include ` as it was removed from node.h for v0.11.8 + +### 0.4.0 Sep 2 2013 + + - Added NAN_INLINE and NAN_DEPRECATED and made use of them + - Added NanError, NanTypeError and NanRangeError + - Cleaned up code + +### 0.3.2 Aug 30 2013 + + - Fix missing scope declaration in GetFromPersistent() and SaveToPersistent + in NanAsyncWorker + +### 0.3.1 Aug 20 2013 + + - fix "not all control paths return a value" compile warning on some platforms + +### 0.3.0 Aug 19 2013 + + - Made NAN work with NPM + - Lots of fixes to NanFromV8String, pulling in features from new Node core + - Changed node::encoding to Nan::Encoding in NanFromV8String to unify the API + - Added optional error number argument for NanThrowError() + - Added NanInitPersistent() + - Added NanReturnNull() and NanReturnEmptyString() + - Added NanLocker and NanUnlocker + - Added missing scopes + - Made sure to clear disposed Persistent handles + - Changed NanAsyncWorker to allocate error messages on the heap + - Changed NanThrowError(Local) to NanThrowError(Handle) + - Fixed leak in NanAsyncWorker when errmsg is used + +### 0.2.2 Aug 5 2013 + + - Fixed usage of undefined variable with node::BASE64 in NanFromV8String() + +### 0.2.1 Aug 5 2013 + + - Fixed 0.8 breakage, node::BUFFER encoding type not available in 0.8 for + NanFromV8String() + +### 0.2.0 Aug 5 2013 + + - Added NAN_PROPERTY_GETTER, NAN_PROPERTY_SETTER, NAN_PROPERTY_ENUMERATOR, + NAN_PROPERTY_DELETER, NAN_PROPERTY_QUERY + - Extracted _NAN_METHOD_ARGS, _NAN_GETTER_ARGS, _NAN_SETTER_ARGS, + _NAN_PROPERTY_GETTER_ARGS, _NAN_PROPERTY_SETTER_ARGS, + _NAN_PROPERTY_ENUMERATOR_ARGS, _NAN_PROPERTY_DELETER_ARGS, + _NAN_PROPERTY_QUERY_ARGS + - Added NanGetInternalFieldPointer, NanSetInternalFieldPointer + - Added NAN_WEAK_CALLBACK, NAN_WEAK_CALLBACK_OBJECT, + NAN_WEAK_CALLBACK_DATA, NanMakeWeak + - Renamed THROW_ERROR to _NAN_THROW_ERROR + - Added NanNewBufferHandle(char*, size_t, node::smalloc::FreeCallback, void*) + - Added NanBufferUse(char*, uint32_t) + - Added NanNewContextHandle(v8::ExtensionConfiguration*, + v8::Handle, v8::Handle) + - Fixed broken NanCallback#GetFunction() + - Added optional encoding and size arguments to NanFromV8String() + - Added NanGetPointerSafe() and NanSetPointerSafe() + - Added initial test suite (to be expanded) + - Allow NanUInt32OptionValue to convert any Number object + +### 0.1.0 Jul 21 2013 + + - Added `NAN_GETTER`, `NAN_SETTER` + - Added `NanThrowError` with single Local argument + - Added `NanNewBufferHandle` with single uint32_t argument + - Added `NanHasInstance(Persistent&, Handle)` + - Added `Local NanCallback#GetFunction()` + - Added `NanCallback#Call(int, Local[])` + - Deprecated `NanCallback#Run(int, Local[])` in favour of Call diff --git a/deploy/node_modules/nan/LICENSE.md b/deploy/node_modules/nan/LICENSE.md new file mode 100644 index 0000000..d4d2da7 --- /dev/null +++ b/deploy/node_modules/nan/LICENSE.md @@ -0,0 +1,13 @@ +The MIT License (MIT) +===================== + +Copyright (c) 2017 NAN contributors +----------------------------------- + +*NAN contributors listed at * + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/deploy/node_modules/nan/README.md b/deploy/node_modules/nan/README.md new file mode 100644 index 0000000..2a9bea4 --- /dev/null +++ b/deploy/node_modules/nan/README.md @@ -0,0 +1,424 @@ +Native Abstractions for Node.js +=============================== + +**A header file filled with macro and utility goodness for making add-on development for Node.js easier across versions 0.8, 0.10, 0.12, 1, 2, 3, 4, 5, 6, 7 and 8.** + +***Current version: 2.7.0*** + +*(See [CHANGELOG.md](https://github.com/nodejs/nan/blob/master/CHANGELOG.md) for complete ChangeLog)* + +[![NPM](https://nodei.co/npm/nan.png?downloads=true&downloadRank=true)](https://nodei.co/npm/nan/) [![NPM](https://nodei.co/npm-dl/nan.png?months=6&height=3)](https://nodei.co/npm/nan/) + +[![Build Status](https://api.travis-ci.org/nodejs/nan.svg?branch=master)](http://travis-ci.org/nodejs/nan) +[![Build status](https://ci.appveyor.com/api/projects/status/kh73pbm9dsju7fgh)](https://ci.appveyor.com/project/RodVagg/nan) + +Thanks to the crazy changes in V8 (and some in Node core), keeping native addons compiling happily across versions, particularly 0.10 to 0.12 to 4.0, is a minor nightmare. The goal of this project is to store all logic necessary to develop native Node.js addons without having to inspect `NODE_MODULE_VERSION` and get yourself into a macro-tangle. + +This project also contains some helper utilities that make addon development a bit more pleasant. + + * **[News & Updates](#news)** + * **[Usage](#usage)** + * **[Example](#example)** + * **[API](#api)** + * **[Tests](#tests)** + * **[Governance & Contributing](#governance)** + + + +## News & Updates + + + +## Usage + +Simply add **NAN** as a dependency in the *package.json* of your Node addon: + +``` bash +$ npm install --save nan +``` + +Pull in the path to **NAN** in your *binding.gyp* so that you can use `#include ` in your *.cpp* files: + +``` python +"include_dirs" : [ + "` when compiling your addon. + + + +## Example + +Just getting started with Nan? Take a look at the **[Node Add-on Examples](https://github.com/nodejs/node-addon-examples)**. + +Refer to a [quick-start **Nan** Boilerplate](https://github.com/fcanas/node-native-boilerplate) for a ready-to-go project that utilizes basic Nan functionality. + +For a simpler example, see the **[async pi estimation example](https://github.com/nodejs/nan/tree/master/examples/async_pi_estimate)** in the examples directory for full code and an explanation of what this Monte Carlo Pi estimation example does. Below are just some parts of the full example that illustrate the use of **NAN**. + +Yet another example is **[nan-example-eol](https://github.com/CodeCharmLtd/nan-example-eol)**. It shows newline detection implemented as a native addon. + +Also take a look at our comprehensive **[C++ test suite](https://github.com/nodejs/nan/tree/master/test/cpp)** which has a plethora of code snippets for your pasting pleasure. + + + +## API + +Additional to the NAN documentation below, please consult: + +* [The V8 Getting Started * Guide](https://github.com/v8/v8/wiki/Getting%20Started%20with%20Embedding) +* [The V8 Embedders * Guide](https://github.com/v8/v8/wiki/Embedder%27s%20Guide) +* [V8 API Documentation](http://v8docs.nodesource.com/) +* [Node Add-on Documentation](https://nodejs.org/api/addons.html) + + + +### JavaScript-accessible methods + +A _template_ is a blueprint for JavaScript functions and objects in a context. You can use a template to wrap C++ functions and data structures within JavaScript objects so that they can be manipulated from JavaScript. See the V8 Embedders Guide section on [Templates](https://developers.google.com/v8/embed#templates) for further information. + +In order to expose functionality to JavaScript via a template, you must provide it to V8 in a form that it understands. Across the versions of V8 supported by NAN, JavaScript-accessible method signatures vary widely, NAN fully abstracts method declaration and provides you with an interface that is similar to the most recent V8 API but is backward-compatible with older versions that still use the now-deceased `v8::Argument` type. + +* **Method argument types** + - Nan::FunctionCallbackInfo + - Nan::PropertyCallbackInfo + - Nan::ReturnValue +* **Method declarations** + - Method declaration + - Getter declaration + - Setter declaration + - Property getter declaration + - Property setter declaration + - Property enumerator declaration + - Property deleter declaration + - Property query declaration + - Index getter declaration + - Index setter declaration + - Index enumerator declaration + - Index deleter declaration + - Index query declaration +* Method and template helpers + - Nan::SetMethod() + - Nan::SetPrototypeMethod() + - Nan::SetAccessor() + - Nan::SetNamedPropertyHandler() + - Nan::SetIndexedPropertyHandler() + - Nan::SetTemplate() + - Nan::SetPrototypeTemplate() + - Nan::SetInstanceTemplate() + - Nan::SetCallHandler() + - Nan::SetCallAsFunctionHandler() + +### Scopes + +A _local handle_ is a pointer to an object. All V8 objects are accessed using handles, they are necessary because of the way the V8 garbage collector works. + +A handle scope can be thought of as a container for any number of handles. When you've finished with your handles, instead of deleting each one individually you can simply delete their scope. + +The creation of `HandleScope` objects is different across the supported versions of V8. Therefore, NAN provides its own implementations that can be used safely across these. + + - Nan::HandleScope + - Nan::EscapableHandleScope + +Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://github.com/v8/v8/wiki/Embedder%27s%20Guide#handles-and-garbage-collection). + +### Persistent references + +An object reference that is independent of any `HandleScope` is a _persistent_ reference. Where a `Local` handle only lives as long as the `HandleScope` in which it was allocated, a `Persistent` handle remains valid until it is explicitly disposed. + +Due to the evolution of the V8 API, it is necessary for NAN to provide a wrapper implementation of the `Persistent` classes to supply compatibility across the V8 versions supported. + + - Nan::PersistentBase & v8::PersistentBase + - Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits + - Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits + - Nan::Persistent + - Nan::Global + - Nan::WeakCallbackInfo + - Nan::WeakCallbackType + +Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://developers.google.com/v8/embed#handles). + +### New + +NAN provides a `Nan::New()` helper for the creation of new JavaScript objects in a way that's compatible across the supported versions of V8. + + - Nan::New() + - Nan::Undefined() + - Nan::Null() + - Nan::True() + - Nan::False() + - Nan::EmptyString() + + +### Converters + +NAN contains functions that convert `v8::Value`s to other `v8::Value` types and native types. Since type conversion is not guaranteed to succeed, they return `Nan::Maybe` types. These converters can be used in place of `value->ToX()` and `value->XValue()` (where `X` is one of the types, e.g. `Boolean`) in a way that provides a consistent interface across V8 versions. Newer versions of V8 use the new `v8::Maybe` and `v8::MaybeLocal` types for these conversions, older versions don't have this functionality so it is provided by NAN. + + - Nan::To() + +### Maybe Types + +The `Nan::MaybeLocal` and `Nan::Maybe` types are monads that encapsulate `v8::Local` handles that _may be empty_. + +* **Maybe Types** + - Nan::MaybeLocal + - Nan::Maybe + - Nan::Nothing + - Nan::Just +* **Maybe Helpers** + - Nan::Call() + - Nan::ToDetailString() + - Nan::ToArrayIndex() + - Nan::Equals() + - Nan::NewInstance() + - Nan::GetFunction() + - Nan::Set() + - Nan::ForceSet() + - Nan::Get() + - Nan::GetPropertyAttributes() + - Nan::Has() + - Nan::Delete() + - Nan::GetPropertyNames() + - Nan::GetOwnPropertyNames() + - Nan::SetPrototype() + - Nan::ObjectProtoToString() + - Nan::HasOwnProperty() + - Nan::HasRealNamedProperty() + - Nan::HasRealIndexedProperty() + - Nan::HasRealNamedCallbackProperty() + - Nan::GetRealNamedPropertyInPrototypeChain() + - Nan::GetRealNamedProperty() + - Nan::CallAsFunction() + - Nan::CallAsConstructor() + - Nan::GetSourceLine() + - Nan::GetLineNumber() + - Nan::GetStartColumn() + - Nan::GetEndColumn() + - Nan::CloneElementAt() + - Nan::HasPrivate() + - Nan::GetPrivate() + - Nan::SetPrivate() + - Nan::DeletePrivate() + - Nan::MakeMaybe() + +### Script + +NAN provides a `v8::Script` helpers as the API has changed over the supported versions of V8. + + - Nan::CompileScript() + - Nan::RunScript() + + +### JSON + +The _JSON_ object provides the c++ versions of the methods offered by the `JSON` object in javascript. V8 exposes these methods via the `v8::JSON` object. + + - Nan::JSON.Parse + - Nan::JSON.Stringify + +Refer to the V8 JSON object in the [V8 documentation](https://v8docs.nodesource.com/node-7.4/da/d6f/classv8_1_1_j_s_o_n.html) for more information about these methods and their arguments. + +### Errors + +NAN includes helpers for creating, throwing and catching Errors as much of this functionality varies across the supported versions of V8 and must be abstracted. + +Note that an Error object is simply a specialized form of `v8::Value`. + +Also consult the V8 Embedders Guide section on [Exceptions](https://developers.google.com/v8/embed#exceptions) for more information. + + - Nan::Error() + - Nan::RangeError() + - Nan::ReferenceError() + - Nan::SyntaxError() + - Nan::TypeError() + - Nan::ThrowError() + - Nan::ThrowRangeError() + - Nan::ThrowReferenceError() + - Nan::ThrowSyntaxError() + - Nan::ThrowTypeError() + - Nan::FatalException() + - Nan::ErrnoException() + - Nan::TryCatch + + +### Buffers + +NAN's `node::Buffer` helpers exist as the API has changed across supported Node versions. Use these methods to ensure compatibility. + + - Nan::NewBuffer() + - Nan::CopyBuffer() + - Nan::FreeCallback() + +### Nan::Callback + +`Nan::Callback` makes it easier to use `v8::Function` handles as callbacks. A class that wraps a `v8::Function` handle, protecting it from garbage collection and making it particularly useful for storage and use across asynchronous execution. + + - Nan::Callback + +### Asynchronous work helpers + +`Nan::AsyncWorker` and `Nan::AsyncProgressWorker` are helper classes that make working with asynchronous code easier. + + - Nan::AsyncWorker + - Nan::AsyncProgressWorkerBase & Nan::AsyncProgressWorker + - Nan::AsyncQueueWorker + +### Strings & Bytes + +Miscellaneous string & byte encoding and decoding functionality provided for compatibility across supported versions of V8 and Node. Implemented by NAN to ensure that all encoding types are supported, even for older versions of Node where they are missing. + + - Nan::Encoding + - Nan::Encode() + - Nan::DecodeBytes() + - Nan::DecodeWrite() + + +### Object Wrappers + +The `ObjectWrap` class can be used to make wrapped C++ objects and a factory of wrapped objects. + + - Nan::ObjectWrap + + +### V8 internals + +The hooks to access V8 internals—including GC and statistics—are different across the supported versions of V8, therefore NAN provides its own hooks that call the appropriate V8 methods. + + - NAN_GC_CALLBACK() + - Nan::AddGCEpilogueCallback() + - Nan::RemoveGCEpilogueCallback() + - Nan::AddGCPrologueCallback() + - Nan::RemoveGCPrologueCallback() + - Nan::GetHeapStatistics() + - Nan::SetCounterFunction() + - Nan::SetCreateHistogramFunction() + - Nan::SetAddHistogramSampleFunction() + - Nan::IdleNotification() + - Nan::LowMemoryNotification() + - Nan::ContextDisposedNotification() + - Nan::GetInternalFieldPointer() + - Nan::SetInternalFieldPointer() + - Nan::AdjustExternalMemory() + + +### Miscellaneous V8 Helpers + + - Nan::Utf8String + - Nan::GetCurrentContext() + - Nan::SetIsolateData() + - Nan::GetIsolateData() + - Nan::TypedArrayContents + + +### Miscellaneous Node Helpers + + - Nan::MakeCallback() + - NAN_MODULE_INIT() + - Nan::Export() + + + + + + +### Tests + +To run the NAN tests do: + +``` sh +npm install +npm run-script rebuild-tests +npm test +``` + +Or just: + +``` sh +npm install +make test +``` + + + +## Governance & Contributing + +NAN is governed by the [Node.js Addon API Working Group](https://github.com/nodejs/CTC/blob/master/WORKING_GROUPS.md#addon-api) + +### Addon API Working Group (WG) + +The NAN project is jointly governed by a Working Group which is responsible for high-level guidance of the project. + +Members of the WG are also known as Collaborators, there is no distinction between the two, unlike other Node.js projects. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project [README.md](./README.md#collaborators). + +Individuals making significant and valuable contributions are made members of the WG and given commit-access to the project. These individuals are identified by the WG and their addition to the WG is discussed via GitHub and requires unanimous consensus amongst those WG members participating in the discussion with a quorum of 50% of WG members required for acceptance of the vote. + +_Note:_ If you make a significant contribution and are not considered for commit-access log an issue or contact a WG member directly. + +For the current list of WG members / Collaborators, see the project [README.md](./README.md#collaborators). + +### Consensus Seeking Process + +The WG follows a [Consensus Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) decision making model. + +Modifications of the contents of the NAN repository are made on a collaborative basis. Anybody with a GitHub account may propose a modification via pull request and it will be considered by the WG. All pull requests must be reviewed and accepted by a WG member with sufficient expertise who is able to take full responsibility for the change. In the case of pull requests proposed by an existing WG member, an additional WG member is required for sign-off. Consensus should be sought if additional WG members participate and there is disagreement around a particular modification. + +If a change proposal cannot reach a consensus, a WG member can call for a vote amongst the members of the WG. Simple majority wins. + + + +## Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + + + +### WG Members / Collaborators + +
+ + + + + + + +
Rod VaggGitHub/rvaggTwitter/@rvagg
Benjamin ByholmGitHub/kkoopa-
Trevor NorrisGitHub/trevnorrisTwitter/@trevnorris
Nathan RajlichGitHub/TooTallNateTwitter/@TooTallNate
Brett LawsonGitHub/brett19Twitter/@brett19x
Ben NoordhuisGitHub/bnoordhuisTwitter/@bnoordhuis
David SiegelGitHub/agnatTwitter/@agnat
+ +## Licence & copyright + +Copyright (c) 2017 NAN WG Members / Collaborators (listed above). + +Native Abstractions for Node.js is licensed under an MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/deploy/node_modules/nan/doc/asyncworker.md b/deploy/node_modules/nan/doc/asyncworker.md new file mode 100644 index 0000000..86a023f --- /dev/null +++ b/deploy/node_modules/nan/doc/asyncworker.md @@ -0,0 +1,104 @@ +## Asynchronous work helpers + +`Nan::AsyncWorker` and `Nan::AsyncProgressWorker` are helper classes that make working with asynchronous code easier. + + - Nan::AsyncWorker + - Nan::AsyncProgressWorkerBase & Nan::AsyncProgressWorker + - Nan::AsyncQueueWorker + + +### Nan::AsyncWorker + +`Nan::AsyncWorker` is an _abstract_ class that you can subclass to have much of the annoying asynchronous queuing and handling taken care of for you. It can even store arbitrary V8 objects for you and have them persist while the asynchronous work is in progress. + +Definition: + +```c++ +class AsyncWorker { + public: + explicit AsyncWorker(Callback *callback_); + + virtual ~AsyncWorker(); + + virtual void WorkComplete(); + + void SaveToPersistent(const char *key, const v8::Local &value); + + void SaveToPersistent(const v8::Local &key, + const v8::Local &value); + + void SaveToPersistent(uint32_t index, + const v8::Local &value); + + v8::Local GetFromPersistent(const char *key) const; + + v8::Local GetFromPersistent(const v8::Local &key) const; + + v8::Local GetFromPersistent(uint32_t index) const; + + virtual void Execute() = 0; + + uv_work_t request; + + virtual void Destroy(); + + protected: + Persistent persistentHandle; + + Callback *callback; + + virtual void HandleOKCallback(); + + virtual void HandleErrorCallback(); + + void SetErrorMessage(const char *msg); + + const char* ErrorMessage(); +}; +``` + + +### Nan::AsyncProgressWorkerBase & Nan::AsyncProgressWorker + +`Nan::AsyncProgressWorkerBase` is an _abstract_ class template that extends `Nan::AsyncWorker` and adds additional progress reporting callbacks that can be used during the asynchronous work execution to provide progress data back to JavaScript. + +Previously the definiton of `Nan::AsyncProgressWorker` only allowed sending `const char` data. Now extending `Nan::AsyncProgressWorker` will yield an instance of the implicit `Nan::AsyncProgressWorkerBase` template with type `` for compatibility. + +Definition: + +```c++ +template +class AsyncProgressWorkerBase : public AsyncWorker { + public: + explicit AsyncProgressWorker(Callback *callback_); + + virtual ~AsyncProgressWorker(); + + void WorkProgress(); + + class ExecutionProgress { + public: + void Signal() const; + void Send(const T* data, size_t count) const; + }; + + virtual void Execute(const ExecutionProgress& progress) = 0; + + virtual void HandleProgressCallback(const T *data, size_t count) = 0; + + virtual void Destroy(); +}; + +typedef AsyncProgressWorkerBase AsyncProgressWorker; +``` + + +### Nan::AsyncQueueWorker + +`Nan::AsyncQueueWorker` will run a `Nan::AsyncWorker` asynchronously via libuv. Both the `execute` and `after_work` steps are taken care of for you. Most of the logic for this is embedded in `Nan::AsyncWorker`. + +Definition: + +```c++ +void AsyncQueueWorker(AsyncWorker *); +``` diff --git a/deploy/node_modules/nan/doc/buffers.md b/deploy/node_modules/nan/doc/buffers.md new file mode 100644 index 0000000..8d8d25c --- /dev/null +++ b/deploy/node_modules/nan/doc/buffers.md @@ -0,0 +1,54 @@ +## Buffers + +NAN's `node::Buffer` helpers exist as the API has changed across supported Node versions. Use these methods to ensure compatibility. + + - Nan::NewBuffer() + - Nan::CopyBuffer() + - Nan::FreeCallback() + + +### Nan::NewBuffer() + +Allocate a new `node::Buffer` object with the specified size and optional data. Calls `node::Buffer::New()`. + +Note that when creating a `Buffer` using `Nan::NewBuffer()` and an existing `char*`, it is assumed that the ownership of the pointer is being transferred to the new `Buffer` for management. +When a `node::Buffer` instance is garbage collected and a `FreeCallback` has not been specified, `data` will be disposed of via a call to `free()`. +You _must not_ free the memory space manually once you have created a `Buffer` in this way. + +Signature: + +```c++ +Nan::MaybeLocal Nan::NewBuffer(uint32_t size) +Nan::MaybeLocal Nan::NewBuffer(char* data, uint32_t size) +Nan::MaybeLocal Nan::NewBuffer(char *data, + size_t length, + Nan::FreeCallback callback, + void *hint) +``` + + + +### Nan::CopyBuffer() + +Similar to [`Nan::NewBuffer()`](#api_nan_new_buffer) except that an implicit memcpy will occur within Node. Calls `node::Buffer::Copy()`. + +Management of the `char*` is left to the user, you should manually free the memory space if necessary as the new `Buffer` will have its own copy. + +Signature: + +```c++ +Nan::MaybeLocal Nan::CopyBuffer(const char *data, uint32_t size) +``` + + + +### Nan::FreeCallback() + +A free callback that can be provided to [`Nan::NewBuffer()`](#api_nan_new_buffer). +The supplied callback will be invoked when the `Buffer` undergoes garbage collection. + +Signature: + +```c++ +typedef void (*FreeCallback)(char *data, void *hint); +``` diff --git a/deploy/node_modules/nan/doc/callback.md b/deploy/node_modules/nan/doc/callback.md new file mode 100644 index 0000000..46de1d7 --- /dev/null +++ b/deploy/node_modules/nan/doc/callback.md @@ -0,0 +1,56 @@ +## Nan::Callback + +`Nan::Callback` makes it easier to use `v8::Function` handles as callbacks. A class that wraps a `v8::Function` handle, protecting it from garbage collection and making it particularly useful for storage and use across asynchronous execution. + + - Nan::Callback + + +### Nan::Callback + +```c++ +class Callback { + public: + Callback(); + + explicit Callback(const v8::Local &fn); + + ~Callback(); + + bool operator==(const Callback &other) const; + + bool operator!=(const Callback &other) const; + + v8::Local operator*() const; + + v8::Local operator()(v8::Local target, + int argc = 0, + v8::Local argv[] = 0) const; + + v8::Local operator()(int argc = 0, + v8::Local argv[] = 0) const; + + void SetFunction(const v8::Local &fn); + + v8::Local GetFunction() const; + + bool IsEmpty() const; + + void Reset(const v8::Local &fn); + + void Reset(); + + v8::Local Call(v8::Local target, + int argc, + v8::Local argv[]) const; + + v8::Local Call(int argc, v8::Local argv[]) const; +}; +``` + +Example usage: + +```c++ +v8::Local function; +Nan::Callback callback(function); +callback.Call(0, 0); +``` diff --git a/deploy/node_modules/nan/doc/converters.md b/deploy/node_modules/nan/doc/converters.md new file mode 100644 index 0000000..d20861b --- /dev/null +++ b/deploy/node_modules/nan/doc/converters.md @@ -0,0 +1,41 @@ +## Converters + +NAN contains functions that convert `v8::Value`s to other `v8::Value` types and native types. Since type conversion is not guaranteed to succeed, they return `Nan::Maybe` types. These converters can be used in place of `value->ToX()` and `value->XValue()` (where `X` is one of the types, e.g. `Boolean`) in a way that provides a consistent interface across V8 versions. Newer versions of V8 use the new `v8::Maybe` and `v8::MaybeLocal` types for these conversions, older versions don't have this functionality so it is provided by NAN. + + - Nan::To() + + +### Nan::To() + +Converts a `v8::Local` to a different subtype of `v8::Value` or to a native data type. Returns a `Nan::MaybeLocal<>` or a `Nan::Maybe<>` accordingly. + +See [maybe_types.md](./maybe_types.md) for more information on `Nan::Maybe` types. + +Signatures: + +```c++ +// V8 types +Nan::MaybeLocal Nan::To(v8::Local val); +Nan::MaybeLocal Nan::To(v8::Local val); +Nan::MaybeLocal Nan::To(v8::Local val); +Nan::MaybeLocal Nan::To(v8::Local val); +Nan::MaybeLocal Nan::To(v8::Local val); +Nan::MaybeLocal Nan::To(v8::Local val); +Nan::MaybeLocal Nan::To(v8::Local val); + +// Native types +Nan::Maybe Nan::To(v8::Local val); +Nan::Maybe Nan::To(v8::Local val); +Nan::Maybe Nan::To(v8::Local val); +Nan::Maybe Nan::To(v8::Local val); +Nan::Maybe Nan::To(v8::Local val); +``` + +### Example + +```c++ +v8::Local val; +Nan::MaybeLocal str = Nan::To(val); +Nan::Maybe d = Nan::To(val); +``` + diff --git a/deploy/node_modules/nan/doc/errors.md b/deploy/node_modules/nan/doc/errors.md new file mode 100644 index 0000000..aac6e08 --- /dev/null +++ b/deploy/node_modules/nan/doc/errors.md @@ -0,0 +1,226 @@ +## Errors + +NAN includes helpers for creating, throwing and catching Errors as much of this functionality varies across the supported versions of V8 and must be abstracted. + +Note that an Error object is simply a specialized form of `v8::Value`. + +Also consult the V8 Embedders Guide section on [Exceptions](https://developers.google.com/v8/embed#exceptions) for more information. + + - Nan::Error() + - Nan::RangeError() + - Nan::ReferenceError() + - Nan::SyntaxError() + - Nan::TypeError() + - Nan::ThrowError() + - Nan::ThrowRangeError() + - Nan::ThrowReferenceError() + - Nan::ThrowSyntaxError() + - Nan::ThrowTypeError() + - Nan::FatalException() + - Nan::ErrnoException() + - Nan::TryCatch + + + +### Nan::Error() + +Create a new Error object using the [v8::Exception](https://v8docs.nodesource.com/io.js-3.0/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8. + +Note that an Error object is simply a specialized form of `v8::Value`. + +Signature: + +```c++ +v8::Local Nan::Error(const char *msg); +v8::Local Nan::Error(v8::Local msg); +``` + + + +### Nan::RangeError() + +Create a new RangeError object using the [v8::Exception](https://v8docs.nodesource.com/io.js-3.0/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8. + +Note that an RangeError object is simply a specialized form of `v8::Value`. + +Signature: + +```c++ +v8::Local Nan::RangeError(const char *msg); +v8::Local Nan::RangeError(v8::Local msg); +``` + + + +### Nan::ReferenceError() + +Create a new ReferenceError object using the [v8::Exception](https://v8docs.nodesource.com/io.js-3.0/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8. + +Note that an ReferenceError object is simply a specialized form of `v8::Value`. + +Signature: + +```c++ +v8::Local Nan::ReferenceError(const char *msg); +v8::Local Nan::ReferenceError(v8::Local msg); +``` + + + +### Nan::SyntaxError() + +Create a new SyntaxError object using the [v8::Exception](https://v8docs.nodesource.com/io.js-3.0/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8. + +Note that an SyntaxError object is simply a specialized form of `v8::Value`. + +Signature: + +```c++ +v8::Local Nan::SyntaxError(const char *msg); +v8::Local Nan::SyntaxError(v8::Local msg); +``` + + + +### Nan::TypeError() + +Create a new TypeError object using the [v8::Exception](https://v8docs.nodesource.com/io.js-3.0/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8. + +Note that an TypeError object is simply a specialized form of `v8::Value`. + +Signature: + +```c++ +v8::Local Nan::TypeError(const char *msg); +v8::Local Nan::TypeError(v8::Local msg); +``` + + + +### Nan::ThrowError() + +Throw an Error object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new Error object will be created. + +Signature: + +```c++ +void Nan::ThrowError(const char *msg); +void Nan::ThrowError(v8::Local msg); +void Nan::ThrowError(v8::Local error); +``` + + + +### Nan::ThrowRangeError() + +Throw an RangeError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new RangeError object will be created. + +Signature: + +```c++ +void Nan::ThrowRangeError(const char *msg); +void Nan::ThrowRangeError(v8::Local msg); +void Nan::ThrowRangeError(v8::Local error); +``` + + + +### Nan::ThrowReferenceError() + +Throw an ReferenceError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new ReferenceError object will be created. + +Signature: + +```c++ +void Nan::ThrowReferenceError(const char *msg); +void Nan::ThrowReferenceError(v8::Local msg); +void Nan::ThrowReferenceError(v8::Local error); +``` + + + +### Nan::ThrowSyntaxError() + +Throw an SyntaxError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new SyntaxError object will be created. + +Signature: + +```c++ +void Nan::ThrowSyntaxError(const char *msg); +void Nan::ThrowSyntaxError(v8::Local msg); +void Nan::ThrowSyntaxError(v8::Local error); +``` + + + +### Nan::ThrowTypeError() + +Throw an TypeError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new TypeError object will be created. + +Signature: + +```c++ +void Nan::ThrowTypeError(const char *msg); +void Nan::ThrowTypeError(v8::Local msg); +void Nan::ThrowTypeError(v8::Local error); +``` + + +### Nan::FatalException() + +Replaces `node::FatalException()` which has a different API across supported versions of Node. For use with [`Nan::TryCatch`](#api_nan_try_catch). + +Signature: + +```c++ +void Nan::FatalException(const Nan::TryCatch& try_catch); +``` + + +### Nan::ErrnoException() + +Replaces `node::ErrnoException()` which has a different API across supported versions of Node. + +Signature: + +```c++ +v8::Local Nan::ErrnoException(int errorno, + const char* syscall = NULL, + const char* message = NULL, + const char* path = NULL); +``` + + + +### Nan::TryCatch + +A simple wrapper around [`v8::TryCatch`](https://v8docs.nodesource.com/io.js-3.0/d4/dc6/classv8_1_1_try_catch.html) compatible with all supported versions of V8. Can be used as a direct replacement in most cases. See also [`Nan::FatalException()`](#api_nan_fatal_exception) for an internal use compatible with `node::FatalException`. + +Signature: + +```c++ +class Nan::TryCatch { + public: + Nan::TryCatch(); + + bool HasCaught() const; + + bool CanContinue() const; + + v8::Local ReThrow(); + + v8::Local Exception() const; + + // Nan::MaybeLocal for older versions of V8 + v8::MaybeLocal StackTrace() const; + + v8::Local Message() const; + + void Reset(); + + void SetVerbose(bool value); + + void SetCaptureMessage(bool value); +}; +``` + diff --git a/deploy/node_modules/nan/doc/json.md b/deploy/node_modules/nan/doc/json.md new file mode 100644 index 0000000..c916c4d --- /dev/null +++ b/deploy/node_modules/nan/doc/json.md @@ -0,0 +1,62 @@ +## JSON + +The _JSON_ object provides the c++ versions of the methods offered by the `JSON` object in javascript. V8 exposes these methods via the `v8::JSON` object. + + - Nan::JSON.Parse + - Nan::JSON.Stringify + +Refer to the V8 JSON object in the [V8 documentation](https://v8docs.nodesource.com/node-7.4/da/d6f/classv8_1_1_j_s_o_n.html) for more information about these methods and their arguments. + + + +### Nan::JSON.Parse + +A simple wrapper around [`v8::JSON::Parse`](https://v8docs.nodesource.com/node-7.4/da/d6f/classv8_1_1_j_s_o_n.html#a936310d2540fb630ed37d3ee3ffe4504). + +Definition: + +```c++ +Nan::MaybeLocal Nan::JSON::Parse(v8::Local json_string); +``` + +Use `JSON.Parse(json_string)` to parse a string into a `v8::Value`. + +Example: + +```c++ +v8::Local json_string = Nan::New("{ \"JSON\": \"object\" }").ToLocalChecked(); + +Nan::JSON NanJSON; +Nan::MaybeLocal result = NanJSON.Parse(json_string); +if (!result.IsEmpty()) { + v8::Local val = result.ToLocalChecked(); +} +``` + + + +### Nan::JSON.Stringify + +A simple wrapper around [`v8::JSON::Stringify`](https://v8docs.nodesource.com/node-7.4/da/d6f/classv8_1_1_j_s_o_n.html#a44b255c3531489ce43f6110209138860). + +Definition: + +```c++ +Nan::MaybeLocal Nan::JSON::Stringify(v8::Local json_object, v8::Local gap = v8::Local()); +``` + +Use `JSON.Stringify(value)` to stringify a `v8::Object`. + +Example: + +```c++ +// using `v8::Local val` from the `JSON::Parse` example +v8::Local obj = Nan::To(val).ToLocalChecked(); + +Nan::JSON NanJSON; +Nan::MaybeLocal result = NanJSON.Stringify(obj); +if (!result.IsEmpty()) { + v8::Local stringified = result.ToLocalChecked(); +} +``` + diff --git a/deploy/node_modules/nan/doc/maybe_types.md b/deploy/node_modules/nan/doc/maybe_types.md new file mode 100644 index 0000000..818861d --- /dev/null +++ b/deploy/node_modules/nan/doc/maybe_types.md @@ -0,0 +1,560 @@ +## Maybe Types + +The `Nan::MaybeLocal` and `Nan::Maybe` types are monads that encapsulate `v8::Local` handles that _may be empty_. + +* **Maybe Types** + - Nan::MaybeLocal + - Nan::Maybe + - Nan::Nothing + - Nan::Just +* **Maybe Helpers** + - Nan::Call() + - Nan::ToDetailString() + - Nan::ToArrayIndex() + - Nan::Equals() + - Nan::NewInstance() + - Nan::GetFunction() + - Nan::Set() + - Nan::ForceSet() + - Nan::Get() + - Nan::GetPropertyAttributes() + - Nan::Has() + - Nan::Delete() + - Nan::GetPropertyNames() + - Nan::GetOwnPropertyNames() + - Nan::SetPrototype() + - Nan::ObjectProtoToString() + - Nan::HasOwnProperty() + - Nan::HasRealNamedProperty() + - Nan::HasRealIndexedProperty() + - Nan::HasRealNamedCallbackProperty() + - Nan::GetRealNamedPropertyInPrototypeChain() + - Nan::GetRealNamedProperty() + - Nan::CallAsFunction() + - Nan::CallAsConstructor() + - Nan::GetSourceLine() + - Nan::GetLineNumber() + - Nan::GetStartColumn() + - Nan::GetEndColumn() + - Nan::CloneElementAt() + - Nan::HasPrivate() + - Nan::GetPrivate() + - Nan::SetPrivate() + - Nan::DeletePrivate() + - Nan::MakeMaybe() + + +### Nan::MaybeLocal + +A `Nan::MaybeLocal` is a wrapper around [`v8::Local`](https://v8docs.nodesource.com/io.js-3.0/de/deb/classv8_1_1_local.html) that enforces a check that determines whether the `v8::Local` is empty before it can be used. + +If an API method returns a `Nan::MaybeLocal`, the API method can potentially fail either because an exception is thrown, or because an exception is pending, e.g. because a previous API call threw an exception that hasn't been caught yet, or because a `v8::TerminateExecution` exception was thrown. In that case, an empty `Nan::MaybeLocal` is returned. + +Definition: + +```c++ +template class Nan::MaybeLocal { + public: + MaybeLocal(); + + template MaybeLocal(v8::Local that); + + bool IsEmpty() const; + + template bool ToLocal(v8::Local *out); + + // Will crash if the MaybeLocal<> is empty. + v8::Local ToLocalChecked(); + + template v8::Local FromMaybe(v8::Local default_value) const; +}; +``` + +See the documentation for [`v8::MaybeLocal`](https://v8docs.nodesource.com/io.js-3.0/d8/d7d/classv8_1_1_maybe_local.html) for further details. + + +### Nan::Maybe + +A simple `Nan::Maybe` type, representing an object which may or may not have a value, see https://hackage.haskell.org/package/base/docs/Data-Maybe.html. + +If an API method returns a `Nan::Maybe<>`, the API method can potentially fail either because an exception is thrown, or because an exception is pending, e.g. because a previous API call threw an exception that hasn't been caught yet, or because a `v8::TerminateExecution` exception was thrown. In that case, a "Nothing" value is returned. + +Definition: + +```c++ +template class Nan::Maybe { + public: + bool IsNothing() const; + bool IsJust() const; + + // Will crash if the Maybe<> is nothing. + T FromJust(); + + T FromMaybe(const T& default_value); + + bool operator==(const Maybe &other); + + bool operator!=(const Maybe &other); +}; +``` + +See the documentation for [`v8::Maybe`](https://v8docs.nodesource.com/io.js-3.0/d9/d4b/classv8_1_1_maybe.html) for further details. + + +### Nan::Nothing + +Construct an empty `Nan::Maybe` type representing _nothing_. + +```c++ +template Nan::Maybe Nan::Nothing(); +``` + + +### Nan::Just + +Construct a `Nan::Maybe` type representing _just_ a value. + +```c++ +template Nan::Maybe Nan::Just(const T &t); +``` + + +### Nan::Call() + +A helper method for calling [`v8::Function#Call()`](https://v8docs.nodesource.com/io.js-3.0/d5/d54/classv8_1_1_function.html#a468a89f737af0612db10132799c827c0) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::Call(v8::Local fun, v8::Local recv, int argc, v8::Local argv[]); +``` + + + +### Nan::ToDetailString() + +A helper method for calling [`v8::Value#ToDetailString()`](https://v8docs.nodesource.com/io.js-3.0/dc/d0a/classv8_1_1_value.html#a2f9770296dc2c8d274bc8cc0dca243e5) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::ToDetailString(v8::Local val); +``` + + + +### Nan::ToArrayIndex() + +A helper method for calling [`v8::Value#ToArrayIndex()`](https://v8docs.nodesource.com/io.js-3.0/dc/d0a/classv8_1_1_value.html#acc5bbef3c805ec458470c0fcd6f13493) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::ToArrayIndex(v8::Local val); +``` + + + +### Nan::Equals() + +A helper method for calling [`v8::Value#Equals()`](https://v8docs.nodesource.com/io.js-3.0/dc/d0a/classv8_1_1_value.html#a0d9616ab2de899d4e3047c30a10c9285) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::Equals(v8::Local a, v8::Local(b)); +``` + + + +### Nan::NewInstance() + +A helper method for calling [`v8::Function#NewInstance()`](https://v8docs.nodesource.com/io.js-3.0/d5/d54/classv8_1_1_function.html#a691b13f7a553069732cbacf5ac8c62ec) and [`v8::ObjectTemplate#NewInstance()`](https://v8docs.nodesource.com/io.js-3.0/db/d5f/classv8_1_1_object_template.html#ad605a7543cfbc5dab54cdb0883d14ae4) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::NewInstance(v8::Local h); +Nan::MaybeLocal Nan::NewInstance(v8::Local h, int argc, v8::Local argv[]); +Nan::MaybeLocal Nan::NewInstance(v8::Local h); +``` + + + +### Nan::GetFunction() + +A helper method for calling [`v8::FunctionTemplate#GetFunction()`](https://v8docs.nodesource.com/io.js-3.0/d8/d83/classv8_1_1_function_template.html#a56d904662a86eca78da37d9bb0ed3705) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::GetFunction(v8::Local t); +``` + + + +### Nan::Set() + +A helper method for calling [`v8::Object#Set()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a67604ea3734f170c66026064ea808f20) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::Set(v8::Local obj, + v8::Local key, + v8::Local value) +Nan::Maybe Nan::Set(v8::Local obj, + uint32_t index, + v8::Local value); +``` + + + +### Nan::ForceSet() + +A helper method for calling [`v8::Object#ForceSet()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a796b7b682896fb64bf1872747734e836) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::ForceSet(v8::Local obj, + v8::Local key, + v8::Local value, + v8::PropertyAttribute attribs = v8::None); +``` + + + +### Nan::Get() + +A helper method for calling [`v8::Object#Get()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a2565f03e736694f6b1e1cf22a0b4eac2) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::Get(v8::Local obj, + v8::Local key); +Nan::MaybeLocal Nan::Get(v8::Local obj, uint32_t index); +``` + + + +### Nan::GetPropertyAttributes() + +A helper method for calling [`v8::Object#GetPropertyAttributes()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a9b898894da3d1db2714fd9325a54fe57) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::GetPropertyAttributes( + v8::Local obj, + v8::Local key); +``` + + + +### Nan::Has() + +A helper method for calling [`v8::Object#Has()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#ab3c3d89ea7c2f9afd08965bd7299a41d) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::Has(v8::Local obj, v8::Local key); +Nan::Maybe Nan::Has(v8::Local obj, uint32_t index); +``` + + + +### Nan::Delete() + +A helper method for calling [`v8::Object#Delete()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a2fa0f5a592582434ed1ceceff7d891ef) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::Delete(v8::Local obj, + v8::Local key); +Nan::Maybe Nan::Delete(v8::Local obj, uint32_t index); +``` + + + +### Nan::GetPropertyNames() + +A helper method for calling [`v8::Object#GetPropertyNames()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#aced885270cfd2c956367b5eedc7fbfe8) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::GetPropertyNames(v8::Local obj); +``` + + + +### Nan::GetOwnPropertyNames() + +A helper method for calling [`v8::Object#GetOwnPropertyNames()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a79a6e4d66049b9aa648ed4dfdb23e6eb) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::GetOwnPropertyNames(v8::Local obj); +``` + + + +### Nan::SetPrototype() + +A helper method for calling [`v8::Object#SetPrototype()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a442706b22fceda6e6d1f632122a9a9f4) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::SetPrototype(v8::Local obj, + v8::Local prototype); +``` + + + +### Nan::ObjectProtoToString() + +A helper method for calling [`v8::Object#ObjectProtoToString()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#ab7a92b4dcf822bef72f6c0ac6fea1f0b) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::ObjectProtoToString(v8::Local obj); +``` + + + +### Nan::HasOwnProperty() + +A helper method for calling [`v8::Object#HasOwnProperty()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#ab7b7245442ca6de1e1c145ea3fd653ff) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::HasOwnProperty(v8::Local obj, + v8::Local key); +``` + + + +### Nan::HasRealNamedProperty() + +A helper method for calling [`v8::Object#HasRealNamedProperty()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#ad8b80a59c9eb3c1e6c3cd6c84571f767) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::HasRealNamedProperty(v8::Local obj, + v8::Local key); +``` + + + +### Nan::HasRealIndexedProperty() + +A helper method for calling [`v8::Object#HasRealIndexedProperty()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#af94fc1135a5e74a2193fb72c3a1b9855) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::HasRealIndexedProperty(v8::Local obj, + uint32_t index); +``` + + + +### Nan::HasRealNamedCallbackProperty() + +A helper method for calling [`v8::Object#HasRealNamedCallbackProperty()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#af743b7ea132b89f84d34d164d0668811) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::HasRealNamedCallbackProperty( + v8::Local obj, + v8::Local key); +``` + + + +### Nan::GetRealNamedPropertyInPrototypeChain() + +A helper method for calling [`v8::Object#GetRealNamedPropertyInPrototypeChain()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a8700b1862e6b4783716964ba4d5e6172) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::GetRealNamedPropertyInPrototypeChain( + v8::Local obj, + v8::Local key); +``` + + + +### Nan::GetRealNamedProperty() + +A helper method for calling [`v8::Object#GetRealNamedProperty()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a84471a824576a5994fdd0ffcbf99ccc0) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::GetRealNamedProperty(v8::Local obj, + v8::Local key); +``` + + + +### Nan::CallAsFunction() + +A helper method for calling [`v8::Object#CallAsFunction()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a9ef18be634e79b4f0cdffa1667a29f58) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::CallAsFunction(v8::Local obj, + v8::Local recv, + int argc, + v8::Local argv[]); +``` + + + +### Nan::CallAsConstructor() + +A helper method for calling [`v8::Object#CallAsConstructor()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a50d571de50d0b0dfb28795619d07a01b) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::CallAsConstructor(v8::Local obj, + int argc, + v8::Local argv[]); +``` + + + +### Nan::GetSourceLine() + +A helper method for calling [`v8::Message#GetSourceLine()`](https://v8docs.nodesource.com/io.js-3.0/d9/d28/classv8_1_1_message.html#a849f7a6c41549d83d8159825efccd23a) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::GetSourceLine(v8::Local msg); +``` + + + +### Nan::GetLineNumber() + +A helper method for calling [`v8::Message#GetLineNumber()`](https://v8docs.nodesource.com/io.js-3.0/d9/d28/classv8_1_1_message.html#adbe46c10a88a6565f2732a2d2adf99b9) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::GetLineNumber(v8::Local msg); +``` + + + +### Nan::GetStartColumn() + +A helper method for calling [`v8::Message#GetStartColumn()`](https://v8docs.nodesource.com/io.js-3.0/d9/d28/classv8_1_1_message.html#a60ede616ba3822d712e44c7a74487ba6) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::GetStartColumn(v8::Local msg); +``` + + + +### Nan::GetEndColumn() + +A helper method for calling [`v8::Message#GetEndColumn()`](https://v8docs.nodesource.com/io.js-3.0/d9/d28/classv8_1_1_message.html#aaa004cf19e529da980bc19fcb76d93be) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::GetEndColumn(v8::Local msg); +``` + + + +### Nan::CloneElementAt() + +A helper method for calling [`v8::Array#CloneElementAt()`](https://v8docs.nodesource.com/io.js-3.0/d3/d32/classv8_1_1_array.html#a1d3a878d4c1c7cae974dd50a1639245e) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::CloneElementAt(v8::Local array, uint32_t index); +``` + + +### Nan::HasPrivate() + +A helper method for calling [`v8::Object#HasPrivate()`](https://v8docs.nodesource.com/node-7.2/db/d85/classv8_1_1_object.html#af68a0b98066cfdeb8f943e98a40ba08d) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::HasPrivate(v8::Local object, v8::Local key); +``` + + +### Nan::GetPrivate() + +A helper method for calling [`v8::Object#GetPrivate()`](https://v8docs.nodesource.com/node-7.2/db/d85/classv8_1_1_object.html#a169f2da506acbec34deadd9149a1925a) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::GetPrivate(v8::Local object, v8::Local key); +``` + + +### Nan::SetPrivate() + +A helper method for calling [`v8::Object#SetPrivate()`](https://v8docs.nodesource.com/node-7.2/db/d85/classv8_1_1_object.html#ace1769b0f3b86bfe9fda1010916360ee) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::SetPrivate(v8::Local object, v8::Local key, v8::Local value); +``` + + +### Nan::DeletePrivate() + +A helper method for calling [`v8::Object#DeletePrivate()`](https://v8docs.nodesource.com/node-7.2/db/d85/classv8_1_1_object.html#a138bb32a304f3982be02ad499693b8fd) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::DeletePrivate(v8::Local object, v8::Local key); +``` + + +### Nan::MakeMaybe() + +Wraps a `v8::Local<>` in a `Nan::MaybeLocal<>`. When called with a `Nan::MaybeLocal<>` it just returns its argument. This is useful in generic template code that builds on NAN. + +Synopsis: + +```c++ + MaybeLocal someNumber = MakeMaybe(New(3.141592654)); + MaybeLocal someString = MakeMaybe(New("probably")); +``` + +Signature: + +```c++ +template class MaybeMaybe> +Nan::MaybeLocal Nan::MakeMaybe(MaybeMaybe v); +``` diff --git a/deploy/node_modules/nan/doc/methods.md b/deploy/node_modules/nan/doc/methods.md new file mode 100644 index 0000000..dbe512d --- /dev/null +++ b/deploy/node_modules/nan/doc/methods.md @@ -0,0 +1,659 @@ +## JavaScript-accessible methods + +A _template_ is a blueprint for JavaScript functions and objects in a context. You can use a template to wrap C++ functions and data structures within JavaScript objects so that they can be manipulated from JavaScript. See the V8 Embedders Guide section on [Templates](https://developers.google.com/v8/embed#templates) for further information. + +In order to expose functionality to JavaScript via a template, you must provide it to V8 in a form that it understands. Across the versions of V8 supported by NAN, JavaScript-accessible method signatures vary widely, NAN fully abstracts method declaration and provides you with an interface that is similar to the most recent V8 API but is backward-compatible with older versions that still use the now-deceased `v8::Argument` type. + +* **Method argument types** + - Nan::FunctionCallbackInfo + - Nan::PropertyCallbackInfo + - Nan::ReturnValue +* **Method declarations** + - Method declaration + - Getter declaration + - Setter declaration + - Property getter declaration + - Property setter declaration + - Property enumerator declaration + - Property deleter declaration + - Property query declaration + - Index getter declaration + - Index setter declaration + - Index enumerator declaration + - Index deleter declaration + - Index query declaration +* Method and template helpers + - Nan::SetMethod() + - Nan::SetPrototypeMethod() + - Nan::SetAccessor() + - Nan::SetNamedPropertyHandler() + - Nan::SetIndexedPropertyHandler() + - Nan::SetTemplate() + - Nan::SetPrototypeTemplate() + - Nan::SetInstanceTemplate() + - Nan::SetCallHandler() + - Nan::SetCallAsFunctionHandler() + + +### Nan::FunctionCallbackInfo + +`Nan::FunctionCallbackInfo` should be used in place of [`v8::FunctionCallbackInfo`](https://v8docs.nodesource.com/node-8.0/dd/d0d/classv8_1_1_function_callback_info.html), even with older versions of Node where `v8::FunctionCallbackInfo` does not exist. + +Definition: + +```c++ +template class FunctionCallbackInfo { + public: + ReturnValue GetReturnValue() const; + v8::Local Callee(); + v8::Local Data(); + v8::Local Holder(); + bool IsConstructCall(); + int Length() const; + v8::Local operator[](int i) const; + v8::Local This() const; + v8::Isolate *GetIsolate() const; +}; +``` + +See the [`v8::FunctionCallbackInfo`](https://v8docs.nodesource.com/node-8.0/dd/d0d/classv8_1_1_function_callback_info.html) documentation for usage details on these. See [`Nan::ReturnValue`](#api_nan_return_value) for further information on how to set a return value from methods. + + +### Nan::PropertyCallbackInfo + +`Nan::PropertyCallbackInfo` should be used in place of [`v8::PropertyCallbackInfo`](https://v8docs.nodesource.com/node-8.0/d7/dc5/classv8_1_1_property_callback_info.html), even with older versions of Node where `v8::PropertyCallbackInfo` does not exist. + +Definition: + +```c++ +template class PropertyCallbackInfo : public PropertyCallbackInfoBase { + public: + ReturnValue GetReturnValue() const; + v8::Isolate* GetIsolate() const; + v8::Local Data() const; + v8::Local This() const; + v8::Local Holder() const; +}; +``` + +See the [`v8::PropertyCallbackInfo`](https://v8docs.nodesource.com/node-8.0/d7/dc5/classv8_1_1_property_callback_info.html) documentation for usage details on these. See [`Nan::ReturnValue`](#api_nan_return_value) for further information on how to set a return value from property accessor methods. + + +### Nan::ReturnValue + +`Nan::ReturnValue` is used in place of [`v8::ReturnValue`](https://v8docs.nodesource.com/node-8.0/da/da7/classv8_1_1_return_value.html) on both [`Nan::FunctionCallbackInfo`](#api_nan_function_callback_info) and [`Nan::PropertyCallbackInfo`](#api_nan_property_callback_info) as the return type of `GetReturnValue()`. + +Example usage: + +```c++ +void EmptyArray(const Nan::FunctionCallbackInfo& info) { + info.GetReturnValue().Set(Nan::New()); +} +``` + +Definition: + +```c++ +template class ReturnValue { + public: + // Handle setters + template void Set(const v8::Local &handle); + template void Set(const Nan::Global &handle); + + // Fast primitive setters + void Set(bool value); + void Set(double i); + void Set(int32_t i); + void Set(uint32_t i); + + // Fast JS primitive setters + void SetNull(); + void SetUndefined(); + void SetEmptyString(); + + // Convenience getter for isolate + v8::Isolate *GetIsolate() const; +}; +``` + +See the documentation on [`v8::ReturnValue`](https://v8docs.nodesource.com/node-8.0/da/da7/classv8_1_1_return_value.html) for further information on this. + + +### Method declaration + +JavaScript-accessible methods should be declared with the following signature to form a `Nan::FunctionCallback`: + +```c++ +typedef void(*FunctionCallback)(const FunctionCallbackInfo&); +``` + +Example: + +```c++ +void MethodName(const Nan::FunctionCallbackInfo& info) { + ... +} +``` + +You do not need to declare a new `HandleScope` within a method as one is implicitly created for you. + +**Example usage** + +```c++ +// .h: +class Foo : public Nan::ObjectWrap { + ... + + static void Bar(const Nan::FunctionCallbackInfo& info); + static void Baz(const Nan::FunctionCallbackInfo& info); +} + + +// .cc: +void Foo::Bar(const Nan::FunctionCallbackInfo& info) { + ... +} + +void Foo::Baz(const Nan::FunctionCallbackInfo& info) { + ... +} +``` + +A helper macro `NAN_METHOD(methodname)` exists, compatible with NAN v1 method declarations. + +**Example usage with `NAN_METHOD(methodname)`** + +```c++ +// .h: +class Foo : public Nan::ObjectWrap { + ... + + static NAN_METHOD(Bar); + static NAN_METHOD(Baz); +} + + +// .cc: +NAN_METHOD(Foo::Bar) { + ... +} + +NAN_METHOD(Foo::Baz) { + ... +} +``` + +Use [`Nan::SetPrototypeMethod`](#api_nan_set_prototype_method) to attach a method to a JavaScript function prototype or [`Nan::SetMethod`](#api_nan_set_method) to attach a method directly on a JavaScript object. + + +### Getter declaration + +JavaScript-accessible getters should be declared with the following signature to form a `Nan::GetterCallback`: + +```c++ +typedef void(*GetterCallback)(v8::Local, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void GetterName(v8::Local property, + const Nan::PropertyCallbackInfo& info) { + ... +} +``` + +You do not need to declare a new `HandleScope` within a getter as one is implicitly created for you. + +A helper macro `NAN_GETTER(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on [Accessors](https://developers.google.com/v8/embed#accesssors). + + +### Setter declaration + +JavaScript-accessible setters should be declared with the following signature to form a Nan::SetterCallback: + +```c++ +typedef void(*SetterCallback)(v8::Local, + v8::Local, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void SetterName(v8::Local property, + v8::Local value, + const Nan::PropertyCallbackInfo& info) { + ... +} +``` + +You do not need to declare a new `HandleScope` within a setter as one is implicitly created for you. + +A helper macro `NAN_SETTER(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on [Accessors](https://developers.google.com/v8/embed#accesssors). + + +### Property getter declaration + +JavaScript-accessible property getters should be declared with the following signature to form a Nan::PropertyGetterCallback: + +```c++ +typedef void(*PropertyGetterCallback)(v8::Local, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void PropertyGetterName(v8::Local property, + const Nan::PropertyCallbackInfo& info) { + ... +} +``` + +You do not need to declare a new `HandleScope` within a property getter as one is implicitly created for you. + +A helper macro `NAN_PROPERTY_GETTER(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors). + + +### Property setter declaration + +JavaScript-accessible property setters should be declared with the following signature to form a Nan::PropertySetterCallback: + +```c++ +typedef void(*PropertySetterCallback)(v8::Local, + v8::Local, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void PropertySetterName(v8::Local property, + v8::Local value, + const Nan::PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a property setter as one is implicitly created for you. + +A helper macro `NAN_PROPERTY_SETTER(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors). + + +### Property enumerator declaration + +JavaScript-accessible property enumerators should be declared with the following signature to form a Nan::PropertyEnumeratorCallback: + +```c++ +typedef void(*PropertyEnumeratorCallback)(const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void PropertyEnumeratorName(const Nan::PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a property enumerator as one is implicitly created for you. + +A helper macro `NAN_PROPERTY_ENUMERATOR(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors). + + +### Property deleter declaration + +JavaScript-accessible property deleters should be declared with the following signature to form a Nan::PropertyDeleterCallback: + +```c++ +typedef void(*PropertyDeleterCallback)(v8::Local, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void PropertyDeleterName(v8::Local property, + const Nan::PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a property deleter as one is implicitly created for you. + +A helper macro `NAN_PROPERTY_DELETER(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors). + + +### Property query declaration + +JavaScript-accessible property query methods should be declared with the following signature to form a Nan::PropertyQueryCallback: + +```c++ +typedef void(*PropertyQueryCallback)(v8::Local, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void PropertyQueryName(v8::Local property, + const Nan::PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a property query method as one is implicitly created for you. + +A helper macro `NAN_PROPERTY_QUERY(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors). + + +### Index getter declaration + +JavaScript-accessible index getter methods should be declared with the following signature to form a Nan::IndexGetterCallback: + +```c++ +typedef void(*IndexGetterCallback)(uint32_t, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void IndexGetterName(uint32_t index, const PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a index getter as one is implicitly created for you. + +A helper macro `NAN_INDEX_GETTER(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors). + + +### Index setter declaration + +JavaScript-accessible index setter methods should be declared with the following signature to form a Nan::IndexSetterCallback: + +```c++ +typedef void(*IndexSetterCallback)(uint32_t, + v8::Local, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void IndexSetterName(uint32_t index, + v8::Local value, + const PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a index setter as one is implicitly created for you. + +A helper macro `NAN_INDEX_SETTER(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors). + + +### Index enumerator declaration + +JavaScript-accessible index enumerator methods should be declared with the following signature to form a Nan::IndexEnumeratorCallback: + +```c++ +typedef void(*IndexEnumeratorCallback)(const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void IndexEnumeratorName(const PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a index enumerator as one is implicitly created for you. + +A helper macro `NAN_INDEX_ENUMERATOR(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors). + + +### Index deleter declaration + +JavaScript-accessible index deleter methods should be declared with the following signature to form a Nan::IndexDeleterCallback: + +```c++ +typedef void(*IndexDeleterCallback)(uint32_t, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void IndexDeleterName(uint32_t index, const PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a index deleter as one is implicitly created for you. + +A helper macro `NAN_INDEX_DELETER(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors). + + +### Index query declaration + +JavaScript-accessible index query methods should be declared with the following signature to form a Nan::IndexQueryCallback: + +```c++ +typedef void(*IndexQueryCallback)(uint32_t, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void IndexQueryName(uint32_t index, const PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a index query method as one is implicitly created for you. + +A helper macro `NAN_INDEX_QUERY(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors). + + +### Nan::SetMethod() + +Sets a method with a given name directly on a JavaScript object where the method has the `Nan::FunctionCallback` signature (see Method declaration). + +Signature: + +```c++ +void Nan::SetMethod(v8::Local recv, + const char *name, + Nan::FunctionCallback callback) +void Nan::SetMethod(v8::Local templ, + const char *name, + Nan::FunctionCallback callback) +``` + + +### Nan::SetPrototypeMethod() + +Sets a method with a given name on a `FunctionTemplate`'s prototype where the method has the `Nan::FunctionCallback` signature (see Method declaration). + +Signature: + +```c++ +void Nan::SetPrototypeMethod(v8::Local recv, + const char* name, + Nan::FunctionCallback callback) +``` + + +### Nan::SetAccessor() + +Sets getters and setters for a property with a given name on an `ObjectTemplate` or a plain `Object`. Accepts getters with the `Nan::GetterCallback` signature (see Getter declaration) and setters with the `Nan::SetterCallback` signature (see Setter declaration). + +Signature: + +```c++ +void SetAccessor(v8::Local tpl, + v8::Local name, + Nan::GetterCallback getter, + Nan::SetterCallback setter = 0, + v8::Local data = v8::Local(), + v8::AccessControl settings = v8::DEFAULT, + v8::PropertyAttribute attribute = v8::None, + imp::Sig signature = imp::Sig()); +bool SetAccessor(v8::Local obj, + v8::Local name, + Nan::GetterCallback getter, + Nan::SetterCallback setter = 0, + v8::Local data = v8::Local(), + v8::AccessControl settings = v8::DEFAULT, + v8::PropertyAttribute attribute = v8::None) +``` + +See the V8 [`ObjectTemplate#SetAccessor()`](https://v8docs.nodesource.com/node-8.0/db/d5f/classv8_1_1_object_template.html#aca0ed196f8a9adb1f68b1aadb6c9cd77) and [`Object#SetAccessor()`](https://v8docs.nodesource.com/node-8.0/db/d85/classv8_1_1_object.html#a3f9dee085f5ec346465f1dc924325043) for further information about how to use `Nan::SetAccessor()`. + + +### Nan::SetNamedPropertyHandler() + +Sets named property getters, setters, query, deleter and enumerator methods on an `ObjectTemplate`. Accepts: + +* Property getters with the `Nan::PropertyGetterCallback` signature (see Property getter declaration) +* Property setters with the `Nan::PropertySetterCallback` signature (see Property setter declaration) +* Property query methods with the `Nan::PropertyQueryCallback` signature (see Property query declaration) +* Property deleters with the `Nan::PropertyDeleterCallback` signature (see Property deleter declaration) +* Property enumerators with the `Nan::PropertyEnumeratorCallback` signature (see Property enumerator declaration) + +Signature: + +```c++ +void SetNamedPropertyHandler(v8::Local tpl, + Nan::PropertyGetterCallback getter, + Nan::PropertySetterCallback setter = 0, + Nan::PropertyQueryCallback query = 0, + Nan::PropertyDeleterCallback deleter = 0, + Nan::PropertyEnumeratorCallback enumerator = 0, + v8::Local data = v8::Local()) +``` + +See the V8 [`ObjectTemplate#SetNamedPropertyHandler()`](https://v8docs.nodesource.com/io.js-3.0/db/d5f/classv8_1_1_object_template.html#a34d1cc45b642cd131706663801aadd76) for further information about how to use `Nan::SetNamedPropertyHandler()`. + + +### Nan::SetIndexedPropertyHandler() + +Sets indexed property getters, setters, query, deleter and enumerator methods on an `ObjectTemplate`. Accepts: + +* Indexed property getters with the `Nan::IndexGetterCallback` signature (see Index getter declaration) +* Indexed property setters with the `Nan::IndexSetterCallback` signature (see Index setter declaration) +* Indexed property query methods with the `Nan::IndexQueryCallback` signature (see Index query declaration) +* Indexed property deleters with the `Nan::IndexDeleterCallback` signature (see Index deleter declaration) +* Indexed property enumerators with the `Nan::IndexEnumeratorCallback` signature (see Index enumerator declaration) + +Signature: + +```c++ +void SetIndexedPropertyHandler(v8::Local tpl, + Nan::IndexGetterCallback getter, + Nan::IndexSetterCallback setter = 0, + Nan::IndexQueryCallback query = 0, + Nan::IndexDeleterCallback deleter = 0, + Nan::IndexEnumeratorCallback enumerator = 0, + v8::Local data = v8::Local()) +``` + +See the V8 [`ObjectTemplate#SetIndexedPropertyHandler()`](https://v8docs.nodesource.com/node-8.0/db/d5f/classv8_1_1_object_template.html#ac89f06d634add0e890452033f7d17ff1) for further information about how to use `Nan::SetIndexedPropertyHandler()`. + + +### Nan::SetTemplate() + +Adds properties on an `Object`'s or `Function`'s template. + +Signature: + +```c++ +void Nan::SetTemplate(v8::Local templ, + const char *name, + v8::Local value); +void Nan::SetTemplate(v8::Local templ, + v8::Local name, + v8::Local value, + v8::PropertyAttribute attributes) +``` + +Calls the `Template`'s [`Set()`](https://v8docs.nodesource.com/node-8.0/db/df7/classv8_1_1_template.html#ae3fbaff137557aa6a0233bc7e52214ac). + + +### Nan::SetPrototypeTemplate() + +Adds properties on an `Object`'s or `Function`'s prototype template. + +Signature: + +```c++ +void Nan::SetPrototypeTemplate(v8::Local templ, + const char *name, + v8::Local value); +void Nan::SetPrototypeTemplate(v8::Local templ, + v8::Local name, + v8::Local value, + v8::PropertyAttribute attributes) +``` + +Calls the `FunctionTemplate`'s _PrototypeTemplate's_ [`Set()`](https://v8docs.nodesource.com/io.js-3.0/db/df7/classv8_1_1_template.html#a2db6a56597bf23c59659c0659e564ddf). + + +### Nan::SetInstanceTemplate() + +Use to add instance properties on `FunctionTemplate`'s. + +Signature: + +```c++ +void Nan::SetInstanceTemplate(v8::Local templ, + const char *name, + v8::Local value); +void Nan::SetInstanceTemplate(v8::Local templ, + v8::Local name, + v8::Local value, + v8::PropertyAttribute attributes) +``` + +Calls the `FunctionTemplate`'s _InstanceTemplate's_ [`Set()`](https://v8docs.nodesource.com/io.js-3.0/db/df7/classv8_1_1_template.html#a2db6a56597bf23c59659c0659e564ddf). + + +### Nan::SetCallHandler() + +Set the call-handler callback for a `v8::FunctionTemplate`. +This callback is called whenever the function created from this FunctionTemplate is called. + +Signature: + +```c++ +void Nan::SetCallHandler(v8::Local templ, Nan::FunctionCallback callback, v8::Local data = v8::Local()) +``` + +Calls the `FunctionTemplate`'s [`SetCallHandler()`](https://v8docs.nodesource.com/node-8.0/d8/d83/classv8_1_1_function_template.html#a2d3845db66392074c5a018a66efbfada). + + +### Nan::SetCallAsFunctionHandler() + +Sets the callback to be used when calling instances created from the `v8::ObjectTemplate` as a function. +If no callback is set, instances behave like normal JavaScript objects that cannot be called as a function. + +Signature: + +```c++ +void Nan::SetCallAsFunctionHandler(v8::Local templ, Nan::FunctionCallback callback, v8::Local data = v8::Local()) +``` + +Calls the `ObjectTemplate`'s [`SetCallAsFunctionHandler()`](https://v8docs.nodesource.com/node-8.0/db/d5f/classv8_1_1_object_template.html#a5e9612fc80bf6db8f2da199b9b0bd04e). + diff --git a/deploy/node_modules/nan/doc/new.md b/deploy/node_modules/nan/doc/new.md new file mode 100644 index 0000000..c0734bd --- /dev/null +++ b/deploy/node_modules/nan/doc/new.md @@ -0,0 +1,147 @@ +## New + +NAN provides a `Nan::New()` helper for the creation of new JavaScript objects in a way that's compatible across the supported versions of V8. + + - Nan::New() + - Nan::Undefined() + - Nan::Null() + - Nan::True() + - Nan::False() + - Nan::EmptyString() + + + +### Nan::New() + +`Nan::New()` should be used to instantiate new JavaScript objects. + +Refer to the specific V8 type in the [V8 documentation](https://v8docs.nodesource.com/io.js-3.0/d1/d83/classv8_1_1_data.html) for information on the types of arguments required for instantiation. + +Signatures: + +Return types are mostly omitted from the signatures for simplicity. In most cases the type will be contained within a `v8::Local`. The following types will be contained within a `Nan::MaybeLocal`: `v8::String`, `v8::Date`, `v8::RegExp`, `v8::Script`, `v8::UnboundScript`. + +Empty objects: + +```c++ +Nan::New(); +``` + +Generic single and multiple-argument: + +```c++ +Nan::New(A0 arg0); +Nan::New(A0 arg0, A1 arg1); +Nan::New(A0 arg0, A1 arg1, A2 arg2); +Nan::New(A0 arg0, A1 arg1, A2 arg2, A3 arg3); +``` + +For creating `v8::FunctionTemplate` and `v8::Function` objects: + +_The definition of `Nan::FunctionCallback` can be found in the [Method declaration](./methods.md#api_nan_method) documentation._ + +```c++ +Nan::New(Nan::FunctionCallback callback, + v8::Local data = v8::Local()); +Nan::New(Nan::FunctionCallback callback, + v8::Local data = v8::Local(), + A2 a2 = A2()); +``` + +Native number types: + +```c++ +v8::Local Nan::New(bool value); +v8::Local Nan::New(int32_t value); +v8::Local Nan::New(uint32_t value); +v8::Local Nan::New(double value); +``` + +String types: + +```c++ +Nan::MaybeLocal Nan::New(std::string const& value); +Nan::MaybeLocal Nan::New(const char * value, int length); +Nan::MaybeLocal Nan::New(const char * value); +Nan::MaybeLocal Nan::New(const uint16_t * value); +Nan::MaybeLocal Nan::New(const uint16_t * value, int length); +``` + +Specialized types: + +```c++ +v8::Local Nan::New(v8::String::ExternalStringResource * value); +v8::Local Nan::New(Nan::ExternalOneByteStringResource * value); +v8::Local Nan::New(v8::Local pattern, v8::RegExp::Flags flags); +``` + +Note that `Nan::ExternalOneByteStringResource` maps to [`v8::String::ExternalOneByteStringResource`](https://v8docs.nodesource.com/io.js-3.0/d9/db3/classv8_1_1_string_1_1_external_one_byte_string_resource.html), and `v8::String::ExternalAsciiStringResource` in older versions of V8. + + + +### Nan::Undefined() + +A helper method to reference the `v8::Undefined` object in a way that is compatible across all supported versions of V8. + +Signature: + +```c++ +v8::Local Nan::Undefined() +``` + + +### Nan::Null() + +A helper method to reference the `v8::Null` object in a way that is compatible across all supported versions of V8. + +Signature: + +```c++ +v8::Local Nan::Null() +``` + + +### Nan::True() + +A helper method to reference the `v8::Boolean` object representing the `true` value in a way that is compatible across all supported versions of V8. + +Signature: + +```c++ +v8::Local Nan::True() +``` + + +### Nan::False() + +A helper method to reference the `v8::Boolean` object representing the `false` value in a way that is compatible across all supported versions of V8. + +Signature: + +```c++ +v8::Local Nan::False() +``` + + +### Nan::EmptyString() + +Call [`v8::String::Empty`](https://v8docs.nodesource.com/io.js-3.0/d2/db3/classv8_1_1_string.html#a7c1bc8886115d7ee46f1d571dd6ebc6d) to reference the empty string in a way that is compatible across all supported versions of V8. + +Signature: + +```c++ +v8::Local Nan::EmptyString() +``` + + + +### Nan::NewOneByteString() + +An implementation of [`v8::String::NewFromOneByte()`](https://v8docs.nodesource.com/io.js-3.0/d2/db3/classv8_1_1_string.html#a5264d50b96d2c896ce525a734dc10f09) provided for consistent availability and API across supported versions of V8. Allocates a new string from Latin-1 data. + +Signature: + +```c++ +Nan::MaybeLocal Nan::NewOneByteString(const uint8_t * value, + int length = -1) +``` diff --git a/deploy/node_modules/nan/doc/node_misc.md b/deploy/node_modules/nan/doc/node_misc.md new file mode 100644 index 0000000..8aa080f --- /dev/null +++ b/deploy/node_modules/nan/doc/node_misc.md @@ -0,0 +1,63 @@ +## Miscellaneous Node Helpers + + - Nan::MakeCallback() + - NAN_MODULE_INIT() + - Nan::Export() + + + +### Nan::MakeCallback() + +Wrappers around `node::MakeCallback()` providing a consistent API across all supported versions of Node. + +Use `MakeCallback()` rather than using `v8::Function#Call()` directly in order to properly process internal Node functionality including domains, async hooks, the microtask queue, and other debugging functionality. + +Signatures: + +```c++ +v8::Local Nan::MakeCallback(v8::Local target, + v8::Local func, + int argc, + v8::Local* argv); +v8::Local Nan::MakeCallback(v8::Local target, + v8::Local symbol, + int argc, + v8::Local* argv); +v8::Local Nan::MakeCallback(v8::Local target, + const char* method, + int argc, + v8::Local* argv); +``` + + + +### NAN_MODULE_INIT() + +Used to define the entry point function to a Node add-on. Creates a function with a given `name` that receives a `target` object representing the equivalent of the JavaScript `exports` object. + +See example below. + + +### Nan::Export() + +A simple helper to register a `v8::FunctionTemplate` from a JavaScript-accessible method (see [Methods](./methods.md)) as a property on an object. Can be used in a way similar to assigning properties to `module.exports` in JavaScript. + +Signature: + +```c++ +void Export(v8::Local target, const char *name, Nan::FunctionCallback f) +``` + +Also available as the shortcut `NAN_EXPORT` macro. + +Example: + +```c++ +NAN_METHOD(Foo) { + ... +} + +NAN_MODULE_INIT(Init) { + NAN_EXPORT(target, Foo); +} +``` diff --git a/deploy/node_modules/nan/doc/object_wrappers.md b/deploy/node_modules/nan/doc/object_wrappers.md new file mode 100644 index 0000000..e89832b --- /dev/null +++ b/deploy/node_modules/nan/doc/object_wrappers.md @@ -0,0 +1,263 @@ +## Object Wrappers + +The `ObjectWrap` class can be used to make wrapped C++ objects and a factory of wrapped objects. + + - Nan::ObjectWrap + + + +### Nan::ObjectWrap() + +A reimplementation of `node::ObjectWrap` that adds some API not present in older versions of Node. Should be preferred over `node::ObjectWrap` in all cases for consistency. + +Definition: + +```c++ +class ObjectWrap { + public: + ObjectWrap(); + + virtual ~ObjectWrap(); + + template + static inline T* Unwrap(v8::Local handle); + + inline v8::Local handle(); + + inline Nan::Persistent& persistent(); + + protected: + inline void Wrap(v8::Local handle); + + inline void MakeWeak(); + + /* Ref() marks the object as being attached to an event loop. + * Refed objects will not be garbage collected, even if + * all references are lost. + */ + virtual void Ref(); + + /* Unref() marks an object as detached from the event loop. This is its + * default state. When an object with a "weak" reference changes from + * attached to detached state it will be freed. Be careful not to access + * the object after making this call as it might be gone! + * (A "weak reference" means an object that only has a + * persistant handle.) + * + * DO NOT CALL THIS FROM DESTRUCTOR + */ + virtual void Unref(); + + int refs_; // ro +}; +``` + +See the Node documentation on [Wrapping C++ Objects](https://nodejs.org/api/addons.html#addons_wrapping_c_objects) for more details. + +### This vs. Holder + +When calling `Unwrap`, it is important that the argument is indeed some JavaScript object which got wrapped by a `Wrap` call for this class or any derived class. +The `Signature` installed by [`Nan::SetPrototypeMethod()`](methods.md#api_nan_set_prototype_method) does ensure that `info.Holder()` is just such an instance. +In Node 0.12 and later, `info.This()` will also be of such a type, since otherwise the invocation will get rejected. +However, in Node 0.10 and before it was possible to invoke a method on a JavaScript object which just had the extension type in its prototype chain. +In such a situation, calling `Unwrap` on `info.This()` will likely lead to a failed assertion causing a crash, but could lead to even more serious corruption. + +On the other hand, calling `Unwrap` in an [accessor](methods.md#api_nan_set_accessor) should not use `Holder()` if the accessor is defined on the prototype. +So either define your accessors on the instance template, +or use `This()` after verifying that it is indeed a valid object. + +### Examples + +#### Basic + +```c++ +class MyObject : public Nan::ObjectWrap { + public: + static NAN_MODULE_INIT(Init) { + v8::Local tpl = Nan::New(New); + tpl->SetClassName(Nan::New("MyObject").ToLocalChecked()); + tpl->InstanceTemplate()->SetInternalFieldCount(1); + + Nan::SetPrototypeMethod(tpl, "getHandle", GetHandle); + Nan::SetPrototypeMethod(tpl, "getValue", GetValue); + + constructor().Reset(Nan::GetFunction(tpl).ToLocalChecked()); + Nan::Set(target, Nan::New("MyObject").ToLocalChecked(), + Nan::GetFunction(tpl).ToLocalChecked()); + } + + private: + explicit MyObject(double value = 0) : value_(value) {} + ~MyObject() {} + + static NAN_METHOD(New) { + if (info.IsConstructCall()) { + double value = info[0]->IsUndefined() ? 0 : Nan::To(info[0]).FromJust(); + MyObject *obj = new MyObject(value); + obj->Wrap(info.This()); + info.GetReturnValue().Set(info.This()); + } else { + const int argc = 1; + v8::Local argv[argc] = {info[0]}; + v8::Local cons = Nan::New(constructor()); + info.GetReturnValue().Set(cons->NewInstance(argc, argv)); + } + } + + static NAN_METHOD(GetHandle) { + MyObject* obj = Nan::ObjectWrap::Unwrap(info.Holder()); + info.GetReturnValue().Set(obj->handle()); + } + + static NAN_METHOD(GetValue) { + MyObject* obj = Nan::ObjectWrap::Unwrap(info.Holder()); + info.GetReturnValue().Set(obj->value_); + } + + static inline Nan::Persistent & constructor() { + static Nan::Persistent my_constructor; + return my_constructor; + } + + double value_; +}; + +NODE_MODULE(objectwrapper, MyObject::Init) +``` + +To use in Javascript: + +```Javascript +var objectwrapper = require('bindings')('objectwrapper'); + +var obj = new objectwrapper.MyObject(5); +console.log('Should be 5: ' + obj.getValue()); +``` + +#### Factory of wrapped objects + +```c++ +class MyFactoryObject : public Nan::ObjectWrap { + public: + static NAN_MODULE_INIT(Init) { + v8::Local tpl = Nan::New(New); + tpl->InstanceTemplate()->SetInternalFieldCount(1); + + Nan::SetPrototypeMethod(tpl, "getValue", GetValue); + + constructor().Reset(Nan::GetFunction(tpl).ToLocalChecked()); + } + + static NAN_METHOD(NewInstance) { + v8::Local cons = Nan::New(constructor()); + double value = info[0]->IsNumber() ? Nan::To(info[0]).FromJust() : 0; + const int argc = 1; + v8::Local argv[1] = {Nan::New(value)}; + info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked()); + } + + // Needed for the next example: + inline double value() const { + return value_; + } + + private: + explicit MyFactoryObject(double value = 0) : value_(value) {} + ~MyFactoryObject() {} + + static NAN_METHOD(New) { + if (info.IsConstructCall()) { + double value = info[0]->IsNumber() ? Nan::To(info[0]).FromJust() : 0; + MyFactoryObject * obj = new MyFactoryObject(value); + obj->Wrap(info.This()); + info.GetReturnValue().Set(info.This()); + } else { + const int argc = 1; + v8::Local argv[argc] = {info[0]}; + v8::Local cons = Nan::New(constructor()); + info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked()); + } + } + + static NAN_METHOD(GetValue) { + MyFactoryObject* obj = ObjectWrap::Unwrap(info.Holder()); + info.GetReturnValue().Set(obj->value_); + } + + static inline Nan::Persistent & constructor() { + static Nan::Persistent my_constructor; + return my_constructor; + } + + double value_; +}; + +NAN_MODULE_INIT(Init) { + MyFactoryObject::Init(target); + Nan::Set(target, + Nan::New("newFactoryObjectInstance").ToLocalChecked(), + Nan::GetFunction( + Nan::New(MyFactoryObject::NewInstance)).ToLocalChecked() + ); +} + +NODE_MODULE(wrappedobjectfactory, Init) +``` + +To use in Javascript: + +```Javascript +var wrappedobjectfactory = require('bindings')('wrappedobjectfactory'); + +var obj = wrappedobjectfactory.newFactoryObjectInstance(10); +console.log('Should be 10: ' + obj.getValue()); +``` + +#### Passing wrapped objects around + +Use the `MyFactoryObject` class above along with the following: + +```c++ +static NAN_METHOD(Sum) { + Nan::MaybeLocal maybe1 = Nan::To(info[0]); + Nan::MaybeLocal maybe2 = Nan::To(info[1]); + + // Quick check: + if (maybe1.IsEmpty() || maybe2.IsEmpty()) { + // return value is undefined by default + return; + } + + MyFactoryObject* obj1 = + Nan::ObjectWrap::Unwrap(maybe1.ToLocalChecked()); + MyFactoryObject* obj2 = + Nan::ObjectWrap::Unwrap(maybe2.ToLocalChecked()); + + info.GetReturnValue().Set(Nan::New(obj1->value() + obj2->value())); +} + +NAN_MODULE_INIT(Init) { + MyFactoryObject::Init(target); + Nan::Set(target, + Nan::New("newFactoryObjectInstance").ToLocalChecked(), + Nan::GetFunction( + Nan::New(MyFactoryObject::NewInstance)).ToLocalChecked() + ); + Nan::Set(target, + Nan::New("sum").ToLocalChecked(), + Nan::GetFunction(Nan::New(Sum)).ToLocalChecked() + ); +} + +NODE_MODULE(myaddon, Init) +``` + +To use in Javascript: + +```Javascript +var myaddon = require('bindings')('myaddon'); + +var obj1 = myaddon.newFactoryObjectInstance(5); +var obj2 = myaddon.newFactoryObjectInstance(10); +console.log('sum of object values: ' + myaddon.sum(obj1, obj2)); +``` diff --git a/deploy/node_modules/nan/doc/persistent.md b/deploy/node_modules/nan/doc/persistent.md new file mode 100644 index 0000000..743b44a --- /dev/null +++ b/deploy/node_modules/nan/doc/persistent.md @@ -0,0 +1,295 @@ +## Persistent references + +An object reference that is independent of any `HandleScope` is a _persistent_ reference. Where a `Local` handle only lives as long as the `HandleScope` in which it was allocated, a `Persistent` handle remains valid until it is explicitly disposed. + +Due to the evolution of the V8 API, it is necessary for NAN to provide a wrapper implementation of the `Persistent` classes to supply compatibility across the V8 versions supported. + + - Nan::PersistentBase & v8::PersistentBase + - Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits + - Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits + - Nan::Persistent + - Nan::Global + - Nan::WeakCallbackInfo + - Nan::WeakCallbackType + +Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://developers.google.com/v8/embed#handles). + + +### Nan::PersistentBase & v8::PersistentBase + +A persistent handle contains a reference to a storage cell in V8 which holds an object value and which is updated by the garbage collector whenever the object is moved. A new storage cell can be created using the constructor or `Nan::PersistentBase::Reset()`. Existing handles can be disposed using an argument-less `Nan::PersistentBase::Reset()`. + +Definition: + +_(note: this is implemented as `Nan::PersistentBase` for older versions of V8 and the native `v8::PersistentBase` is used for newer versions of V8)_ + +```c++ +template class PersistentBase { + public: + /** + * If non-empty, destroy the underlying storage cell + */ + void Reset(); + + /** + * If non-empty, destroy the underlying storage cell and create a new one with + * the contents of another if it is also non-empty + */ + template void Reset(const v8::Local &other); + + /** + * If non-empty, destroy the underlying storage cell and create a new one with + * the contents of another if it is also non-empty + */ + template void Reset(const PersistentBase &other); + + /** + * If non-empty, destroy the underlying storage cell + * IsEmpty() will return true after this call. + */ + bool IsEmpty(); + + void Empty(); + + template bool operator==(const PersistentBase &that); + + template bool operator==(const v8::Local &that); + + template bool operator!=(const PersistentBase &that); + + template bool operator!=(const v8::Local &that); + + /** + * Install a finalization callback on this object. + * NOTE: There is no guarantee as to *when* or even *if* the callback is + * invoked. The invocation is performed solely on a best effort basis. + * As always, GC-based finalization should *not* be relied upon for any + * critical form of resource management! At the moment you can either + * specify a parameter for the callback or the location of two internal + * fields in the dying object. + */ + template + void SetWeak(P *parameter, + typename WeakCallbackInfo

::Callback callback, + WeakCallbackType type); + + void ClearWeak(); + + /** + * Marks the reference to this object independent. Garbage collector is free + * to ignore any object groups containing this object. Weak callback for an + * independent handle should not assume that it will be preceded by a global + * GC prologue callback or followed by a global GC epilogue callback. + */ + void MarkIndependent() const; + + bool IsIndependent() const; + + /** Checks if the handle holds the only reference to an object. */ + bool IsNearDeath() const; + + /** Returns true if the handle's reference is weak. */ + bool IsWeak() const +}; +``` + +See the V8 documentation for [`PersistentBase`](https://v8docs.nodesource.com/io.js-3.0/d4/dca/classv8_1_1_persistent_base.html) for further information. + +**Tip:** To get a `v8::Local` reference to the original object back from a `PersistentBase` or `Persistent` object: + +```c++ +v8::Local object = Nan::New(persistent); +``` + + +### Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits + +Default traits for `Nan::Persistent`. This class does not allow use of the a copy constructor or assignment operator. At present `kResetInDestructor` is not set, but that will change in a future version. + +Definition: + +_(note: this is implemented as `Nan::NonCopyablePersistentTraits` for older versions of V8 and the native `v8::NonCopyablePersistentTraits` is used for newer versions of V8)_ + +```c++ +template class NonCopyablePersistentTraits { + public: + typedef Persistent > NonCopyablePersistent; + + static const bool kResetInDestructor = false; + + template + static void Copy(const Persistent &source, + NonCopyablePersistent *dest); + + template static void Uncompilable(); +}; +``` + +See the V8 documentation for [`NonCopyablePersistentTraits`](https://v8docs.nodesource.com/io.js-3.0/de/d73/classv8_1_1_non_copyable_persistent_traits.html) for further information. + + +### Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits + +A helper class of traits to allow copying and assignment of `Persistent`. This will clone the contents of storage cell, but not any of the flags, etc.. + +Definition: + +_(note: this is implemented as `Nan::CopyablePersistentTraits` for older versions of V8 and the native `v8::NonCopyablePersistentTraits` is used for newer versions of V8)_ + +```c++ +template +class CopyablePersistentTraits { + public: + typedef Persistent > CopyablePersistent; + + static const bool kResetInDestructor = true; + + template + static void Copy(const Persistent &source, + CopyablePersistent *dest); +}; +``` + +See the V8 documentation for [`CopyablePersistentTraits`](https://v8docs.nodesource.com/io.js-3.0/da/d5c/structv8_1_1_copyable_persistent_traits.html) for further information. + + +### Nan::Persistent + +A type of `PersistentBase` which allows copy and assignment. Copy, assignment and destructor behavior is controlled by the traits class `M`. + +Definition: + +```c++ +template > +class Persistent; + +template class Persistent : public PersistentBase { + public: + /** + * A Persistent with no storage cell. + */ + Persistent(); + + /** + * Construct a Persistent from a v8::Local. When the v8::Local is non-empty, a + * new storage cell is created pointing to the same object, and no flags are + * set. + */ + template Persistent(v8::Local that); + + /** + * Construct a Persistent from a Persistent. When the Persistent is non-empty, + * a new storage cell is created pointing to the same object, and no flags are + * set. + */ + Persistent(const Persistent &that); + + /** + * The copy constructors and assignment operator create a Persistent exactly + * as the Persistent constructor, but the Copy function from the traits class + * is called, allowing the setting of flags based on the copied Persistent. + */ + Persistent &operator=(const Persistent &that); + + template + Persistent &operator=(const Persistent &that); + + /** + * The destructor will dispose the Persistent based on the kResetInDestructor + * flags in the traits class. Since not calling dispose can result in a + * memory leak, it is recommended to always set this flag. + */ + ~Persistent(); +}; +``` + +See the V8 documentation for [`Persistent`](https://v8docs.nodesource.com/io.js-3.0/d2/d78/classv8_1_1_persistent.html) for further information. + + +### Nan::Global + +A type of `PersistentBase` which has move semantics. + +```c++ +template class Global : public PersistentBase { + public: + /** + * A Global with no storage cell. + */ + Global(); + + /** + * Construct a Global from a v8::Local. When the v8::Local is non-empty, a new + * storage cell is created pointing to the same object, and no flags are set. + */ + template Global(v8::Local that); + /** + * Construct a Global from a PersistentBase. When the Persistent is non-empty, + * a new storage cell is created pointing to the same object, and no flags are + * set. + */ + template Global(const PersistentBase &that); + + /** + * Pass allows returning globals from functions, etc. + */ + Global Pass(); +}; +``` + +See the V8 documentation for [`Global`](https://v8docs.nodesource.com/io.js-3.0/d5/d40/classv8_1_1_global.html) for further information. + + +### Nan::WeakCallbackInfo + +`Nan::WeakCallbackInfo` is used as an argument when setting a persistent reference as weak. You may need to free any external resources attached to the object. It is a mirror of `v8:WeakCallbackInfo` as found in newer versions of V8. + +Definition: + +```c++ +template class WeakCallbackInfo { + public: + typedef void (*Callback)(const WeakCallbackInfo& data); + + v8::Isolate *GetIsolate() const; + + /** + * Get the parameter that was associated with the weak handle. + */ + T *GetParameter() const; + + /** + * Get pointer from internal field, index can be 0 or 1. + */ + void *GetInternalField(int index) const; +}; +``` + +Example usage: + +```c++ +void weakCallback(const WeakCallbackInfo &data) { + int *parameter = data.GetParameter(); + delete parameter; +} + +Persistent obj; +int *data = new int(0); +obj.SetWeak(data, callback, WeakCallbackType::kParameter); +``` + +See the V8 documentation for [`WeakCallbackInfo`](https://v8docs.nodesource.com/io.js-3.0/d8/d06/classv8_1_1_weak_callback_info.html) for further information. + + +### Nan::WeakCallbackType + +Represents the type of a weak callback. +A weak callback of type `kParameter` makes the supplied parameter to `Nan::PersistentBase::SetWeak` available through `WeakCallbackInfo::GetParameter`. +A weak callback of type `kInternalFields` uses up to two internal fields at indices 0 and 1 on the `Nan::PersistentBase` being made weak. +Note that only `v8::Object`s and derivatives can have internal fields. + +Definition: + +```c++ +enum class WeakCallbackType { kParameter, kInternalFields }; +``` diff --git a/deploy/node_modules/nan/doc/scopes.md b/deploy/node_modules/nan/doc/scopes.md new file mode 100644 index 0000000..060c8e4 --- /dev/null +++ b/deploy/node_modules/nan/doc/scopes.md @@ -0,0 +1,73 @@ +## Scopes + +A _local handle_ is a pointer to an object. All V8 objects are accessed using handles, they are necessary because of the way the V8 garbage collector works. + +A handle scope can be thought of as a container for any number of handles. When you've finished with your handles, instead of deleting each one individually you can simply delete their scope. + +The creation of `HandleScope` objects is different across the supported versions of V8. Therefore, NAN provides its own implementations that can be used safely across these. + + - Nan::HandleScope + - Nan::EscapableHandleScope + +Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://github.com/v8/v8/wiki/Embedder%27s%20Guide#handles-and-garbage-collection). + + +### Nan::HandleScope + +A simple wrapper around [`v8::HandleScope`](https://v8docs.nodesource.com/io.js-3.0/d3/d95/classv8_1_1_handle_scope.html). + +Definition: + +```c++ +class Nan::HandleScope { + public: + Nan::HandleScope(); + static int NumberOfHandles(); +}; +``` + +Allocate a new `Nan::HandleScope` whenever you are creating new V8 JavaScript objects. Note that an implicit `HandleScope` is created for you on JavaScript-accessible methods so you do not need to insert one yourself. + +Example: + +```c++ +// new object is created, it needs a new scope: +void Pointless() { + Nan::HandleScope scope; + v8::Local obj = Nan::New(); +} + +// JavaScript-accessible method already has a HandleScope +NAN_METHOD(Pointless2) { + v8::Local obj = Nan::New(); +} +``` + + +### Nan::EscapableHandleScope + +Similar to [`Nan::HandleScope`](#api_nan_handle_scope) but should be used in cases where a function needs to return a V8 JavaScript type that has been created within it. + +Definition: + +```c++ +class Nan::EscapableHandleScope { + public: + Nan::EscapableHandleScope(); + static int NumberOfHandles(); + template v8::Local Escape(v8::Local value); +} +``` + +Use `Escape(value)` to return the object. + +Example: + +```c++ +v8::Local EmptyObj() { + Nan::EscapableHandleScope scope; + v8::Local obj = Nan::New(); + return scope.Escape(obj); +} +``` + diff --git a/deploy/node_modules/nan/doc/script.md b/deploy/node_modules/nan/doc/script.md new file mode 100644 index 0000000..1267b5e --- /dev/null +++ b/deploy/node_modules/nan/doc/script.md @@ -0,0 +1,38 @@ +## Script + +NAN provides a `v8::Script` helpers as the API has changed over the supported versions of V8. + + - Nan::CompileScript() + - Nan::RunScript() + + + +### Nan::CompileScript() + +A wrapper around [`v8::Script::Compile()`](https://v8docs.nodesource.com/io.js-3.0/da/da5/classv8_1_1_script_compiler.html#a93f5072a0db55d881b969e9fc98e564b). + +Note that `Nan::BoundScript` is an alias for `v8::Script`. + +Signature: + +```c++ +Nan::MaybeLocal Nan::CompileScript( + v8::Local s, + const v8::ScriptOrigin& origin); +Nan::MaybeLocal Nan::CompileScript(v8::Local s); +``` + + + +### Nan::RunScript() + +Calls `script->Run()` or `script->BindToCurrentContext()->Run(Nan::GetCurrentContext())`. + +Note that `Nan::BoundScript` is an alias for `v8::Script` and `Nan::UnboundScript` is an alias for `v8::UnboundScript` where available and `v8::Script` on older versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::RunScript(v8::Local script) +Nan::MaybeLocal Nan::RunScript(v8::Local script) +``` diff --git a/deploy/node_modules/nan/doc/string_bytes.md b/deploy/node_modules/nan/doc/string_bytes.md new file mode 100644 index 0000000..7c1bd32 --- /dev/null +++ b/deploy/node_modules/nan/doc/string_bytes.md @@ -0,0 +1,62 @@ +## Strings & Bytes + +Miscellaneous string & byte encoding and decoding functionality provided for compatibility across supported versions of V8 and Node. Implemented by NAN to ensure that all encoding types are supported, even for older versions of Node where they are missing. + + - Nan::Encoding + - Nan::Encode() + - Nan::DecodeBytes() + - Nan::DecodeWrite() + + + +### Nan::Encoding + +An enum representing the supported encoding types. A copy of `node::encoding` that is consistent across versions of Node. + +Definition: + +```c++ +enum Nan::Encoding { ASCII, UTF8, BASE64, UCS2, BINARY, HEX, BUFFER } +``` + + + +### Nan::Encode() + +A wrapper around `node::Encode()` that provides a consistent implementation across supported versions of Node. + +Signature: + +```c++ +v8::Local Nan::Encode(const void *buf, + size_t len, + enum Nan::Encoding encoding = BINARY); +``` + + + +### Nan::DecodeBytes() + +A wrapper around `node::DecodeBytes()` that provides a consistent implementation across supported versions of Node. + +Signature: + +```c++ +ssize_t Nan::DecodeBytes(v8::Local val, + enum Nan::Encoding encoding = BINARY); +``` + + + +### Nan::DecodeWrite() + +A wrapper around `node::DecodeWrite()` that provides a consistent implementation across supported versions of Node. + +Signature: + +```c++ +ssize_t Nan::DecodeWrite(char *buf, + size_t len, + v8::Local val, + enum Nan::Encoding encoding = BINARY); +``` diff --git a/deploy/node_modules/nan/doc/v8_internals.md b/deploy/node_modules/nan/doc/v8_internals.md new file mode 100644 index 0000000..ce5f230 --- /dev/null +++ b/deploy/node_modules/nan/doc/v8_internals.md @@ -0,0 +1,199 @@ +## V8 internals + +The hooks to access V8 internals—including GC and statistics—are different across the supported versions of V8, therefore NAN provides its own hooks that call the appropriate V8 methods. + + - NAN_GC_CALLBACK() + - Nan::AddGCEpilogueCallback() + - Nan::RemoveGCEpilogueCallback() + - Nan::AddGCPrologueCallback() + - Nan::RemoveGCPrologueCallback() + - Nan::GetHeapStatistics() + - Nan::SetCounterFunction() + - Nan::SetCreateHistogramFunction() + - Nan::SetAddHistogramSampleFunction() + - Nan::IdleNotification() + - Nan::LowMemoryNotification() + - Nan::ContextDisposedNotification() + - Nan::GetInternalFieldPointer() + - Nan::SetInternalFieldPointer() + - Nan::AdjustExternalMemory() + + + +### NAN_GC_CALLBACK(callbackname) + +Use `NAN_GC_CALLBACK` to declare your callbacks for `Nan::AddGCPrologueCallback()` and `Nan::AddGCEpilogueCallback()`. Your new method receives the arguments `v8::GCType type` and `v8::GCCallbackFlags flags`. + +```c++ +static Nan::Persistent callback; + +NAN_GC_CALLBACK(gcPrologueCallback) { + v8::Local argv[] = { Nan::New("prologue").ToLocalChecked() }; + Nan::MakeCallback(Nan::GetCurrentContext()->Global(), Nan::New(callback), 1, argv); +} + +NAN_METHOD(Hook) { + callback.Reset(args[0].As()); + Nan::AddGCPrologueCallback(gcPrologueCallback); + info.GetReturnValue().Set(info.Holder()); +} +``` + + +### Nan::AddGCEpilogueCallback() + +Signature: + +```c++ +void Nan::AddGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback, v8::GCType gc_type_filter = v8::kGCTypeAll) +``` + +Calls V8's [`AddGCEpilogueCallback()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a90d1860babc76059c62514b422f56960). + + +### Nan::RemoveGCEpilogueCallback() + +Signature: + +```c++ +void Nan::RemoveGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback) +``` + +Calls V8's [`RemoveGCEpilogueCallback()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a05c60859fd4b8e96bfcd451281ed6c7c). + + +### Nan::AddGCPrologueCallback() + +Signature: + +```c++ +void Nan::AddGCPrologueCallback(v8::Isolate::GCPrologueCallback, v8::GCType gc_type_filter callback) +``` + +Calls V8's [`AddGCPrologueCallback()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#ab4b87b8f9f8e5bf95eba4009357e001f). + + +### Nan::RemoveGCPrologueCallback() + +Signature: + +```c++ +void Nan::RemoveGCPrologueCallback(v8::Isolate::GCPrologueCallback callback) +``` + +Calls V8's [`RemoveGCEpilogueCallback()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a9f6c51932811593f81ff30b949124186). + + +### Nan::GetHeapStatistics() + +Signature: + +```c++ +void Nan::GetHeapStatistics(v8::HeapStatistics *heap_statistics) +``` + +Calls V8's [`GetHeapStatistics()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a5593ac74687b713095c38987e5950b34). + + +### Nan::SetCounterFunction() + +Signature: + +```c++ +void Nan::SetCounterFunction(v8::CounterLookupCallback cb) +``` + +Calls V8's [`SetCounterFunction()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a045d7754e62fa0ec72ae6c259b29af94). + + +### Nan::SetCreateHistogramFunction() + +Signature: + +```c++ +void Nan::SetCreateHistogramFunction(v8::CreateHistogramCallback cb) +``` + +Calls V8's [`SetCreateHistogramFunction()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a542d67e85089cb3f92aadf032f99e732). + + +### Nan::SetAddHistogramSampleFunction() + +Signature: + +```c++ +void Nan::SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) +``` + +Calls V8's [`SetAddHistogramSampleFunction()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#aeb420b690bc2c216882d6fdd00ddd3ea). + + +### Nan::IdleNotification() + +Signature: + +```c++ +void Nan::IdleNotification(v8::HeapStatistics *heap_statistics) +``` + +Calls V8's [`IdleNotification()` or `IdleNotificationDeadline()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#ad6a2a02657f5425ad460060652a5a118) depending on V8 version. + + +### Nan::LowMemoryNotification() + +Signature: + +```c++ +void Nan::LowMemoryNotification() +``` + +Calls V8's [`LowMemoryNotification()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a24647f61d6b41f69668094bdcd6ea91f). + + +### Nan::ContextDisposedNotification() + +Signature: + +```c++ +void Nan::ContextDisposedNotification() +``` + +Calls V8's [`ContextDisposedNotification()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#ad7f5dc559866343fe6cd8db1f134d48b). + + +### Nan::GetInternalFieldPointer() + +Gets a pointer to the internal field with at `index` from a V8 `Object` handle. + +Signature: + +```c++ +void* Nan::GetInternalFieldPointer(v8::Local object, int index) +``` + +Calls the Object's [`GetAlignedPointerFromInternalField()` or `GetPointerFromInternalField()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#ab3c57184263cf29963ef0017bec82281) depending on the version of V8. + + +### Nan::SetInternalFieldPointer() + +Sets the value of the internal field at `index` on a V8 `Object` handle. + +Signature: + +```c++ +void Nan::SetInternalFieldPointer(v8::Local object, int index, void* value) +``` + +Calls the Object's [`SetAlignedPointerInInternalField()` or `SetPointerInInternalField()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#ad7f5dc559866343fe6cd8db1f134d48b) depending on the version of V8. + + +### Nan::AdjustExternalMemory() + +Signature: + +```c++ +int Nan::AdjustExternalMemory(int bytesChange) +``` + +Calls V8's [`AdjustAmountOfExternalAllocatedMemory()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#ae1a59cac60409d3922582c4af675473e). + diff --git a/deploy/node_modules/nan/doc/v8_misc.md b/deploy/node_modules/nan/doc/v8_misc.md new file mode 100644 index 0000000..64f736d --- /dev/null +++ b/deploy/node_modules/nan/doc/v8_misc.md @@ -0,0 +1,85 @@ +## Miscellaneous V8 Helpers + + - Nan::Utf8String + - Nan::GetCurrentContext() + - Nan::SetIsolateData() + - Nan::GetIsolateData() + - Nan::TypedArrayContents + + + +### Nan::Utf8String + +Converts an object to a UTF-8-encoded character array. If conversion to a string fails (e.g. due to an exception in the toString() method of the object) then the length() method returns 0 and the * operator returns NULL. The underlying memory used for this object is managed by the object. + +An implementation of [`v8::String::Utf8Value`](https://v8docs.nodesource.com/io.js-3.0/d4/d1b/classv8_1_1_string_1_1_utf8_value.html) that is consistent across all supported versions of V8. + +Definition: + +```c++ +class Nan::Utf8String { + public: + Nan::Utf8String(v8::Local from); + + int length() const; + + char* operator*(); + const char* operator*() const; +}; +``` + + +### Nan::GetCurrentContext() + +A call to [`v8::Isolate::GetCurrent()->GetCurrentContext()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a81c7a1ed7001ae2a65e89107f75fd053) that works across all supported versions of V8. + +Signature: + +```c++ +v8::Local Nan::GetCurrentContext() +``` + + +### Nan::SetIsolateData() + +A helper to provide a consistent API to [`v8::Isolate#SetData()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a7acadfe7965997e9c386a05f098fbe36). + +Signature: + +```c++ +void Nan::SetIsolateData(v8::Isolate *isolate, T *data) +``` + + + +### Nan::GetIsolateData() + +A helper to provide a consistent API to [`v8::Isolate#GetData()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#aabd223436bc1100a787dadaa024c6257). + +Signature: + +```c++ +T *Nan::GetIsolateData(v8::Isolate *isolate) +``` + + +### Nan::TypedArrayContents + +A helper class for accessing the contents of an ArrayBufferView (aka a typedarray) from C++. If the input array is not a valid typedarray, then the data pointer of TypedArrayContents will default to `NULL` and the length will be 0. If the data pointer is not compatible with the alignment requirements of type, an assertion error will fail. + +Note that you must store a reference to the `array` object while you are accessing its contents. + +Definition: + +```c++ +template +class Nan::TypedArrayContents { + public: + TypedArrayContents(v8::Local array); + + size_t length() const; + + T* const operator*(); + const T* const operator*() const; +}; +``` diff --git a/deploy/node_modules/nan/include_dirs.js b/deploy/node_modules/nan/include_dirs.js new file mode 100644 index 0000000..4f1dfb4 --- /dev/null +++ b/deploy/node_modules/nan/include_dirs.js @@ -0,0 +1 @@ +console.log(require('path').relative('.', __dirname)); diff --git a/deploy/node_modules/nan/nan.h b/deploy/node_modules/nan/nan.h new file mode 100644 index 0000000..ffbf960 --- /dev/null +++ b/deploy/node_modules/nan/nan.h @@ -0,0 +1,2321 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors: + * - Rod Vagg + * - Benjamin Byholm + * - Trevor Norris + * - Nathan Rajlich + * - Brett Lawson + * - Ben Noordhuis + * - David Siegel + * - Michael Ira Krufky + * + * MIT License + * + * Version 2.7.0: current Node 8.4.0, Node 12: 0.12.18, Node 10: 0.10.48, iojs: 3.3.1 + * + * See https://github.com/nodejs/nan for the latest update to this file + **********************************************************************************/ + +#ifndef NAN_H_ +#define NAN_H_ + +#include + +#define NODE_0_10_MODULE_VERSION 11 +#define NODE_0_12_MODULE_VERSION 14 +#define ATOM_0_21_MODULE_VERSION 41 +#define IOJS_1_0_MODULE_VERSION 42 +#define IOJS_1_1_MODULE_VERSION 43 +#define IOJS_2_0_MODULE_VERSION 44 +#define IOJS_3_0_MODULE_VERSION 45 +#define NODE_4_0_MODULE_VERSION 46 +#define NODE_5_0_MODULE_VERSION 47 +#define NODE_6_0_MODULE_VERSION 48 +#define NODE_7_0_MODULE_VERSION 51 + +#ifdef _MSC_VER +# define NAN_HAS_CPLUSPLUS_11 (_MSC_VER >= 1800) +#else +# define NAN_HAS_CPLUSPLUS_11 (__cplusplus >= 201103L) +#endif + +#if NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION && !NAN_HAS_CPLUSPLUS_11 +# error This version of node/NAN/v8 requires a C++11 compiler +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(_MSC_VER) +# pragma warning( push ) +# pragma warning( disable : 4530 ) +# include +# include +# pragma warning( pop ) +#else +# include +# include +#endif + +// uv helpers +#ifdef UV_VERSION_MAJOR +# ifndef UV_VERSION_PATCH +# define UV_VERSION_PATCH 0 +# endif +# define NAUV_UVVERSION ((UV_VERSION_MAJOR << 16) | \ + (UV_VERSION_MINOR << 8) | \ + (UV_VERSION_PATCH)) +#else +# define NAUV_UVVERSION 0x000b00 +#endif + +#if NAUV_UVVERSION < 0x000b0b +# ifdef WIN32 +# include +# else +# include +# endif +#endif + +namespace Nan { + +#define NAN_INLINE inline // TODO(bnoordhuis) Remove in v3.0.0. + +#if defined(__GNUC__) && \ + !(defined(V8_DISABLE_DEPRECATIONS) && V8_DISABLE_DEPRECATIONS) +# define NAN_DEPRECATED __attribute__((deprecated)) +#elif defined(_MSC_VER) && \ + !(defined(V8_DISABLE_DEPRECATIONS) && V8_DISABLE_DEPRECATIONS) +# define NAN_DEPRECATED __declspec(deprecated) +#else +# define NAN_DEPRECATED +#endif + +#if NAN_HAS_CPLUSPLUS_11 +# define NAN_DISALLOW_ASSIGN(CLASS) void operator=(const CLASS&) = delete; +# define NAN_DISALLOW_COPY(CLASS) CLASS(const CLASS&) = delete; +# define NAN_DISALLOW_MOVE(CLASS) \ + CLASS(CLASS&&) = delete; /* NOLINT(build/c++11) */ \ + void operator=(CLASS&&) = delete; +#else +# define NAN_DISALLOW_ASSIGN(CLASS) void operator=(const CLASS&); +# define NAN_DISALLOW_COPY(CLASS) CLASS(const CLASS&); +# define NAN_DISALLOW_MOVE(CLASS) +#endif + +#define NAN_DISALLOW_ASSIGN_COPY(CLASS) \ + NAN_DISALLOW_ASSIGN(CLASS) \ + NAN_DISALLOW_COPY(CLASS) + +#define NAN_DISALLOW_ASSIGN_MOVE(CLASS) \ + NAN_DISALLOW_ASSIGN(CLASS) \ + NAN_DISALLOW_MOVE(CLASS) + +#define NAN_DISALLOW_COPY_MOVE(CLASS) \ + NAN_DISALLOW_COPY(CLASS) \ + NAN_DISALLOW_MOVE(CLASS) + +#define NAN_DISALLOW_ASSIGN_COPY_MOVE(CLASS) \ + NAN_DISALLOW_ASSIGN(CLASS) \ + NAN_DISALLOW_COPY(CLASS) \ + NAN_DISALLOW_MOVE(CLASS) + +#define TYPE_CHECK(T, S) \ + while (false) { \ + *(static_cast(0)) = static_cast(0); \ + } + +//=== RegistrationFunction ===================================================== + +#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + typedef v8::Handle ADDON_REGISTER_FUNCTION_ARGS_TYPE; +#else + typedef v8::Local ADDON_REGISTER_FUNCTION_ARGS_TYPE; +#endif + +#define NAN_MODULE_INIT(name) \ + void name(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) + +//=== CallbackInfo ============================================================= + +#include "nan_callbacks.h" // NOLINT(build/include) + +//============================================================================== + +#if (NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION) +typedef v8::Script UnboundScript; +typedef v8::Script BoundScript; +#else +typedef v8::UnboundScript UnboundScript; +typedef v8::Script BoundScript; +#endif + +#if (NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION) +typedef v8::String::ExternalAsciiStringResource + ExternalOneByteStringResource; +#else +typedef v8::String::ExternalOneByteStringResource + ExternalOneByteStringResource; +#endif + +#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) +template +class NonCopyablePersistentTraits : + public v8::NonCopyablePersistentTraits {}; +template +class CopyablePersistentTraits : + public v8::CopyablePersistentTraits {}; + +template +class PersistentBase : + public v8::PersistentBase {}; + +template > +class Persistent; +#else +template class NonCopyablePersistentTraits; +template class PersistentBase; +template class WeakCallbackData; +template > +class Persistent; +#endif // NODE_MODULE_VERSION + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +# include "nan_maybe_43_inl.h" // NOLINT(build/include) +#else +# include "nan_maybe_pre_43_inl.h" // NOLINT(build/include) +#endif + +#include "nan_converters.h" // NOLINT(build/include) +#include "nan_new.h" // NOLINT(build/include) + +#if NAUV_UVVERSION < 0x000b17 +#define NAUV_WORK_CB(func) \ + void func(uv_async_t *async, int) +#else +#define NAUV_WORK_CB(func) \ + void func(uv_async_t *async) +#endif + +#if NAUV_UVVERSION >= 0x000b0b + +typedef uv_key_t nauv_key_t; + +inline int nauv_key_create(nauv_key_t *key) { + return uv_key_create(key); +} + +inline void nauv_key_delete(nauv_key_t *key) { + uv_key_delete(key); +} + +inline void* nauv_key_get(nauv_key_t *key) { + return uv_key_get(key); +} + +inline void nauv_key_set(nauv_key_t *key, void *value) { + uv_key_set(key, value); +} + +#else + +/* Implement thread local storage for older versions of libuv. + * This is essentially a backport of libuv commit 5d2434bf + * written by Ben Noordhuis, adjusted for names and inline. + */ + +#ifndef WIN32 + +typedef pthread_key_t nauv_key_t; + +inline int nauv_key_create(nauv_key_t* key) { + return -pthread_key_create(key, NULL); +} + +inline void nauv_key_delete(nauv_key_t* key) { + if (pthread_key_delete(*key)) + abort(); +} + +inline void* nauv_key_get(nauv_key_t* key) { + return pthread_getspecific(*key); +} + +inline void nauv_key_set(nauv_key_t* key, void* value) { + if (pthread_setspecific(*key, value)) + abort(); +} + +#else + +typedef struct { + DWORD tls_index; +} nauv_key_t; + +inline int nauv_key_create(nauv_key_t* key) { + key->tls_index = TlsAlloc(); + if (key->tls_index == TLS_OUT_OF_INDEXES) + return UV_ENOMEM; + return 0; +} + +inline void nauv_key_delete(nauv_key_t* key) { + if (TlsFree(key->tls_index) == FALSE) + abort(); + key->tls_index = TLS_OUT_OF_INDEXES; +} + +inline void* nauv_key_get(nauv_key_t* key) { + void* value = TlsGetValue(key->tls_index); + if (value == NULL) + if (GetLastError() != ERROR_SUCCESS) + abort(); + return value; +} + +inline void nauv_key_set(nauv_key_t* key, void* value) { + if (TlsSetValue(key->tls_index, value) == FALSE) + abort(); +} + +#endif +#endif + +#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION +template +v8::Local New(v8::Handle); +#endif + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + typedef v8::WeakCallbackType WeakCallbackType; +#else +struct WeakCallbackType { + enum E {kParameter, kInternalFields}; + E type; + WeakCallbackType(E other) : type(other) {} // NOLINT(runtime/explicit) + inline bool operator==(E other) { return other == this->type; } + inline bool operator!=(E other) { return !operator==(other); } +}; +#endif + +template class WeakCallbackInfo; + +#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION +# include "nan_persistent_12_inl.h" // NOLINT(build/include) +#else +# include "nan_persistent_pre_12_inl.h" // NOLINT(build/include) +#endif + +namespace imp { + static const size_t kMaxLength = 0x3fffffff; + // v8::String::REPLACE_INVALID_UTF8 was introduced + // in node.js v0.10.29 and v0.8.27. +#if NODE_MAJOR_VERSION > 0 || \ + NODE_MINOR_VERSION > 10 || \ + NODE_MINOR_VERSION == 10 && NODE_PATCH_VERSION >= 29 || \ + NODE_MINOR_VERSION == 8 && NODE_PATCH_VERSION >= 27 + static const unsigned kReplaceInvalidUtf8 = v8::String::REPLACE_INVALID_UTF8; +#else + static const unsigned kReplaceInvalidUtf8 = 0; +#endif +} // end of namespace imp + +//=== HandleScope ============================================================== + +class HandleScope { + v8::HandleScope scope; + + public: +#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + inline HandleScope() : scope(v8::Isolate::GetCurrent()) {} + inline static int NumberOfHandles() { + return v8::HandleScope::NumberOfHandles(v8::Isolate::GetCurrent()); + } +#else + inline HandleScope() : scope() {} + inline static int NumberOfHandles() { + return v8::HandleScope::NumberOfHandles(); + } +#endif + + private: + // Make it hard to create heap-allocated or illegal handle scopes by + // disallowing certain operations. + HandleScope(const HandleScope &); + void operator=(const HandleScope &); + void *operator new(size_t size); + void operator delete(void *, size_t) { + abort(); + } +}; + +class EscapableHandleScope { + public: +#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + inline EscapableHandleScope() : scope(v8::Isolate::GetCurrent()) {} + + inline static int NumberOfHandles() { + return v8::EscapableHandleScope::NumberOfHandles(v8::Isolate::GetCurrent()); + } + + template + inline v8::Local Escape(v8::Local value) { + return scope.Escape(value); + } + + private: + v8::EscapableHandleScope scope; +#else + inline EscapableHandleScope() : scope() {} + + inline static int NumberOfHandles() { + return v8::HandleScope::NumberOfHandles(); + } + + template + inline v8::Local Escape(v8::Local value) { + return scope.Close(value); + } + + private: + v8::HandleScope scope; +#endif + + private: + // Make it hard to create heap-allocated or illegal handle scopes by + // disallowing certain operations. + EscapableHandleScope(const EscapableHandleScope &); + void operator=(const EscapableHandleScope &); + void *operator new(size_t size); + void operator delete(void *, size_t) { + abort(); + } +}; + +//=== TryCatch ================================================================= + +class TryCatch { + v8::TryCatch try_catch_; + friend void FatalException(const TryCatch&); + + public: +#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION + TryCatch() : try_catch_(v8::Isolate::GetCurrent()) {} +#endif + + inline bool HasCaught() const { return try_catch_.HasCaught(); } + + inline bool CanContinue() const { return try_catch_.CanContinue(); } + + inline v8::Local ReThrow() { +#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + return New(try_catch_.ReThrow()); +#else + return try_catch_.ReThrow(); +#endif + } + + inline v8::Local Exception() const { + return try_catch_.Exception(); + } + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + inline v8::MaybeLocal StackTrace() const { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(try_catch_.StackTrace(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); + } +#else + inline MaybeLocal StackTrace() const { + return try_catch_.StackTrace(); + } +#endif + + inline v8::Local Message() const { + return try_catch_.Message(); + } + + inline void Reset() { try_catch_.Reset(); } + + inline void SetVerbose(bool value) { try_catch_.SetVerbose(value); } + + inline void SetCaptureMessage(bool value) { + try_catch_.SetCaptureMessage(value); + } +}; + +//============ ================================================================= + +/* node 0.12 */ +#if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION + inline + void SetCounterFunction(v8::CounterLookupCallback cb) { + v8::Isolate::GetCurrent()->SetCounterFunction(cb); + } + + inline + void SetCreateHistogramFunction(v8::CreateHistogramCallback cb) { + v8::Isolate::GetCurrent()->SetCreateHistogramFunction(cb); + } + + inline + void SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) { + v8::Isolate::GetCurrent()->SetAddHistogramSampleFunction(cb); + } + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + inline bool IdleNotification(int idle_time_in_ms) { + return v8::Isolate::GetCurrent()->IdleNotificationDeadline( + idle_time_in_ms * 0.001); + } +# else + inline bool IdleNotification(int idle_time_in_ms) { + return v8::Isolate::GetCurrent()->IdleNotification(idle_time_in_ms); + } +#endif + + inline void LowMemoryNotification() { + v8::Isolate::GetCurrent()->LowMemoryNotification(); + } + + inline void ContextDisposedNotification() { + v8::Isolate::GetCurrent()->ContextDisposedNotification(); + } +#else + inline + void SetCounterFunction(v8::CounterLookupCallback cb) { + v8::V8::SetCounterFunction(cb); + } + + inline + void SetCreateHistogramFunction(v8::CreateHistogramCallback cb) { + v8::V8::SetCreateHistogramFunction(cb); + } + + inline + void SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) { + v8::V8::SetAddHistogramSampleFunction(cb); + } + + inline bool IdleNotification(int idle_time_in_ms) { + return v8::V8::IdleNotification(idle_time_in_ms); + } + + inline void LowMemoryNotification() { + v8::V8::LowMemoryNotification(); + } + + inline void ContextDisposedNotification() { + v8::V8::ContextDisposedNotification(); + } +#endif + +#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) // Node 0.12 + inline v8::Local Undefined() { +# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + EscapableHandleScope scope; + return scope.Escape(New(v8::Undefined(v8::Isolate::GetCurrent()))); +# else + return v8::Undefined(v8::Isolate::GetCurrent()); +# endif + } + + inline v8::Local Null() { +# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + EscapableHandleScope scope; + return scope.Escape(New(v8::Null(v8::Isolate::GetCurrent()))); +# else + return v8::Null(v8::Isolate::GetCurrent()); +# endif + } + + inline v8::Local True() { +# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + EscapableHandleScope scope; + return scope.Escape(New(v8::True(v8::Isolate::GetCurrent()))); +# else + return v8::True(v8::Isolate::GetCurrent()); +# endif + } + + inline v8::Local False() { +# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + EscapableHandleScope scope; + return scope.Escape(New(v8::False(v8::Isolate::GetCurrent()))); +# else + return v8::False(v8::Isolate::GetCurrent()); +# endif + } + + inline v8::Local EmptyString() { + return v8::String::Empty(v8::Isolate::GetCurrent()); + } + + inline int AdjustExternalMemory(int bc) { + return static_cast( + v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(bc)); + } + + inline void SetTemplate( + v8::Local templ + , const char *name + , v8::Local value) { + templ->Set(v8::Isolate::GetCurrent(), name, value); + } + + inline void SetTemplate( + v8::Local templ + , v8::Local name + , v8::Local value + , v8::PropertyAttribute attributes) { + templ->Set(name, value, attributes); + } + + inline v8::Local GetCurrentContext() { + return v8::Isolate::GetCurrent()->GetCurrentContext(); + } + + inline void* GetInternalFieldPointer( + v8::Local object + , int index) { + return object->GetAlignedPointerFromInternalField(index); + } + + inline void SetInternalFieldPointer( + v8::Local object + , int index + , void* value) { + object->SetAlignedPointerInInternalField(index, value); + } + +# define NAN_GC_CALLBACK(name) \ + void name(v8::Isolate *isolate, v8::GCType type, v8::GCCallbackFlags flags) + +#if NODE_MODULE_VERSION <= NODE_4_0_MODULE_VERSION + typedef v8::Isolate::GCEpilogueCallback GCEpilogueCallback; + typedef v8::Isolate::GCPrologueCallback GCPrologueCallback; +#else + typedef v8::Isolate::GCCallback GCEpilogueCallback; + typedef v8::Isolate::GCCallback GCPrologueCallback; +#endif + + inline void AddGCEpilogueCallback( + GCEpilogueCallback callback + , v8::GCType gc_type_filter = v8::kGCTypeAll) { + v8::Isolate::GetCurrent()->AddGCEpilogueCallback(callback, gc_type_filter); + } + + inline void RemoveGCEpilogueCallback( + GCEpilogueCallback callback) { + v8::Isolate::GetCurrent()->RemoveGCEpilogueCallback(callback); + } + + inline void AddGCPrologueCallback( + GCPrologueCallback callback + , v8::GCType gc_type_filter = v8::kGCTypeAll) { + v8::Isolate::GetCurrent()->AddGCPrologueCallback(callback, gc_type_filter); + } + + inline void RemoveGCPrologueCallback( + GCPrologueCallback callback) { + v8::Isolate::GetCurrent()->RemoveGCPrologueCallback(callback); + } + + inline void GetHeapStatistics( + v8::HeapStatistics *heap_statistics) { + v8::Isolate::GetCurrent()->GetHeapStatistics(heap_statistics); + } + +# define X(NAME) \ + inline v8::Local NAME(const char *msg) { \ + EscapableHandleScope scope; \ + return scope.Escape(v8::Exception::NAME(New(msg).ToLocalChecked())); \ + } \ + \ + inline \ + v8::Local NAME(v8::Local msg) { \ + return v8::Exception::NAME(msg); \ + } \ + \ + inline void Throw ## NAME(const char *msg) { \ + HandleScope scope; \ + v8::Isolate::GetCurrent()->ThrowException( \ + v8::Exception::NAME(New(msg).ToLocalChecked())); \ + } \ + \ + inline void Throw ## NAME(v8::Local msg) { \ + HandleScope scope; \ + v8::Isolate::GetCurrent()->ThrowException( \ + v8::Exception::NAME(msg)); \ + } + + X(Error) + X(RangeError) + X(ReferenceError) + X(SyntaxError) + X(TypeError) + +# undef X + + inline void ThrowError(v8::Local error) { + v8::Isolate::GetCurrent()->ThrowException(error); + } + + inline MaybeLocal NewBuffer( + char *data + , size_t length +#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION + , node::Buffer::FreeCallback callback +#else + , node::smalloc::FreeCallback callback +#endif + , void *hint + ) { + // arbitrary buffer lengths requires + // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION + assert(length <= imp::kMaxLength && "too large buffer"); +#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION + return node::Buffer::New( + v8::Isolate::GetCurrent(), data, length, callback, hint); +#else + return node::Buffer::New(v8::Isolate::GetCurrent(), data, length, callback, + hint); +#endif + } + + inline MaybeLocal CopyBuffer( + const char *data + , uint32_t size + ) { + // arbitrary buffer lengths requires + // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION + assert(size <= imp::kMaxLength && "too large buffer"); +#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION + return node::Buffer::Copy( + v8::Isolate::GetCurrent(), data, size); +#else + return node::Buffer::New(v8::Isolate::GetCurrent(), data, size); +#endif + } + + inline MaybeLocal NewBuffer(uint32_t size) { + // arbitrary buffer lengths requires + // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION + assert(size <= imp::kMaxLength && "too large buffer"); +#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION + return node::Buffer::New( + v8::Isolate::GetCurrent(), size); +#else + return node::Buffer::New(v8::Isolate::GetCurrent(), size); +#endif + } + + inline MaybeLocal NewBuffer( + char* data + , uint32_t size + ) { + // arbitrary buffer lengths requires + // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION + assert(size <= imp::kMaxLength && "too large buffer"); +#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION + return node::Buffer::New(v8::Isolate::GetCurrent(), data, size); +#else + return node::Buffer::Use(v8::Isolate::GetCurrent(), data, size); +#endif + } + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + inline MaybeLocal + NewOneByteString(const uint8_t * value, int length = -1) { + return v8::String::NewFromOneByte(v8::Isolate::GetCurrent(), value, + v8::NewStringType::kNormal, length); + } + + inline MaybeLocal CompileScript( + v8::Local s + , const v8::ScriptOrigin& origin + ) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + v8::ScriptCompiler::Source source(s, origin); + return scope.Escape( + v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &source) + .FromMaybe(v8::Local())); + } + + inline MaybeLocal CompileScript( + v8::Local s + ) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + v8::ScriptCompiler::Source source(s); + return scope.Escape( + v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &source) + .FromMaybe(v8::Local())); + } + + inline MaybeLocal RunScript( + v8::Local script + ) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(script->BindToCurrentContext() + ->Run(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); + } + + inline MaybeLocal RunScript( + v8::Local script + ) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(script->Run(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); + } +#else + inline MaybeLocal + NewOneByteString(const uint8_t * value, int length = -1) { + return v8::String::NewFromOneByte(v8::Isolate::GetCurrent(), value, + v8::String::kNormalString, length); + } + + inline MaybeLocal CompileScript( + v8::Local s + , const v8::ScriptOrigin& origin + ) { + v8::ScriptCompiler::Source source(s, origin); + return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source); + } + + inline MaybeLocal CompileScript( + v8::Local s + ) { + v8::ScriptCompiler::Source source(s); + return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source); + } + + inline MaybeLocal RunScript( + v8::Local script + ) { + EscapableHandleScope scope; + return scope.Escape(script->BindToCurrentContext()->Run()); + } + + inline MaybeLocal RunScript( + v8::Local script + ) { + return script->Run(); + } +#endif + + inline v8::Local MakeCallback( + v8::Local target + , v8::Local func + , int argc + , v8::Local* argv) { +#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + EscapableHandleScope scope; + return scope.Escape(New(node::MakeCallback( + v8::Isolate::GetCurrent(), target, func, argc, argv))); +#else + return node::MakeCallback( + v8::Isolate::GetCurrent(), target, func, argc, argv); +#endif + } + + inline v8::Local MakeCallback( + v8::Local target + , v8::Local symbol + , int argc + , v8::Local* argv) { +#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + EscapableHandleScope scope; + return scope.Escape(New(node::MakeCallback( + v8::Isolate::GetCurrent(), target, symbol, argc, argv))); +#else + return node::MakeCallback( + v8::Isolate::GetCurrent(), target, symbol, argc, argv); +#endif + } + + inline v8::Local MakeCallback( + v8::Local target + , const char* method + , int argc + , v8::Local* argv) { +#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + EscapableHandleScope scope; + return scope.Escape(New(node::MakeCallback( + v8::Isolate::GetCurrent(), target, method, argc, argv))); +#else + return node::MakeCallback( + v8::Isolate::GetCurrent(), target, method, argc, argv); +#endif + } + + inline void FatalException(const TryCatch& try_catch) { + node::FatalException(v8::Isolate::GetCurrent(), try_catch.try_catch_); + } + + inline v8::Local ErrnoException( + int errorno + , const char* syscall = NULL + , const char* message = NULL + , const char* path = NULL) { + return node::ErrnoException(v8::Isolate::GetCurrent(), errorno, syscall, + message, path); + } + + NAN_DEPRECATED inline v8::Local NanErrnoException( + int errorno + , const char* syscall = NULL + , const char* message = NULL + , const char* path = NULL) { + return ErrnoException(errorno, syscall, message, path); + } + + template + inline void SetIsolateData( + v8::Isolate *isolate + , T *data + ) { + isolate->SetData(0, data); + } + + template + inline T *GetIsolateData( + v8::Isolate *isolate + ) { + return static_cast(isolate->GetData(0)); + } + +class Utf8String { + public: + inline explicit Utf8String(v8::Local from) : + length_(0), str_(str_st_) { + HandleScope scope; + if (!from.IsEmpty()) { + v8::Local string = from->ToString(); + if (!string.IsEmpty()) { + size_t len = 3 * string->Length() + 1; + assert(len <= INT_MAX); + if (len > sizeof (str_st_)) { + str_ = static_cast(malloc(len)); + assert(str_ != 0); + } + const int flags = + v8::String::NO_NULL_TERMINATION | imp::kReplaceInvalidUtf8; + length_ = string->WriteUtf8(str_, static_cast(len), 0, flags); + str_[length_] = '\0'; + } + } + } + + inline int length() const { + return length_; + } + + inline char* operator*() { return str_; } + inline const char* operator*() const { return str_; } + + inline ~Utf8String() { + if (str_ != str_st_) { + free(str_); + } + } + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(Utf8String) + + int length_; + char *str_; + char str_st_[1024]; +}; + +#else // Node 0.8 and 0.10 + inline v8::Local Undefined() { + EscapableHandleScope scope; + return scope.Escape(New(v8::Undefined())); + } + + inline v8::Local Null() { + EscapableHandleScope scope; + return scope.Escape(New(v8::Null())); + } + + inline v8::Local True() { + EscapableHandleScope scope; + return scope.Escape(New(v8::True())); + } + + inline v8::Local False() { + EscapableHandleScope scope; + return scope.Escape(New(v8::False())); + } + + inline v8::Local EmptyString() { + return v8::String::Empty(); + } + + inline int AdjustExternalMemory(int bc) { + return static_cast(v8::V8::AdjustAmountOfExternalAllocatedMemory(bc)); + } + + inline void SetTemplate( + v8::Local templ + , const char *name + , v8::Local value) { + templ->Set(name, value); + } + + inline void SetTemplate( + v8::Local templ + , v8::Local name + , v8::Local value + , v8::PropertyAttribute attributes) { + templ->Set(name, value, attributes); + } + + inline v8::Local GetCurrentContext() { + return v8::Context::GetCurrent(); + } + + inline void* GetInternalFieldPointer( + v8::Local object + , int index) { + return object->GetPointerFromInternalField(index); + } + + inline void SetInternalFieldPointer( + v8::Local object + , int index + , void* value) { + object->SetPointerInInternalField(index, value); + } + +# define NAN_GC_CALLBACK(name) \ + void name(v8::GCType type, v8::GCCallbackFlags flags) + + inline void AddGCEpilogueCallback( + v8::GCEpilogueCallback callback + , v8::GCType gc_type_filter = v8::kGCTypeAll) { + v8::V8::AddGCEpilogueCallback(callback, gc_type_filter); + } + inline void RemoveGCEpilogueCallback( + v8::GCEpilogueCallback callback) { + v8::V8::RemoveGCEpilogueCallback(callback); + } + inline void AddGCPrologueCallback( + v8::GCPrologueCallback callback + , v8::GCType gc_type_filter = v8::kGCTypeAll) { + v8::V8::AddGCPrologueCallback(callback, gc_type_filter); + } + inline void RemoveGCPrologueCallback( + v8::GCPrologueCallback callback) { + v8::V8::RemoveGCPrologueCallback(callback); + } + inline void GetHeapStatistics( + v8::HeapStatistics *heap_statistics) { + v8::V8::GetHeapStatistics(heap_statistics); + } + +# define X(NAME) \ + inline v8::Local NAME(const char *msg) { \ + EscapableHandleScope scope; \ + return scope.Escape(v8::Exception::NAME(New(msg).ToLocalChecked())); \ + } \ + \ + inline \ + v8::Local NAME(v8::Local msg) { \ + return v8::Exception::NAME(msg); \ + } \ + \ + inline void Throw ## NAME(const char *msg) { \ + HandleScope scope; \ + v8::ThrowException(v8::Exception::NAME(New(msg).ToLocalChecked())); \ + } \ + \ + inline \ + void Throw ## NAME(v8::Local errmsg) { \ + HandleScope scope; \ + v8::ThrowException(v8::Exception::NAME(errmsg)); \ + } + + X(Error) + X(RangeError) + X(ReferenceError) + X(SyntaxError) + X(TypeError) + +# undef X + + inline void ThrowError(v8::Local error) { + v8::ThrowException(error); + } + + inline MaybeLocal NewBuffer( + char *data + , size_t length + , node::Buffer::free_callback callback + , void *hint + ) { + EscapableHandleScope scope; + // arbitrary buffer lengths requires + // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION + assert(length <= imp::kMaxLength && "too large buffer"); + return scope.Escape( + New(node::Buffer::New(data, length, callback, hint)->handle_)); + } + + inline MaybeLocal CopyBuffer( + const char *data + , uint32_t size + ) { + EscapableHandleScope scope; + // arbitrary buffer lengths requires + // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION + assert(size <= imp::kMaxLength && "too large buffer"); +#if NODE_MODULE_VERSION >= NODE_0_10_MODULE_VERSION + return scope.Escape(New(node::Buffer::New(data, size)->handle_)); +#else + return scope.Escape( + New(node::Buffer::New(const_cast(data), size)->handle_)); +#endif + } + + inline MaybeLocal NewBuffer(uint32_t size) { + // arbitrary buffer lengths requires + // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION + EscapableHandleScope scope; + assert(size <= imp::kMaxLength && "too large buffer"); + return scope.Escape(New(node::Buffer::New(size)->handle_)); + } + + inline void FreeData(char *data, void *hint) { + (void) hint; // unused + delete[] data; + } + + inline MaybeLocal NewBuffer( + char* data + , uint32_t size + ) { + EscapableHandleScope scope; + // arbitrary buffer lengths requires + // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION + assert(size <= imp::kMaxLength && "too large buffer"); + return scope.Escape( + New(node::Buffer::New(data, size, FreeData, NULL)->handle_)); + } + +namespace imp { +inline void +widenString(std::vector *ws, const uint8_t *s, int l) { + size_t len = static_cast(l); + if (l < 0) { + len = strlen(reinterpret_cast(s)); + } + assert(len <= INT_MAX && "string too long"); + ws->resize(len); + std::copy(s, s + len, ws->begin()); // NOLINT(build/include_what_you_use) +} +} // end of namespace imp + + inline MaybeLocal + NewOneByteString(const uint8_t * value, int length = -1) { + std::vector wideString; // NOLINT(build/include_what_you_use) + imp::widenString(&wideString, value, length); + return v8::String::New(wideString.data(), + static_cast(wideString.size())); + } + + inline MaybeLocal CompileScript( + v8::Local s + , const v8::ScriptOrigin& origin + ) { + return v8::Script::Compile(s, const_cast(&origin)); + } + + inline MaybeLocal CompileScript( + v8::Local s + ) { + return v8::Script::Compile(s); + } + + inline + MaybeLocal RunScript(v8::Local script) { + return script->Run(); + } + + inline v8::Local MakeCallback( + v8::Local target + , v8::Local func + , int argc + , v8::Local* argv) { + v8::HandleScope scope; + return scope.Close(New(node::MakeCallback(target, func, argc, argv))); + } + + inline v8::Local MakeCallback( + v8::Local target + , v8::Local symbol + , int argc + , v8::Local* argv) { + v8::HandleScope scope; + return scope.Close(New(node::MakeCallback(target, symbol, argc, argv))); + } + + inline v8::Local MakeCallback( + v8::Local target + , const char* method + , int argc + , v8::Local* argv) { + v8::HandleScope scope; + return scope.Close(New(node::MakeCallback(target, method, argc, argv))); + } + + inline void FatalException(const TryCatch& try_catch) { + node::FatalException(const_cast(try_catch.try_catch_)); + } + + inline v8::Local ErrnoException( + int errorno + , const char* syscall = NULL + , const char* message = NULL + , const char* path = NULL) { + return node::ErrnoException(errorno, syscall, message, path); + } + + NAN_DEPRECATED inline v8::Local NanErrnoException( + int errorno + , const char* syscall = NULL + , const char* message = NULL + , const char* path = NULL) { + return ErrnoException(errorno, syscall, message, path); + } + + + template + inline void SetIsolateData( + v8::Isolate *isolate + , T *data + ) { + isolate->SetData(data); + } + + template + inline T *GetIsolateData( + v8::Isolate *isolate + ) { + return static_cast(isolate->GetData()); + } + +class Utf8String { + public: + inline explicit Utf8String(v8::Local from) : + length_(0), str_(str_st_) { + v8::HandleScope scope; + if (!from.IsEmpty()) { + v8::Local string = from->ToString(); + if (!string.IsEmpty()) { + size_t len = 3 * string->Length() + 1; + assert(len <= INT_MAX); + if (len > sizeof (str_st_)) { + str_ = static_cast(malloc(len)); + assert(str_ != 0); + } + const int flags = + v8::String::NO_NULL_TERMINATION | imp::kReplaceInvalidUtf8; + length_ = string->WriteUtf8(str_, static_cast(len), 0, flags); + str_[length_] = '\0'; + } + } + } + + inline int length() const { + return length_; + } + + inline char* operator*() { return str_; } + inline const char* operator*() const { return str_; } + + inline ~Utf8String() { + if (str_ != str_st_) { + free(str_); + } + } + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(Utf8String) + + int length_; + char *str_; + char str_st_[1024]; +}; + +#endif // NODE_MODULE_VERSION + +typedef void (*FreeCallback)(char *data, void *hint); + +typedef const FunctionCallbackInfo& NAN_METHOD_ARGS_TYPE; +typedef void NAN_METHOD_RETURN_TYPE; + +typedef const PropertyCallbackInfo& NAN_GETTER_ARGS_TYPE; +typedef void NAN_GETTER_RETURN_TYPE; + +typedef const PropertyCallbackInfo& NAN_SETTER_ARGS_TYPE; +typedef void NAN_SETTER_RETURN_TYPE; + +typedef const PropertyCallbackInfo& + NAN_PROPERTY_GETTER_ARGS_TYPE; +typedef void NAN_PROPERTY_GETTER_RETURN_TYPE; + +typedef const PropertyCallbackInfo& + NAN_PROPERTY_SETTER_ARGS_TYPE; +typedef void NAN_PROPERTY_SETTER_RETURN_TYPE; + +typedef const PropertyCallbackInfo& + NAN_PROPERTY_ENUMERATOR_ARGS_TYPE; +typedef void NAN_PROPERTY_ENUMERATOR_RETURN_TYPE; + +typedef const PropertyCallbackInfo& + NAN_PROPERTY_DELETER_ARGS_TYPE; +typedef void NAN_PROPERTY_DELETER_RETURN_TYPE; + +typedef const PropertyCallbackInfo& + NAN_PROPERTY_QUERY_ARGS_TYPE; +typedef void NAN_PROPERTY_QUERY_RETURN_TYPE; + +typedef const PropertyCallbackInfo& NAN_INDEX_GETTER_ARGS_TYPE; +typedef void NAN_INDEX_GETTER_RETURN_TYPE; + +typedef const PropertyCallbackInfo& NAN_INDEX_SETTER_ARGS_TYPE; +typedef void NAN_INDEX_SETTER_RETURN_TYPE; + +typedef const PropertyCallbackInfo& + NAN_INDEX_ENUMERATOR_ARGS_TYPE; +typedef void NAN_INDEX_ENUMERATOR_RETURN_TYPE; + +typedef const PropertyCallbackInfo& + NAN_INDEX_DELETER_ARGS_TYPE; +typedef void NAN_INDEX_DELETER_RETURN_TYPE; + +typedef const PropertyCallbackInfo& + NAN_INDEX_QUERY_ARGS_TYPE; +typedef void NAN_INDEX_QUERY_RETURN_TYPE; + +#define NAN_METHOD(name) \ + Nan::NAN_METHOD_RETURN_TYPE name(Nan::NAN_METHOD_ARGS_TYPE info) +#define NAN_GETTER(name) \ + Nan::NAN_GETTER_RETURN_TYPE name( \ + v8::Local property \ + , Nan::NAN_GETTER_ARGS_TYPE info) +#define NAN_SETTER(name) \ + Nan::NAN_SETTER_RETURN_TYPE name( \ + v8::Local property \ + , v8::Local value \ + , Nan::NAN_SETTER_ARGS_TYPE info) +#define NAN_PROPERTY_GETTER(name) \ + Nan::NAN_PROPERTY_GETTER_RETURN_TYPE name( \ + v8::Local property \ + , Nan::NAN_PROPERTY_GETTER_ARGS_TYPE info) +#define NAN_PROPERTY_SETTER(name) \ + Nan::NAN_PROPERTY_SETTER_RETURN_TYPE name( \ + v8::Local property \ + , v8::Local value \ + , Nan::NAN_PROPERTY_SETTER_ARGS_TYPE info) +#define NAN_PROPERTY_ENUMERATOR(name) \ + Nan::NAN_PROPERTY_ENUMERATOR_RETURN_TYPE name( \ + Nan::NAN_PROPERTY_ENUMERATOR_ARGS_TYPE info) +#define NAN_PROPERTY_DELETER(name) \ + Nan::NAN_PROPERTY_DELETER_RETURN_TYPE name( \ + v8::Local property \ + , Nan::NAN_PROPERTY_DELETER_ARGS_TYPE info) +#define NAN_PROPERTY_QUERY(name) \ + Nan::NAN_PROPERTY_QUERY_RETURN_TYPE name( \ + v8::Local property \ + , Nan::NAN_PROPERTY_QUERY_ARGS_TYPE info) +# define NAN_INDEX_GETTER(name) \ + Nan::NAN_INDEX_GETTER_RETURN_TYPE name( \ + uint32_t index \ + , Nan::NAN_INDEX_GETTER_ARGS_TYPE info) +#define NAN_INDEX_SETTER(name) \ + Nan::NAN_INDEX_SETTER_RETURN_TYPE name( \ + uint32_t index \ + , v8::Local value \ + , Nan::NAN_INDEX_SETTER_ARGS_TYPE info) +#define NAN_INDEX_ENUMERATOR(name) \ + Nan::NAN_INDEX_ENUMERATOR_RETURN_TYPE \ + name(Nan::NAN_INDEX_ENUMERATOR_ARGS_TYPE info) +#define NAN_INDEX_DELETER(name) \ + Nan::NAN_INDEX_DELETER_RETURN_TYPE name( \ + uint32_t index \ + , Nan::NAN_INDEX_DELETER_ARGS_TYPE info) +#define NAN_INDEX_QUERY(name) \ + Nan::NAN_INDEX_QUERY_RETURN_TYPE name( \ + uint32_t index \ + , Nan::NAN_INDEX_QUERY_ARGS_TYPE info) + +class Callback { + public: + Callback() {} + + explicit Callback(const v8::Local &fn) : handle_(fn) {} + + ~Callback() { + handle_.Reset(); + } + + bool operator==(const Callback &other) const { + return handle_ == other.handle_; + } + + bool operator!=(const Callback &other) const { + return !operator==(other); + } + + inline + v8::Local operator*() const { return GetFunction(); } + + inline v8::Local operator()( + v8::Local target + , int argc = 0 + , v8::Local argv[] = 0) const { + return this->Call(target, argc, argv); + } + + inline v8::Local operator()( + int argc = 0 + , v8::Local argv[] = 0) const { + return this->Call(argc, argv); + } + + // TODO(kkoopa): remove + inline void SetFunction(const v8::Local &fn) { + Reset(fn); + } + + inline void Reset(const v8::Local &fn) { + handle_.Reset(fn); + } + + inline void Reset() { + handle_.Reset(); + } + + inline v8::Local GetFunction() const { + return New(handle_); + } + + inline bool IsEmpty() const { + return handle_.IsEmpty(); + } + + inline v8::Local + Call(v8::Local target + , int argc + , v8::Local argv[]) const { +#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + return Call_(isolate, target, argc, argv); +#else + return Call_(target, argc, argv); +#endif + } + + inline v8::Local + Call(int argc, v8::Local argv[]) const { +#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape( + Call_(isolate, isolate->GetCurrentContext()->Global(), argc, argv)); +#else + v8::HandleScope scope; + return scope.Close(Call_(v8::Context::GetCurrent()->Global(), argc, argv)); +#endif + } + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(Callback) + Persistent handle_; + +#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) + v8::Local Call_(v8::Isolate *isolate + , v8::Local target + , int argc + , v8::Local argv[]) const { + EscapableHandleScope scope; + + v8::Local callback = New(handle_); +# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + return scope.Escape(New(node::MakeCallback( + isolate + , target + , callback + , argc + , argv + ))); +# else + return scope.Escape(node::MakeCallback( + isolate + , target + , callback + , argc + , argv + )); +# endif + } +#else + v8::Local Call_(v8::Local target + , int argc + , v8::Local argv[]) const { + EscapableHandleScope scope; + + v8::Local callback = New(handle_); + return scope.Escape(New(node::MakeCallback( + target + , callback + , argc + , argv + ))); + } +#endif +}; + +/* abstract */ class AsyncWorker { + public: + explicit AsyncWorker(Callback *callback_) + : callback(callback_), errmsg_(NULL) { + request.data = this; + + HandleScope scope; + v8::Local obj = New(); + persistentHandle.Reset(obj); + } + + virtual ~AsyncWorker() { + HandleScope scope; + + if (!persistentHandle.IsEmpty()) + persistentHandle.Reset(); + delete callback; + delete[] errmsg_; + } + + virtual void WorkComplete() { + HandleScope scope; + + if (errmsg_ == NULL) + HandleOKCallback(); + else + HandleErrorCallback(); + delete callback; + callback = NULL; + } + + inline void SaveToPersistent( + const char *key, const v8::Local &value) { + HandleScope scope; + New(persistentHandle)->Set(New(key).ToLocalChecked(), value); + } + + inline void SaveToPersistent( + const v8::Local &key, const v8::Local &value) { + HandleScope scope; + New(persistentHandle)->Set(key, value); + } + + inline void SaveToPersistent( + uint32_t index, const v8::Local &value) { + HandleScope scope; + New(persistentHandle)->Set(index, value); + } + + inline v8::Local GetFromPersistent(const char *key) const { + EscapableHandleScope scope; + return scope.Escape( + New(persistentHandle)->Get(New(key).ToLocalChecked())); + } + + inline v8::Local + GetFromPersistent(const v8::Local &key) const { + EscapableHandleScope scope; + return scope.Escape(New(persistentHandle)->Get(key)); + } + + inline v8::Local GetFromPersistent(uint32_t index) const { + EscapableHandleScope scope; + return scope.Escape(New(persistentHandle)->Get(index)); + } + + virtual void Execute() = 0; + + uv_work_t request; + + virtual void Destroy() { + delete this; + } + + protected: + Persistent persistentHandle; + Callback *callback; + + virtual void HandleOKCallback() { + HandleScope scope; + + callback->Call(0, NULL); + } + + virtual void HandleErrorCallback() { + HandleScope scope; + + v8::Local argv[] = { + v8::Exception::Error(New(ErrorMessage()).ToLocalChecked()) + }; + callback->Call(1, argv); + } + + void SetErrorMessage(const char *msg) { + delete[] errmsg_; + + size_t size = strlen(msg) + 1; + errmsg_ = new char[size]; + memcpy(errmsg_, msg, size); + } + + const char* ErrorMessage() const { + return errmsg_; + } + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(AsyncWorker) + char *errmsg_; +}; + + +template +/* abstract */ class AsyncProgressWorkerBase : public AsyncWorker { + public: + explicit AsyncProgressWorkerBase(Callback *callback_) + : AsyncWorker(callback_), asyncdata_(NULL), asyncsize_(0) { + async = new uv_async_t; + uv_async_init( + uv_default_loop() + , async + , AsyncProgress_ + ); + async->data = this; + + uv_mutex_init(&async_lock); + } + + virtual ~AsyncProgressWorkerBase() { + uv_mutex_destroy(&async_lock); + + delete[] asyncdata_; + } + + void WorkProgress() { + uv_mutex_lock(&async_lock); + T *data = asyncdata_; + size_t size = asyncsize_; + asyncdata_ = NULL; + uv_mutex_unlock(&async_lock); + + // Don't send progress events after we've already completed. + if (callback) { + HandleProgressCallback(data, size); + } + delete[] data; + } + + class ExecutionProgress { + friend class AsyncProgressWorkerBase; + public: + void Signal() const { + uv_async_send(that_->async); + } + + void Send(const T* data, size_t count) const { + that_->SendProgress_(data, count); + } + + private: + explicit ExecutionProgress(AsyncProgressWorkerBase *that) : that_(that) {} + NAN_DISALLOW_ASSIGN_COPY_MOVE(ExecutionProgress) + AsyncProgressWorkerBase* const that_; + }; + + virtual void Execute(const ExecutionProgress& progress) = 0; + virtual void HandleProgressCallback(const T *data, size_t size) = 0; + + virtual void Destroy() { + uv_close(reinterpret_cast(async), AsyncClose_); + } + + private: + void Execute() /*final override*/ { + ExecutionProgress progress(this); + Execute(progress); + } + + void SendProgress_(const T *data, size_t count) { + T *new_data = new T[count]; + { + T *it = new_data; + std::copy(data, data + count, it); + } + + uv_mutex_lock(&async_lock); + T *old_data = asyncdata_; + asyncdata_ = new_data; + asyncsize_ = count; + uv_mutex_unlock(&async_lock); + + delete[] old_data; + uv_async_send(async); + } + + inline static NAUV_WORK_CB(AsyncProgress_) { + AsyncProgressWorkerBase *worker = + static_cast(async->data); + worker->WorkProgress(); + } + + inline static void AsyncClose_(uv_handle_t* handle) { + AsyncProgressWorkerBase *worker = + static_cast(handle->data); + delete reinterpret_cast(handle); + delete worker; + } + + uv_async_t *async; + uv_mutex_t async_lock; + T *asyncdata_; + size_t asyncsize_; +}; + +// This ensures compatibility to the previous un-templated AsyncProgressWorker +// class definition. +typedef AsyncProgressWorkerBase AsyncProgressWorker; + +inline void AsyncExecute (uv_work_t* req) { + AsyncWorker *worker = static_cast(req->data); + worker->Execute(); +} + +inline void AsyncExecuteComplete (uv_work_t* req) { + AsyncWorker* worker = static_cast(req->data); + worker->WorkComplete(); + worker->Destroy(); +} + +inline void AsyncQueueWorker (AsyncWorker* worker) { + uv_queue_work( + uv_default_loop() + , &worker->request + , AsyncExecute + , reinterpret_cast(AsyncExecuteComplete) + ); +} + +namespace imp { + +inline +ExternalOneByteStringResource const* +GetExternalResource(v8::Local str) { +#if NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION + return str->GetExternalAsciiStringResource(); +#else + return str->GetExternalOneByteStringResource(); +#endif +} + +inline +bool +IsExternal(v8::Local str) { +#if NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION + return str->IsExternalAscii(); +#else + return str->IsExternalOneByte(); +#endif +} + +} // end of namespace imp + +enum Encoding {ASCII, UTF8, BASE64, UCS2, BINARY, HEX, BUFFER}; + +#if NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION +# include "nan_string_bytes.h" // NOLINT(build/include) +#endif + +inline v8::Local Encode( + const void *buf, size_t len, enum Encoding encoding = BINARY) { +#if (NODE_MODULE_VERSION >= ATOM_0_21_MODULE_VERSION) + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + node::encoding node_enc = static_cast(encoding); + + if (encoding == UCS2) { + return node::Encode( + isolate + , reinterpret_cast(buf) + , len / 2); + } else { + return node::Encode( + isolate + , reinterpret_cast(buf) + , len + , node_enc); + } +#elif (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) + return node::Encode( + v8::Isolate::GetCurrent() + , buf, len + , static_cast(encoding)); +#else +# if NODE_MODULE_VERSION >= NODE_0_10_MODULE_VERSION + return node::Encode(buf, len, static_cast(encoding)); +# else + return imp::Encode(reinterpret_cast(buf), len, encoding); +# endif +#endif +} + +inline ssize_t DecodeBytes( + v8::Local val, enum Encoding encoding = BINARY) { +#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) + return node::DecodeBytes( + v8::Isolate::GetCurrent() + , val + , static_cast(encoding)); +#else +# if (NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION) + if (encoding == BUFFER) { + return node::DecodeBytes(val, node::BINARY); + } +# endif + return node::DecodeBytes(val, static_cast(encoding)); +#endif +} + +inline ssize_t DecodeWrite( + char *buf + , size_t len + , v8::Local val + , enum Encoding encoding = BINARY) { +#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) + return node::DecodeWrite( + v8::Isolate::GetCurrent() + , buf + , len + , val + , static_cast(encoding)); +#else +# if (NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION) + if (encoding == BUFFER) { + return node::DecodeWrite(buf, len, val, node::BINARY); + } +# endif + return node::DecodeWrite( + buf + , len + , val + , static_cast(encoding)); +#endif +} + +inline void SetPrototypeTemplate( + v8::Local templ + , const char *name + , v8::Local value +) { + HandleScope scope; + SetTemplate(templ->PrototypeTemplate(), name, value); +} + +inline void SetPrototypeTemplate( + v8::Local templ + , v8::Local name + , v8::Local value + , v8::PropertyAttribute attributes +) { + HandleScope scope; + SetTemplate(templ->PrototypeTemplate(), name, value, attributes); +} + +inline void SetInstanceTemplate( + v8::Local templ + , const char *name + , v8::Local value +) { + HandleScope scope; + SetTemplate(templ->InstanceTemplate(), name, value); +} + +inline void SetInstanceTemplate( + v8::Local templ + , v8::Local name + , v8::Local value + , v8::PropertyAttribute attributes +) { + HandleScope scope; + SetTemplate(templ->InstanceTemplate(), name, value, attributes); +} + +namespace imp { + +// Note(@agnat): Helper to distinguish different receiver types. The first +// version deals with receivers derived from v8::Template. The second version +// handles everything else. The final argument only serves as discriminator and +// is unused. +template +inline +void +SetMethodAux(T recv, + v8::Local name, + v8::Local tpl, + v8::Template *) { + recv->Set(name, tpl); +} + +template +inline +void +SetMethodAux(T recv, + v8::Local name, + v8::Local tpl, + ...) { + recv->Set(name, GetFunction(tpl).ToLocalChecked()); +} + +} // end of namespace imp + +template class HandleType> +inline void SetMethod( + HandleType recv + , const char *name + , FunctionCallback callback) { + HandleScope scope; + v8::Local t = New(callback); + v8::Local fn_name = New(name).ToLocalChecked(); + t->SetClassName(fn_name); + // Note(@agnat): Pass an empty T* as discriminator. See note on + // SetMethodAux(...) above + imp::SetMethodAux(recv, fn_name, t, static_cast(0)); +} + +inline void SetPrototypeMethod( + v8::Local recv + , const char* name, FunctionCallback callback) { + HandleScope scope; + v8::Local t = New( + callback + , v8::Local() + , New(recv)); + v8::Local fn_name = New(name).ToLocalChecked(); + recv->PrototypeTemplate()->Set(fn_name, t); + t->SetClassName(fn_name); +} + +//=== Accessors and Such ======================================================= + +inline void SetAccessor( + v8::Local tpl + , v8::Local name + , GetterCallback getter + , SetterCallback setter = 0 + , v8::Local data = v8::Local() + , v8::AccessControl settings = v8::DEFAULT + , v8::PropertyAttribute attribute = v8::None + , imp::Sig signature = imp::Sig()) { + HandleScope scope; + + imp::NativeGetter getter_ = + imp::GetterCallbackWrapper; + imp::NativeSetter setter_ = + setter ? imp::SetterCallbackWrapper : 0; + + v8::Local otpl = New(); + otpl->SetInternalFieldCount(imp::kAccessorFieldCount); + v8::Local obj = NewInstance(otpl).ToLocalChecked(); + + obj->SetInternalField( + imp::kGetterIndex + , New(reinterpret_cast(getter))); + + if (setter != 0) { + obj->SetInternalField( + imp::kSetterIndex + , New(reinterpret_cast(setter))); + } + + if (!data.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, data); + } + + tpl->SetAccessor( + name + , getter_ + , setter_ + , obj + , settings + , attribute + , signature); +} + +inline bool SetAccessor( + v8::Local obj + , v8::Local name + , GetterCallback getter + , SetterCallback setter = 0 + , v8::Local data = v8::Local() + , v8::AccessControl settings = v8::DEFAULT + , v8::PropertyAttribute attribute = v8::None) { + HandleScope scope; + + imp::NativeGetter getter_ = + imp::GetterCallbackWrapper; + imp::NativeSetter setter_ = + setter ? imp::SetterCallbackWrapper : 0; + + v8::Local otpl = New(); + otpl->SetInternalFieldCount(imp::kAccessorFieldCount); + v8::Local dataobj = NewInstance(otpl).ToLocalChecked(); + + dataobj->SetInternalField( + imp::kGetterIndex + , New(reinterpret_cast(getter))); + + if (!data.IsEmpty()) { + dataobj->SetInternalField(imp::kDataIndex, data); + } + + if (setter) { + dataobj->SetInternalField( + imp::kSetterIndex + , New(reinterpret_cast(setter))); + } + +#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION) + return obj->SetAccessor( + GetCurrentContext() + , name + , getter_ + , setter_ + , dataobj + , settings + , attribute).FromMaybe(false); +#else + return obj->SetAccessor( + name + , getter_ + , setter_ + , dataobj + , settings + , attribute); +#endif +} + +inline void SetNamedPropertyHandler( + v8::Local tpl + , PropertyGetterCallback getter + , PropertySetterCallback setter = 0 + , PropertyQueryCallback query = 0 + , PropertyDeleterCallback deleter = 0 + , PropertyEnumeratorCallback enumerator = 0 + , v8::Local data = v8::Local()) { + HandleScope scope; + + imp::NativePropertyGetter getter_ = + imp::PropertyGetterCallbackWrapper; + imp::NativePropertySetter setter_ = + setter ? imp::PropertySetterCallbackWrapper : 0; + imp::NativePropertyQuery query_ = + query ? imp::PropertyQueryCallbackWrapper : 0; + imp::NativePropertyDeleter *deleter_ = + deleter ? imp::PropertyDeleterCallbackWrapper : 0; + imp::NativePropertyEnumerator enumerator_ = + enumerator ? imp::PropertyEnumeratorCallbackWrapper : 0; + + v8::Local otpl = New(); + otpl->SetInternalFieldCount(imp::kPropertyFieldCount); + v8::Local obj = NewInstance(otpl).ToLocalChecked(); + obj->SetInternalField( + imp::kPropertyGetterIndex + , New(reinterpret_cast(getter))); + + if (setter) { + obj->SetInternalField( + imp::kPropertySetterIndex + , New(reinterpret_cast(setter))); + } + + if (query) { + obj->SetInternalField( + imp::kPropertyQueryIndex + , New(reinterpret_cast(query))); + } + + if (deleter) { + obj->SetInternalField( + imp::kPropertyDeleterIndex + , New(reinterpret_cast(deleter))); + } + + if (enumerator) { + obj->SetInternalField( + imp::kPropertyEnumeratorIndex + , New(reinterpret_cast(enumerator))); + } + + if (!data.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, data); + } + +#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION + tpl->SetHandler(v8::NamedPropertyHandlerConfiguration( + getter_, setter_, query_, deleter_, enumerator_, obj)); +#else + tpl->SetNamedPropertyHandler( + getter_ + , setter_ + , query_ + , deleter_ + , enumerator_ + , obj); +#endif +} + +inline void SetIndexedPropertyHandler( + v8::Local tpl + , IndexGetterCallback getter + , IndexSetterCallback setter = 0 + , IndexQueryCallback query = 0 + , IndexDeleterCallback deleter = 0 + , IndexEnumeratorCallback enumerator = 0 + , v8::Local data = v8::Local()) { + HandleScope scope; + + imp::NativeIndexGetter getter_ = + imp::IndexGetterCallbackWrapper; + imp::NativeIndexSetter setter_ = + setter ? imp::IndexSetterCallbackWrapper : 0; + imp::NativeIndexQuery query_ = + query ? imp::IndexQueryCallbackWrapper : 0; + imp::NativeIndexDeleter deleter_ = + deleter ? imp::IndexDeleterCallbackWrapper : 0; + imp::NativeIndexEnumerator enumerator_ = + enumerator ? imp::IndexEnumeratorCallbackWrapper : 0; + + v8::Local otpl = New(); + otpl->SetInternalFieldCount(imp::kIndexPropertyFieldCount); + v8::Local obj = NewInstance(otpl).ToLocalChecked(); + obj->SetInternalField( + imp::kIndexPropertyGetterIndex + , New(reinterpret_cast(getter))); + + if (setter) { + obj->SetInternalField( + imp::kIndexPropertySetterIndex + , New(reinterpret_cast(setter))); + } + + if (query) { + obj->SetInternalField( + imp::kIndexPropertyQueryIndex + , New(reinterpret_cast(query))); + } + + if (deleter) { + obj->SetInternalField( + imp::kIndexPropertyDeleterIndex + , New(reinterpret_cast(deleter))); + } + + if (enumerator) { + obj->SetInternalField( + imp::kIndexPropertyEnumeratorIndex + , New(reinterpret_cast(enumerator))); + } + + if (!data.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, data); + } + +#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION + tpl->SetHandler(v8::IndexedPropertyHandlerConfiguration( + getter_, setter_, query_, deleter_, enumerator_, obj)); +#else + tpl->SetIndexedPropertyHandler( + getter_ + , setter_ + , query_ + , deleter_ + , enumerator_ + , obj); +#endif +} + +inline void SetCallHandler( + v8::Local tpl + , FunctionCallback callback + , v8::Local data = v8::Local()) { + HandleScope scope; + + v8::Local otpl = New(); + otpl->SetInternalFieldCount(imp::kFunctionFieldCount); + v8::Local obj = NewInstance(otpl).ToLocalChecked(); + + obj->SetInternalField( + imp::kFunctionIndex + , New(reinterpret_cast(callback))); + + if (!data.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, data); + } + + tpl->SetCallHandler(imp::FunctionCallbackWrapper, obj); +} + + +inline void SetCallAsFunctionHandler( + v8::Local tpl, + FunctionCallback callback, + v8::Local data = v8::Local()) { + HandleScope scope; + + v8::Local otpl = New(); + otpl->SetInternalFieldCount(imp::kFunctionFieldCount); + v8::Local obj = NewInstance(otpl).ToLocalChecked(); + + obj->SetInternalField( + imp::kFunctionIndex + , New(reinterpret_cast(callback))); + + if (!data.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, data); + } + + tpl->SetCallAsFunctionHandler(imp::FunctionCallbackWrapper, obj); +} + +//=== Weak Persistent Handling ================================================= + +#include "nan_weak.h" // NOLINT(build/include) + +//=== ObjectWrap =============================================================== + +#include "nan_object_wrap.h" // NOLINT(build/include) + +//=== HiddenValue/Private ====================================================== + +#include "nan_private.h" // NOLINT(build/include) + +//=== Export ================================================================== + +inline +void +Export(ADDON_REGISTER_FUNCTION_ARGS_TYPE target, const char *name, + FunctionCallback f) { + HandleScope scope; + + Set(target, New(name).ToLocalChecked(), + GetFunction(New(f)).ToLocalChecked()); +} + +//=== Tap Reverse Binding ===================================================== + +struct Tap { + explicit Tap(v8::Local t) : t_() { + HandleScope scope; + + t_.Reset(To(t).ToLocalChecked()); + } + + ~Tap() { t_.Reset(); } // not sure if neccessary + + inline void plan(int i) { + HandleScope scope; + v8::Local arg = New(i); + MakeCallback(New(t_), "plan", 1, &arg); + } + + inline void ok(bool isOk, const char *msg = NULL) { + HandleScope scope; + v8::Local args[2]; + args[0] = New(isOk); + if (msg) args[1] = New(msg).ToLocalChecked(); + MakeCallback(New(t_), "ok", msg ? 2 : 1, args); + } + + inline void pass(const char * msg = NULL) { + HandleScope scope; + v8::Local hmsg; + if (msg) hmsg = New(msg).ToLocalChecked(); + MakeCallback(New(t_), "pass", msg ? 1 : 0, &hmsg); + } + + private: + Persistent t_; +}; + +#define NAN_STRINGIZE2(x) #x +#define NAN_STRINGIZE(x) NAN_STRINGIZE2(x) +#define NAN_TEST_EXPRESSION(expression) \ + ( expression ), __FILE__ ":" NAN_STRINGIZE(__LINE__) ": " #expression + +#define NAN_EXPORT(target, function) Export(target, #function, function) + +#undef TYPE_CHECK + +//=== Generic Maybefication =================================================== + +namespace imp { + +template struct Maybefier; + +template struct Maybefier > { + inline static MaybeLocal convert(v8::Local v) { + return v; + } +}; + +template struct Maybefier > { + inline static MaybeLocal convert(MaybeLocal v) { + return v; + } +}; + +} // end of namespace imp + +template class MaybeMaybe> +inline MaybeLocal +MakeMaybe(MaybeMaybe v) { + return imp::Maybefier >::convert(v); +} + +//=== TypedArrayContents ======================================================= + +#include "nan_typedarray_contents.h" // NOLINT(build/include) + +//=== JSON ===================================================================== + +#include "nan_json.h" // NOLINT(build/include) + +} // end of namespace Nan + +#endif // NAN_H_ diff --git a/deploy/node_modules/nan/nan_callbacks.h b/deploy/node_modules/nan/nan_callbacks.h new file mode 100644 index 0000000..c612cee --- /dev/null +++ b/deploy/node_modules/nan/nan_callbacks.h @@ -0,0 +1,88 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_CALLBACKS_H_ +#define NAN_CALLBACKS_H_ + +template class FunctionCallbackInfo; +template class PropertyCallbackInfo; +template class Global; + +typedef void(*FunctionCallback)(const FunctionCallbackInfo&); +typedef void(*GetterCallback) + (v8::Local, const PropertyCallbackInfo&); +typedef void(*SetterCallback)( + v8::Local, + v8::Local, + const PropertyCallbackInfo&); +typedef void(*PropertyGetterCallback)( + v8::Local, + const PropertyCallbackInfo&); +typedef void(*PropertySetterCallback)( + v8::Local, + v8::Local, + const PropertyCallbackInfo&); +typedef void(*PropertyEnumeratorCallback) + (const PropertyCallbackInfo&); +typedef void(*PropertyDeleterCallback)( + v8::Local, + const PropertyCallbackInfo&); +typedef void(*PropertyQueryCallback)( + v8::Local, + const PropertyCallbackInfo&); +typedef void(*IndexGetterCallback)( + uint32_t, + const PropertyCallbackInfo&); +typedef void(*IndexSetterCallback)( + uint32_t, + v8::Local, + const PropertyCallbackInfo&); +typedef void(*IndexEnumeratorCallback) + (const PropertyCallbackInfo&); +typedef void(*IndexDeleterCallback)( + uint32_t, + const PropertyCallbackInfo&); +typedef void(*IndexQueryCallback)( + uint32_t, + const PropertyCallbackInfo&); + +namespace imp { +typedef v8::Local Sig; + +static const int kDataIndex = 0; + +static const int kFunctionIndex = 1; +static const int kFunctionFieldCount = 2; + +static const int kGetterIndex = 1; +static const int kSetterIndex = 2; +static const int kAccessorFieldCount = 3; + +static const int kPropertyGetterIndex = 1; +static const int kPropertySetterIndex = 2; +static const int kPropertyEnumeratorIndex = 3; +static const int kPropertyDeleterIndex = 4; +static const int kPropertyQueryIndex = 5; +static const int kPropertyFieldCount = 6; + +static const int kIndexPropertyGetterIndex = 1; +static const int kIndexPropertySetterIndex = 2; +static const int kIndexPropertyEnumeratorIndex = 3; +static const int kIndexPropertyDeleterIndex = 4; +static const int kIndexPropertyQueryIndex = 5; +static const int kIndexPropertyFieldCount = 6; + +} // end of namespace imp + +#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION +# include "nan_callbacks_12_inl.h" // NOLINT(build/include) +#else +# include "nan_callbacks_pre_12_inl.h" // NOLINT(build/include) +#endif + +#endif // NAN_CALLBACKS_H_ diff --git a/deploy/node_modules/nan/nan_callbacks_12_inl.h b/deploy/node_modules/nan/nan_callbacks_12_inl.h new file mode 100644 index 0000000..9c8bf7e --- /dev/null +++ b/deploy/node_modules/nan/nan_callbacks_12_inl.h @@ -0,0 +1,512 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_CALLBACKS_12_INL_H_ +#define NAN_CALLBACKS_12_INL_H_ + +template +class ReturnValue { + v8::ReturnValue value_; + + public: + template + explicit inline ReturnValue(const v8::ReturnValue &value) : + value_(value) {} + template + explicit inline ReturnValue(const ReturnValue& that) + : value_(that.value_) { + TYPE_CHECK(T, S); + } + + // Handle setters + template inline void Set(const v8::Local &handle) { + TYPE_CHECK(T, S); + value_.Set(handle); + } + + template inline void Set(const Global &handle) { + TYPE_CHECK(T, S); +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && \ + (V8_MINOR_VERSION > 5 || (V8_MINOR_VERSION == 5 && \ + defined(V8_BUILD_NUMBER) && V8_BUILD_NUMBER >= 8)))) + value_.Set(handle); +#else + value_.Set(*reinterpret_cast*>(&handle)); + const_cast &>(handle).Reset(); +#endif + } + + // Fast primitive setters + inline void Set(bool value) { + TYPE_CHECK(T, v8::Boolean); + value_.Set(value); + } + + inline void Set(double i) { + TYPE_CHECK(T, v8::Number); + value_.Set(i); + } + + inline void Set(int32_t i) { + TYPE_CHECK(T, v8::Integer); + value_.Set(i); + } + + inline void Set(uint32_t i) { + TYPE_CHECK(T, v8::Integer); + value_.Set(i); + } + + // Fast JS primitive setters + inline void SetNull() { + TYPE_CHECK(T, v8::Primitive); + value_.SetNull(); + } + + inline void SetUndefined() { + TYPE_CHECK(T, v8::Primitive); + value_.SetUndefined(); + } + + inline void SetEmptyString() { + TYPE_CHECK(T, v8::String); + value_.SetEmptyString(); + } + + // Convenience getter for isolate + inline v8::Isolate *GetIsolate() const { + return value_.GetIsolate(); + } + + // Pointer setter: Uncompilable to prevent inadvertent misuse. + template + inline void Set(S *whatever) { TYPE_CHECK(S*, v8::Primitive); } +}; + +template +class FunctionCallbackInfo { + const v8::FunctionCallbackInfo &info_; + const v8::Local data_; + + public: + explicit inline FunctionCallbackInfo( + const v8::FunctionCallbackInfo &info + , v8::Local data) : + info_(info) + , data_(data) {} + + inline ReturnValue GetReturnValue() const { + return ReturnValue(info_.GetReturnValue()); + } + + inline v8::Local Callee() const { return info_.Callee(); } + inline v8::Local Data() const { return data_; } + inline v8::Local Holder() const { return info_.Holder(); } + inline bool IsConstructCall() const { return info_.IsConstructCall(); } + inline int Length() const { return info_.Length(); } + inline v8::Local operator[](int i) const { return info_[i]; } + inline v8::Local This() const { return info_.This(); } + inline v8::Isolate *GetIsolate() const { return info_.GetIsolate(); } + + + protected: + static const int kHolderIndex = 0; + static const int kIsolateIndex = 1; + static const int kReturnValueDefaultValueIndex = 2; + static const int kReturnValueIndex = 3; + static const int kDataIndex = 4; + static const int kCalleeIndex = 5; + static const int kContextSaveIndex = 6; + static const int kArgsLength = 7; + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(FunctionCallbackInfo) +}; + +template +class PropertyCallbackInfo { + const v8::PropertyCallbackInfo &info_; + const v8::Local data_; + + public: + explicit inline PropertyCallbackInfo( + const v8::PropertyCallbackInfo &info + , const v8::Local data) : + info_(info) + , data_(data) {} + + inline v8::Isolate* GetIsolate() const { return info_.GetIsolate(); } + inline v8::Local Data() const { return data_; } + inline v8::Local This() const { return info_.This(); } + inline v8::Local Holder() const { return info_.Holder(); } + inline ReturnValue GetReturnValue() const { + return ReturnValue(info_.GetReturnValue()); + } + + protected: + static const int kHolderIndex = 0; + static const int kIsolateIndex = 1; + static const int kReturnValueDefaultValueIndex = 2; + static const int kReturnValueIndex = 3; + static const int kDataIndex = 4; + static const int kThisIndex = 5; + static const int kArgsLength = 6; + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(PropertyCallbackInfo) +}; + +namespace imp { +static +void FunctionCallbackWrapper(const v8::FunctionCallbackInfo &info) { + v8::Local obj = info.Data().As(); + FunctionCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kFunctionIndex).As()->Value())); + FunctionCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + callback(cbinfo); +} + +typedef void (*NativeFunction)(const v8::FunctionCallbackInfo &); + +#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION +static +void GetterCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + GetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kGetterIndex).As()->Value())); + callback(property.As(), cbinfo); +} + +typedef void (*NativeGetter) + (v8::Local, const v8::PropertyCallbackInfo &); + +static +void SetterCallbackWrapper( + v8::Local property + , v8::Local value + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + SetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kSetterIndex).As()->Value())); + callback(property.As(), value, cbinfo); +} + +typedef void (*NativeSetter)( + v8::Local + , v8::Local + , const v8::PropertyCallbackInfo &); +#else +static +void GetterCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + GetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kGetterIndex).As()->Value())); + callback(property, cbinfo); +} + +typedef void (*NativeGetter) + (v8::Local, const v8::PropertyCallbackInfo &); + +static +void SetterCallbackWrapper( + v8::Local property + , v8::Local value + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + SetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kSetterIndex).As()->Value())); + callback(property, value, cbinfo); +} + +typedef void (*NativeSetter)( + v8::Local + , v8::Local + , const v8::PropertyCallbackInfo &); +#endif + +#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION +static +void PropertyGetterCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertyGetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyGetterIndex) + .As()->Value())); + callback(property.As(), cbinfo); +} + +typedef void (*NativePropertyGetter) + (v8::Local, const v8::PropertyCallbackInfo &); + +static +void PropertySetterCallbackWrapper( + v8::Local property + , v8::Local value + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertySetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertySetterIndex) + .As()->Value())); + callback(property.As(), value, cbinfo); +} + +typedef void (*NativePropertySetter)( + v8::Local + , v8::Local + , const v8::PropertyCallbackInfo &); + +static +void PropertyEnumeratorCallbackWrapper( + const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertyEnumeratorCallback callback = + reinterpret_cast(reinterpret_cast( + obj->GetInternalField(kPropertyEnumeratorIndex) + .As()->Value())); + callback(cbinfo); +} + +typedef void (*NativePropertyEnumerator) + (const v8::PropertyCallbackInfo &); + +static +void PropertyDeleterCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertyDeleterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyDeleterIndex) + .As()->Value())); + callback(property.As(), cbinfo); +} + +typedef void (NativePropertyDeleter) + (v8::Local, const v8::PropertyCallbackInfo &); + +static +void PropertyQueryCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertyQueryCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyQueryIndex) + .As()->Value())); + callback(property.As(), cbinfo); +} + +typedef void (*NativePropertyQuery) + (v8::Local, const v8::PropertyCallbackInfo &); +#else +static +void PropertyGetterCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertyGetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyGetterIndex) + .As()->Value())); + callback(property, cbinfo); +} + +typedef void (*NativePropertyGetter) + (v8::Local, const v8::PropertyCallbackInfo &); + +static +void PropertySetterCallbackWrapper( + v8::Local property + , v8::Local value + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertySetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertySetterIndex) + .As()->Value())); + callback(property, value, cbinfo); +} + +typedef void (*NativePropertySetter)( + v8::Local + , v8::Local + , const v8::PropertyCallbackInfo &); + +static +void PropertyEnumeratorCallbackWrapper( + const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertyEnumeratorCallback callback = + reinterpret_cast(reinterpret_cast( + obj->GetInternalField(kPropertyEnumeratorIndex) + .As()->Value())); + callback(cbinfo); +} + +typedef void (*NativePropertyEnumerator) + (const v8::PropertyCallbackInfo &); + +static +void PropertyDeleterCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertyDeleterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyDeleterIndex) + .As()->Value())); + callback(property, cbinfo); +} + +typedef void (NativePropertyDeleter) + (v8::Local, const v8::PropertyCallbackInfo &); + +static +void PropertyQueryCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertyQueryCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyQueryIndex) + .As()->Value())); + callback(property, cbinfo); +} + +typedef void (*NativePropertyQuery) + (v8::Local, const v8::PropertyCallbackInfo &); +#endif + +static +void IndexGetterCallbackWrapper( + uint32_t index, const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + IndexGetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyGetterIndex) + .As()->Value())); + callback(index, cbinfo); +} + +typedef void (*NativeIndexGetter) + (uint32_t, const v8::PropertyCallbackInfo &); + +static +void IndexSetterCallbackWrapper( + uint32_t index + , v8::Local value + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + IndexSetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertySetterIndex) + .As()->Value())); + callback(index, value, cbinfo); +} + +typedef void (*NativeIndexSetter)( + uint32_t + , v8::Local + , const v8::PropertyCallbackInfo &); + +static +void IndexEnumeratorCallbackWrapper( + const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + IndexEnumeratorCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField( + kIndexPropertyEnumeratorIndex).As()->Value())); + callback(cbinfo); +} + +typedef void (*NativeIndexEnumerator) + (const v8::PropertyCallbackInfo &); + +static +void IndexDeleterCallbackWrapper( + uint32_t index, const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + IndexDeleterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyDeleterIndex) + .As()->Value())); + callback(index, cbinfo); +} + +typedef void (*NativeIndexDeleter) + (uint32_t, const v8::PropertyCallbackInfo &); + +static +void IndexQueryCallbackWrapper( + uint32_t index, const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + IndexQueryCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyQueryIndex) + .As()->Value())); + callback(index, cbinfo); +} + +typedef void (*NativeIndexQuery) + (uint32_t, const v8::PropertyCallbackInfo &); +} // end of namespace imp + +#endif // NAN_CALLBACKS_12_INL_H_ diff --git a/deploy/node_modules/nan/nan_callbacks_pre_12_inl.h b/deploy/node_modules/nan/nan_callbacks_pre_12_inl.h new file mode 100644 index 0000000..087ee52 --- /dev/null +++ b/deploy/node_modules/nan/nan_callbacks_pre_12_inl.h @@ -0,0 +1,520 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_CALLBACKS_PRE_12_INL_H_ +#define NAN_CALLBACKS_PRE_12_INL_H_ + +namespace imp { +template class ReturnValueImp; +} // end of namespace imp + +template +class ReturnValue { + v8::Isolate *isolate_; + v8::Persistent *value_; + friend class imp::ReturnValueImp; + + public: + template + explicit inline ReturnValue(v8::Isolate *isolate, v8::Persistent *p) : + isolate_(isolate), value_(p) {} + template + explicit inline ReturnValue(const ReturnValue& that) + : isolate_(that.isolate_), value_(that.value_) { + TYPE_CHECK(T, S); + } + + // Handle setters + template inline void Set(const v8::Local &handle) { + TYPE_CHECK(T, S); + value_->Dispose(); + *value_ = v8::Persistent::New(handle); + } + + template inline void Set(const Global &handle) { + TYPE_CHECK(T, S); + value_->Dispose(); + *value_ = v8::Persistent::New(handle.persistent); + const_cast &>(handle).Reset(); + } + + // Fast primitive setters + inline void Set(bool value) { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Boolean); + value_->Dispose(); + *value_ = v8::Persistent::New(v8::Boolean::New(value)); + } + + inline void Set(double i) { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Number); + value_->Dispose(); + *value_ = v8::Persistent::New(v8::Number::New(i)); + } + + inline void Set(int32_t i) { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Integer); + value_->Dispose(); + *value_ = v8::Persistent::New(v8::Int32::New(i)); + } + + inline void Set(uint32_t i) { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Integer); + value_->Dispose(); + *value_ = v8::Persistent::New(v8::Uint32::NewFromUnsigned(i)); + } + + // Fast JS primitive setters + inline void SetNull() { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Primitive); + value_->Dispose(); + *value_ = v8::Persistent::New(v8::Null()); + } + + inline void SetUndefined() { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Primitive); + value_->Dispose(); + *value_ = v8::Persistent::New(v8::Undefined()); + } + + inline void SetEmptyString() { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::String); + value_->Dispose(); + *value_ = v8::Persistent::New(v8::String::Empty()); + } + + // Convenience getter for isolate + inline v8::Isolate *GetIsolate() const { + return isolate_; + } + + // Pointer setter: Uncompilable to prevent inadvertent misuse. + template + inline void Set(S *whatever) { TYPE_CHECK(S*, v8::Primitive); } +}; + +template +class FunctionCallbackInfo { + const v8::Arguments &args_; + v8::Local data_; + ReturnValue return_value_; + v8::Persistent retval_; + + public: + explicit inline FunctionCallbackInfo( + const v8::Arguments &args + , v8::Local data) : + args_(args) + , data_(data) + , return_value_(args.GetIsolate(), &retval_) + , retval_(v8::Persistent::New(v8::Undefined())) {} + + inline ~FunctionCallbackInfo() { + retval_.Dispose(); + retval_.Clear(); + } + + inline ReturnValue GetReturnValue() const { + return ReturnValue(return_value_); + } + + inline v8::Local Callee() const { return args_.Callee(); } + inline v8::Local Data() const { return data_; } + inline v8::Local Holder() const { return args_.Holder(); } + inline bool IsConstructCall() const { return args_.IsConstructCall(); } + inline int Length() const { return args_.Length(); } + inline v8::Local operator[](int i) const { return args_[i]; } + inline v8::Local This() const { return args_.This(); } + inline v8::Isolate *GetIsolate() const { return args_.GetIsolate(); } + + + protected: + static const int kHolderIndex = 0; + static const int kIsolateIndex = 1; + static const int kReturnValueDefaultValueIndex = 2; + static const int kReturnValueIndex = 3; + static const int kDataIndex = 4; + static const int kCalleeIndex = 5; + static const int kContextSaveIndex = 6; + static const int kArgsLength = 7; + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(FunctionCallbackInfo) +}; + +template +class PropertyCallbackInfoBase { + const v8::AccessorInfo &info_; + const v8::Local data_; + + public: + explicit inline PropertyCallbackInfoBase( + const v8::AccessorInfo &info + , const v8::Local data) : + info_(info) + , data_(data) {} + + inline v8::Isolate* GetIsolate() const { return info_.GetIsolate(); } + inline v8::Local Data() const { return data_; } + inline v8::Local This() const { return info_.This(); } + inline v8::Local Holder() const { return info_.Holder(); } + + protected: + static const int kHolderIndex = 0; + static const int kIsolateIndex = 1; + static const int kReturnValueDefaultValueIndex = 2; + static const int kReturnValueIndex = 3; + static const int kDataIndex = 4; + static const int kThisIndex = 5; + static const int kArgsLength = 6; + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(PropertyCallbackInfoBase) +}; + +template +class PropertyCallbackInfo : public PropertyCallbackInfoBase { + ReturnValue return_value_; + v8::Persistent retval_; + + public: + explicit inline PropertyCallbackInfo( + const v8::AccessorInfo &info + , const v8::Local data) : + PropertyCallbackInfoBase(info, data) + , return_value_(info.GetIsolate(), &retval_) + , retval_(v8::Persistent::New(v8::Undefined())) {} + + inline ~PropertyCallbackInfo() { + retval_.Dispose(); + retval_.Clear(); + } + + inline ReturnValue GetReturnValue() const { return return_value_; } +}; + +template<> +class PropertyCallbackInfo : + public PropertyCallbackInfoBase { + ReturnValue return_value_; + v8::Persistent retval_; + + public: + explicit inline PropertyCallbackInfo( + const v8::AccessorInfo &info + , const v8::Local data) : + PropertyCallbackInfoBase(info, data) + , return_value_(info.GetIsolate(), &retval_) + , retval_(v8::Persistent::New(v8::Local())) {} + + inline ~PropertyCallbackInfo() { + retval_.Dispose(); + retval_.Clear(); + } + + inline ReturnValue GetReturnValue() const { + return return_value_; + } +}; + +template<> +class PropertyCallbackInfo : + public PropertyCallbackInfoBase { + ReturnValue return_value_; + v8::Persistent retval_; + + public: + explicit inline PropertyCallbackInfo( + const v8::AccessorInfo &info + , const v8::Local data) : + PropertyCallbackInfoBase(info, data) + , return_value_(info.GetIsolate(), &retval_) + , retval_(v8::Persistent::New(v8::Local())) {} + + inline ~PropertyCallbackInfo() { + retval_.Dispose(); + retval_.Clear(); + } + + inline ReturnValue GetReturnValue() const { + return return_value_; + } +}; + +template<> +class PropertyCallbackInfo : + public PropertyCallbackInfoBase { + ReturnValue return_value_; + v8::Persistent retval_; + + public: + explicit inline PropertyCallbackInfo( + const v8::AccessorInfo &info + , const v8::Local data) : + PropertyCallbackInfoBase(info, data) + , return_value_(info.GetIsolate(), &retval_) + , retval_(v8::Persistent::New(v8::Local())) {} + + inline ~PropertyCallbackInfo() { + retval_.Dispose(); + retval_.Clear(); + } + + inline ReturnValue GetReturnValue() const { + return return_value_; + } +}; + +namespace imp { +template +class ReturnValueImp : public ReturnValue { + public: + explicit ReturnValueImp(ReturnValue that) : + ReturnValue(that) {} + inline v8::Handle Value() { + return *ReturnValue::value_; + } +}; + +static +v8::Handle FunctionCallbackWrapper(const v8::Arguments &args) { + v8::Local obj = args.Data().As(); + FunctionCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kFunctionIndex).As()->Value())); + FunctionCallbackInfo + cbinfo(args, obj->GetInternalField(kDataIndex)); + callback(cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativeFunction)(const v8::Arguments &); + +static +v8::Handle GetterCallbackWrapper( + v8::Local property, const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + GetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kGetterIndex).As()->Value())); + callback(property, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativeGetter) + (v8::Local, const v8::AccessorInfo &); + +static +void SetterCallbackWrapper( + v8::Local property + , v8::Local value + , const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + SetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kSetterIndex).As()->Value())); + callback(property, value, cbinfo); +} + +typedef void (*NativeSetter) + (v8::Local, v8::Local, const v8::AccessorInfo &); + +static +v8::Handle PropertyGetterCallbackWrapper( + v8::Local property, const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertyGetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyGetterIndex) + .As()->Value())); + callback(property, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativePropertyGetter) + (v8::Local, const v8::AccessorInfo &); + +static +v8::Handle PropertySetterCallbackWrapper( + v8::Local property + , v8::Local value + , const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertySetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertySetterIndex) + .As()->Value())); + callback(property, value, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativePropertySetter) + (v8::Local, v8::Local, const v8::AccessorInfo &); + +static +v8::Handle PropertyEnumeratorCallbackWrapper( + const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertyEnumeratorCallback callback = + reinterpret_cast(reinterpret_cast( + obj->GetInternalField(kPropertyEnumeratorIndex) + .As()->Value())); + callback(cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativePropertyEnumerator) + (const v8::AccessorInfo &); + +static +v8::Handle PropertyDeleterCallbackWrapper( + v8::Local property + , const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertyDeleterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyDeleterIndex) + .As()->Value())); + callback(property, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (NativePropertyDeleter) + (v8::Local, const v8::AccessorInfo &); + +static +v8::Handle PropertyQueryCallbackWrapper( + v8::Local property, const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertyQueryCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyQueryIndex) + .As()->Value())); + callback(property, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativePropertyQuery) + (v8::Local, const v8::AccessorInfo &); + +static +v8::Handle IndexGetterCallbackWrapper( + uint32_t index, const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + IndexGetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyGetterIndex) + .As()->Value())); + callback(index, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativeIndexGetter) + (uint32_t, const v8::AccessorInfo &); + +static +v8::Handle IndexSetterCallbackWrapper( + uint32_t index + , v8::Local value + , const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + IndexSetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertySetterIndex) + .As()->Value())); + callback(index, value, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativeIndexSetter) + (uint32_t, v8::Local, const v8::AccessorInfo &); + +static +v8::Handle IndexEnumeratorCallbackWrapper( + const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + IndexEnumeratorCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyEnumeratorIndex) + .As()->Value())); + callback(cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativeIndexEnumerator) + (const v8::AccessorInfo &); + +static +v8::Handle IndexDeleterCallbackWrapper( + uint32_t index, const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + IndexDeleterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyDeleterIndex) + .As()->Value())); + callback(index, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativeIndexDeleter) + (uint32_t, const v8::AccessorInfo &); + +static +v8::Handle IndexQueryCallbackWrapper( + uint32_t index, const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + IndexQueryCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyQueryIndex) + .As()->Value())); + callback(index, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativeIndexQuery) + (uint32_t, const v8::AccessorInfo &); +} // end of namespace imp + +#endif // NAN_CALLBACKS_PRE_12_INL_H_ diff --git a/deploy/node_modules/nan/nan_converters.h b/deploy/node_modules/nan/nan_converters.h new file mode 100644 index 0000000..8a569b5 --- /dev/null +++ b/deploy/node_modules/nan/nan_converters.h @@ -0,0 +1,72 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_CONVERTERS_H_ +#define NAN_CONVERTERS_H_ + +namespace imp { +template struct ToFactoryBase { + typedef MaybeLocal return_t; +}; +template struct ValueFactoryBase { typedef Maybe return_t; }; + +template struct ToFactory; + +template<> +struct ToFactory : ToFactoryBase { + static inline return_t convert(v8::Local val) { + if (val.IsEmpty() || !val->IsFunction()) return MaybeLocal(); + return MaybeLocal(val.As()); + } +}; + +#define X(TYPE) \ + template<> \ + struct ToFactory : ToFactoryBase { \ + static inline return_t convert(v8::Local val); \ + }; + +X(Boolean) +X(Number) +X(String) +X(Object) +X(Integer) +X(Uint32) +X(Int32) + +#undef X + +#define X(TYPE) \ + template<> \ + struct ToFactory : ValueFactoryBase { \ + static inline return_t convert(v8::Local val); \ + }; + +X(bool) +X(double) +X(int64_t) +X(uint32_t) +X(int32_t) + +#undef X +} // end of namespace imp + +template +inline +typename imp::ToFactory::return_t To(v8::Local val) { + return imp::ToFactory::convert(val); +} + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +# include "nan_converters_43_inl.h" +#else +# include "nan_converters_pre_43_inl.h" +#endif + +#endif // NAN_CONVERTERS_H_ diff --git a/deploy/node_modules/nan/nan_converters_43_inl.h b/deploy/node_modules/nan/nan_converters_43_inl.h new file mode 100644 index 0000000..0c7cd50 --- /dev/null +++ b/deploy/node_modules/nan/nan_converters_43_inl.h @@ -0,0 +1,48 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_CONVERTERS_43_INL_H_ +#define NAN_CONVERTERS_43_INL_H_ + +#define X(TYPE) \ +imp::ToFactory::return_t \ +imp::ToFactory::convert(v8::Local val) { \ + v8::Isolate *isolate = v8::Isolate::GetCurrent(); \ + v8::EscapableHandleScope scope(isolate); \ + return scope.Escape( \ + val->To ## TYPE(v8::Isolate::GetCurrent()->GetCurrentContext()) \ + .FromMaybe(v8::Local())); \ +} + +X(Boolean) +X(Number) +X(String) +X(Object) +X(Integer) +X(Uint32) +X(Int32) + +#undef X + +#define X(TYPE, NAME) \ +imp::ToFactory::return_t \ +imp::ToFactory::convert(v8::Local val) { \ + v8::Isolate *isolate = v8::Isolate::GetCurrent(); \ + v8::HandleScope scope(isolate); \ + return val->NAME ## Value(isolate->GetCurrentContext()); \ +} + +X(bool, Boolean) +X(double, Number) +X(int64_t, Integer) +X(uint32_t, Uint32) +X(int32_t, Int32) + +#undef X + +#endif // NAN_CONVERTERS_43_INL_H_ diff --git a/deploy/node_modules/nan/nan_converters_pre_43_inl.h b/deploy/node_modules/nan/nan_converters_pre_43_inl.h new file mode 100644 index 0000000..3391be2 --- /dev/null +++ b/deploy/node_modules/nan/nan_converters_pre_43_inl.h @@ -0,0 +1,42 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_CONVERTERS_PRE_43_INL_H_ +#define NAN_CONVERTERS_PRE_43_INL_H_ + +#define X(TYPE) \ +imp::ToFactory::return_t \ +imp::ToFactory::convert(v8::Local val) { \ + return val->To ## TYPE(); \ +} + +X(Boolean) +X(Number) +X(String) +X(Object) +X(Integer) +X(Uint32) +X(Int32) + +#undef X + +#define X(TYPE, NAME) \ +imp::ToFactory::return_t \ +imp::ToFactory::convert(v8::Local val) { \ + return Just(val->NAME ## Value()); \ +} + +X(bool, Boolean) +X(double, Number) +X(int64_t, Integer) +X(uint32_t, Uint32) +X(int32_t, Int32) + +#undef X + +#endif // NAN_CONVERTERS_PRE_43_INL_H_ diff --git a/deploy/node_modules/nan/nan_implementation_12_inl.h b/deploy/node_modules/nan/nan_implementation_12_inl.h new file mode 100644 index 0000000..be80a45 --- /dev/null +++ b/deploy/node_modules/nan/nan_implementation_12_inl.h @@ -0,0 +1,399 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_IMPLEMENTATION_12_INL_H_ +#define NAN_IMPLEMENTATION_12_INL_H_ +//============================================================================== +// node v0.11 implementation +//============================================================================== + +namespace imp { + +//=== Array ==================================================================== + +Factory::return_t +Factory::New() { + return v8::Array::New(v8::Isolate::GetCurrent()); +} + +Factory::return_t +Factory::New(int length) { + return v8::Array::New(v8::Isolate::GetCurrent(), length); +} + +//=== Boolean ================================================================== + +Factory::return_t +Factory::New(bool value) { + return v8::Boolean::New(v8::Isolate::GetCurrent(), value); +} + +//=== Boolean Object =========================================================== + +Factory::return_t +Factory::New(bool value) { +#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION) + return v8::BooleanObject::New( + v8::Isolate::GetCurrent(), value).As(); +#else + return v8::BooleanObject::New(value).As(); +#endif +} + +//=== Context ================================================================== + +Factory::return_t +Factory::New( v8::ExtensionConfiguration* extensions + , v8::Local tmpl + , v8::Local obj) { + return v8::Context::New(v8::Isolate::GetCurrent(), extensions, tmpl, obj); +} + +//=== Date ===================================================================== + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +Factory::return_t +Factory::New(double value) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(v8::Date::New(isolate->GetCurrentContext(), value) + .FromMaybe(v8::Local()).As()); +} +#else +Factory::return_t +Factory::New(double value) { + return v8::Date::New(v8::Isolate::GetCurrent(), value).As(); +} +#endif + +//=== External ================================================================= + +Factory::return_t +Factory::New(void * value) { + return v8::External::New(v8::Isolate::GetCurrent(), value); +} + +//=== Function ================================================================= + +Factory::return_t +Factory::New( FunctionCallback callback + , v8::Local data) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + v8::Local tpl = v8::ObjectTemplate::New(isolate); + tpl->SetInternalFieldCount(imp::kFunctionFieldCount); + v8::Local obj = NewInstance(tpl).ToLocalChecked(); + + obj->SetInternalField( + imp::kFunctionIndex + , v8::External::New(isolate, reinterpret_cast(callback))); + + v8::Local val = v8::Local::New(isolate, data); + + if (!val.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, val); + } + + return scope.Escape(v8::Function::New( isolate + , imp::FunctionCallbackWrapper + , obj)); +} + +//=== Function Template ======================================================== + +Factory::return_t +Factory::New( FunctionCallback callback + , v8::Local data + , v8::Local signature) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + if (callback) { + v8::EscapableHandleScope scope(isolate); + v8::Local tpl = v8::ObjectTemplate::New(isolate); + tpl->SetInternalFieldCount(imp::kFunctionFieldCount); + v8::Local obj = NewInstance(tpl).ToLocalChecked(); + + obj->SetInternalField( + imp::kFunctionIndex + , v8::External::New(isolate, reinterpret_cast(callback))); + v8::Local val = v8::Local::New(isolate, data); + + if (!val.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, val); + } + + return scope.Escape(v8::FunctionTemplate::New( isolate + , imp::FunctionCallbackWrapper + , obj + , signature)); + } else { + return v8::FunctionTemplate::New(isolate, 0, data, signature); + } +} + +//=== Number =================================================================== + +Factory::return_t +Factory::New(double value) { + return v8::Number::New(v8::Isolate::GetCurrent(), value); +} + +//=== Number Object ============================================================ + +Factory::return_t +Factory::New(double value) { + return v8::NumberObject::New( v8::Isolate::GetCurrent() + , value).As(); +} + +//=== Integer, Int32 and Uint32 ================================================ + +template +typename IntegerFactory::return_t +IntegerFactory::New(int32_t value) { + return To(T::New(v8::Isolate::GetCurrent(), value)); +} + +template +typename IntegerFactory::return_t +IntegerFactory::New(uint32_t value) { + return To(T::NewFromUnsigned(v8::Isolate::GetCurrent(), value)); +} + +Factory::return_t +Factory::New(int32_t value) { + return To( + v8::Uint32::NewFromUnsigned(v8::Isolate::GetCurrent(), value)); +} + +Factory::return_t +Factory::New(uint32_t value) { + return To( + v8::Uint32::NewFromUnsigned(v8::Isolate::GetCurrent(), value)); +} + +//=== Object =================================================================== + +Factory::return_t +Factory::New() { + return v8::Object::New(v8::Isolate::GetCurrent()); +} + +//=== Object Template ========================================================== + +Factory::return_t +Factory::New() { + return v8::ObjectTemplate::New(v8::Isolate::GetCurrent()); +} + +//=== RegExp =================================================================== + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +Factory::return_t +Factory::New( + v8::Local pattern + , v8::RegExp::Flags flags) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape( + v8::RegExp::New(isolate->GetCurrentContext(), pattern, flags) + .FromMaybe(v8::Local())); +} +#else +Factory::return_t +Factory::New( + v8::Local pattern + , v8::RegExp::Flags flags) { + return v8::RegExp::New(pattern, flags); +} +#endif + +//=== Script =================================================================== + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +Factory::return_t +Factory::New( v8::Local source) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + v8::ScriptCompiler::Source src(source); + return scope.Escape( + v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &src) + .FromMaybe(v8::Local())); +} + +Factory::return_t +Factory::New( v8::Local source + , v8::ScriptOrigin const& origin) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + v8::ScriptCompiler::Source src(source, origin); + return scope.Escape( + v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &src) + .FromMaybe(v8::Local())); +} +#else +Factory::return_t +Factory::New( v8::Local source) { + v8::ScriptCompiler::Source src(source); + return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &src); +} + +Factory::return_t +Factory::New( v8::Local source + , v8::ScriptOrigin const& origin) { + v8::ScriptCompiler::Source src(source, origin); + return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &src); +} +#endif + +//=== Signature ================================================================ + +Factory::return_t +Factory::New(Factory::FTH receiver) { + return v8::Signature::New(v8::Isolate::GetCurrent(), receiver); +} + +//=== String =================================================================== + +Factory::return_t +Factory::New() { + return v8::String::Empty(v8::Isolate::GetCurrent()); +} + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +Factory::return_t +Factory::New(const char * value, int length) { + return v8::String::NewFromUtf8( + v8::Isolate::GetCurrent(), value, v8::NewStringType::kNormal, length); +} + +Factory::return_t +Factory::New(std::string const& value) { + assert(value.size() <= INT_MAX && "string too long"); + return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), + value.data(), v8::NewStringType::kNormal, static_cast(value.size())); +} + +Factory::return_t +Factory::New(const uint16_t * value, int length) { + return v8::String::NewFromTwoByte(v8::Isolate::GetCurrent(), value, + v8::NewStringType::kNormal, length); +} + +Factory::return_t +Factory::New(v8::String::ExternalStringResource * value) { + return v8::String::NewExternalTwoByte(v8::Isolate::GetCurrent(), value); +} + +Factory::return_t +Factory::New(ExternalOneByteStringResource * value) { + return v8::String::NewExternalOneByte(v8::Isolate::GetCurrent(), value); +} +#else +Factory::return_t +Factory::New(const char * value, int length) { + return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), value, + v8::String::kNormalString, length); +} + +Factory::return_t +Factory::New( + std::string const& value) /* NOLINT(build/include_what_you_use) */ { + assert(value.size() <= INT_MAX && "string too long"); + return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), value.data(), + v8::String::kNormalString, + static_cast(value.size())); +} + +Factory::return_t +Factory::New(const uint16_t * value, int length) { + return v8::String::NewFromTwoByte(v8::Isolate::GetCurrent(), value, + v8::String::kNormalString, length); +} + +Factory::return_t +Factory::New(v8::String::ExternalStringResource * value) { + return v8::String::NewExternal(v8::Isolate::GetCurrent(), value); +} + +Factory::return_t +Factory::New(ExternalOneByteStringResource * value) { + return v8::String::NewExternal(v8::Isolate::GetCurrent(), value); +} +#endif + +//=== String Object ============================================================ + +Factory::return_t +Factory::New(v8::Local value) { + return v8::StringObject::New(value).As(); +} + +//=== Unbound Script =========================================================== + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +Factory::return_t +Factory::New(v8::Local source) { + v8::ScriptCompiler::Source src(source); + return v8::ScriptCompiler::CompileUnboundScript( + v8::Isolate::GetCurrent(), &src); +} + +Factory::return_t +Factory::New( v8::Local source + , v8::ScriptOrigin const& origin) { + v8::ScriptCompiler::Source src(source, origin); + return v8::ScriptCompiler::CompileUnboundScript( + v8::Isolate::GetCurrent(), &src); +} +#else +Factory::return_t +Factory::New(v8::Local source) { + v8::ScriptCompiler::Source src(source); + return v8::ScriptCompiler::CompileUnbound(v8::Isolate::GetCurrent(), &src); +} + +Factory::return_t +Factory::New( v8::Local source + , v8::ScriptOrigin const& origin) { + v8::ScriptCompiler::Source src(source, origin); + return v8::ScriptCompiler::CompileUnbound(v8::Isolate::GetCurrent(), &src); +} +#endif + +} // end of namespace imp + +//=== Presistents and Handles ================================================== + +#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION +template +inline v8::Local New(v8::Handle h) { + return v8::Local::New(v8::Isolate::GetCurrent(), h); +} +#endif + +template +inline v8::Local New(v8::Persistent const& p) { + return v8::Local::New(v8::Isolate::GetCurrent(), p); +} + +template +inline v8::Local New(Persistent const& p) { + return v8::Local::New(v8::Isolate::GetCurrent(), p); +} + +template +inline v8::Local New(Global const& p) { + return v8::Local::New(v8::Isolate::GetCurrent(), p); +} + +#endif // NAN_IMPLEMENTATION_12_INL_H_ diff --git a/deploy/node_modules/nan/nan_implementation_pre_12_inl.h b/deploy/node_modules/nan/nan_implementation_pre_12_inl.h new file mode 100644 index 0000000..6afe94c --- /dev/null +++ b/deploy/node_modules/nan/nan_implementation_pre_12_inl.h @@ -0,0 +1,263 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_IMPLEMENTATION_PRE_12_INL_H_ +#define NAN_IMPLEMENTATION_PRE_12_INL_H_ + +//============================================================================== +// node v0.10 implementation +//============================================================================== + +namespace imp { + +//=== Array ==================================================================== + +Factory::return_t +Factory::New() { + return v8::Array::New(); +} + +Factory::return_t +Factory::New(int length) { + return v8::Array::New(length); +} + +//=== Boolean ================================================================== + +Factory::return_t +Factory::New(bool value) { + return v8::Boolean::New(value)->ToBoolean(); +} + +//=== Boolean Object =========================================================== + +Factory::return_t +Factory::New(bool value) { + return v8::BooleanObject::New(value).As(); +} + +//=== Context ================================================================== + +Factory::return_t +Factory::New( v8::ExtensionConfiguration* extensions + , v8::Local tmpl + , v8::Local obj) { + v8::Persistent ctx = v8::Context::New(extensions, tmpl, obj); + v8::Local lctx = v8::Local::New(ctx); + ctx.Dispose(); + return lctx; +} + +//=== Date ===================================================================== + +Factory::return_t +Factory::New(double value) { + return v8::Date::New(value).As(); +} + +//=== External ================================================================= + +Factory::return_t +Factory::New(void * value) { + return v8::External::New(value); +} + +//=== Function ================================================================= + +Factory::return_t +Factory::New( FunctionCallback callback + , v8::Local data) { + v8::HandleScope scope; + + return scope.Close(Factory::New( + callback, data, v8::Local()) + ->GetFunction()); +} + + +//=== FunctionTemplate ========================================================= + +Factory::return_t +Factory::New( FunctionCallback callback + , v8::Local data + , v8::Local signature) { + if (callback) { + v8::HandleScope scope; + + v8::Local tpl = v8::ObjectTemplate::New(); + tpl->SetInternalFieldCount(imp::kFunctionFieldCount); + v8::Local obj = tpl->NewInstance(); + + obj->SetInternalField( + imp::kFunctionIndex + , v8::External::New(reinterpret_cast(callback))); + + v8::Local val = v8::Local::New(data); + + if (!val.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, val); + } + + // Note(agnat): Emulate length argument here. Unfortunately, I couldn't find + // a way. Have at it though... + return scope.Close( + v8::FunctionTemplate::New(imp::FunctionCallbackWrapper + , obj + , signature)); + } else { + return v8::FunctionTemplate::New(0, data, signature); + } +} + +//=== Number =================================================================== + +Factory::return_t +Factory::New(double value) { + return v8::Number::New(value); +} + +//=== Number Object ============================================================ + +Factory::return_t +Factory::New(double value) { + return v8::NumberObject::New(value).As(); +} + +//=== Integer, Int32 and Uint32 ================================================ + +template +typename IntegerFactory::return_t +IntegerFactory::New(int32_t value) { + return To(T::New(value)); +} + +template +typename IntegerFactory::return_t +IntegerFactory::New(uint32_t value) { + return To(T::NewFromUnsigned(value)); +} + +Factory::return_t +Factory::New(int32_t value) { + return To(v8::Uint32::NewFromUnsigned(value)); +} + +Factory::return_t +Factory::New(uint32_t value) { + return To(v8::Uint32::NewFromUnsigned(value)); +} + + +//=== Object =================================================================== + +Factory::return_t +Factory::New() { + return v8::Object::New(); +} + +//=== Object Template ========================================================== + +Factory::return_t +Factory::New() { + return v8::ObjectTemplate::New(); +} + +//=== RegExp =================================================================== + +Factory::return_t +Factory::New( + v8::Local pattern + , v8::RegExp::Flags flags) { + return v8::RegExp::New(pattern, flags); +} + +//=== Script =================================================================== + +Factory::return_t +Factory::New( v8::Local source) { + return v8::Script::New(source); +} +Factory::return_t +Factory::New( v8::Local source + , v8::ScriptOrigin const& origin) { + return v8::Script::New(source, const_cast(&origin)); +} + +//=== Signature ================================================================ + +Factory::return_t +Factory::New(Factory::FTH receiver) { + return v8::Signature::New(receiver); +} + +//=== String =================================================================== + +Factory::return_t +Factory::New() { + return v8::String::Empty(); +} + +Factory::return_t +Factory::New(const char * value, int length) { + return v8::String::New(value, length); +} + +Factory::return_t +Factory::New( + std::string const& value) /* NOLINT(build/include_what_you_use) */ { + assert(value.size() <= INT_MAX && "string too long"); + return v8::String::New(value.data(), static_cast(value.size())); +} + +Factory::return_t +Factory::New(const uint16_t * value, int length) { + return v8::String::New(value, length); +} + +Factory::return_t +Factory::New(v8::String::ExternalStringResource * value) { + return v8::String::NewExternal(value); +} + +Factory::return_t +Factory::New(v8::String::ExternalAsciiStringResource * value) { + return v8::String::NewExternal(value); +} + +//=== String Object ============================================================ + +Factory::return_t +Factory::New(v8::Local value) { + return v8::StringObject::New(value).As(); +} + +} // end of namespace imp + +//=== Presistents and Handles ================================================== + +template +inline v8::Local New(v8::Handle h) { + return v8::Local::New(h); +} + +template +inline v8::Local New(v8::Persistent const& p) { + return v8::Local::New(p); +} + +template +inline v8::Local New(Persistent const& p) { + return v8::Local::New(p.persistent); +} + +template +inline v8::Local New(Global const& p) { + return v8::Local::New(p.persistent); +} + +#endif // NAN_IMPLEMENTATION_PRE_12_INL_H_ diff --git a/deploy/node_modules/nan/nan_json.h b/deploy/node_modules/nan/nan_json.h new file mode 100644 index 0000000..465614b --- /dev/null +++ b/deploy/node_modules/nan/nan_json.h @@ -0,0 +1,159 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_JSON_H_ +#define NAN_JSON_H_ + +#if NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION +#define NAN_JSON_H_NEED_PARSE 1 +#else +#define NAN_JSON_H_NEED_PARSE 0 +#endif // NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION + +#if NODE_MODULE_VERSION >= NODE_7_0_MODULE_VERSION +#define NAN_JSON_H_NEED_STRINGIFY 0 +#else +#define NAN_JSON_H_NEED_STRINGIFY 1 +#endif // NODE_MODULE_VERSION >= NODE_7_0_MODULE_VERSION + +class JSON { + public: + JSON() { +#if NAN_JSON_H_NEED_PARSE + NAN_JSON_H_NEED_STRINGIFY + Nan::HandleScope scope; + + Nan::MaybeLocal maybe_global_json = Nan::Get( + Nan::GetCurrentContext()->Global(), + Nan::New("JSON").ToLocalChecked() + ); + + assert(!maybe_global_json.IsEmpty() && "global JSON is empty"); + v8::Local val_global_json = maybe_global_json.ToLocalChecked(); + + assert(val_global_json->IsObject() && "global JSON is not an object"); + Nan::MaybeLocal maybe_obj_global_json = + Nan::To(val_global_json); + + assert(!maybe_obj_global_json.IsEmpty() && "global JSON object is empty"); + v8::Local global_json = maybe_obj_global_json.ToLocalChecked(); + +#if NAN_JSON_H_NEED_PARSE + Nan::MaybeLocal maybe_parse_method = Nan::Get( + global_json, Nan::New("parse").ToLocalChecked() + ); + + assert(!maybe_parse_method.IsEmpty() && "JSON.parse is empty"); + v8::Local parse_method = maybe_parse_method.ToLocalChecked(); + + assert(parse_method->IsFunction() && "JSON.parse is not a function"); + parse_cb_.Reset(parse_method.As()); +#endif // NAN_JSON_H_NEED_PARSE + +#if NAN_JSON_H_NEED_STRINGIFY + Nan::MaybeLocal maybe_stringify_method = Nan::Get( + global_json, Nan::New("stringify").ToLocalChecked() + ); + + assert(!maybe_stringify_method.IsEmpty() && "JSON.stringify is empty"); + v8::Local stringify_method = + maybe_stringify_method.ToLocalChecked(); + + assert( + stringify_method->IsFunction() && "JSON.stringify is not a function" + ); + stringify_cb_.Reset(stringify_method.As()); +#endif // NAN_JSON_H_NEED_STRINGIFY +#endif // NAN_JSON_H_NEED_PARSE + NAN_JSON_H_NEED_STRINGIFY + } + + inline + Nan::MaybeLocal Parse(v8::Local json_string) { + Nan::EscapableHandleScope scope; +#if NAN_JSON_H_NEED_PARSE + return scope.Escape(parse(json_string)); +#else + Nan::MaybeLocal result; +#if NODE_MODULE_VERSION == NODE_0_12_MODULE_VERSION + result = v8::JSON::Parse(json_string); +#else +#if NODE_MODULE_VERSION > NODE_6_0_MODULE_VERSION + v8::Local context_or_isolate = Nan::GetCurrentContext(); +#else + v8::Isolate* context_or_isolate = v8::Isolate::GetCurrent(); +#endif // NODE_MODULE_VERSION > NODE_6_0_MODULE_VERSION + result = v8::JSON::Parse(context_or_isolate, json_string); +#endif // NODE_MODULE_VERSION == NODE_0_12_MODULE_VERSION + if (result.IsEmpty()) return v8::Local(); + return scope.Escape(result.ToLocalChecked()); +#endif // NAN_JSON_H_NEED_PARSE + } + + inline + Nan::MaybeLocal Stringify(v8::Local json_object) { + Nan::EscapableHandleScope scope; + Nan::MaybeLocal result = +#if NAN_JSON_H_NEED_STRINGIFY + Nan::To(stringify(json_object)); +#else + v8::JSON::Stringify(Nan::GetCurrentContext(), json_object); +#endif // NAN_JSON_H_NEED_STRINGIFY + if (result.IsEmpty()) return v8::Local(); + return scope.Escape(result.ToLocalChecked()); + } + + inline + Nan::MaybeLocal Stringify(v8::Local json_object, + v8::Local gap) { + Nan::EscapableHandleScope scope; + Nan::MaybeLocal result = +#if NAN_JSON_H_NEED_STRINGIFY + Nan::To(stringify(json_object, gap)); +#else + v8::JSON::Stringify(Nan::GetCurrentContext(), json_object, gap); +#endif // NAN_JSON_H_NEED_STRINGIFY + if (result.IsEmpty()) return v8::Local(); + return scope.Escape(result.ToLocalChecked()); + } + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(JSON) +#if NAN_JSON_H_NEED_PARSE + Nan::Callback parse_cb_; +#endif // NAN_JSON_H_NEED_PARSE +#if NAN_JSON_H_NEED_STRINGIFY + Nan::Callback stringify_cb_; +#endif // NAN_JSON_H_NEED_STRINGIFY + +#if NAN_JSON_H_NEED_PARSE + inline v8::Local parse(v8::Local arg) { + assert(!parse_cb_.IsEmpty() && "parse_cb_ is empty"); + return parse_cb_.Call(1, &arg); + } +#endif // NAN_JSON_H_NEED_PARSE + +#if NAN_JSON_H_NEED_STRINGIFY + inline v8::Local stringify(v8::Local arg) { + assert(!stringify_cb_.IsEmpty() && "stringify_cb_ is empty"); + return stringify_cb_.Call(1, &arg); + } + + inline v8::Local stringify(v8::Local arg, + v8::Local gap) { + assert(!stringify_cb_.IsEmpty() && "stringify_cb_ is empty"); + + v8::Local argv[] = { + arg, + Nan::Null(), + gap + }; + return stringify_cb_.Call(3, argv); + } +#endif // NAN_JSON_H_NEED_STRINGIFY +}; + +#endif // NAN_JSON_H_ diff --git a/deploy/node_modules/nan/nan_maybe_43_inl.h b/deploy/node_modules/nan/nan_maybe_43_inl.h new file mode 100644 index 0000000..10eeb02 --- /dev/null +++ b/deploy/node_modules/nan/nan_maybe_43_inl.h @@ -0,0 +1,337 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_MAYBE_43_INL_H_ +#define NAN_MAYBE_43_INL_H_ + +template +using MaybeLocal = v8::MaybeLocal; + +template +using Maybe = v8::Maybe; + +template +inline Maybe Nothing() { + return v8::Nothing(); +} + +template +inline Maybe Just(const T& t) { + return v8::Just(t); +} + +inline +MaybeLocal ToDetailString(v8::Local val) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(val->ToDetailString(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + +inline +MaybeLocal ToArrayIndex(v8::Local val) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(val->ToArrayIndex(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + +inline +Maybe Equals(v8::Local a, v8::Local(b)) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return a->Equals(isolate->GetCurrentContext(), b); +} + +inline +MaybeLocal NewInstance(v8::Local h) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(h->NewInstance(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + +inline +MaybeLocal NewInstance( + v8::Local h + , int argc + , v8::Local argv[]) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(h->NewInstance(isolate->GetCurrentContext(), argc, argv) + .FromMaybe(v8::Local())); +} + +inline +MaybeLocal NewInstance(v8::Local h) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(h->NewInstance(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + + +inline MaybeLocal GetFunction( + v8::Local t) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(t->GetFunction(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + +inline Maybe Set( + v8::Local obj + , v8::Local key + , v8::Local value) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->Set(isolate->GetCurrentContext(), key, value); +} + +inline Maybe Set( + v8::Local obj + , uint32_t index + , v8::Local value) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->Set(isolate->GetCurrentContext(), index, value); +} + +inline Maybe ForceSet( + v8::Local obj + , v8::Local key + , v8::Local value + , v8::PropertyAttribute attribs = v8::None) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->ForceSet(isolate->GetCurrentContext(), key, value, attribs); +} + +inline MaybeLocal Get( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(obj->Get(isolate->GetCurrentContext(), key) + .FromMaybe(v8::Local())); +} + +inline +MaybeLocal Get(v8::Local obj, uint32_t index) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(obj->Get(isolate->GetCurrentContext(), index) + .FromMaybe(v8::Local())); +} + +inline v8::PropertyAttribute GetPropertyAttributes( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->GetPropertyAttributes(isolate->GetCurrentContext(), key) + .FromJust(); +} + +inline Maybe Has( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->Has(isolate->GetCurrentContext(), key); +} + +inline Maybe Has(v8::Local obj, uint32_t index) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->Has(isolate->GetCurrentContext(), index); +} + +inline Maybe Delete( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->Delete(isolate->GetCurrentContext(), key); +} + +inline +Maybe Delete(v8::Local obj, uint32_t index) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->Delete(isolate->GetCurrentContext(), index); +} + +inline +MaybeLocal GetPropertyNames(v8::Local obj) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(obj->GetPropertyNames(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + +inline +MaybeLocal GetOwnPropertyNames(v8::Local obj) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(obj->GetOwnPropertyNames(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + +inline Maybe SetPrototype( + v8::Local obj + , v8::Local prototype) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->SetPrototype(isolate->GetCurrentContext(), prototype); +} + +inline MaybeLocal ObjectProtoToString( + v8::Local obj) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(obj->ObjectProtoToString(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + +inline Maybe HasOwnProperty( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->HasOwnProperty(isolate->GetCurrentContext(), key); +} + +inline Maybe HasRealNamedProperty( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->HasRealNamedProperty(isolate->GetCurrentContext(), key); +} + +inline Maybe HasRealIndexedProperty( + v8::Local obj + , uint32_t index) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->HasRealIndexedProperty(isolate->GetCurrentContext(), index); +} + +inline Maybe HasRealNamedCallbackProperty( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->HasRealNamedCallbackProperty(isolate->GetCurrentContext(), key); +} + +inline MaybeLocal GetRealNamedPropertyInPrototypeChain( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(obj->GetRealNamedPropertyInPrototypeChain( + isolate->GetCurrentContext(), key) + .FromMaybe(v8::Local())); +} + +inline MaybeLocal GetRealNamedProperty( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape( + obj->GetRealNamedProperty(isolate->GetCurrentContext(), key) + .FromMaybe(v8::Local())); +} + +inline MaybeLocal CallAsFunction( + v8::Local obj + , v8::Local recv + , int argc + , v8::Local argv[]) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape( + obj->CallAsFunction(isolate->GetCurrentContext(), recv, argc, argv) + .FromMaybe(v8::Local())); +} + +inline MaybeLocal CallAsConstructor( + v8::Local obj + , int argc, v8::Local argv[]) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape( + obj->CallAsConstructor(isolate->GetCurrentContext(), argc, argv) + .FromMaybe(v8::Local())); +} + +inline +MaybeLocal GetSourceLine(v8::Local msg) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(msg->GetSourceLine(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + +inline Maybe GetLineNumber(v8::Local msg) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return msg->GetLineNumber(isolate->GetCurrentContext()); +} + +inline Maybe GetStartColumn(v8::Local msg) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return msg->GetStartColumn(isolate->GetCurrentContext()); +} + +inline Maybe GetEndColumn(v8::Local msg) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return msg->GetEndColumn(isolate->GetCurrentContext()); +} + +inline MaybeLocal CloneElementAt( + v8::Local array + , uint32_t index) { +#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION) + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + v8::Local context = isolate->GetCurrentContext(); + v8::Local elem; + v8::Local obj; + if (!array->Get(context, index).ToLocal(&elem)) { + return scope.Escape(obj); + } + if (!elem->ToObject(context).ToLocal(&obj)) { + return scope.Escape(v8::Local()); + } + return scope.Escape(obj->Clone()); +#else + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(array->CloneElementAt(isolate->GetCurrentContext(), index) + .FromMaybe(v8::Local())); +#endif +} + +inline MaybeLocal Call( + v8::Local fun + , v8::Local recv + , int argc + , v8::Local argv[]) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(fun->Call(isolate->GetCurrentContext(), recv, argc, argv) + .FromMaybe(v8::Local())); +} + +#endif // NAN_MAYBE_43_INL_H_ diff --git a/deploy/node_modules/nan/nan_maybe_pre_43_inl.h b/deploy/node_modules/nan/nan_maybe_pre_43_inl.h new file mode 100644 index 0000000..f0248f9 --- /dev/null +++ b/deploy/node_modules/nan/nan_maybe_pre_43_inl.h @@ -0,0 +1,305 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_MAYBE_PRE_43_INL_H_ +#define NAN_MAYBE_PRE_43_INL_H_ + +template +class MaybeLocal { + public: + inline MaybeLocal() : val_(v8::Local()) {} + + template +# if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION + inline + MaybeLocal(v8::Local that) : val_(that) {} // NOLINT(runtime/explicit) +# else + inline + MaybeLocal(v8::Local that) : // NOLINT(runtime/explicit) + val_(*reinterpret_cast*>(&that)) {} +# endif + + inline bool IsEmpty() const { return val_.IsEmpty(); } + + template + inline bool ToLocal(v8::Local *out) const { + *out = val_; + return !IsEmpty(); + } + + inline v8::Local ToLocalChecked() const { +#if defined(V8_ENABLE_CHECKS) + assert(!IsEmpty() && "ToLocalChecked is Empty"); +#endif // V8_ENABLE_CHECKS + return val_; + } + + template + inline v8::Local FromMaybe(v8::Local default_value) const { + return IsEmpty() ? default_value : v8::Local(val_); + } + + private: + v8::Local val_; +}; + +template +class Maybe { + public: + inline bool IsNothing() const { return !has_value_; } + inline bool IsJust() const { return has_value_; } + + inline T FromJust() const { +#if defined(V8_ENABLE_CHECKS) + assert(IsJust() && "FromJust is Nothing"); +#endif // V8_ENABLE_CHECKS + return value_; + } + + inline T FromMaybe(const T& default_value) const { + return has_value_ ? value_ : default_value; + } + + inline bool operator==(const Maybe &other) const { + return (IsJust() == other.IsJust()) && + (!IsJust() || FromJust() == other.FromJust()); + } + + inline bool operator!=(const Maybe &other) const { + return !operator==(other); + } + + private: + Maybe() : has_value_(false) {} + explicit Maybe(const T& t) : has_value_(true), value_(t) {} + bool has_value_; + T value_; + + template + friend Maybe Nothing(); + template + friend Maybe Just(const U& u); +}; + +template +inline Maybe Nothing() { + return Maybe(); +} + +template +inline Maybe Just(const T& t) { + return Maybe(t); +} + +inline +MaybeLocal ToDetailString(v8::Handle val) { + return MaybeLocal(val->ToDetailString()); +} + +inline +MaybeLocal ToArrayIndex(v8::Handle val) { + return MaybeLocal(val->ToArrayIndex()); +} + +inline +Maybe Equals(v8::Handle a, v8::Handle(b)) { + return Just(a->Equals(b)); +} + +inline +MaybeLocal NewInstance(v8::Handle h) { + return MaybeLocal(h->NewInstance()); +} + +inline +MaybeLocal NewInstance( + v8::Local h + , int argc + , v8::Local argv[]) { + return MaybeLocal(h->NewInstance(argc, argv)); +} + +inline +MaybeLocal NewInstance(v8::Handle h) { + return MaybeLocal(h->NewInstance()); +} + +inline +MaybeLocal GetFunction(v8::Handle t) { + return MaybeLocal(t->GetFunction()); +} + +inline Maybe Set( + v8::Handle obj + , v8::Handle key + , v8::Handle value) { + return Just(obj->Set(key, value)); +} + +inline Maybe Set( + v8::Handle obj + , uint32_t index + , v8::Handle value) { + return Just(obj->Set(index, value)); +} + +inline Maybe ForceSet( + v8::Handle obj + , v8::Handle key + , v8::Handle value + , v8::PropertyAttribute attribs = v8::None) { + return Just(obj->ForceSet(key, value, attribs)); +} + +inline MaybeLocal Get( + v8::Handle obj + , v8::Handle key) { + return MaybeLocal(obj->Get(key)); +} + +inline MaybeLocal Get( + v8::Handle obj + , uint32_t index) { + return MaybeLocal(obj->Get(index)); +} + +inline Maybe GetPropertyAttributes( + v8::Handle obj + , v8::Handle key) { + return Just(obj->GetPropertyAttributes(key)); +} + +inline Maybe Has( + v8::Handle obj + , v8::Handle key) { + return Just(obj->Has(key)); +} + +inline Maybe Has( + v8::Handle obj + , uint32_t index) { + return Just(obj->Has(index)); +} + +inline Maybe Delete( + v8::Handle obj + , v8::Handle key) { + return Just(obj->Delete(key)); +} + +inline Maybe Delete( + v8::Handle obj + , uint32_t index) { + return Just(obj->Delete(index)); +} + +inline +MaybeLocal GetPropertyNames(v8::Handle obj) { + return MaybeLocal(obj->GetPropertyNames()); +} + +inline +MaybeLocal GetOwnPropertyNames(v8::Handle obj) { + return MaybeLocal(obj->GetOwnPropertyNames()); +} + +inline Maybe SetPrototype( + v8::Handle obj + , v8::Handle prototype) { + return Just(obj->SetPrototype(prototype)); +} + +inline MaybeLocal ObjectProtoToString( + v8::Handle obj) { + return MaybeLocal(obj->ObjectProtoToString()); +} + +inline Maybe HasOwnProperty( + v8::Handle obj + , v8::Handle key) { + return Just(obj->HasOwnProperty(key)); +} + +inline Maybe HasRealNamedProperty( + v8::Handle obj + , v8::Handle key) { + return Just(obj->HasRealNamedProperty(key)); +} + +inline Maybe HasRealIndexedProperty( + v8::Handle obj + , uint32_t index) { + return Just(obj->HasRealIndexedProperty(index)); +} + +inline Maybe HasRealNamedCallbackProperty( + v8::Handle obj + , v8::Handle key) { + return Just(obj->HasRealNamedCallbackProperty(key)); +} + +inline MaybeLocal GetRealNamedPropertyInPrototypeChain( + v8::Handle obj + , v8::Handle key) { + return MaybeLocal( + obj->GetRealNamedPropertyInPrototypeChain(key)); +} + +inline MaybeLocal GetRealNamedProperty( + v8::Handle obj + , v8::Handle key) { + return MaybeLocal(obj->GetRealNamedProperty(key)); +} + +inline MaybeLocal CallAsFunction( + v8::Handle obj + , v8::Handle recv + , int argc + , v8::Handle argv[]) { + return MaybeLocal(obj->CallAsFunction(recv, argc, argv)); +} + +inline MaybeLocal CallAsConstructor( + v8::Handle obj + , int argc + , v8::Local argv[]) { + return MaybeLocal(obj->CallAsConstructor(argc, argv)); +} + +inline +MaybeLocal GetSourceLine(v8::Handle msg) { + return MaybeLocal(msg->GetSourceLine()); +} + +inline Maybe GetLineNumber(v8::Handle msg) { + return Just(msg->GetLineNumber()); +} + +inline Maybe GetStartColumn(v8::Handle msg) { + return Just(msg->GetStartColumn()); +} + +inline Maybe GetEndColumn(v8::Handle msg) { + return Just(msg->GetEndColumn()); +} + +inline MaybeLocal CloneElementAt( + v8::Handle array + , uint32_t index) { + return MaybeLocal(array->CloneElementAt(index)); +} + +inline MaybeLocal Call( + v8::Local fun + , v8::Local recv + , int argc + , v8::Local argv[]) { + return MaybeLocal(fun->Call(recv, argc, argv)); +} + +#endif // NAN_MAYBE_PRE_43_INL_H_ diff --git a/deploy/node_modules/nan/nan_new.h b/deploy/node_modules/nan/nan_new.h new file mode 100644 index 0000000..628f40c --- /dev/null +++ b/deploy/node_modules/nan/nan_new.h @@ -0,0 +1,340 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_NEW_H_ +#define NAN_NEW_H_ + +namespace imp { // scnr + +// TODO(agnat): Generalize +template v8::Local To(v8::Local i); + +template <> +inline +v8::Local +To(v8::Local i) { + return Nan::To(i).ToLocalChecked(); +} + +template <> +inline +v8::Local +To(v8::Local i) { + return Nan::To(i).ToLocalChecked(); +} + +template <> +inline +v8::Local +To(v8::Local i) { + return Nan::To(i).ToLocalChecked(); +} + +template struct FactoryBase { + typedef v8::Local return_t; +}; + +template struct MaybeFactoryBase { + typedef MaybeLocal return_t; +}; + +template struct Factory; + +template <> +struct Factory : FactoryBase { + static inline return_t New(); + static inline return_t New(int length); +}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(bool value); +}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(bool value); +}; + +template <> +struct Factory : FactoryBase { + static inline + return_t + New( v8::ExtensionConfiguration* extensions = NULL + , v8::Local tmpl = v8::Local() + , v8::Local obj = v8::Local()); +}; + +template <> +struct Factory : MaybeFactoryBase { + static inline return_t New(double value); +}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(void *value); +}; + +template <> +struct Factory : FactoryBase { + static inline + return_t + New( FunctionCallback callback + , v8::Local data = v8::Local()); +}; + +template <> +struct Factory : FactoryBase { + static inline + return_t + New( FunctionCallback callback = NULL + , v8::Local data = v8::Local() + , v8::Local signature = v8::Local()); +}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(double value); +}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(double value); +}; + +template +struct IntegerFactory : FactoryBase { + typedef typename FactoryBase::return_t return_t; + static inline return_t New(int32_t value); + static inline return_t New(uint32_t value); +}; + +template <> +struct Factory : IntegerFactory {}; + +template <> +struct Factory : IntegerFactory {}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(int32_t value); + static inline return_t New(uint32_t value); +}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(); +}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(); +}; + +template <> +struct Factory : MaybeFactoryBase { + static inline return_t New( + v8::Local pattern, v8::RegExp::Flags flags); +}; + +template <> +struct Factory : MaybeFactoryBase { + static inline return_t New( v8::Local source); + static inline return_t New( v8::Local source + , v8::ScriptOrigin const& origin); +}; + +template <> +struct Factory : FactoryBase { + typedef v8::Local FTH; + static inline return_t New(FTH receiver = FTH()); +}; + +template <> +struct Factory : MaybeFactoryBase { + static inline return_t New(); + static inline return_t New(const char *value, int length = -1); + static inline return_t New(const uint16_t *value, int length = -1); + static inline return_t New(std::string const& value); + + static inline return_t New(v8::String::ExternalStringResource * value); + static inline return_t New(ExternalOneByteStringResource * value); +}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(v8::Local value); +}; + +} // end of namespace imp + +#if (NODE_MODULE_VERSION >= 12) + +namespace imp { + +template <> +struct Factory : MaybeFactoryBase { + static inline return_t New( v8::Local source); + static inline return_t New( v8::Local source + , v8::ScriptOrigin const& origin); +}; + +} // end of namespace imp + +# include "nan_implementation_12_inl.h" + +#else // NODE_MODULE_VERSION >= 12 + +# include "nan_implementation_pre_12_inl.h" + +#endif + +//=== API ====================================================================== + +template +typename imp::Factory::return_t +New() { + return imp::Factory::New(); +} + +template +typename imp::Factory::return_t +New(A0 arg0) { + return imp::Factory::New(arg0); +} + +template +typename imp::Factory::return_t +New(A0 arg0, A1 arg1) { + return imp::Factory::New(arg0, arg1); +} + +template +typename imp::Factory::return_t +New(A0 arg0, A1 arg1, A2 arg2) { + return imp::Factory::New(arg0, arg1, arg2); +} + +template +typename imp::Factory::return_t +New(A0 arg0, A1 arg1, A2 arg2, A3 arg3) { + return imp::Factory::New(arg0, arg1, arg2, arg3); +} + +// Note(agnat): When passing overloaded function pointers to template functions +// as generic arguments the compiler needs help in picking the right overload. +// These two functions handle New and New with +// all argument variations. + +// v8::Function and v8::FunctionTemplate with one or two arguments +template +typename imp::Factory::return_t +New( FunctionCallback callback + , v8::Local data = v8::Local()) { + return imp::Factory::New(callback, data); +} + +// v8::Function and v8::FunctionTemplate with three arguments +template +typename imp::Factory::return_t +New( FunctionCallback callback + , v8::Local data = v8::Local() + , A2 a2 = A2()) { + return imp::Factory::New(callback, data, a2); +} + +// Convenience + +#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION +template inline v8::Local New(v8::Handle h); +#endif + +#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION +template + inline v8::Local New(v8::Persistent const& p); +#else +template inline v8::Local New(v8::Persistent const& p); +#endif +template +inline v8::Local New(Persistent const& p); +template +inline v8::Local New(Global const& p); + +inline +imp::Factory::return_t +New(bool value) { + return New(value); +} + +inline +imp::Factory::return_t +New(int32_t value) { + return New(value); +} + +inline +imp::Factory::return_t +New(uint32_t value) { + return New(value); +} + +inline +imp::Factory::return_t +New(double value) { + return New(value); +} + +inline +imp::Factory::return_t +New(std::string const& value) { // NOLINT(build/include_what_you_use) + return New(value); +} + +inline +imp::Factory::return_t +New(const char * value, int length) { + return New(value, length); +} + +inline +imp::Factory::return_t +New(const uint16_t * value, int length) { + return New(value, length); +} + +inline +imp::Factory::return_t +New(const char * value) { + return New(value); +} + +inline +imp::Factory::return_t +New(const uint16_t * value) { + return New(value); +} + +inline +imp::Factory::return_t +New(v8::String::ExternalStringResource * value) { + return New(value); +} + +inline +imp::Factory::return_t +New(ExternalOneByteStringResource * value) { + return New(value); +} + +inline +imp::Factory::return_t +New(v8::Local pattern, v8::RegExp::Flags flags) { + return New(pattern, flags); +} + +#endif // NAN_NEW_H_ diff --git a/deploy/node_modules/nan/nan_object_wrap.h b/deploy/node_modules/nan/nan_object_wrap.h new file mode 100644 index 0000000..28281b0 --- /dev/null +++ b/deploy/node_modules/nan/nan_object_wrap.h @@ -0,0 +1,155 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_OBJECT_WRAP_H_ +#define NAN_OBJECT_WRAP_H_ + +class ObjectWrap { + public: + ObjectWrap() { + refs_ = 0; + } + + + virtual ~ObjectWrap() { + if (persistent().IsEmpty()) { + return; + } + + assert(persistent().IsNearDeath()); + persistent().ClearWeak(); + persistent().Reset(); + } + + + template + static inline T* Unwrap(v8::Local object) { + assert(!object.IsEmpty()); + assert(object->InternalFieldCount() > 0); + // Cast to ObjectWrap before casting to T. A direct cast from void + // to T won't work right when T has more than one base class. + void* ptr = GetInternalFieldPointer(object, 0); + ObjectWrap* wrap = static_cast(ptr); + return static_cast(wrap); + } + + + inline v8::Local handle() const { + return New(handle_); + } + + + inline Persistent& persistent() { + return handle_; + } + + + protected: + inline void Wrap(v8::Local object) { + assert(persistent().IsEmpty()); + assert(object->InternalFieldCount() > 0); + SetInternalFieldPointer(object, 0, this); + persistent().Reset(object); + MakeWeak(); + } + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + + inline void MakeWeak() { + persistent().v8::PersistentBase::SetWeak( + this, WeakCallback, v8::WeakCallbackType::kParameter); + persistent().MarkIndependent(); + } + +#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + + inline void MakeWeak() { + persistent().v8::PersistentBase::SetWeak(this, WeakCallback); + persistent().MarkIndependent(); + } + +#else + + inline void MakeWeak() { + persistent().persistent.MakeWeak(this, WeakCallback); + persistent().MarkIndependent(); + } + +#endif + + /* Ref() marks the object as being attached to an event loop. + * Refed objects will not be garbage collected, even if + * all references are lost. + */ + virtual void Ref() { + assert(!persistent().IsEmpty()); + persistent().ClearWeak(); + refs_++; + } + + /* Unref() marks an object as detached from the event loop. This is its + * default state. When an object with a "weak" reference changes from + * attached to detached state it will be freed. Be careful not to access + * the object after making this call as it might be gone! + * (A "weak reference" means an object that only has a + * persistant handle.) + * + * DO NOT CALL THIS FROM DESTRUCTOR + */ + virtual void Unref() { + assert(!persistent().IsEmpty()); + assert(!persistent().IsWeak()); + assert(refs_ > 0); + if (--refs_ == 0) + MakeWeak(); + } + + int refs_; // ro + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(ObjectWrap) +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + + static void + WeakCallback(v8::WeakCallbackInfo const& info) { + ObjectWrap* wrap = info.GetParameter(); + assert(wrap->refs_ == 0); + assert(wrap->handle_.IsNearDeath()); + wrap->handle_.Reset(); + delete wrap; + } + +#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + + static void + WeakCallback(v8::WeakCallbackData const& data) { + ObjectWrap* wrap = data.GetParameter(); + assert(wrap->refs_ == 0); + assert(wrap->handle_.IsNearDeath()); + wrap->handle_.Reset(); + delete wrap; + } + +#else + + static void WeakCallback(v8::Persistent value, void *data) { + ObjectWrap *wrap = static_cast(data); + assert(wrap->refs_ == 0); + assert(wrap->handle_.IsNearDeath()); + wrap->handle_.Reset(); + delete wrap; + } + +#endif + Persistent handle_; +}; + + +#endif // NAN_OBJECT_WRAP_H_ diff --git a/deploy/node_modules/nan/nan_persistent_12_inl.h b/deploy/node_modules/nan/nan_persistent_12_inl.h new file mode 100644 index 0000000..a23d899 --- /dev/null +++ b/deploy/node_modules/nan/nan_persistent_12_inl.h @@ -0,0 +1,132 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_PERSISTENT_12_INL_H_ +#define NAN_PERSISTENT_12_INL_H_ + +template class Persistent : + public v8::Persistent { + public: + inline Persistent() : v8::Persistent() {} + + template inline Persistent(v8::Local that) : + v8::Persistent(v8::Isolate::GetCurrent(), that) {} + + template + inline + Persistent(const v8::Persistent &that) : // NOLINT(runtime/explicit) + v8::Persistent(v8::Isolate::GetCurrent(), that) {} + + inline void Reset() { v8::PersistentBase::Reset(); } + + template + inline void Reset(const v8::Local &other) { + v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); + } + + template + inline void Reset(const v8::PersistentBase &other) { + v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); + } + + template + inline void SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type); + + private: + inline T *operator*() const { return *PersistentBase::persistent; } + + template + inline void Copy(const Persistent &that) { + TYPE_CHECK(T, S); + + this->Reset(); + + if (!that.IsEmpty()) { + this->Reset(that); + M::Copy(that, this); + } + } +}; + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +template +class Global : public v8::Global { + public: + inline Global() : v8::Global() {} + + template inline Global(v8::Local that) : + v8::Global(v8::Isolate::GetCurrent(), that) {} + + template + inline + Global(const v8::PersistentBase &that) : // NOLINT(runtime/explicit) + v8::Global(v8::Isolate::GetCurrent(), that) {} + + inline void Reset() { v8::PersistentBase::Reset(); } + + template + inline void Reset(const v8::Local &other) { + v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); + } + + template + inline void Reset(const v8::PersistentBase &other) { + v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); + } + + template + inline void SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type) { + reinterpret_cast*>(this)->SetWeak( + parameter, callback, type); + } +}; +#else +template +class Global : public v8::UniquePersistent { + public: + inline Global() : v8::UniquePersistent() {} + + template inline Global(v8::Local that) : + v8::UniquePersistent(v8::Isolate::GetCurrent(), that) {} + + template + inline + Global(const v8::PersistentBase &that) : // NOLINT(runtime/explicit) + v8::UniquePersistent(v8::Isolate::GetCurrent(), that) {} + + inline void Reset() { v8::PersistentBase::Reset(); } + + template + inline void Reset(const v8::Local &other) { + v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); + } + + template + inline void Reset(const v8::PersistentBase &other) { + v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); + } + + template + inline void SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type) { + reinterpret_cast*>(this)->SetWeak( + parameter, callback, type); + } +}; +#endif + +#endif // NAN_PERSISTENT_12_INL_H_ diff --git a/deploy/node_modules/nan/nan_persistent_pre_12_inl.h b/deploy/node_modules/nan/nan_persistent_pre_12_inl.h new file mode 100644 index 0000000..f915746 --- /dev/null +++ b/deploy/node_modules/nan/nan_persistent_pre_12_inl.h @@ -0,0 +1,242 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_PERSISTENT_PRE_12_INL_H_ +#define NAN_PERSISTENT_PRE_12_INL_H_ + +template +class PersistentBase { + v8::Persistent persistent; + template + friend v8::Local New(const PersistentBase &p); + template + friend v8::Local New(const Persistent &p); + template + friend v8::Local New(const Global &p); + template friend class ReturnValue; + + public: + inline PersistentBase() : + persistent() {} + + inline void Reset() { + persistent.Dispose(); + persistent.Clear(); + } + + template + inline void Reset(const v8::Local &other) { + TYPE_CHECK(T, S); + + if (!persistent.IsEmpty()) { + persistent.Dispose(); + } + + if (other.IsEmpty()) { + persistent.Clear(); + } else { + persistent = v8::Persistent::New(other); + } + } + + template + inline void Reset(const PersistentBase &other) { + TYPE_CHECK(T, S); + + if (!persistent.IsEmpty()) { + persistent.Dispose(); + } + + if (other.IsEmpty()) { + persistent.Clear(); + } else { + persistent = v8::Persistent::New(other.persistent); + } + } + + inline bool IsEmpty() const { return persistent.IsEmpty(); } + + inline void Empty() { persistent.Clear(); } + + template + inline bool operator==(const PersistentBase &that) const { + return this->persistent == that.persistent; + } + + template + inline bool operator==(const v8::Local &that) const { + return this->persistent == that; + } + + template + inline bool operator!=(const PersistentBase &that) const { + return !operator==(that); + } + + template + inline bool operator!=(const v8::Local &that) const { + return !operator==(that); + } + + template + inline void SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type); + + inline void ClearWeak() { persistent.ClearWeak(); } + + inline void MarkIndependent() { persistent.MarkIndependent(); } + + inline bool IsIndependent() const { return persistent.IsIndependent(); } + + inline bool IsNearDeath() const { return persistent.IsNearDeath(); } + + inline bool IsWeak() const { return persistent.IsWeak(); } + + private: + inline explicit PersistentBase(v8::Persistent that) : + persistent(that) { } + inline explicit PersistentBase(T *val) : persistent(val) {} + template friend class Persistent; + template friend class Global; + friend class ObjectWrap; +}; + +template +class NonCopyablePersistentTraits { + public: + typedef Persistent > + NonCopyablePersistent; + static const bool kResetInDestructor = false; + template + inline static void Copy(const Persistent &source, + NonCopyablePersistent *dest) { + Uncompilable(); + } + + template inline static void Uncompilable() { + TYPE_CHECK(O, v8::Primitive); + } +}; + +template +struct CopyablePersistentTraits { + typedef Persistent > CopyablePersistent; + static const bool kResetInDestructor = true; + template + static inline void Copy(const Persistent &source, + CopyablePersistent *dest) {} +}; + +template class Persistent : + public PersistentBase { + public: + inline Persistent() {} + + template inline Persistent(v8::Handle that) + : PersistentBase(v8::Persistent::New(that)) { + TYPE_CHECK(T, S); + } + + inline Persistent(const Persistent &that) : PersistentBase() { + Copy(that); + } + + template + inline Persistent(const Persistent &that) : + PersistentBase() { + Copy(that); + } + + inline Persistent &operator=(const Persistent &that) { + Copy(that); + return *this; + } + + template + inline Persistent &operator=(const Persistent &that) { + Copy(that); + return *this; + } + + inline ~Persistent() { + if (M::kResetInDestructor) this->Reset(); + } + + private: + inline T *operator*() const { return *PersistentBase::persistent; } + + template + inline void Copy(const Persistent &that) { + TYPE_CHECK(T, S); + + this->Reset(); + + if (!that.IsEmpty()) { + this->persistent = v8::Persistent::New(that.persistent); + M::Copy(that, this); + } + } +}; + +template +class Global : public PersistentBase { + struct RValue { + inline explicit RValue(Global* obj) : object(obj) {} + Global* object; + }; + + public: + inline Global() : PersistentBase(0) { } + + template + inline Global(v8::Local that) // NOLINT(runtime/explicit) + : PersistentBase(v8::Persistent::New(that)) { + TYPE_CHECK(T, S); + } + + template + inline Global(const PersistentBase &that) // NOLINT(runtime/explicit) + : PersistentBase(that) { + TYPE_CHECK(T, S); + } + /** + * Move constructor. + */ + inline Global(RValue rvalue) // NOLINT(runtime/explicit) + : PersistentBase(rvalue.object->persistent) { + rvalue.object->Reset(); + } + inline ~Global() { this->Reset(); } + /** + * Move via assignment. + */ + template + inline Global &operator=(Global rhs) { + TYPE_CHECK(T, S); + this->Reset(rhs.persistent); + rhs.Reset(); + return *this; + } + /** + * Cast operator for moves. + */ + inline operator RValue() { return RValue(this); } + /** + * Pass allows returning uniques from functions, etc. + */ + Global Pass() { return Global(RValue(this)); } + + private: + Global(Global &); + void operator=(Global &); + template friend class ReturnValue; +}; + +#endif // NAN_PERSISTENT_PRE_12_INL_H_ diff --git a/deploy/node_modules/nan/nan_private.h b/deploy/node_modules/nan/nan_private.h new file mode 100644 index 0000000..03082cd --- /dev/null +++ b/deploy/node_modules/nan/nan_private.h @@ -0,0 +1,73 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_PRIVATE_H_ +#define NAN_PRIVATE_H_ + +inline Maybe +HasPrivate(v8::Local object, v8::Local key) { + HandleScope scope; +#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::Local context = isolate->GetCurrentContext(); + v8::Local private_key = v8::Private::ForApi(isolate, key); + return object->HasPrivate(context, private_key); +#else + return Just(!object->GetHiddenValue(key).IsEmpty()); +#endif +} + +inline MaybeLocal +GetPrivate(v8::Local object, v8::Local key) { +#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + v8::Local context = isolate->GetCurrentContext(); + v8::Local private_key = v8::Private::ForApi(isolate, key); + v8::MaybeLocal v = object->GetPrivate(context, private_key); + return scope.Escape(v.ToLocalChecked()); +#else + EscapableHandleScope scope; + v8::Local v = object->GetHiddenValue(key); + if (v.IsEmpty()) { + v = Undefined(); + } + return scope.Escape(v); +#endif +} + +inline Maybe SetPrivate( + v8::Local object, + v8::Local key, + v8::Local value) { +#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION + HandleScope scope; + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::Local context = isolate->GetCurrentContext(); + v8::Local private_key = v8::Private::ForApi(isolate, key); + return object->SetPrivate(context, private_key, value); +#else + return Just(object->SetHiddenValue(key, value)); +#endif +} + +inline Maybe DeletePrivate( + v8::Local object, + v8::Local key) { +#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION + HandleScope scope; + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::Local private_key = v8::Private::ForApi(isolate, key); + return object->DeletePrivate(isolate->GetCurrentContext(), private_key); +#else + return Just(object->DeleteHiddenValue(key)); +#endif +} + +#endif // NAN_PRIVATE_H_ + diff --git a/deploy/node_modules/nan/nan_string_bytes.h b/deploy/node_modules/nan/nan_string_bytes.h new file mode 100644 index 0000000..a2e6437 --- /dev/null +++ b/deploy/node_modules/nan/nan_string_bytes.h @@ -0,0 +1,305 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef NAN_STRING_BYTES_H_ +#define NAN_STRING_BYTES_H_ + +// Decodes a v8::Local or Buffer to a raw char* + +namespace imp { + +using v8::Local; +using v8::Object; +using v8::String; +using v8::Value; + + +//// Base 64 //// + +#define base64_encoded_size(size) ((size + 2 - ((size + 2) % 3)) / 3 * 4) + + + +//// HEX //// + +static bool contains_non_ascii_slow(const char* buf, size_t len) { + for (size_t i = 0; i < len; ++i) { + if (buf[i] & 0x80) return true; + } + return false; +} + + +static bool contains_non_ascii(const char* src, size_t len) { + if (len < 16) { + return contains_non_ascii_slow(src, len); + } + + const unsigned bytes_per_word = sizeof(void*); + const unsigned align_mask = bytes_per_word - 1; + const unsigned unaligned = reinterpret_cast(src) & align_mask; + + if (unaligned > 0) { + const unsigned n = bytes_per_word - unaligned; + if (contains_non_ascii_slow(src, n)) return true; + src += n; + len -= n; + } + + +#if defined(__x86_64__) || defined(_WIN64) + const uintptr_t mask = 0x8080808080808080ll; +#else + const uintptr_t mask = 0x80808080l; +#endif + + const uintptr_t* srcw = reinterpret_cast(src); + + for (size_t i = 0, n = len / bytes_per_word; i < n; ++i) { + if (srcw[i] & mask) return true; + } + + const unsigned remainder = len & align_mask; + if (remainder > 0) { + const size_t offset = len - remainder; + if (contains_non_ascii_slow(src + offset, remainder)) return true; + } + + return false; +} + + +static void force_ascii_slow(const char* src, char* dst, size_t len) { + for (size_t i = 0; i < len; ++i) { + dst[i] = src[i] & 0x7f; + } +} + + +static void force_ascii(const char* src, char* dst, size_t len) { + if (len < 16) { + force_ascii_slow(src, dst, len); + return; + } + + const unsigned bytes_per_word = sizeof(void*); + const unsigned align_mask = bytes_per_word - 1; + const unsigned src_unalign = reinterpret_cast(src) & align_mask; + const unsigned dst_unalign = reinterpret_cast(dst) & align_mask; + + if (src_unalign > 0) { + if (src_unalign == dst_unalign) { + const unsigned unalign = bytes_per_word - src_unalign; + force_ascii_slow(src, dst, unalign); + src += unalign; + dst += unalign; + len -= src_unalign; + } else { + force_ascii_slow(src, dst, len); + return; + } + } + +#if defined(__x86_64__) || defined(_WIN64) + const uintptr_t mask = ~0x8080808080808080ll; +#else + const uintptr_t mask = ~0x80808080l; +#endif + + const uintptr_t* srcw = reinterpret_cast(src); + uintptr_t* dstw = reinterpret_cast(dst); + + for (size_t i = 0, n = len / bytes_per_word; i < n; ++i) { + dstw[i] = srcw[i] & mask; + } + + const unsigned remainder = len & align_mask; + if (remainder > 0) { + const size_t offset = len - remainder; + force_ascii_slow(src + offset, dst + offset, remainder); + } +} + + +static size_t base64_encode(const char* src, + size_t slen, + char* dst, + size_t dlen) { + // We know how much we'll write, just make sure that there's space. + assert(dlen >= base64_encoded_size(slen) && + "not enough space provided for base64 encode"); + + dlen = base64_encoded_size(slen); + + unsigned a; + unsigned b; + unsigned c; + unsigned i; + unsigned k; + unsigned n; + + static const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + + i = 0; + k = 0; + n = slen / 3 * 3; + + while (i < n) { + a = src[i + 0] & 0xff; + b = src[i + 1] & 0xff; + c = src[i + 2] & 0xff; + + dst[k + 0] = table[a >> 2]; + dst[k + 1] = table[((a & 3) << 4) | (b >> 4)]; + dst[k + 2] = table[((b & 0x0f) << 2) | (c >> 6)]; + dst[k + 3] = table[c & 0x3f]; + + i += 3; + k += 4; + } + + if (n != slen) { + switch (slen - n) { + case 1: + a = src[i + 0] & 0xff; + dst[k + 0] = table[a >> 2]; + dst[k + 1] = table[(a & 3) << 4]; + dst[k + 2] = '='; + dst[k + 3] = '='; + break; + + case 2: + a = src[i + 0] & 0xff; + b = src[i + 1] & 0xff; + dst[k + 0] = table[a >> 2]; + dst[k + 1] = table[((a & 3) << 4) | (b >> 4)]; + dst[k + 2] = table[(b & 0x0f) << 2]; + dst[k + 3] = '='; + break; + } + } + + return dlen; +} + + +static size_t hex_encode(const char* src, size_t slen, char* dst, size_t dlen) { + // We know how much we'll write, just make sure that there's space. + assert(dlen >= slen * 2 && + "not enough space provided for hex encode"); + + dlen = slen * 2; + for (uint32_t i = 0, k = 0; k < dlen; i += 1, k += 2) { + static const char hex[] = "0123456789abcdef"; + uint8_t val = static_cast(src[i]); + dst[k + 0] = hex[val >> 4]; + dst[k + 1] = hex[val & 15]; + } + + return dlen; +} + + + +static Local Encode(const char* buf, + size_t buflen, + enum Encoding encoding) { + assert(buflen <= node::Buffer::kMaxLength); + if (!buflen && encoding != BUFFER) + return New("").ToLocalChecked(); + + Local val; + switch (encoding) { + case BUFFER: + return CopyBuffer(buf, buflen).ToLocalChecked(); + + case ASCII: + if (contains_non_ascii(buf, buflen)) { + char* out = new char[buflen]; + force_ascii(buf, out, buflen); + val = New(out, buflen).ToLocalChecked(); + delete[] out; + } else { + val = New(buf, buflen).ToLocalChecked(); + } + break; + + case UTF8: + val = New(buf, buflen).ToLocalChecked(); + break; + + case BINARY: { + // TODO(isaacs) use ExternalTwoByteString? + const unsigned char *cbuf = reinterpret_cast(buf); + uint16_t * twobytebuf = new uint16_t[buflen]; + for (size_t i = 0; i < buflen; i++) { + // XXX is the following line platform independent? + twobytebuf[i] = cbuf[i]; + } + val = New(twobytebuf, buflen).ToLocalChecked(); + delete[] twobytebuf; + break; + } + + case BASE64: { + size_t dlen = base64_encoded_size(buflen); + char* dst = new char[dlen]; + + size_t written = base64_encode(buf, buflen, dst, dlen); + assert(written == dlen); + + val = New(dst, dlen).ToLocalChecked(); + delete[] dst; + break; + } + + case UCS2: { + const uint16_t* data = reinterpret_cast(buf); + val = New(data, buflen / 2).ToLocalChecked(); + break; + } + + case HEX: { + size_t dlen = buflen * 2; + char* dst = new char[dlen]; + size_t written = hex_encode(buf, buflen, dst, dlen); + assert(written == dlen); + + val = New(dst, dlen).ToLocalChecked(); + delete[] dst; + break; + } + + default: + assert(0 && "unknown encoding"); + break; + } + + return val; +} + +#undef base64_encoded_size + +} // end of namespace imp + +#endif // NAN_STRING_BYTES_H_ diff --git a/deploy/node_modules/nan/nan_typedarray_contents.h b/deploy/node_modules/nan/nan_typedarray_contents.h new file mode 100644 index 0000000..17c9681 --- /dev/null +++ b/deploy/node_modules/nan/nan_typedarray_contents.h @@ -0,0 +1,90 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_TYPEDARRAY_CONTENTS_H_ +#define NAN_TYPEDARRAY_CONTENTS_H_ + +template +class TypedArrayContents { + public: + inline explicit TypedArrayContents(v8::Local from) : + length_(0), data_(NULL) { + HandleScope scope; + + size_t length = 0; + void* data = NULL; + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + + if (from->IsArrayBufferView()) { + v8::Local array = + v8::Local::Cast(from); + + const size_t byte_length = array->ByteLength(); + const ptrdiff_t byte_offset = array->ByteOffset(); + v8::Local buffer = array->Buffer(); + + length = byte_length / sizeof(T); + data = static_cast(buffer->GetContents().Data()) + byte_offset; + } + +#else + + if (from->IsObject() && !from->IsNull()) { + v8::Local array = v8::Local::Cast(from); + + MaybeLocal buffer = Get(array, + New("buffer").ToLocalChecked()); + MaybeLocal byte_length = Get(array, + New("byteLength").ToLocalChecked()); + MaybeLocal byte_offset = Get(array, + New("byteOffset").ToLocalChecked()); + + if (!buffer.IsEmpty() && + !byte_length.IsEmpty() && byte_length.ToLocalChecked()->IsUint32() && + !byte_offset.IsEmpty() && byte_offset.ToLocalChecked()->IsUint32()) { + data = array->GetIndexedPropertiesExternalArrayData(); + if(data) { + length = byte_length.ToLocalChecked()->Uint32Value() / sizeof(T); + } + } + } + +#endif + +#if defined(_MSC_VER) && _MSC_VER >= 1900 || __cplusplus >= 201103L + assert(reinterpret_cast(data) % alignof (T) == 0); +#elif defined(_MSC_VER) && _MSC_VER >= 1600 || defined(__GNUC__) + assert(reinterpret_cast(data) % __alignof(T) == 0); +#else + assert(reinterpret_cast(data) % sizeof (T) == 0); +#endif + + length_ = length; + data_ = static_cast(data); + } + + inline size_t length() const { return length_; } + inline T* operator*() { return data_; } + inline const T* operator*() const { return data_; } + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(TypedArrayContents) + + //Disable heap allocation + void *operator new(size_t size); + void operator delete(void *, size_t) { + abort(); + } + + size_t length_; + T* data_; +}; + +#endif // NAN_TYPEDARRAY_CONTENTS_H_ diff --git a/deploy/node_modules/nan/nan_weak.h b/deploy/node_modules/nan/nan_weak.h new file mode 100644 index 0000000..3f2d569 --- /dev/null +++ b/deploy/node_modules/nan/nan_weak.h @@ -0,0 +1,432 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_WEAK_H_ +#define NAN_WEAK_H_ + +static const int kInternalFieldsInWeakCallback = 2; +static const int kNoInternalFieldIndex = -1; + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \ + v8::WeakCallbackInfo > const& +# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \ + NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ +# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ +# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ +#elif NODE_MODULE_VERSION > IOJS_1_1_MODULE_VERSION +# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \ + v8::PhantomCallbackData > const& +# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \ + NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ +# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ +# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ +#elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION +# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \ + v8::PhantomCallbackData > const& +# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \ + v8::InternalFieldsCallbackData, void> const& +# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ +# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ +#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION +# define NAN_WEAK_CALLBACK_DATA_TYPE_ \ + v8::WeakCallbackData > const& +# define NAN_WEAK_CALLBACK_SIG_ NAN_WEAK_CALLBACK_DATA_TYPE_ +#else +# define NAN_WEAK_CALLBACK_DATA_TYPE_ void * +# define NAN_WEAK_CALLBACK_SIG_ \ + v8::Persistent, NAN_WEAK_CALLBACK_DATA_TYPE_ +#endif + +template +class WeakCallbackInfo { + public: + typedef void (*Callback)(const WeakCallbackInfo& data); + WeakCallbackInfo( + Persistent *persistent + , Callback callback + , void *parameter + , void *field1 = 0 + , void *field2 = 0) : + callback_(callback), isolate_(0), parameter_(parameter) { + std::memcpy(&persistent_, persistent, sizeof (v8::Persistent)); + internal_fields_[0] = field1; + internal_fields_[1] = field2; + } + inline v8::Isolate *GetIsolate() const { return isolate_; } + inline T *GetParameter() const { return static_cast(parameter_); } + inline void *GetInternalField(int index) const { + assert((index == 0 || index == 1) && "internal field index out of bounds"); + if (index == 0) { + return internal_fields_[0]; + } else { + return internal_fields_[1]; + } + } + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(WeakCallbackInfo) + Callback callback_; + v8::Isolate *isolate_; + void *parameter_; + void *internal_fields_[kInternalFieldsInWeakCallback]; + v8::Persistent persistent_; + template friend class Persistent; + template friend class PersistentBase; +#if NODE_MODULE_VERSION <= NODE_0_12_MODULE_VERSION +# if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + template + static void invoke(NAN_WEAK_CALLBACK_SIG_ data); + template + static WeakCallbackInfo *unwrap(NAN_WEAK_CALLBACK_DATA_TYPE_ data); +# else + static void invoke(NAN_WEAK_CALLBACK_SIG_ data); + static WeakCallbackInfo *unwrap(NAN_WEAK_CALLBACK_DATA_TYPE_ data); +# endif +#else +# if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + template + static void invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data); + template + static void invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data); +# else + static void invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data); + static void invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data); +# endif + static WeakCallbackInfo *unwrapparameter( + NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data); + static WeakCallbackInfo *unwraptwofield( + NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data); +#endif +}; + + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + +template +template +void +WeakCallbackInfo::invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data) { + WeakCallbackInfo *cbinfo = unwrapparameter(data); + if (isFirstPass) { + cbinfo->persistent_.Reset(); + data.SetSecondPassCallback(invokeparameter); + } else { + cbinfo->callback_(*cbinfo); + delete cbinfo; + } +} + +template +template +void +WeakCallbackInfo::invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data) { + WeakCallbackInfo *cbinfo = unwraptwofield(data); + if (isFirstPass) { + cbinfo->persistent_.Reset(); + data.SetSecondPassCallback(invoketwofield); + } else { + cbinfo->callback_(*cbinfo); + delete cbinfo; + } +} + +template +WeakCallbackInfo *WeakCallbackInfo::unwrapparameter( + NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data) { + WeakCallbackInfo *cbinfo = + static_cast*>(data.GetParameter()); + cbinfo->isolate_ = data.GetIsolate(); + return cbinfo; +} + +template +WeakCallbackInfo *WeakCallbackInfo::unwraptwofield( + NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data) { + WeakCallbackInfo *cbinfo = + static_cast*>(data.GetInternalField(0)); + cbinfo->isolate_ = data.GetIsolate(); + return cbinfo; +} + +#undef NAN_WEAK_PARAMETER_CALLBACK_SIG_ +#undef NAN_WEAK_TWOFIELD_CALLBACK_SIG_ +#undef NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ +#undef NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ +# elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION + +template +void +WeakCallbackInfo::invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data) { + WeakCallbackInfo *cbinfo = unwrapparameter(data); + cbinfo->persistent_.Reset(); + cbinfo->callback_(*cbinfo); + delete cbinfo; +} + +template +void +WeakCallbackInfo::invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data) { + WeakCallbackInfo *cbinfo = unwraptwofield(data); + cbinfo->persistent_.Reset(); + cbinfo->callback_(*cbinfo); + delete cbinfo; +} + +template +WeakCallbackInfo *WeakCallbackInfo::unwrapparameter( + NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data) { + WeakCallbackInfo *cbinfo = + static_cast*>(data.GetParameter()); + cbinfo->isolate_ = data.GetIsolate(); + return cbinfo; +} + +template +WeakCallbackInfo *WeakCallbackInfo::unwraptwofield( + NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data) { + WeakCallbackInfo *cbinfo = + static_cast*>(data.GetInternalField1()); + cbinfo->isolate_ = data.GetIsolate(); + return cbinfo; +} + +#undef NAN_WEAK_PARAMETER_CALLBACK_SIG_ +#undef NAN_WEAK_TWOFIELD_CALLBACK_SIG_ +#undef NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ +#undef NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ +#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + +template +template +void WeakCallbackInfo::invoke(NAN_WEAK_CALLBACK_SIG_ data) { + WeakCallbackInfo *cbinfo = unwrap(data); + cbinfo->persistent_.Reset(); + cbinfo->callback_(*cbinfo); + delete cbinfo; +} + +template +template +WeakCallbackInfo *WeakCallbackInfo::unwrap( + NAN_WEAK_CALLBACK_DATA_TYPE_ data) { + void *parameter = data.GetParameter(); + WeakCallbackInfo *cbinfo = + static_cast*>(parameter); + cbinfo->isolate_ = data.GetIsolate(); + return cbinfo; +} + +#undef NAN_WEAK_CALLBACK_SIG_ +#undef NAN_WEAK_CALLBACK_DATA_TYPE_ +#else + +template +void WeakCallbackInfo::invoke(NAN_WEAK_CALLBACK_SIG_ data) { + WeakCallbackInfo *cbinfo = unwrap(data); + cbinfo->persistent_.Dispose(); + cbinfo->persistent_.Clear(); + cbinfo->callback_(*cbinfo); + delete cbinfo; +} + +template +WeakCallbackInfo *WeakCallbackInfo::unwrap( + NAN_WEAK_CALLBACK_DATA_TYPE_ data) { + WeakCallbackInfo *cbinfo = + static_cast*>(data); + cbinfo->isolate_ = v8::Isolate::GetCurrent(); + return cbinfo; +} + +#undef NAN_WEAK_CALLBACK_SIG_ +#undef NAN_WEAK_CALLBACK_DATA_TYPE_ +#endif + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +template +template +inline void Persistent::SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type) { + WeakCallbackInfo

*wcbd; + if (type == WeakCallbackType::kParameter) { + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , parameter); + v8::PersistentBase::SetWeak( + wcbd + , WeakCallbackInfo

::template invokeparameter + , type); + } else { + v8::Local* self = reinterpret_cast*>(this); + assert((*self)->IsObject()); + int count = (*self)->InternalFieldCount(); + void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0}; + for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) { + internal_fields[i] = (*self)->GetAlignedPointerFromInternalField(i); + } + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , 0 + , internal_fields[0] + , internal_fields[1]); + (*self)->SetAlignedPointerInInternalField(0, wcbd); + v8::PersistentBase::SetWeak( + static_cast*>(0) + , WeakCallbackInfo

::template invoketwofield + , type); + } +} +#elif NODE_MODULE_VERSION > IOJS_1_1_MODULE_VERSION +template +template +inline void Persistent::SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type) { + WeakCallbackInfo

*wcbd; + if (type == WeakCallbackType::kParameter) { + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , parameter); + v8::PersistentBase::SetPhantom( + wcbd + , WeakCallbackInfo

::invokeparameter); + } else { + v8::Local* self = reinterpret_cast*>(this); + assert((*self)->IsObject()); + int count = (*self)->InternalFieldCount(); + void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0}; + for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) { + internal_fields[i] = (*self)->GetAlignedPointerFromInternalField(i); + } + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , 0 + , internal_fields[0] + , internal_fields[1]); + (*self)->SetAlignedPointerInInternalField(0, wcbd); + v8::PersistentBase::SetPhantom( + static_cast*>(0) + , WeakCallbackInfo

::invoketwofield + , 0 + , count > 1 ? 1 : kNoInternalFieldIndex); + } +} +#elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION +template +template +inline void Persistent::SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type) { + WeakCallbackInfo

*wcbd; + if (type == WeakCallbackType::kParameter) { + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , parameter); + v8::PersistentBase::SetPhantom( + wcbd + , WeakCallbackInfo

::invokeparameter); + } else { + v8::Local* self = reinterpret_cast*>(this); + assert((*self)->IsObject()); + int count = (*self)->InternalFieldCount(); + void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0}; + for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) { + internal_fields[i] = (*self)->GetAlignedPointerFromInternalField(i); + } + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , 0 + , internal_fields[0] + , internal_fields[1]); + (*self)->SetAlignedPointerInInternalField(0, wcbd); + v8::PersistentBase::SetPhantom( + WeakCallbackInfo

::invoketwofield + , 0 + , count > 1 ? 1 : kNoInternalFieldIndex); + } +} +#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION +template +template +inline void Persistent::SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type) { + WeakCallbackInfo

*wcbd; + if (type == WeakCallbackType::kParameter) { + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , parameter); + v8::PersistentBase::SetWeak(wcbd, WeakCallbackInfo

::invoke); + } else { + v8::Local* self = reinterpret_cast*>(this); + assert((*self)->IsObject()); + int count = (*self)->InternalFieldCount(); + void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0}; + for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) { + internal_fields[i] = (*self)->GetAlignedPointerFromInternalField(i); + } + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , 0 + , internal_fields[0] + , internal_fields[1]); + v8::PersistentBase::SetWeak(wcbd, WeakCallbackInfo

::invoke); + } +} +#else +template +template +inline void PersistentBase::SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type) { + WeakCallbackInfo

*wcbd; + if (type == WeakCallbackType::kParameter) { + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , parameter); + persistent.MakeWeak(wcbd, WeakCallbackInfo

::invoke); + } else { + v8::Local* self = reinterpret_cast*>(this); + assert((*self)->IsObject()); + int count = (*self)->InternalFieldCount(); + void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0}; + for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) { + internal_fields[i] = (*self)->GetPointerFromInternalField(i); + } + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , 0 + , internal_fields[0] + , internal_fields[1]); + persistent.MakeWeak(wcbd, WeakCallbackInfo

::invoke); + } +} +#endif + +#endif // NAN_WEAK_H_ diff --git a/deploy/node_modules/nan/package.json b/deploy/node_modules/nan/package.json new file mode 100644 index 0000000..8e0139b --- /dev/null +++ b/deploy/node_modules/nan/package.json @@ -0,0 +1,96 @@ +{ + "_from": "nan@^2.3.3", + "_id": "nan@2.7.0", + "_inBundle": false, + "_integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", + "_location": "/nan", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "nan@^2.3.3", + "name": "nan", + "escapedName": "nan", + "rawSpec": "^2.3.3", + "saveSpec": null, + "fetchSpec": "^2.3.3" + }, + "_requiredBy": [ + "/websocket" + ], + "_resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", + "_shasum": "d95bf721ec877e08db276ed3fc6eb78f9083ad46", + "_spec": "nan@^2.3.3", + "_where": "/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/websocket", + "bugs": { + "url": "https://github.com/nodejs/nan/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Rod Vagg", + "email": "r@va.gg", + "url": "https://github.com/rvagg" + }, + { + "name": "Benjamin Byholm", + "email": "bbyholm@abo.fi", + "url": "https://github.com/kkoopa/" + }, + { + "name": "Trevor Norris", + "email": "trev.norris@gmail.com", + "url": "https://github.com/trevnorris" + }, + { + "name": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": "https://github.com/TooTallNate" + }, + { + "name": "Brett Lawson", + "email": "brett19@gmail.com", + "url": "https://github.com/brett19" + }, + { + "name": "Ben Noordhuis", + "email": "info@bnoordhuis.nl", + "url": "https://github.com/bnoordhuis" + }, + { + "name": "David Siegel", + "email": "david@artcom.de", + "url": "https://github.com/agnat" + }, + { + "name": "Michael Ira Krufky", + "email": "mkrufky@gmail.com", + "url": "https://github.com/mkrufky" + } + ], + "deprecated": false, + "description": "Native Abstractions for Node.js: C++ header for Node 0.8 -> 8 compatibility", + "devDependencies": { + "bindings": "~1.2.1", + "commander": "^2.8.1", + "glob": "^5.0.14", + "node-gyp": "~3.0.1", + "readable-stream": "^2.1.4", + "tap": "~0.7.1", + "xtend": "~4.0.0" + }, + "homepage": "https://github.com/nodejs/nan#readme", + "license": "MIT", + "main": "include_dirs.js", + "name": "nan", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/nan.git" + }, + "scripts": { + "docs": "doc/.build.sh", + "rebuild-tests": "node-gyp rebuild --msvs_version=2013 --directory test", + "test": "tap --gc --stderr test/js/*-test.js" + }, + "version": "2.7.0" +} diff --git a/deploy/node_modules/nan/tools/1to2.js b/deploy/node_modules/nan/tools/1to2.js new file mode 100755 index 0000000..1e86be7 --- /dev/null +++ b/deploy/node_modules/nan/tools/1to2.js @@ -0,0 +1,412 @@ +#!/usr/bin/env node +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2017 NAN contributors + * + * MIT License + ********************************************************************/ + +var commander = require('commander'), + fs = require('fs'), + glob = require('glob'), + groups = [], + total = 0, + warning1 = '/* ERROR: Rewrite using Buffer */\n', + warning2 = '\\/\\* ERROR\\: Rewrite using Buffer \\*\\/\\n', + length, + i; + +fs.readFile(__dirname + '/package.json', 'utf8', function (err, data) { + if (err) { + throw err; + } + + commander + .version(JSON.parse(data).version) + .usage('[options] ') + .parse(process.argv); + + if (!process.argv.slice(2).length) { + commander.outputHelp(); + } +}); + +/* construct strings representing regular expressions + each expression contains a unique group allowing for identification of the match + the index of this key group, relative to the regular expression in question, + is indicated by the first array member */ + +/* simple substistutions, key group is the entire match, 0 */ +groups.push([0, [ + '_NAN_', + 'NODE_SET_METHOD', + 'NODE_SET_PROTOTYPE_METHOD', + 'NanAsciiString', + 'NanEscapeScope', + 'NanReturnValue', + 'NanUcs2String'].join('|')]); + +/* substitutions of parameterless macros, key group is 1 */ +groups.push([1, ['(', [ + 'NanEscapableScope', + 'NanReturnNull', + 'NanReturnUndefined', + 'NanScope'].join('|'), ')\\(\\)'].join('')]); + +/* replace TryCatch with NanTryCatch once, gobbling possible namespace, key group 2 */ +groups.push([2, '(?:(?:v8\\:\\:)?|(Nan)?)(TryCatch)']); + +/* NanNew("string") will likely not fail a ToLocalChecked(), key group 1 */ +groups.push([1, ['(NanNew)', '(\\("[^\\"]*"[^\\)]*\\))(?!\\.ToLocalChecked\\(\\))'].join('')]); + +/* Removed v8 APIs, warn that the code needs rewriting using node::Buffer, key group 2 */ +groups.push([2, ['(', warning2, ')?', '^.*?(', [ + 'GetIndexedPropertiesExternalArrayDataLength', + 'GetIndexedPropertiesExternalArrayData', + 'GetIndexedPropertiesExternalArrayDataType', + 'GetIndexedPropertiesPixelData', + 'GetIndexedPropertiesPixelDataLength', + 'HasIndexedPropertiesInExternalArrayData', + 'HasIndexedPropertiesInPixelData', + 'SetIndexedPropertiesToExternalArrayData', + 'SetIndexedPropertiesToPixelData'].join('|'), ')'].join('')]); + +/* No need for NanScope in V8-exposed methods, key group 2 */ +groups.push([2, ['((', [ + 'NAN_METHOD', + 'NAN_GETTER', + 'NAN_SETTER', + 'NAN_PROPERTY_GETTER', + 'NAN_PROPERTY_SETTER', + 'NAN_PROPERTY_ENUMERATOR', + 'NAN_PROPERTY_DELETER', + 'NAN_PROPERTY_QUERY', + 'NAN_INDEX_GETTER', + 'NAN_INDEX_SETTER', + 'NAN_INDEX_ENUMERATOR', + 'NAN_INDEX_DELETER', + 'NAN_INDEX_QUERY'].join('|'), ')\\([^\\)]*\\)\\s*\\{)\\s*NanScope\\(\\)\\s*;'].join('')]); + +/* v8::Value::ToXXXXXXX returns v8::MaybeLocal, key group 3 */ +groups.push([3, ['([\\s\\(\\)])([^\\s\\(\\)]+)->(', [ + 'Boolean', + 'Number', + 'String', + 'Object', + 'Integer', + 'Uint32', + 'Int32'].join('|'), ')\\('].join('')]); + +/* v8::Value::XXXXXXXValue returns v8::Maybe, key group 3 */ +groups.push([3, ['([\\s\\(\\)])([^\\s\\(\\)]+)->((?:', [ + 'Boolean', + 'Number', + 'Integer', + 'Uint32', + 'Int32'].join('|'), ')Value)\\('].join('')]); + +/* NAN_WEAK_CALLBACK macro was removed, write out callback definition, key group 1 */ +groups.push([1, '(NAN_WEAK_CALLBACK)\\(([^\\s\\)]+)\\)']); + +/* node::ObjectWrap and v8::Persistent have been replaced with Nan implementations, key group 1 */ +groups.push([1, ['(', [ + 'NanDisposePersistent', + 'NanObjectWrapHandle'].join('|'), ')\\s*\\(\\s*([^\\s\\)]+)'].join('')]); + +/* Since NanPersistent there is no need for NanMakeWeakPersistent, key group 1 */ +groups.push([1, '(NanMakeWeakPersistent)\\s*\\(\\s*([^\\s,]+)\\s*,\\s*']); + +/* Many methods of v8::Object and others now return v8::MaybeLocal, key group 3 */ +groups.push([3, ['([\\s])([^\\s]+)->(', [ + 'GetEndColumn', + 'GetFunction', + 'GetLineNumber', + 'NewInstance', + 'GetPropertyNames', + 'GetOwnPropertyNames', + 'GetSourceLine', + 'GetStartColumn', + 'ObjectProtoToString', + 'ToArrayIndex', + 'ToDetailString', + 'CallAsConstructor', + 'CallAsFunction', + 'CloneElementAt', + 'Delete', + 'ForceSet', + 'Get', + 'GetPropertyAttributes', + 'GetRealNamedProperty', + 'GetRealNamedPropertyInPrototypeChain', + 'Has', + 'HasOwnProperty', + 'HasRealIndexedProperty', + 'HasRealNamedCallbackProperty', + 'HasRealNamedProperty', + 'Set', + 'SetAccessor', + 'SetIndexedPropertyHandler', + 'SetNamedPropertyHandler', + 'SetPrototype'].join('|'), ')\\('].join('')]); + +/* You should get an error if any of these fail anyways, + or handle the error better, it is indicated either way, key group 2 */ +groups.push([2, ['NanNew(<(?:v8\\:\\:)?(', ['Date', 'String', 'RegExp'].join('|'), ')>)(\\([^\\)]*\\))(?!\\.ToLocalChecked\\(\\))'].join('')]); + +/* v8::Value::Equals now returns a v8::Maybe, key group 3 */ +groups.push([3, '([\\s\\(\\)])([^\\s\\(\\)]+)->(Equals)\\(([^\\s\\)]+)']); + +/* NanPersistent makes this unnecessary, key group 1 */ +groups.push([1, '(NanAssignPersistent)(?:]+>)?\\(([^,]+),\\s*']); + +/* args has been renamed to info, key group 2 */ +groups.push([2, '(\\W)(args)(\\W)']) + +/* node::ObjectWrap was replaced with NanObjectWrap, key group 2 */ +groups.push([2, '(\\W)(?:node\\:\\:)?(ObjectWrap)(\\W)']); + +/* v8::Persistent was replaced with NanPersistent, key group 2 */ +groups.push([2, '(\\W)(?:v8\\:\\:)?(Persistent)(\\W)']); + +/* counts the number of capturing groups in a well-formed regular expression, + ignoring non-capturing groups and escaped parentheses */ +function groupcount(s) { + var positive = s.match(/\((?!\?)/g), + negative = s.match(/\\\(/g); + return (positive ? positive.length : 0) - (negative ? negative.length : 0); +} + +/* compute the absolute position of each key group in the joined master RegExp */ +for (i = 1, length = groups.length; i < length; i++) { + total += groupcount(groups[i - 1][1]); + groups[i][0] += total; +} + +/* create the master RegExp, whis is the union of all the groups' expressions */ +master = new RegExp(groups.map(function (a) { return a[1]; }).join('|'), 'gm'); + +/* replacement function for String.replace, receives 21 arguments */ +function replace() { + /* simple expressions */ + switch (arguments[groups[0][0]]) { + case '_NAN_': + return 'NAN_'; + case 'NODE_SET_METHOD': + return 'NanSetMethod'; + case 'NODE_SET_PROTOTYPE_METHOD': + return 'NanSetPrototypeMethod'; + case 'NanAsciiString': + return 'NanUtf8String'; + case 'NanEscapeScope': + return 'scope.Escape'; + case 'NanReturnNull': + return 'info.GetReturnValue().SetNull'; + case 'NanReturnValue': + return 'info.GetReturnValue().Set'; + case 'NanUcs2String': + return 'v8::String::Value'; + default: + } + + /* macros without arguments */ + switch (arguments[groups[1][0]]) { + case 'NanEscapableScope': + return 'NanEscapableScope scope' + case 'NanReturnUndefined': + return 'return'; + case 'NanScope': + return 'NanScope scope'; + default: + } + + /* TryCatch, emulate negative backref */ + if (arguments[groups[2][0]] === 'TryCatch') { + return arguments[groups[2][0] - 1] ? arguments[0] : 'NanTryCatch'; + } + + /* NanNew("foo") --> NanNew("foo").ToLocalChecked() */ + if (arguments[groups[3][0]] === 'NanNew') { + return [arguments[0], '.ToLocalChecked()'].join(''); + } + + /* insert warning for removed functions as comment on new line above */ + switch (arguments[groups[4][0]]) { + case 'GetIndexedPropertiesExternalArrayData': + case 'GetIndexedPropertiesExternalArrayDataLength': + case 'GetIndexedPropertiesExternalArrayDataType': + case 'GetIndexedPropertiesPixelData': + case 'GetIndexedPropertiesPixelDataLength': + case 'HasIndexedPropertiesInExternalArrayData': + case 'HasIndexedPropertiesInPixelData': + case 'SetIndexedPropertiesToExternalArrayData': + case 'SetIndexedPropertiesToPixelData': + return arguments[groups[4][0] - 1] ? arguments[0] : [warning1, arguments[0]].join(''); + default: + } + + /* remove unnecessary NanScope() */ + switch (arguments[groups[5][0]]) { + case 'NAN_GETTER': + case 'NAN_METHOD': + case 'NAN_SETTER': + case 'NAN_INDEX_DELETER': + case 'NAN_INDEX_ENUMERATOR': + case 'NAN_INDEX_GETTER': + case 'NAN_INDEX_QUERY': + case 'NAN_INDEX_SETTER': + case 'NAN_PROPERTY_DELETER': + case 'NAN_PROPERTY_ENUMERATOR': + case 'NAN_PROPERTY_GETTER': + case 'NAN_PROPERTY_QUERY': + case 'NAN_PROPERTY_SETTER': + return arguments[groups[5][0] - 1]; + default: + } + + /* Value converstion */ + switch (arguments[groups[6][0]]) { + case 'Boolean': + case 'Int32': + case 'Integer': + case 'Number': + case 'Object': + case 'String': + case 'Uint32': + return [arguments[groups[6][0] - 2], 'NanTo(', arguments[groups[6][0] - 1]].join(''); + default: + } + + /* other value conversion */ + switch (arguments[groups[7][0]]) { + case 'BooleanValue': + return [arguments[groups[7][0] - 2], 'NanTo(', arguments[groups[7][0] - 1]].join(''); + case 'Int32Value': + return [arguments[groups[7][0] - 2], 'NanTo(', arguments[groups[7][0] - 1]].join(''); + case 'IntegerValue': + return [arguments[groups[7][0] - 2], 'NanTo(', arguments[groups[7][0] - 1]].join(''); + case 'Uint32Value': + return [arguments[groups[7][0] - 2], 'NanTo(', arguments[groups[7][0] - 1]].join(''); + default: + } + + /* NAN_WEAK_CALLBACK */ + if (arguments[groups[8][0]] === 'NAN_WEAK_CALLBACK') { + return ['template\nvoid ', + arguments[groups[8][0] + 1], '(const NanWeakCallbackInfo &data)'].join(''); + } + + /* use methods on NAN classes instead */ + switch (arguments[groups[9][0]]) { + case 'NanDisposePersistent': + return [arguments[groups[9][0] + 1], '.Reset('].join(''); + case 'NanObjectWrapHandle': + return [arguments[groups[9][0] + 1], '->handle('].join(''); + default: + } + + /* use method on NanPersistent instead */ + if (arguments[groups[10][0]] === 'NanMakeWeakPersistent') { + return arguments[groups[10][0] + 1] + '.SetWeak('; + } + + /* These return Maybes, the upper ones take no arguments */ + switch (arguments[groups[11][0]]) { + case 'GetEndColumn': + case 'GetFunction': + case 'GetLineNumber': + case 'GetOwnPropertyNames': + case 'GetPropertyNames': + case 'GetSourceLine': + case 'GetStartColumn': + case 'NewInstance': + case 'ObjectProtoToString': + case 'ToArrayIndex': + case 'ToDetailString': + return [arguments[groups[11][0] - 2], 'Nan', arguments[groups[11][0]], '(', arguments[groups[11][0] - 1]].join(''); + case 'CallAsConstructor': + case 'CallAsFunction': + case 'CloneElementAt': + case 'Delete': + case 'ForceSet': + case 'Get': + case 'GetPropertyAttributes': + case 'GetRealNamedProperty': + case 'GetRealNamedPropertyInPrototypeChain': + case 'Has': + case 'HasOwnProperty': + case 'HasRealIndexedProperty': + case 'HasRealNamedCallbackProperty': + case 'HasRealNamedProperty': + case 'Set': + case 'SetAccessor': + case 'SetIndexedPropertyHandler': + case 'SetNamedPropertyHandler': + case 'SetPrototype': + return [arguments[groups[11][0] - 2], 'Nan', arguments[groups[11][0]], '(', arguments[groups[11][0] - 1], ', '].join(''); + default: + } + + /* Automatic ToLocalChecked(), take it or leave it */ + switch (arguments[groups[12][0]]) { + case 'Date': + case 'String': + case 'RegExp': + return ['NanNew', arguments[groups[12][0] - 1], arguments[groups[12][0] + 1], '.ToLocalChecked()'].join(''); + default: + } + + /* NanEquals is now required for uniformity */ + if (arguments[groups[13][0]] === 'Equals') { + return [arguments[groups[13][0] - 1], 'NanEquals(', arguments[groups[13][0] - 1], ', ', arguments[groups[13][0] + 1]].join(''); + } + + /* use method on replacement class instead */ + if (arguments[groups[14][0]] === 'NanAssignPersistent') { + return [arguments[groups[14][0] + 1], '.Reset('].join(''); + } + + /* args --> info */ + if (arguments[groups[15][0]] === 'args') { + return [arguments[groups[15][0] - 1], 'info', arguments[groups[15][0] + 1]].join(''); + } + + /* ObjectWrap --> NanObjectWrap */ + if (arguments[groups[16][0]] === 'ObjectWrap') { + return [arguments[groups[16][0] - 1], 'NanObjectWrap', arguments[groups[16][0] + 1]].join(''); + } + + /* Persistent --> NanPersistent */ + if (arguments[groups[17][0]] === 'Persistent') { + return [arguments[groups[17][0] - 1], 'NanPersistent', arguments[groups[17][0] + 1]].join(''); + } + + /* This should not happen. A switch is probably missing a case if it does. */ + throw 'Unhandled match: ' + arguments[0]; +} + +/* reads a file, runs replacement and writes it back */ +function processFile(file) { + fs.readFile(file, {encoding: 'utf8'}, function (err, data) { + if (err) { + throw err; + } + + /* run replacement twice, might need more runs */ + fs.writeFile(file, data.replace(master, replace).replace(master, replace), function (err) { + if (err) { + throw err; + } + }); + }); +} + +/* process file names from command line and process the identified files */ +for (i = 2, length = process.argv.length; i < length; i++) { + glob(process.argv[i], function (err, matches) { + if (err) { + throw err; + } + matches.forEach(processFile); + }); +} diff --git a/deploy/node_modules/nan/tools/README.md b/deploy/node_modules/nan/tools/README.md new file mode 100644 index 0000000..7f07e4b --- /dev/null +++ b/deploy/node_modules/nan/tools/README.md @@ -0,0 +1,14 @@ +1to2 naively converts source code files from NAN 1 to NAN 2. There will be erroneous conversions, +false positives and missed opportunities. The input files are rewritten in place. Make sure that +you have backups. You will have to manually review the changes afterwards and do some touchups. + +```sh +$ tools/1to2.js + + Usage: 1to2 [options] + + Options: + + -h, --help output usage information + -V, --version output the version number +``` diff --git a/deploy/node_modules/nan/tools/package.json b/deploy/node_modules/nan/tools/package.json new file mode 100644 index 0000000..2dcdd78 --- /dev/null +++ b/deploy/node_modules/nan/tools/package.json @@ -0,0 +1,19 @@ +{ + "name": "1to2", + "version": "1.0.0", + "description": "NAN 1 -> 2 Migration Script", + "main": "1to2.js", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/nan.git" + }, + "contributors": [ + "Benjamin Byholm (https://github.com/kkoopa/)", + "Mathias Küsel (https://github.com/mathiask88/)" + ], + "dependencies": { + "glob": "~5.0.10", + "commander": "~2.8.1" + }, + "license": "MIT" +} diff --git a/deploy/node_modules/typedarray-to-buffer/.travis.yml b/deploy/node_modules/typedarray-to-buffer/.travis.yml new file mode 100644 index 0000000..70f4cf1 --- /dev/null +++ b/deploy/node_modules/typedarray-to-buffer/.travis.yml @@ -0,0 +1,7 @@ +language: node_js +node_js: +- 'node' +env: + global: + - secure: i51rE9rZGHbcZWlL58j3H1qtL23OIV2r0X4TcQKNI3pw2mubdHFJmfPNNO19ItfReu8wwQMxOehKamwaNvqMiKWyHfn/QcThFQysqzgGZ6AgnUbYx9od6XFNDeWd1sVBf7QBAL07y7KWlYGWCwFwWjabSVySzQhEBdisPcskfkI= + - secure: BKq6/5z9LK3KDkTjs7BGeBZ1KsWgz+MsAXZ4P64NSeVGFaBdXU45+ww1mwxXFt5l22/mhyOQZfebQl+kGVqRSZ+DEgQeCymkNZ6CD8c6w6cLuOJXiXwuu/cDM2DD0tfGeu2YZC7yEikP7BqEFwH3D324rRzSGLF2RSAAwkOI7bE= diff --git a/deploy/node_modules/typedarray-to-buffer/.zuul.yml b/deploy/node_modules/typedarray-to-buffer/.zuul.yml new file mode 100644 index 0000000..0367f75 --- /dev/null +++ b/deploy/node_modules/typedarray-to-buffer/.zuul.yml @@ -0,0 +1,20 @@ +ui: tape +browsers: + - name: chrome + version: latest + - name: firefox + version: latest + - name: safari + version: latest + - name: microsoftedge + version: latest + - name: ie + version: latest + - name: opera + version: latest + - name: iphone + version: latest + - name: ipad + version: latest + - name: android + version: latest diff --git a/deploy/node_modules/typedarray-to-buffer/LICENSE b/deploy/node_modules/typedarray-to-buffer/LICENSE new file mode 100644 index 0000000..0c068ce --- /dev/null +++ b/deploy/node_modules/typedarray-to-buffer/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/deploy/node_modules/typedarray-to-buffer/README.md b/deploy/node_modules/typedarray-to-buffer/README.md new file mode 100644 index 0000000..98dc2c4 --- /dev/null +++ b/deploy/node_modules/typedarray-to-buffer/README.md @@ -0,0 +1,81 @@ +# typedarray-to-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][npm-url] + +#### Convert a typed array to a [Buffer](https://github.com/feross/buffer) without a copy. + +[![saucelabs][saucelabs-image]][saucelabs-url] + +[travis-image]: https://img.shields.io/travis/feross/typedarray-to-buffer/master.svg +[travis-url]: https://travis-ci.org/feross/typedarray-to-buffer +[npm-image]: https://img.shields.io/npm/v/typedarray-to-buffer.svg +[npm-url]: https://npmjs.org/package/typedarray-to-buffer +[downloads-image]: https://img.shields.io/npm/dm/typedarray-to-buffer.svg +[saucelabs-image]: https://saucelabs.com/browser-matrix/typedarray-to-buffer.svg +[saucelabs-url]: https://saucelabs.com/u/typedarray-to-buffer + +Say you're using the ['buffer'](https://github.com/feross/buffer) module on npm, or +[browserify](http://browserify.org/) and you're working with lots of binary data. + +Unfortunately, sometimes the browser or someone else's API gives you a typed array like +`Uint8Array` to work with and you need to convert it to a `Buffer`. What do you do? + +Of course: `new Buffer(uint8array)` + +But, alas, every time you do `new Buffer(uint8array)` **the entire array gets copied**. +The `Buffer` constructor does a copy; this is +defined by the [node docs](http://nodejs.org/api/buffer.html) and the 'buffer' module +matches the node API exactly. + +So, how can we avoid this expensive copy in +[performance critical applications](https://github.com/feross/buffer/issues/22)? + +***Simply use this module, of course!*** + +If you have an `ArrayBuffer`, you don't need this module, because +`new Buffer(arrayBuffer)` +[is already efficient](https://nodejs.org/api/buffer.html#buffer_new_buffer_arraybuffer). + +## install + +```bash +npm install typedarray-to-buffer +``` + +## usage + +To convert a typed array to a `Buffer` **without a copy**, do this: + +```js +var toBuffer = require('typedarray-to-buffer') + +var arr = new Uint8Array([1, 2, 3]) +arr = toBuffer(arr) + +// arr is a buffer now! + +arr.toString() // '\u0001\u0002\u0003' +arr.readUInt16BE(0) // 258 +``` + +## how it works + +If the browser supports typed arrays, then `toBuffer` will **augment the typed array** you +pass in with the `Buffer` methods and return it. See [how does Buffer +work?](https://github.com/feross/buffer#how-does-it-work) for more about how augmentation +works. + +This module uses the typed array's underlying `ArrayBuffer` to back the new `Buffer`. This +respects the "view" on the `ArrayBuffer`, i.e. `byteOffset` and `byteLength`. In other +words, if you do `toBuffer(new Uint32Array([1, 2, 3]))`, then the new `Buffer` will +contain `[1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]`, **not** `[1, 2, 3]`. And it still doesn't +require a copy. + +If the browser doesn't support typed arrays, then `toBuffer` will create a new `Buffer` +object, copy the data into it, and return it. There's no simple performance optimization +we can do for old browsers. Oh well. + +If this module is used in node, then it will just call `new Buffer`. This is just for +the convenience of modules that work in both node and the browser. + +## license + +MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org). diff --git a/deploy/node_modules/typedarray-to-buffer/index.js b/deploy/node_modules/typedarray-to-buffer/index.js new file mode 100644 index 0000000..861cb05 --- /dev/null +++ b/deploy/node_modules/typedarray-to-buffer/index.js @@ -0,0 +1,25 @@ +/** + * Convert a typed array to a Buffer without a copy + * + * Author: Feross Aboukhadijeh + * License: MIT + * + * `npm install typedarray-to-buffer` + */ + +var isTypedArray = require('is-typedarray').strict + +module.exports = function typedarrayToBuffer (arr) { + if (isTypedArray(arr)) { + // To avoid a copy, use the typed array's underlying ArrayBuffer to back new Buffer + var buf = new Buffer(arr.buffer) + if (arr.byteLength !== arr.buffer.byteLength) { + // Respect the "view", i.e. byteOffset and byteLength, without doing a copy + buf = buf.slice(arr.byteOffset, arr.byteOffset + arr.byteLength) + } + return buf + } else { + // Pass through all other types to the `Buffer` constructor + return new Buffer(arr) + } +} diff --git a/deploy/node_modules/typedarray-to-buffer/package.json b/deploy/node_modules/typedarray-to-buffer/package.json new file mode 100644 index 0000000..3798a20 --- /dev/null +++ b/deploy/node_modules/typedarray-to-buffer/package.json @@ -0,0 +1,75 @@ +{ + "_from": "typedarray-to-buffer@^3.1.2", + "_id": "typedarray-to-buffer@3.1.2", + "_inBundle": false, + "_integrity": "sha1-EBezLZhP9VbroQD1AViauhrOLgQ=", + "_location": "/typedarray-to-buffer", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "typedarray-to-buffer@^3.1.2", + "name": "typedarray-to-buffer", + "escapedName": "typedarray-to-buffer", + "rawSpec": "^3.1.2", + "saveSpec": null, + "fetchSpec": "^3.1.2" + }, + "_requiredBy": [ + "/websocket" + ], + "_resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.2.tgz", + "_shasum": "1017b32d984ff556eba100f501589aba1ace2e04", + "_spec": "typedarray-to-buffer@^3.1.2", + "_where": "/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/websocket", + "author": { + "name": "Feross Aboukhadijeh", + "email": "feross@feross.org", + "url": "http://feross.org/" + }, + "bugs": { + "url": "https://github.com/feross/typedarray-to-buffer/issues" + }, + "bundleDependencies": false, + "dependencies": { + "is-typedarray": "^1.0.0" + }, + "deprecated": false, + "description": "Convert a typed array to a Buffer without a copy", + "devDependencies": { + "standard": "^6.0.4", + "tape": "^4.0.0", + "zuul": "^3.0.0" + }, + "homepage": "http://feross.org", + "keywords": [ + "buffer", + "typed array", + "convert", + "no copy", + "uint8array", + "uint16array", + "uint32array", + "int16array", + "int32array", + "float32array", + "float64array", + "browser", + "arraybuffer", + "dataview" + ], + "license": "MIT", + "main": "index.js", + "name": "typedarray-to-buffer", + "repository": { + "type": "git", + "url": "git://github.com/feross/typedarray-to-buffer.git" + }, + "scripts": { + "test": "standard && npm run test-node && npm run test-browser", + "test-browser": "zuul -- test/*.js", + "test-browser-local": "zuul --local -- test/*.js", + "test-node": "tape test/*.js" + }, + "version": "3.1.2" +} diff --git a/deploy/node_modules/typedarray-to-buffer/test/basic.js b/deploy/node_modules/typedarray-to-buffer/test/basic.js new file mode 100644 index 0000000..e7052e9 --- /dev/null +++ b/deploy/node_modules/typedarray-to-buffer/test/basic.js @@ -0,0 +1,50 @@ +var test = require('tape') +var toBuffer = require('../') + +test('convert to buffer from Uint8Array', function (t) { + if (typeof Uint8Array !== 'undefined') { + var arr = new Uint8Array([1, 2, 3]) + arr = toBuffer(arr) + + t.deepEqual(arr, new Buffer([1, 2, 3]), 'contents equal') + t.ok(Buffer.isBuffer(arr), 'is buffer') + t.equal(arr.readUInt8(0), 1) + t.equal(arr.readUInt8(1), 2) + t.equal(arr.readUInt8(2), 3) + } else { + t.pass('browser lacks Uint8Array support, skip test') + } + t.end() +}) + +test('convert to buffer from another arrayview type (Uint32Array)', function (t) { + if (typeof Uint32Array !== 'undefined' && Buffer.TYPED_ARRAY_SUPPORT !== false) { + var arr = new Uint32Array([1, 2, 3]) + arr = toBuffer(arr) + + t.deepEqual(arr, new Buffer([1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]), 'contents equal') + t.ok(Buffer.isBuffer(arr), 'is buffer') + t.equal(arr.readUInt32LE(0), 1) + t.equal(arr.readUInt32LE(4), 2) + t.equal(arr.readUInt32LE(8), 3) + t.equal(arr instanceof Uint8Array, true) + } else { + t.pass('browser lacks Uint32Array support, skip test') + } + t.end() +}) + +test('convert to buffer from ArrayBuffer', function (t) { + if (typeof Uint32Array !== 'undefined' && Buffer.TYPED_ARRAY_SUPPORT !== false) { + var arr = new Uint32Array([1, 2, 3]).subarray(1, 2) + arr = toBuffer(arr) + + t.deepEqual(arr, new Buffer([2, 0, 0, 0]), 'contents equal') + t.ok(Buffer.isBuffer(arr), 'is buffer') + t.equal(arr.readUInt32LE(0), 2) + t.equal(arr instanceof Uint8Array, true) + } else { + t.pass('browser lacks ArrayBuffer support, skip test') + } + t.end() +}) diff --git a/deploy/node_modules/util/.npmignore b/deploy/node_modules/util/.npmignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/deploy/node_modules/util/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/deploy/node_modules/util/.travis.yml b/deploy/node_modules/util/.travis.yml new file mode 100644 index 0000000..ded625c --- /dev/null +++ b/deploy/node_modules/util/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +node_js: +- '0.8' +- '0.10' +env: + global: + - secure: AdUubswCR68/eGD+WWjwTHgFbelwQGnNo81j1IOaUxKw+zgFPzSnFEEtDw7z98pWgg7p9DpCnyzzSnSllP40wq6AG19OwyUJjSLoZK57fp+r8zwTQwWiSqUgMu2YSMmKJPIO/aoSGpRQXT+L1nRrHoUJXgFodyIZgz40qzJeZjc= + - secure: heQuxPVsQ7jBbssoVKimXDpqGjQFiucm6W5spoujmspjDG7oEcHD9ANo9++LoRPrsAmNx56SpMK5fNfVmYediw6SvhXm4Mxt56/fYCrLDBtgGG+1neCeffAi8z1rO8x48m77hcQ6YhbUL5R9uBimUjMX92fZcygAt8Rg804zjFo= diff --git a/deploy/node_modules/util/.zuul.yml b/deploy/node_modules/util/.zuul.yml new file mode 100644 index 0000000..2105010 --- /dev/null +++ b/deploy/node_modules/util/.zuul.yml @@ -0,0 +1,10 @@ +ui: mocha-qunit +browsers: + - name: chrome + version: 27..latest + - name: firefox + version: latest + - name: safari + version: latest + - name: ie + version: 9..latest diff --git a/deploy/node_modules/util/LICENSE b/deploy/node_modules/util/LICENSE new file mode 100644 index 0000000..e3d4e69 --- /dev/null +++ b/deploy/node_modules/util/LICENSE @@ -0,0 +1,18 @@ +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/deploy/node_modules/util/README.md b/deploy/node_modules/util/README.md new file mode 100644 index 0000000..1c473d2 --- /dev/null +++ b/deploy/node_modules/util/README.md @@ -0,0 +1,15 @@ +# util + +[![Build Status](https://travis-ci.org/defunctzombie/node-util.png?branch=master)](https://travis-ci.org/defunctzombie/node-util) + +node.js [util](http://nodejs.org/api/util.html) module as a module + +## install via [npm](npmjs.org) + +```shell +npm install util +``` + +## browser support + +This module also works in modern browsers. If you need legacy browser support you will need to polyfill ES5 features. diff --git a/deploy/node_modules/util/package.json b/deploy/node_modules/util/package.json new file mode 100644 index 0000000..5b33cfd --- /dev/null +++ b/deploy/node_modules/util/package.json @@ -0,0 +1,60 @@ +{ + "_from": "util", + "_id": "util@0.10.3", + "_inBundle": false, + "_integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "_location": "/util", + "_phantomChildren": {}, + "_requested": { + "type": "tag", + "registry": true, + "raw": "util", + "name": "util", + "escapedName": "util", + "rawSpec": "", + "saveSpec": null, + "fetchSpec": "latest" + }, + "_requiredBy": [ + "#DEV:/", + "#USER" + ], + "_resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "_shasum": "7afb1afe50805246489e3db7fe0ed379336ac0f9", + "_spec": "util", + "_where": "/Users/prophesi/Projects/websocket-kinect/deploy", + "author": { + "name": "Joyent", + "url": "http://www.joyent.com" + }, + "browser": { + "./support/isBuffer.js": "./support/isBufferBrowser.js" + }, + "bugs": { + "url": "https://github.com/defunctzombie/node-util/issues" + }, + "bundleDependencies": false, + "dependencies": { + "inherits": "2.0.1" + }, + "deprecated": false, + "description": "Node.JS util module", + "devDependencies": { + "zuul": "~1.0.9" + }, + "homepage": "https://github.com/defunctzombie/node-util", + "keywords": [ + "util" + ], + "license": "MIT", + "main": "./util.js", + "name": "util", + "repository": { + "type": "git", + "url": "git://github.com/defunctzombie/node-util.git" + }, + "scripts": { + "test": "node test/node/*.js && zuul test/browser/*.js" + }, + "version": "0.10.3" +} diff --git a/deploy/node_modules/util/support/isBuffer.js b/deploy/node_modules/util/support/isBuffer.js new file mode 100644 index 0000000..ace9ac0 --- /dev/null +++ b/deploy/node_modules/util/support/isBuffer.js @@ -0,0 +1,3 @@ +module.exports = function isBuffer(arg) { + return arg instanceof Buffer; +} diff --git a/deploy/node_modules/util/support/isBufferBrowser.js b/deploy/node_modules/util/support/isBufferBrowser.js new file mode 100644 index 0000000..0e1bee1 --- /dev/null +++ b/deploy/node_modules/util/support/isBufferBrowser.js @@ -0,0 +1,6 @@ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; +} \ No newline at end of file diff --git a/deploy/node_modules/util/test/browser/inspect.js b/deploy/node_modules/util/test/browser/inspect.js new file mode 100644 index 0000000..91af3b0 --- /dev/null +++ b/deploy/node_modules/util/test/browser/inspect.js @@ -0,0 +1,41 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var assert = require('assert'); +var util = require('../../'); + +suite('inspect'); + +test('util.inspect - test for sparse array', function () { + var a = ['foo', 'bar', 'baz']; + assert.equal(util.inspect(a), '[ \'foo\', \'bar\', \'baz\' ]'); + delete a[1]; + assert.equal(util.inspect(a), '[ \'foo\', , \'baz\' ]'); + assert.equal(util.inspect(a, true), '[ \'foo\', , \'baz\', [length]: 3 ]'); + assert.equal(util.inspect(new Array(5)), '[ , , , , ]'); +}); + +test('util.inspect - exceptions should print the error message, not \'{}\'', function () { + assert.equal(util.inspect(new Error()), '[Error]'); + assert.equal(util.inspect(new Error('FAIL')), '[Error: FAIL]'); + assert.equal(util.inspect(new TypeError('FAIL')), '[TypeError: FAIL]'); + assert.equal(util.inspect(new SyntaxError('FAIL')), '[SyntaxError: FAIL]'); +}); diff --git a/deploy/node_modules/util/test/browser/is.js b/deploy/node_modules/util/test/browser/is.js new file mode 100644 index 0000000..f63bff9 --- /dev/null +++ b/deploy/node_modules/util/test/browser/is.js @@ -0,0 +1,91 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var assert = require('assert'); + +var util = require('../../'); + +suite('is'); + +test('util.isArray', function () { + assert.equal(true, util.isArray([])); + assert.equal(true, util.isArray(Array())); + assert.equal(true, util.isArray(new Array())); + assert.equal(true, util.isArray(new Array(5))); + assert.equal(true, util.isArray(new Array('with', 'some', 'entries'))); + assert.equal(false, util.isArray({})); + assert.equal(false, util.isArray({ push: function() {} })); + assert.equal(false, util.isArray(/regexp/)); + assert.equal(false, util.isArray(new Error())); + assert.equal(false, util.isArray(Object.create(Array.prototype))); +}); + +test('util.isRegExp', function () { + assert.equal(true, util.isRegExp(/regexp/)); + assert.equal(true, util.isRegExp(RegExp())); + assert.equal(true, util.isRegExp(new RegExp())); + assert.equal(false, util.isRegExp({})); + assert.equal(false, util.isRegExp([])); + assert.equal(false, util.isRegExp(new Date())); + assert.equal(false, util.isRegExp(Object.create(RegExp.prototype))); +}); + +test('util.isDate', function () { + assert.equal(true, util.isDate(new Date())); + assert.equal(true, util.isDate(new Date(0))); + assert.equal(false, util.isDate(Date())); + assert.equal(false, util.isDate({})); + assert.equal(false, util.isDate([])); + assert.equal(false, util.isDate(new Error())); + assert.equal(false, util.isDate(Object.create(Date.prototype))); +}); + +test('util.isError', function () { + assert.equal(true, util.isError(new Error())); + assert.equal(true, util.isError(new TypeError())); + assert.equal(true, util.isError(new SyntaxError())); + assert.equal(false, util.isError({})); + assert.equal(false, util.isError({ name: 'Error', message: '' })); + assert.equal(false, util.isError([])); + assert.equal(true, util.isError(Object.create(Error.prototype))); +}); + +test('util._extend', function () { + assert.deepEqual(util._extend({a:1}), {a:1}); + assert.deepEqual(util._extend({a:1}, []), {a:1}); + assert.deepEqual(util._extend({a:1}, null), {a:1}); + assert.deepEqual(util._extend({a:1}, true), {a:1}); + assert.deepEqual(util._extend({a:1}, false), {a:1}); + assert.deepEqual(util._extend({a:1}, {b:2}), {a:1, b:2}); + assert.deepEqual(util._extend({a:1, b:2}, {b:3}), {a:1, b:3}); +}); + +test('util.isBuffer', function () { + assert.equal(true, util.isBuffer(new Buffer(4))); + assert.equal(true, util.isBuffer(Buffer(4))); + assert.equal(true, util.isBuffer(new Buffer(4))); + assert.equal(true, util.isBuffer(new Buffer([1, 2, 3, 4]))); + assert.equal(false, util.isBuffer({})); + assert.equal(false, util.isBuffer([])); + assert.equal(false, util.isBuffer(new Error())); + assert.equal(false, util.isRegExp(new Date())); + assert.equal(true, util.isBuffer(Object.create(Buffer.prototype))); +}); diff --git a/deploy/node_modules/util/test/node/debug.js b/deploy/node_modules/util/test/node/debug.js new file mode 100644 index 0000000..ef5f69f --- /dev/null +++ b/deploy/node_modules/util/test/node/debug.js @@ -0,0 +1,86 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var assert = require('assert'); +var util = require('../../'); + +if (process.argv[2] === 'child') + child(); +else + parent(); + +function parent() { + test('foo,tud,bar', true); + test('foo,tud', true); + test('tud,bar', true); + test('tud', true); + test('foo,bar', false); + test('', false); +} + +function test(environ, shouldWrite) { + var expectErr = ''; + if (shouldWrite) { + expectErr = 'TUD %PID%: this { is: \'a\' } /debugging/\n' + + 'TUD %PID%: number=1234 string=asdf obj={"foo":"bar"}\n'; + } + var expectOut = 'ok\n'; + var didTest = false; + + var spawn = require('child_process').spawn; + var child = spawn(process.execPath, [__filename, 'child'], { + env: { NODE_DEBUG: environ } + }); + + expectErr = expectErr.split('%PID%').join(child.pid); + + var err = ''; + child.stderr.setEncoding('utf8'); + child.stderr.on('data', function(c) { + err += c; + }); + + var out = ''; + child.stdout.setEncoding('utf8'); + child.stdout.on('data', function(c) { + out += c; + }); + + child.on('close', function(c) { + assert(!c); + assert.equal(err, expectErr); + assert.equal(out, expectOut); + didTest = true; + console.log('ok %j %j', environ, shouldWrite); + }); + + process.on('exit', function() { + assert(didTest); + }); +} + + +function child() { + var debug = util.debuglog('tud'); + debug('this', { is: 'a' }, /debugging/); + debug('number=%d string=%s obj=%j', 1234, 'asdf', { foo: 'bar' }); + console.log('ok'); +} diff --git a/deploy/node_modules/util/test/node/format.js b/deploy/node_modules/util/test/node/format.js new file mode 100644 index 0000000..f2d1862 --- /dev/null +++ b/deploy/node_modules/util/test/node/format.js @@ -0,0 +1,77 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + + + +var assert = require('assert'); +var util = require('../../'); + +assert.equal(util.format(), ''); +assert.equal(util.format(''), ''); +assert.equal(util.format([]), '[]'); +assert.equal(util.format({}), '{}'); +assert.equal(util.format(null), 'null'); +assert.equal(util.format(true), 'true'); +assert.equal(util.format(false), 'false'); +assert.equal(util.format('test'), 'test'); + +// CHECKME this is for console.log() compatibility - but is it *right*? +assert.equal(util.format('foo', 'bar', 'baz'), 'foo bar baz'); + +assert.equal(util.format('%d', 42.0), '42'); +assert.equal(util.format('%d', 42), '42'); +assert.equal(util.format('%s', 42), '42'); +assert.equal(util.format('%j', 42), '42'); + +assert.equal(util.format('%d', '42.0'), '42'); +assert.equal(util.format('%d', '42'), '42'); +assert.equal(util.format('%s', '42'), '42'); +assert.equal(util.format('%j', '42'), '"42"'); + +assert.equal(util.format('%%s%s', 'foo'), '%sfoo'); + +assert.equal(util.format('%s'), '%s'); +assert.equal(util.format('%s', undefined), 'undefined'); +assert.equal(util.format('%s', 'foo'), 'foo'); +assert.equal(util.format('%s:%s'), '%s:%s'); +assert.equal(util.format('%s:%s', undefined), 'undefined:%s'); +assert.equal(util.format('%s:%s', 'foo'), 'foo:%s'); +assert.equal(util.format('%s:%s', 'foo', 'bar'), 'foo:bar'); +assert.equal(util.format('%s:%s', 'foo', 'bar', 'baz'), 'foo:bar baz'); +assert.equal(util.format('%%%s%%', 'hi'), '%hi%'); +assert.equal(util.format('%%%s%%%%', 'hi'), '%hi%%'); + +(function() { + var o = {}; + o.o = o; + assert.equal(util.format('%j', o), '[Circular]'); +})(); + +// Errors +assert.equal(util.format(new Error('foo')), '[Error: foo]'); +function CustomError(msg) { + Error.call(this); + Object.defineProperty(this, 'message', { value: msg, enumerable: false }); + Object.defineProperty(this, 'name', { value: 'CustomError', enumerable: false }); +} +util.inherits(CustomError, Error); +assert.equal(util.format(new CustomError('bar')), '[CustomError: bar]'); diff --git a/deploy/node_modules/util/test/node/inspect.js b/deploy/node_modules/util/test/node/inspect.js new file mode 100644 index 0000000..f766d11 --- /dev/null +++ b/deploy/node_modules/util/test/node/inspect.js @@ -0,0 +1,195 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + + + +var assert = require('assert'); +var util = require('../../'); + +// test the internal isDate implementation +var Date2 = require('vm').runInNewContext('Date'); +var d = new Date2(); +var orig = util.inspect(d); +Date2.prototype.foo = 'bar'; +var after = util.inspect(d); +assert.equal(orig, after); + +// test for sparse array +var a = ['foo', 'bar', 'baz']; +assert.equal(util.inspect(a), '[ \'foo\', \'bar\', \'baz\' ]'); +delete a[1]; +assert.equal(util.inspect(a), '[ \'foo\', , \'baz\' ]'); +assert.equal(util.inspect(a, true), '[ \'foo\', , \'baz\', [length]: 3 ]'); +assert.equal(util.inspect(new Array(5)), '[ , , , , ]'); + +// test for property descriptors +var getter = Object.create(null, { + a: { + get: function() { return 'aaa'; } + } +}); +var setter = Object.create(null, { + b: { + set: function() {} + } +}); +var getterAndSetter = Object.create(null, { + c: { + get: function() { return 'ccc'; }, + set: function() {} + } +}); +assert.equal(util.inspect(getter, true), '{ [a]: [Getter] }'); +assert.equal(util.inspect(setter, true), '{ [b]: [Setter] }'); +assert.equal(util.inspect(getterAndSetter, true), '{ [c]: [Getter/Setter] }'); + +// exceptions should print the error message, not '{}' +assert.equal(util.inspect(new Error()), '[Error]'); +assert.equal(util.inspect(new Error('FAIL')), '[Error: FAIL]'); +assert.equal(util.inspect(new TypeError('FAIL')), '[TypeError: FAIL]'); +assert.equal(util.inspect(new SyntaxError('FAIL')), '[SyntaxError: FAIL]'); +try { + undef(); +} catch (e) { + assert.equal(util.inspect(e), '[ReferenceError: undef is not defined]'); +} +var ex = util.inspect(new Error('FAIL'), true); +assert.ok(ex.indexOf('[Error: FAIL]') != -1); +assert.ok(ex.indexOf('[stack]') != -1); +assert.ok(ex.indexOf('[message]') != -1); + +// GH-1941 +// should not throw: +assert.equal(util.inspect(Object.create(Date.prototype)), '{}'); + +// GH-1944 +assert.doesNotThrow(function() { + var d = new Date(); + d.toUTCString = null; + util.inspect(d); +}); + +assert.doesNotThrow(function() { + var r = /regexp/; + r.toString = null; + util.inspect(r); +}); + +// bug with user-supplied inspect function returns non-string +assert.doesNotThrow(function() { + util.inspect([{ + inspect: function() { return 123; } + }]); +}); + +// GH-2225 +var x = { inspect: util.inspect }; +assert.ok(util.inspect(x).indexOf('inspect') != -1); + +// util.inspect.styles and util.inspect.colors +function test_color_style(style, input, implicit) { + var color_name = util.inspect.styles[style]; + var color = ['', '']; + if(util.inspect.colors[color_name]) + color = util.inspect.colors[color_name]; + + var without_color = util.inspect(input, false, 0, false); + var with_color = util.inspect(input, false, 0, true); + var expect = '\u001b[' + color[0] + 'm' + without_color + + '\u001b[' + color[1] + 'm'; + assert.equal(with_color, expect, 'util.inspect color for style '+style); +} + +test_color_style('special', function(){}); +test_color_style('number', 123.456); +test_color_style('boolean', true); +test_color_style('undefined', undefined); +test_color_style('null', null); +test_color_style('string', 'test string'); +test_color_style('date', new Date); +test_color_style('regexp', /regexp/); + +// an object with "hasOwnProperty" overwritten should not throw +assert.doesNotThrow(function() { + util.inspect({ + hasOwnProperty: null + }); +}); + +// new API, accepts an "options" object +var subject = { foo: 'bar', hello: 31, a: { b: { c: { d: 0 } } } }; +Object.defineProperty(subject, 'hidden', { enumerable: false, value: null }); + +assert(util.inspect(subject, { showHidden: false }).indexOf('hidden') === -1); +assert(util.inspect(subject, { showHidden: true }).indexOf('hidden') !== -1); +assert(util.inspect(subject, { colors: false }).indexOf('\u001b[32m') === -1); +assert(util.inspect(subject, { colors: true }).indexOf('\u001b[32m') !== -1); +assert(util.inspect(subject, { depth: 2 }).indexOf('c: [Object]') !== -1); +assert(util.inspect(subject, { depth: 0 }).indexOf('a: [Object]') !== -1); +assert(util.inspect(subject, { depth: null }).indexOf('{ d: 0 }') !== -1); + +// "customInspect" option can enable/disable calling inspect() on objects +subject = { inspect: function() { return 123; } }; + +assert(util.inspect(subject, { customInspect: true }).indexOf('123') !== -1); +assert(util.inspect(subject, { customInspect: true }).indexOf('inspect') === -1); +assert(util.inspect(subject, { customInspect: false }).indexOf('123') === -1); +assert(util.inspect(subject, { customInspect: false }).indexOf('inspect') !== -1); + +// custom inspect() functions should be able to return other Objects +subject.inspect = function() { return { foo: 'bar' }; }; + +assert.equal(util.inspect(subject), '{ foo: \'bar\' }'); + +subject.inspect = function(depth, opts) { + assert.strictEqual(opts.customInspectOptions, true); +}; + +util.inspect(subject, { customInspectOptions: true }); + +// util.inspect with "colors" option should produce as many lines as without it +function test_lines(input) { + var count_lines = function(str) { + return (str.match(/\n/g) || []).length; + } + + var without_color = util.inspect(input); + var with_color = util.inspect(input, {colors: true}); + assert.equal(count_lines(without_color), count_lines(with_color)); +} + +test_lines([1, 2, 3, 4, 5, 6, 7]); +test_lines(function() { + var big_array = []; + for (var i = 0; i < 100; i++) { + big_array.push(i); + } + return big_array; +}()); +test_lines({foo: 'bar', baz: 35, b: {a: 35}}); +test_lines({ + foo: 'bar', + baz: 35, + b: {a: 35}, + very_long_key: 'very_long_value', + even_longer_key: ['with even longer value in array'] +}); diff --git a/deploy/node_modules/util/test/node/log.js b/deploy/node_modules/util/test/node/log.js new file mode 100644 index 0000000..6bd96d1 --- /dev/null +++ b/deploy/node_modules/util/test/node/log.js @@ -0,0 +1,58 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + +var assert = require('assert'); +var util = require('../../'); + +assert.ok(process.stdout.writable); +assert.ok(process.stderr.writable); + +var stdout_write = global.process.stdout.write; +var strings = []; +global.process.stdout.write = function(string) { + strings.push(string); +}; +console._stderr = process.stdout; + +var tests = [ + {input: 'foo', output: 'foo'}, + {input: undefined, output: 'undefined'}, + {input: null, output: 'null'}, + {input: false, output: 'false'}, + {input: 42, output: '42'}, + {input: function(){}, output: '[Function]'}, + {input: parseInt('not a number', 10), output: 'NaN'}, + {input: {answer: 42}, output: '{ answer: 42 }'}, + {input: [1,2,3], output: '[ 1, 2, 3 ]'} +]; + +// test util.log() +tests.forEach(function(test) { + util.log(test.input); + var result = strings.shift().trim(), + re = (/[0-9]{1,2} [A-Z][a-z]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} - (.+)$/), + match = re.exec(result); + assert.ok(match); + assert.equal(match[1], test.output); +}); + +global.process.stdout.write = stdout_write; diff --git a/deploy/node_modules/util/test/node/util.js b/deploy/node_modules/util/test/node/util.js new file mode 100644 index 0000000..633ba69 --- /dev/null +++ b/deploy/node_modules/util/test/node/util.js @@ -0,0 +1,83 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + +var assert = require('assert'); +var context = require('vm').runInNewContext; + +var util = require('../../'); + +// isArray +assert.equal(true, util.isArray([])); +assert.equal(true, util.isArray(Array())); +assert.equal(true, util.isArray(new Array())); +assert.equal(true, util.isArray(new Array(5))); +assert.equal(true, util.isArray(new Array('with', 'some', 'entries'))); +assert.equal(true, util.isArray(context('Array')())); +assert.equal(false, util.isArray({})); +assert.equal(false, util.isArray({ push: function() {} })); +assert.equal(false, util.isArray(/regexp/)); +assert.equal(false, util.isArray(new Error)); +assert.equal(false, util.isArray(Object.create(Array.prototype))); + +// isRegExp +assert.equal(true, util.isRegExp(/regexp/)); +assert.equal(true, util.isRegExp(RegExp())); +assert.equal(true, util.isRegExp(new RegExp())); +assert.equal(true, util.isRegExp(context('RegExp')())); +assert.equal(false, util.isRegExp({})); +assert.equal(false, util.isRegExp([])); +assert.equal(false, util.isRegExp(new Date())); +assert.equal(false, util.isRegExp(Object.create(RegExp.prototype))); + +// isDate +assert.equal(true, util.isDate(new Date())); +assert.equal(true, util.isDate(new Date(0))); +assert.equal(true, util.isDate(new (context('Date')))); +assert.equal(false, util.isDate(Date())); +assert.equal(false, util.isDate({})); +assert.equal(false, util.isDate([])); +assert.equal(false, util.isDate(new Error)); +assert.equal(false, util.isDate(Object.create(Date.prototype))); + +// isError +assert.equal(true, util.isError(new Error)); +assert.equal(true, util.isError(new TypeError)); +assert.equal(true, util.isError(new SyntaxError)); +assert.equal(true, util.isError(new (context('Error')))); +assert.equal(true, util.isError(new (context('TypeError')))); +assert.equal(true, util.isError(new (context('SyntaxError')))); +assert.equal(false, util.isError({})); +assert.equal(false, util.isError({ name: 'Error', message: '' })); +assert.equal(false, util.isError([])); +assert.equal(true, util.isError(Object.create(Error.prototype))); + +// isObject +assert.ok(util.isObject({}) === true); + +// _extend +assert.deepEqual(util._extend({a:1}), {a:1}); +assert.deepEqual(util._extend({a:1}, []), {a:1}); +assert.deepEqual(util._extend({a:1}, null), {a:1}); +assert.deepEqual(util._extend({a:1}, true), {a:1}); +assert.deepEqual(util._extend({a:1}, false), {a:1}); +assert.deepEqual(util._extend({a:1}, {b:2}), {a:1, b:2}); +assert.deepEqual(util._extend({a:1, b:2}, {b:3}), {a:1, b:3}); diff --git a/deploy/node_modules/util/util.js b/deploy/node_modules/util/util.js new file mode 100644 index 0000000..e0ea321 --- /dev/null +++ b/deploy/node_modules/util/util.js @@ -0,0 +1,586 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +}; + + +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + + if (process.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +}; + + +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; + + +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; + + +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; + +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; + + +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } +} + + +function stylizeNoColor(str, styleType) { + return str; +} + + +function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; +} + + +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); +} + + +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} + + +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} + + +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; +} + + +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} + + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = require('./support/isBuffer'); + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + + +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} + + +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); +} + + +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +}; + + +/** + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. + */ +exports.inherits = require('inherits'); + +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} diff --git a/deploy/node_modules/websocket/.jshintrc b/deploy/node_modules/websocket/.jshintrc new file mode 100644 index 0000000..98d8766 --- /dev/null +++ b/deploy/node_modules/websocket/.jshintrc @@ -0,0 +1,88 @@ +{ + // JSHint Default Configuration File (as on JSHint website) + // See http://jshint.com/docs/ for more details + + "maxerr" : 50, // {int} Maximum error before stopping + + // Enforcing + "bitwise" : false, // true: Prohibit bitwise operators (&, |, ^, etc.) + "camelcase" : false, // true: Identifiers must be in camelCase + "curly" : true, // true: Require {} for every new block or scope + "eqeqeq" : true, // true: Require triple equals (===) for comparison + "freeze" : true, // true: prohibits overwriting prototypes of native objects such as Array, Date etc. + "forin" : false, // true: Require filtering for..in loops with obj.hasOwnProperty() + "immed" : true, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` + "latedef" : "nofunc", // true: Require variables/functions to be defined before being used + "newcap" : true, // true: Require capitalization of all constructor functions e.g. `new F()` + "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` + "noempty" : true, // true: Prohibit use of empty blocks + "nonbsp" : true, // true: Prohibit "non-breaking whitespace" characters. + "nonew" : true, // true: Prohibit use of constructors for side-effects (without assignment) + "plusplus" : false, // true: Prohibit use of `++` & `--` + "quotmark" : "single", // Quotation mark consistency: + // false : do nothing (default) + // true : ensure whatever is used is consistent + // "single" : require single quotes + // "double" : require double quotes + "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) + "unused" : "vars", // vars: Require all defined variables be used, ignore function params + "strict" : false, // true: Requires all functions run in ES5 Strict Mode + "maxparams" : false, // {int} Max number of formal params allowed per function + "maxdepth" : false, // {int} Max depth of nested blocks (within functions) + "maxstatements" : false, // {int} Max number statements per function + "maxcomplexity" : false, // {int} Max cyclomatic complexity per function + "maxlen" : false, // {int} Max number of characters per line + + // Relaxing + "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) + "boss" : false, // true: Tolerate assignments where comparisons would be expected + "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. + "eqnull" : false, // true: Tolerate use of `== null` + "es5" : false, // true: Allow ES5 syntax (ex: getters and setters) + "esnext" : true, // true: Allow ES.next (ES6) syntax (ex: `const`) + "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) + // (ex: `for each`, multiple try/catch, function expression…) + "evil" : false, // true: Tolerate use of `eval` and `new Function()` + "expr" : false, // true: Tolerate `ExpressionStatement` as Programs + "funcscope" : false, // true: Tolerate defining variables inside control statements + "globalstrict" : false, // true: Allow global "use strict" (also enables 'strict') + "iterator" : false, // true: Tolerate using the `__iterator__` property + "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block + "laxbreak" : false, // true: Tolerate possibly unsafe line breakings + "laxcomma" : false, // true: Tolerate comma-first style coding + "loopfunc" : false, // true: Tolerate functions being defined in loops + "multistr" : false, // true: Tolerate multi-line strings + "noyield" : false, // true: Tolerate generator functions with no yield statement in them. + "notypeof" : false, // true: Tolerate invalid typeof operator values + "proto" : false, // true: Tolerate using the `__proto__` property + "scripturl" : false, // true: Tolerate script-targeted URLs + "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;` + "sub" : true, // true: Tolerate using `[]` notation when it can still be expressed in dot notation + "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` + "validthis" : false, // true: Tolerate using this in a non-constructor function + + // Environments + "browser" : true, // Web Browser (window, document, etc) + "browserify" : true, // Browserify (node.js code in the browser) + "couch" : false, // CouchDB + "devel" : true, // Development/debugging (alert, confirm, etc) + "dojo" : false, // Dojo Toolkit + "jasmine" : false, // Jasmine + "jquery" : false, // jQuery + "mocha" : false, // Mocha + "mootools" : false, // MooTools + "node" : true, // Node.js + "nonstandard" : false, // Widely adopted globals (escape, unescape, etc) + "prototypejs" : false, // Prototype and Scriptaculous + "qunit" : false, // QUnit + "rhino" : false, // Rhino + "shelljs" : false, // ShellJS + "worker" : false, // Web Workers + "wsh" : false, // Windows Scripting Host + "yui" : false, // Yahoo User Interface + + // Custom Globals + "globals" : { // additional predefined global variables + "WebSocket": true + } +} diff --git a/deploy/node_modules/websocket/CHANGELOG.md b/deploy/node_modules/websocket/CHANGELOG.md new file mode 100644 index 0000000..a2d8eab --- /dev/null +++ b/deploy/node_modules/websocket/CHANGELOG.md @@ -0,0 +1,213 @@ +Changelog +========= + +Version 1.0.24 +-------------- +*Released 2016-12-28* + +* Fixed a bug when using native keepalive on Node >= 6.0. (Thanks, [@prossin](https://github.com/prossin)) +* Upgrading outdated dependencies + +Version 1.0.23 +-------------- +*Released 2016-05-18* + +* Official support for Node 6.x +* Updating dependencies. Specifically, updating nan to ^2.3.3 + +Version 1.0.22 +-------------- +*Released 2015-09-28* + +* Updating to work with nan 2.x + +Version 1.0.21 +-------------- +*Released 2015-07-22* + +* Incremented and re-published to work around an aborted npm publish of v1.0.20. + +Version 1.0.20 +-------------- +*Released 2015-07-22* + +* Added EventTarget to the W3CWebSocket interface (Thanks, [@ibc](https://github.com/ibc)!) +* Corrected an inaccurate error message. (Thanks, [@lekoaf](https://github.com/lekoaf)!) + +Version 1.0.19 +-------------- +*Released 2015-05-28* + +* Updated to nan v1.8.x (tested with v1.8.4) +* Added `"license": "Apache-2.0"` to package.json via [pull request #199](https://github.com/theturtle32/WebSocket-Node/pull/199) by [@pgilad](https://github.com/pgilad). See [npm1k.org](http://npm1k.org/). + + +Version 1.0.18 +-------------- +*Released 2015-03-19* + +* Resolves [issue #195](https://github.com/theturtle32/WebSocket-Node/pull/179) - passing number to connection.send() causes crash +* [Added close code/reason arguments to W3CWebSocket#close()](https://github.com/theturtle32/WebSocket-Node/issues/184) + + +Version 1.0.17 +-------------- +*Released 2015-01-17* + +* Resolves [issue #179](https://github.com/theturtle32/WebSocket-Node/pull/179) - Allow toBuffer to work with empty data + + +Version 1.0.16 +-------------- +*Released 2015-01-16* + +* Resolves [issue #178](https://github.com/theturtle32/WebSocket-Node/issues/178) - Ping Frames with no data + + +Version 1.0.15 +-------------- +*Released 2015-01-13* + +* Resolves [issue #177](https://github.com/theturtle32/WebSocket-Node/issues/177) - WebSocketClient ignores options unless it has a tlsOptions property + + +Version 1.0.14 +-------------- +*Released 2014-12-03* + +* Resolves [issue #173](https://github.com/theturtle32/WebSocket-Node/issues/173) - To allow the W3CWebSocket interface to accept an optional non-standard configuration object as its third parameter, which will be ignored when running in a browser context. + + +Version 1.0.13 +-------------- +*Released 2014-11-29* + +* Fixes [issue #171](https://github.com/theturtle32/WebSocket-Node/issues/171) - Code to prevent calling req.accept/req.reject multiple times breaks sanity checks in req.accept + + +Version 1.0.12 +-------------- +*Released 2014-11-28* + +* Fixes [issue #170](https://github.com/theturtle32/WebSocket-Node/issues/170) - Non-native XOR implementation broken after making JSHint happy + + +Version 1.0.11 +-------------- +*Released 2014-11-25* + +* Fixes some undefined behavior surrounding closing WebSocket connections and more reliably handles edge cases. +* Adds an implementation of the W3C WebSocket API for browsers to facilitate sharing code between client and server via browserify. (Thanks, [@ibc](https://github.com/ibc)!) +* `WebSocketConnection.prototype.close` now accepts optional `reasonCode` and `description` parameters. +* Calling `accept` or `reject` more than once on a `WebSocketRequest` will now throw an error. [Issue #149](https://github.com/theturtle32/WebSocket-Node/issues/149) +* Handling connections dropped by client before accepted by server [Issue #167](https://github.com/theturtle32/WebSocket-Node/issues/167) +* Integrating Gulp and JSHint (Thanks, [@ibc](https://github.com/ibc)!) +* Starting to add individual unit tests (using substack's [tape](github.com/substack/tape) and [faucet](github.com/substack/faucet)) + + +Version 1.0.10 +-------------- +*Released 2014-10-22* + +* Fixed Issue [#146](https://github.com/theturtle32/WebSocket-Node/issues/146) that was causing WebSocketClient to throw errors when instantiated if passed `tlsOptions`. + +Version 1.0.9 +------------- +*Released 2014-10-20* + +* Fixing an insidious corner-case bug that prevented `WebSocketConnection` from firing the `close` event in certain cases when there was an error on the underlying `Socket`, leading to connections sticking around forever, stuck erroneously in the `connected` state. These "ghost" connections would cause an error event when trying to write to them. +* Removed deprecated `websocketVersion` property. Use `webSocketVersion` instead (case difference). +* Allowing user to specify all properties for `tlsOptions` in WebSocketClient, not just a few whitelisted properties. This keeps us from having to constantly add new config properties for new versions of Node. (Thanks, [jesusprubio](https://github.com/jesusprubio)) +* Removing support for Node 0.4.x and 0.6.x. +* Adding `fuzzingclient.json` spec file for the Autobahn Test Suite. +* Now more fairly emitting `message` events from the `WebSocketConnection`. Previously, all buffered frames for a connection would be processed and all `message` events emitted before moving on to processing the next connection with available data. Now We process one frame per connection (most of the time) in a more fair round-robin fashion. +* Now correctly calling the `EventEmitter` superclass constructor during class instance initialization. +* `WebSocketClient.prototype.connect` now accepts the empty string (`''`) to mean "no subprotocol requested." Previously either `null` or an empty array (`[]`) was required. +* Fixing a `TypeError` bug in `WebSocketRouter` (Thanks, [a0000778](https://github.com/a0000778)) +* Fixing a potential race condition when attaching event listeners to the underlying `Socket`. (Thanks [RichardBsolut](https://github.com/RichardBsolut)) +* `WebSocketClient` now accepts an optional options hash to be passed to `(http|https).request`. (Thanks [mildred](https://github.com/mildred) and [aus](https://github.com/aus)) This enables the following new abilities, amongst others: + * Use WebSocket-Node from behind HTTP/HTTPS proxy servers using [koichik/node-tunnel](https://github.com/koichik/node-tunnel) or similar. + * Specify the local port and local address to bind the outgoing request socket to. +* Adding option to ignore `X-Forwarded-For` headers when accepting connections from untrusted clients. +* Adding ability to mount a `WebSocketServer` instance to an arbitrary number of Node http/https servers. +* Adding browser shim so Browserify won't blow up when trying to package up code that uses WebSocket-Node. The shim is a no-op, it ***does not implement a wrapper*** providing the WebSocket-Node API in the browser. +* Incorporating upstream enhancements for the native C++ UTF-8 validation and xor masking functions. (Thanks [einaros](https://github.com/einaros) and [kkoopa](https://github.com/kkoopa)) + + +Version 1.0.8 +------------- +*Released 2012-12-26* + +* Fixed remaining naming inconsistency of "websocketVersion" as opposed to "webSocketVersion" throughout the code, and added deprecation warnings for use of the old casing throughout. +* Fixed an issue with our case-insensitive handling of WebSocket subprotocols. Clients that requested a mixed-case subprotocol would end up failing the connection when the server accepted the connection, returning a lower-case version of the subprotocol name. Now we return the subprotocol name in the exact casing that was requested by the client, while still maintaining the case-insensitive verification logic for convenience and practicality. +* Making sure that any socket-level activity timeout that may have been set on a TCP socket is removed when initializing a connection. +* Added support for native TCP Keep-Alive instead of using the WebSocket ping/pong packets to serve that function. +* Fixed cookie parsing to be compliant with RFC 2109 + +Version 1.0.7 +------------- +*Released 2012-08-12* + +* ***Native modules are now optional!*** If they fail to compile, WebSocket-Node will still work but will not verify that received UTF-8 data is valid, and xor masking/unmasking of payload data for security purposes will not be as efficient as it is performed in JavaScript instead of native code. +* Reduced Node.JS version requirement back to v0.6.10 + +Version 1.0.6 +------------- +*Released 2012-05-22* + +* Now requires Node v0.6.13 since that's the first version that I can manage to successfully build the native UTF-8 validator with node-gyp through npm. + +Version 1.0.5 +------------- +*Released 2012-05-21* + +* Fixes the issues that users were having building the native UTF-8 validator on Windows platforms. Special Thanks to: + * [zerodivisi0n](https://github.com/zerodivisi0n) + * [andreasbotsikas](https://github.com/andreasbotsikas) +* Fixed accidental global variable usage (Thanks, [hakobera](https://github.com/hakobera)!) +* Added callbacks to the send* methods that provide notification of messages being sent on the wire and any socket errors that may occur when sending a message. (Thanks, [zerodivisi0n](https://github.com/zerodivisi0n)!) +* Added option to disable logging in the echo-server in the test folder (Thanks, [oberstet](https://github.com/oberstet)!) + + +Version 1.0.4 +------------- +*Released 2011-12-18* + +* Now validates that incoming UTF-8 messages do, in fact, contain valid UTF-8 data. The connection is dropped with prejudice if invalid data is received. This strict behavior conforms to the WebSocket RFC and is verified by the Autobahn Test Suite. This is accomplished in a performant way by using a native C++ Node module created by [einaros](https://github.com/einaros). +* Updated handling of connection closure to pass more of the Autobahn Test Suite. + +Version 1.0.3 +------------- +*Released 2011-12-18* + +* Substantial speed increase (~150% on my machine, depending on the circumstances) due to an optimization in FastBufferList.js that drastically reduces the number of memory alloctions and buffer copying. ([kazuyukitanimura](https://github.com/kazuyukitanimura)) + + +Version 1.0.2 +------------- +*Released 2011-11-28* + +* Fixing whiteboard example to work under Node 0.6.x ([theturtle32](https://github.com/theturtle32)) +* Now correctly emitting a `close` event with a 1006 error code if there is a TCP error while writing to the socket during the handshake. ([theturtle32](https://github.com/theturtle32)) +* Catching errors when writing to the TCP socket during the handshake. ([justoneplanet](https://github.com/justoneplanet)) +* No longer outputting console.warn messages when there is an error writing to the TCP socket ([justoneplanet](https://github.com/justoneplanet)) +* Fixing some formatting errors, commas, semicolons, etc. ([kaisellgren](https://github.com/kaisellgren)) + + +Version 1.0.1 +------------- +*Released 2011-11-21* + +* Now works with Node 0.6.2 as well as 0.4.12 +* Support TLS in WebSocketClient +* Added support for setting and reading cookies +* Added WebSocketServer.prototype.broadcast(data) convenience method +* Added `resourceURL` property to WebSocketRequest objects. It is a Node URL object with the `resource` and any query string params already parsed. +* The WebSocket request router no longer includes the entire query string when trying to match the path name of the request. +* WebSocketRouterRequest objects now include all the properties and events of WebSocketRequest objects. +* Removed more console.log statements. Please rely on the various events emitted to be notified of error conditions. I decided that it is not a library's place to spew information to the console. +* Renamed the `websocketVersion` property to `webSocketVersion` throughout the code to fix inconsistent capitalization. `websocketVersion` has been kept for compatibility but is deprecated and may be removed in the future. +* Now outputting the sanitized version of custom header names rather than the raw value. This prevents invalid HTTP from being put onto the wire if given an illegal header name. + + +I decided it's time to start maintaining a changelog now, starting with version 1.0.1. diff --git a/deploy/node_modules/websocket/LICENSE b/deploy/node_modules/websocket/LICENSE new file mode 100644 index 0000000..430d42b --- /dev/null +++ b/deploy/node_modules/websocket/LICENSE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/deploy/node_modules/websocket/Makefile b/deploy/node_modules/websocket/Makefile new file mode 100644 index 0000000..39ff645 --- /dev/null +++ b/deploy/node_modules/websocket/Makefile @@ -0,0 +1,11 @@ +all: + node-gyp configure build + +clean: + node-gyp clean + +autobahn: + @NODE_PATH=lib node test/autobahn-test-client.js --host=127.0.0.1 --port=9000 + +autobahn-server: + @NODE_PATH=lib node test/echo-server.js diff --git a/deploy/node_modules/websocket/README.md b/deploy/node_modules/websocket/README.md new file mode 100644 index 0000000..6866b6c --- /dev/null +++ b/deploy/node_modules/websocket/README.md @@ -0,0 +1,314 @@ +WebSocket Client & Server Implementation for Node +================================================= + +[![npm version](https://badge.fury.io/js/websocket.svg)](http://badge.fury.io/js/websocket) + +[![NPM Downloads](https://img.shields.io/npm/dm/websocket.svg)](https://www.npmjs.com/package/websocket) + +[![NPM](https://nodei.co/npm/websocket.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/websocket/) + +[![NPM](https://nodei.co/npm-dl/websocket.png?height=3)](https://nodei.co/npm/websocket/) + +[ ![Codeship Status for theturtle32/WebSocket-Node](https://codeship.com/projects/70458270-8ee7-0132-7756-0a0cf4fe8e66/status?branch=master)](https://codeship.com/projects/61106) + +Overview +-------- +This is a (mostly) pure JavaScript implementation of the WebSocket protocol versions 8 and 13 for Node. There are some example client and server applications that implement various interoperability testing protocols in the "test/scripts" folder. + +For a WebSocket client written in ActionScript 3, see my [AS3WebScocket](https://github.com/theturtle32/AS3WebSocket) project. + + +Documentation +============= + +[You can read the full API documentation in the docs folder.](docs/index.md) + + +Changelog +--------- + +***Current Version: 1.0.24*** — Released 2016-12-28 + +***Version 1.0.24*** + +* Fixed a bug when using native keepalive on Node >= 6.0. (Thanks, [@prossin](https://github.com/prossin)) +* Upgrading outdated dependencies + +***Version 1.0.23*** + +* Official support for Node 6.x +* Updating dependencies. Specifically, updating nan to ^2.3.3 + +***Version 1.0.22*** + +* Updating to work with nan 2.x + + +***Version 1.0.21*** + +* Incremented and re-published to work around an aborted npm publish of v1.0.20. + +***Version 1.0.20*** + +* Added EventTarget to the W3CWebSocket interface (Thanks, [@ibc](https://github.com/ibc)!) +* Corrected an inaccurate error message. (Thanks, [@lekoaf](https://github.com/lekoaf)!) + +***Version 1.0.19*** + +* Updated to nan v1.8.x (tested with v1.8.4) +* Added `"license": "Apache-2.0"` to package.json via [pull request #199](https://github.com/theturtle32/WebSocket-Node/pull/199) by [@pgilad](https://github.com/pgilad). See [npm1k.org](http://npm1k.org/). + +[View the full changelog](CHANGELOG.md) + +Browser Support +--------------- + +All current browsers are fully supported. + +* Firefox 7-9 (Old) (Protocol Version 8) +* Firefox 10+ (Protocol Version 13) +* Chrome 14,15 (Old) (Protocol Version 8) +* Chrome 16+ (Protocol Version 13) +* Internet Explorer 10+ (Protocol Version 13) +* Safari 6+ (Protocol Version 13) + +***Safari older than 6.0 is not supported since it uses a very old draft of WebSockets*** + +***If you need to simultaneously support legacy browser versions that had implemented draft-75/draft-76/draft-00, take a look here: https://gist.github.com/1428579*** + +Benchmarks +---------- +There are some basic benchmarking sections in the Autobahn test suite. I've put up a [benchmark page](http://theturtle32.github.com/WebSocket-Node/benchmarks/) that shows the results from the Autobahn tests run against AutobahnServer 0.4.10, WebSocket-Node 1.0.2, WebSocket-Node 1.0.4, and ws 0.3.4. + +Autobahn Tests +-------------- +The very complete [Autobahn Test Suite](http://autobahn.ws/testsuite/) is used by most WebSocket implementations to test spec compliance and interoperability. + +- [View Server Test Results](http://theturtle32.github.com/WebSocket-Node/test-report/servers/) +- [View Client Test Results](http://theturtle32.github.com/WebSocket-Node/test-report/clients/) + +Notes +----- +This library has been used in production on [worlize.com](https://www.worlize.com) since April 2011 and seems to be stable. Your mileage may vary. + +**Tested with the following node versions:** + +- 6.2.0 +- 5.11.1 +- 4.4.4 +- 0.10.45 + +It may work in earlier or later versions but I'm not actively testing it outside of the listed versions. YMMV. + +Installation +------------ + +A few users have reported difficulties building the native extensions without first manually installing node-gyp. If you have trouble building the native extensions, make sure you've got a C++ compiler, and have done `npm install -g node-gyp` first. + +Native extensions are optional, however, and WebSocket-Node will work even if the extensions cannot be compiled. + +In your project root: + + $ npm install websocket + +Then in your code: + +```javascript +var WebSocketServer = require('websocket').server; +var WebSocketClient = require('websocket').client; +var WebSocketFrame = require('websocket').frame; +var WebSocketRouter = require('websocket').router; +var W3CWebSocket = require('websocket').w3cwebsocket; +``` + +Note for Windows Users +---------------------- +Because there is a small C++ component used for validating UTF-8 data, you will need to install a few other software packages in addition to Node to be able to build this module: + +- [Microsoft Visual C++](http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express) +- [Python 2.7](http://www.python.org/download/) (NOT Python 3.x) + + +Current Features: +----------------- +- Licensed under the Apache License, Version 2.0 +- Protocol version "8" and "13" (Draft-08 through the final RFC) framing and handshake +- Can handle/aggregate received fragmented messages +- Can fragment outgoing messages +- Router to mount multiple applications to various path and protocol combinations +- TLS supported for outbound connections via WebSocketClient +- TLS supported for server connections (use https.createServer instead of http.createServer) + - Thanks to [pors](https://github.com/pors) for confirming this! +- Cookie setting and parsing +- Tunable settings + - Max Receivable Frame Size + - Max Aggregate ReceivedMessage Size + - Whether to fragment outgoing messages + - Fragmentation chunk size for outgoing messages + - Whether to automatically send ping frames for the purposes of keepalive + - Keep-alive ping interval + - Whether or not to automatically assemble received fragments (allows application to handle individual fragments directly) + - How long to wait after sending a close frame for acknowledgment before closing the socket. +- [W3C WebSocket API](http://www.w3.org/TR/websockets/) for applications running on both Node and browsers (via the `W3CWebSocket` class). + + +Known Issues/Missing Features: +------------------------------ +- No API for user-provided protocol extensions. + + +Usage Examples +============== + +Server Example +-------------- + +Here's a short example showing a server that echos back anything sent to it, whether utf-8 or binary. + +```javascript +#!/usr/bin/env node +var WebSocketServer = require('websocket').server; +var http = require('http'); + +var server = http.createServer(function(request, response) { + console.log((new Date()) + ' Received request for ' + request.url); + response.writeHead(404); + response.end(); +}); +server.listen(8080, function() { + console.log((new Date()) + ' Server is listening on port 8080'); +}); + +wsServer = new WebSocketServer({ + httpServer: server, + // You should not use autoAcceptConnections for production + // applications, as it defeats all standard cross-origin protection + // facilities built into the protocol and the browser. You should + // *always* verify the connection's origin and decide whether or not + // to accept it. + autoAcceptConnections: false +}); + +function originIsAllowed(origin) { + // put logic here to detect whether the specified origin is allowed. + return true; +} + +wsServer.on('request', function(request) { + if (!originIsAllowed(request.origin)) { + // Make sure we only accept requests from an allowed origin + request.reject(); + console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.'); + return; + } + + var connection = request.accept('echo-protocol', request.origin); + console.log((new Date()) + ' Connection accepted.'); + connection.on('message', function(message) { + if (message.type === 'utf8') { + console.log('Received Message: ' + message.utf8Data); + connection.sendUTF(message.utf8Data); + } + else if (message.type === 'binary') { + console.log('Received Binary Message of ' + message.binaryData.length + ' bytes'); + connection.sendBytes(message.binaryData); + } + }); + connection.on('close', function(reasonCode, description) { + console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.'); + }); +}); +``` + +Client Example +-------------- + +This is a simple example client that will print out any utf-8 messages it receives on the console, and periodically sends a random number. + +*This code demonstrates a client in Node.js, not in the browser* + +```javascript +#!/usr/bin/env node +var WebSocketClient = require('websocket').client; + +var client = new WebSocketClient(); + +client.on('connectFailed', function(error) { + console.log('Connect Error: ' + error.toString()); +}); + +client.on('connect', function(connection) { + console.log('WebSocket Client Connected'); + connection.on('error', function(error) { + console.log("Connection Error: " + error.toString()); + }); + connection.on('close', function() { + console.log('echo-protocol Connection Closed'); + }); + connection.on('message', function(message) { + if (message.type === 'utf8') { + console.log("Received: '" + message.utf8Data + "'"); + } + }); + + function sendNumber() { + if (connection.connected) { + var number = Math.round(Math.random() * 0xFFFFFF); + connection.sendUTF(number.toString()); + setTimeout(sendNumber, 1000); + } + } + sendNumber(); +}); + +client.connect('ws://localhost:8080/', 'echo-protocol'); +``` + +Client Example using the *W3C WebSocket API* +-------------------------------------------- + +Same example as above but using the [W3C WebSocket API](http://www.w3.org/TR/websockets/). + +```javascript +var W3CWebSocket = require('websocket').w3cwebsocket; + +var client = new W3CWebSocket('ws://localhost:8080/', 'echo-protocol'); + +client.onerror = function() { + console.log('Connection Error'); +}; + +client.onopen = function() { + console.log('WebSocket Client Connected'); + + function sendNumber() { + if (client.readyState === client.OPEN) { + var number = Math.round(Math.random() * 0xFFFFFF); + client.send(number.toString()); + setTimeout(sendNumber, 1000); + } + } + sendNumber(); +}; + +client.onclose = function() { + console.log('echo-protocol Client Closed'); +}; + +client.onmessage = function(e) { + if (typeof e.data === 'string') { + console.log("Received: '" + e.data + "'"); + } +}; +``` + +Request Router Example +---------------------- + +For an example of using the request router, see `libwebsockets-test-server.js` in the `test` folder. + + +Resources +--------- + +A presentation on the state of the WebSockets protocol that I gave on July 23, 2011 at the LA Hacker News meetup. [WebSockets: The Real-Time Web, Delivered](http://www.scribd.com/doc/60898569/WebSockets-The-Real-Time-Web-Delivered) diff --git a/deploy/node_modules/websocket/binding.gyp b/deploy/node_modules/websocket/binding.gyp new file mode 100644 index 0000000..77b2ed5 --- /dev/null +++ b/deploy/node_modules/websocket/binding.gyp @@ -0,0 +1,18 @@ +{ + 'targets': [ + { + 'target_name': 'validation', + 'include_dirs': ["> $(depfile) +# Add extra rules as in (2). +# We remove slashes and replace spaces with new lines; +# remove blank lines; +# delete the first line and append a colon to the remaining lines. +sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\ + grep -v '^$$' |\ + sed -e 1d -e 's|$$|:|' \ + >> $(depfile) +rm $(depfile).raw +endef + +# Command definitions: +# - cmd_foo is the actual command to run; +# - quiet_cmd_foo is the brief-output summary of the command. + +quiet_cmd_cc = CC($(TOOLSET)) $@ +cmd_cc = $(CC.$(TOOLSET)) $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c -o $@ $< + +quiet_cmd_cxx = CXX($(TOOLSET)) $@ +cmd_cxx = $(CXX.$(TOOLSET)) $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< + +quiet_cmd_objc = CXX($(TOOLSET)) $@ +cmd_objc = $(CC.$(TOOLSET)) $(GYP_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< + +quiet_cmd_objcxx = CXX($(TOOLSET)) $@ +cmd_objcxx = $(CXX.$(TOOLSET)) $(GYP_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +# Commands for precompiled header files. +quiet_cmd_pch_c = CXX($(TOOLSET)) $@ +cmd_pch_c = $(CC.$(TOOLSET)) $(GYP_PCH_CFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< +quiet_cmd_pch_cc = CXX($(TOOLSET)) $@ +cmd_pch_cc = $(CC.$(TOOLSET)) $(GYP_PCH_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< +quiet_cmd_pch_m = CXX($(TOOLSET)) $@ +cmd_pch_m = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< +quiet_cmd_pch_mm = CXX($(TOOLSET)) $@ +cmd_pch_mm = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +# gyp-mac-tool is written next to the root Makefile by gyp. +# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd +# already. +quiet_cmd_mac_tool = MACTOOL $(4) $< +cmd_mac_tool = ./gyp-mac-tool $(4) $< "$@" + +quiet_cmd_mac_package_framework = PACKAGE FRAMEWORK $@ +cmd_mac_package_framework = ./gyp-mac-tool package-framework "$@" $(4) + +quiet_cmd_infoplist = INFOPLIST $@ +cmd_infoplist = $(CC.$(TOOLSET)) -E -P -Wno-trigraphs -x c $(INFOPLIST_DEFINES) "$<" -o "$@" + +quiet_cmd_touch = TOUCH $@ +cmd_touch = touch $@ + +quiet_cmd_copy = COPY $@ +# send stderr to /dev/null to ignore messages when linking directories. +cmd_copy = rm -rf "$@" && cp -af "$<" "$@" + +quiet_cmd_alink = LIBTOOL-STATIC $@ +cmd_alink = rm -f $@ && ./gyp-mac-tool filter-libtool libtool $(GYP_LIBTOOLFLAGS) -static -o $@ $(filter %.o,$^) + +quiet_cmd_link = LINK($(TOOLSET)) $@ +cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) + +quiet_cmd_solink = SOLINK($(TOOLSET)) $@ +cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) + +quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ +cmd_solink_module = $(LINK.$(TOOLSET)) -bundle $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) + + +# Define an escape_quotes function to escape single quotes. +# This allows us to handle quotes properly as long as we always use +# use single quotes and escape_quotes. +escape_quotes = $(subst ','\'',$(1)) +# This comment is here just to include a ' to unconfuse syntax highlighting. +# Define an escape_vars function to escape '$' variable syntax. +# This allows us to read/write command lines with shell variables (e.g. +# $LD_LIBRARY_PATH), without triggering make substitution. +escape_vars = $(subst $$,$$$$,$(1)) +# Helper that expands to a shell command to echo a string exactly as it is in +# make. This uses printf instead of echo because printf's behaviour with respect +# to escape sequences is more portable than echo's across different shells +# (e.g., dash, bash). +exact_echo = printf '%s\n' '$(call escape_quotes,$(1))' + +# Helper to compare the command we're about to run against the command +# we logged the last time we ran the command. Produces an empty +# string (false) when the commands match. +# Tricky point: Make has no string-equality test function. +# The kernel uses the following, but it seems like it would have false +# positives, where one string reordered its arguments. +# arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \ +# $(filter-out $(cmd_$@), $(cmd_$(1)))) +# We instead substitute each for the empty string into the other, and +# say they're equal if both substitutions produce the empty string. +# .d files contain ? instead of spaces, take that into account. +command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\ + $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1)))) + +# Helper that is non-empty when a prerequisite changes. +# Normally make does this implicitly, but we force rules to always run +# so we can check their command lines. +# $? -- new prerequisites +# $| -- order-only dependencies +prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?)) + +# Helper that executes all postbuilds until one fails. +define do_postbuilds + @E=0;\ + for p in $(POSTBUILDS); do\ + eval $$p;\ + E=$$?;\ + if [ $$E -ne 0 ]; then\ + break;\ + fi;\ + done;\ + if [ $$E -ne 0 ]; then\ + rm -rf "$@";\ + exit $$E;\ + fi +endef + +# do_cmd: run a command via the above cmd_foo names, if necessary. +# Should always run for a given target to handle command-line changes. +# Second argument, if non-zero, makes it do asm/C/C++ dependency munging. +# Third argument, if non-zero, makes it do POSTBUILDS processing. +# Note: We intentionally do NOT call dirx for depfile, since it contains ? for +# spaces already and dirx strips the ? characters. +define do_cmd +$(if $(or $(command_changed),$(prereq_changed)), + @$(call exact_echo, $($(quiet)cmd_$(1))) + @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))" + $(if $(findstring flock,$(word 2,$(cmd_$1))), + @$(cmd_$(1)) + @echo " $(quiet_cmd_$(1)): Finished", + @$(cmd_$(1)) + ) + @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile) + @$(if $(2),$(fixup_dep)) + $(if $(and $(3), $(POSTBUILDS)), + $(call do_postbuilds) + ) +) +endef + +# Declare the "all" target first so it is the default, +# even though we don't have the deps yet. +.PHONY: all +all: + +# make looks for ways to re-generate included makefiles, but in our case, we +# don't have a direct way. Explicitly telling make that it has nothing to do +# for them makes it go faster. +%.d: ; + +# Use FORCE_DO_CMD to force a target to run. Should be coupled with +# do_cmd. +.PHONY: FORCE_DO_CMD +FORCE_DO_CMD: + +TOOLSET := target +# Suffix rules, putting all outputs into $(obj). +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) + +# Try building from generated source, too. +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) + +$(obj).$(TOOLSET)/%.o: $(obj)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) + + +ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ + $(findstring $(join ^,$(prefix)),\ + $(join ^,bufferutil.target.mk)))),) + include bufferutil.target.mk +endif +ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ + $(findstring $(join ^,$(prefix)),\ + $(join ^,validation.target.mk)))),) + include validation.target.mk +endif + +quiet_cmd_regen_makefile = ACTION Regenerating $@ +cmd_regen_makefile = cd $(srcdir); /usr/local/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py -fmake --ignore-environment "--toplevel-dir=." -I/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/websocket/build/config.gypi -I/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/Users/prophesi/.node-gyp/8.2.1/include/node/common.gypi "--depth=." "-Goutput_dir=." "--generator-output=build" "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/Users/prophesi/.node-gyp/8.2.1" "-Dnode_gyp_dir=/usr/local/lib/node_modules/npm/node_modules/node-gyp" "-Dnode_lib_file=/Users/prophesi/.node-gyp/8.2.1/<(target_arch)/node.lib" "-Dmodule_root_dir=/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/websocket" "-Dnode_engine=v8" binding.gyp +Makefile: $(srcdir)/../../../../../.node-gyp/8.2.1/include/node/common.gypi $(srcdir)/../../../../../../../usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi $(srcdir)/build/config.gypi $(srcdir)/binding.gyp + $(call do_cmd,regen_makefile) + +# "all" is a concatenation of the "all" targets from all the included +# sub-makefiles. This is just here to clarify. +all: + +# Add in dependency-tracking rules. $(all_deps) is the list of every single +# target in our tree. Only consider the ones with .d (dependency) info: +d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d)) +ifneq ($(d_files),) + include $(d_files) +endif diff --git a/deploy/node_modules/websocket/build/Release/.deps/Release/bufferutil.node.d b/deploy/node_modules/websocket/build/Release/.deps/Release/bufferutil.node.d new file mode 100644 index 0000000..dace532 --- /dev/null +++ b/deploy/node_modules/websocket/build/Release/.deps/Release/bufferutil.node.d @@ -0,0 +1 @@ +cmd_Release/bufferutil.node := c++ -bundle -undefined dynamic_lookup -Wl,-no_pie -Wl,-search_paths_first -mmacosx-version-min=10.7 -arch x86_64 -L./Release -stdlib=libc++ -o Release/bufferutil.node Release/obj.target/bufferutil/src/bufferutil.o diff --git a/deploy/node_modules/websocket/build/Release/.deps/Release/obj.target/bufferutil/src/bufferutil.o.d b/deploy/node_modules/websocket/build/Release/.deps/Release/obj.target/bufferutil/src/bufferutil.o.d new file mode 100644 index 0000000..44d8031 --- /dev/null +++ b/deploy/node_modules/websocket/build/Release/.deps/Release/obj.target/bufferutil/src/bufferutil.o.d @@ -0,0 +1,52 @@ +cmd_Release/obj.target/bufferutil/src/bufferutil.o := c++ '-DNODE_GYP_MODULE_NAME=bufferutil' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DBUILDING_NODE_EXTENSION' -I/Users/prophesi/.node-gyp/8.2.1/include/node -I/Users/prophesi/.node-gyp/8.2.1/src -I/Users/prophesi/.node-gyp/8.2.1/deps/uv/include -I/Users/prophesi/.node-gyp/8.2.1/deps/v8/include -I../../nan -Os -gdwarf-2 -mmacosx-version-min=10.7 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -std=gnu++0x -stdlib=libc++ -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/bufferutil/src/bufferutil.o.d.raw -c -o Release/obj.target/bufferutil/src/bufferutil.o ../src/bufferutil.cc +Release/obj.target/bufferutil/src/bufferutil.o: ../src/bufferutil.cc \ + /Users/prophesi/.node-gyp/8.2.1/include/node/v8.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/v8-version.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/v8config.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/node.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/node_version.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/node_buffer.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/node_object_wrap.h \ + ../../nan/nan.h /Users/prophesi/.node-gyp/8.2.1/include/node/uv.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/uv-errno.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/uv-version.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/uv-unix.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/uv-threadpool.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/uv-darwin.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/pthread-barrier.h \ + ../../nan/nan_callbacks.h ../../nan/nan_callbacks_12_inl.h \ + ../../nan/nan_maybe_43_inl.h ../../nan/nan_converters.h \ + ../../nan/nan_converters_43_inl.h ../../nan/nan_new.h \ + ../../nan/nan_implementation_12_inl.h \ + ../../nan/nan_persistent_12_inl.h ../../nan/nan_weak.h \ + ../../nan/nan_object_wrap.h ../../nan/nan_private.h \ + ../../nan/nan_typedarray_contents.h ../../nan/nan_json.h +../src/bufferutil.cc: +/Users/prophesi/.node-gyp/8.2.1/include/node/v8.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/v8-version.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/v8config.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/node.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/node_version.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/node_buffer.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/node_object_wrap.h: +../../nan/nan.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/uv.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/uv-errno.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/uv-version.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/uv-unix.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/uv-threadpool.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/uv-darwin.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/pthread-barrier.h: +../../nan/nan_callbacks.h: +../../nan/nan_callbacks_12_inl.h: +../../nan/nan_maybe_43_inl.h: +../../nan/nan_converters.h: +../../nan/nan_converters_43_inl.h: +../../nan/nan_new.h: +../../nan/nan_implementation_12_inl.h: +../../nan/nan_persistent_12_inl.h: +../../nan/nan_weak.h: +../../nan/nan_object_wrap.h: +../../nan/nan_private.h: +../../nan/nan_typedarray_contents.h: +../../nan/nan_json.h: diff --git a/deploy/node_modules/websocket/build/Release/.deps/Release/obj.target/validation/src/validation.o.d b/deploy/node_modules/websocket/build/Release/.deps/Release/obj.target/validation/src/validation.o.d new file mode 100644 index 0000000..54f3c88 --- /dev/null +++ b/deploy/node_modules/websocket/build/Release/.deps/Release/obj.target/validation/src/validation.o.d @@ -0,0 +1,52 @@ +cmd_Release/obj.target/validation/src/validation.o := c++ '-DNODE_GYP_MODULE_NAME=validation' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DBUILDING_NODE_EXTENSION' -I/Users/prophesi/.node-gyp/8.2.1/include/node -I/Users/prophesi/.node-gyp/8.2.1/src -I/Users/prophesi/.node-gyp/8.2.1/deps/uv/include -I/Users/prophesi/.node-gyp/8.2.1/deps/v8/include -I../../nan -Os -gdwarf-2 -mmacosx-version-min=10.7 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -std=gnu++0x -stdlib=libc++ -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/validation/src/validation.o.d.raw -c -o Release/obj.target/validation/src/validation.o ../src/validation.cc +Release/obj.target/validation/src/validation.o: ../src/validation.cc \ + /Users/prophesi/.node-gyp/8.2.1/include/node/v8.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/v8-version.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/v8config.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/node.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/node_version.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/node_buffer.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/node_object_wrap.h \ + ../../nan/nan.h /Users/prophesi/.node-gyp/8.2.1/include/node/uv.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/uv-errno.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/uv-version.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/uv-unix.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/uv-threadpool.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/uv-darwin.h \ + /Users/prophesi/.node-gyp/8.2.1/include/node/pthread-barrier.h \ + ../../nan/nan_callbacks.h ../../nan/nan_callbacks_12_inl.h \ + ../../nan/nan_maybe_43_inl.h ../../nan/nan_converters.h \ + ../../nan/nan_converters_43_inl.h ../../nan/nan_new.h \ + ../../nan/nan_implementation_12_inl.h \ + ../../nan/nan_persistent_12_inl.h ../../nan/nan_weak.h \ + ../../nan/nan_object_wrap.h ../../nan/nan_private.h \ + ../../nan/nan_typedarray_contents.h ../../nan/nan_json.h +../src/validation.cc: +/Users/prophesi/.node-gyp/8.2.1/include/node/v8.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/v8-version.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/v8config.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/node.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/node_version.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/node_buffer.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/node_object_wrap.h: +../../nan/nan.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/uv.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/uv-errno.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/uv-version.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/uv-unix.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/uv-threadpool.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/uv-darwin.h: +/Users/prophesi/.node-gyp/8.2.1/include/node/pthread-barrier.h: +../../nan/nan_callbacks.h: +../../nan/nan_callbacks_12_inl.h: +../../nan/nan_maybe_43_inl.h: +../../nan/nan_converters.h: +../../nan/nan_converters_43_inl.h: +../../nan/nan_new.h: +../../nan/nan_implementation_12_inl.h: +../../nan/nan_persistent_12_inl.h: +../../nan/nan_weak.h: +../../nan/nan_object_wrap.h: +../../nan/nan_private.h: +../../nan/nan_typedarray_contents.h: +../../nan/nan_json.h: diff --git a/deploy/node_modules/websocket/build/Release/.deps/Release/validation.node.d b/deploy/node_modules/websocket/build/Release/.deps/Release/validation.node.d new file mode 100644 index 0000000..7f9e3a4 --- /dev/null +++ b/deploy/node_modules/websocket/build/Release/.deps/Release/validation.node.d @@ -0,0 +1 @@ +cmd_Release/validation.node := c++ -bundle -undefined dynamic_lookup -Wl,-no_pie -Wl,-search_paths_first -mmacosx-version-min=10.7 -arch x86_64 -L./Release -stdlib=libc++ -o Release/validation.node Release/obj.target/validation/src/validation.o diff --git a/deploy/node_modules/websocket/build/Release/bufferutil.node b/deploy/node_modules/websocket/build/Release/bufferutil.node new file mode 100755 index 0000000000000000000000000000000000000000..10270b3ba47a6b9dcf2131b1598fe10b2bd531e8 GIT binary patch literal 22764 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 S^1#FKuQT}1YUGmtN%jLga2>9 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 z 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%0A2hbQ-`gN?*@jpQ2zBLCLA zEKyh9l+@?Aaj|T;?HVGg0%jvgQO6r&j0>1^c%RPrgTO>s5 zq=&3vD$2VMaME&KY_mYp>3q@(kjcSDAZflyS_#q@YzguVk*h$a2fKh=hAfgE2ALgf z1*7YTTn(~ra5P93UIVf)I0+=1S_`sqa3;tXupLNx1Z1fwk!bt=u$Q#JDp?MGFW^aw zt*dFvzXjbRyIF3>J&4VXvtEZmkmJq9!ZTU>1CaeTft&)*E+dU*^>|=>P9sG0K8FF` z>_Yu`oJCdx3dyZ7-4gUKhRw=M-5aE#L0ZQnYQD_v4fu9aY#*Jol*zoA;BF(N3tW)O zoS$1T?H>>j)hU(Y=FLpC> z7P82F2t{NW!sf%9!#k4OTNyKl9icx$kI+A8N7{uDT;I+Fuah+M=pPX)97B+nhD2^@ zHlm6$a*EhLBj`hPZs{OIJ}W|X5TOnep})(GRNadHRujQS46Fe${)J#QCy8=OMd%Me zBm1L4m{7_$(w$Na^rh6O*5GkKWP~2Vh>RwHQ+H5`{8EKsIeNMyavuSdDqlsZPGRsk zATmOaYDDOvjL1$xDOLU&rRX+qgaaZYi@KoQKFUY^`XXNuPJay*;ehUgM$QqBQsv3G z;Mx4WZW`sMpLQ3ZdIA+_&{wz+H>Ptd&{fg;Ncsb%7a>aVMaoExa^b8ZbjLGt1@S0V z9--97WR(8uFfxotPO<+Jh~yOgrFmpFk({Ex7m9Fj@Jgg;s)%rE1Bq~o{_!NTtT%#! zz6f3>fKugeQL1qSJnFL%`p|vkbK+5|{4}N7;A&cgKEfXPgGf$sKwsaERM`$5rOInk z>L-#*8i3$Jkp29{2t|1lg8B~vmzJQ&HtIaYi_iydBlNx6NG}rM)F4VRpjwR3F~p;{ z_LT;G)-^JRc$}hVHzP}lq*VE8O5IB$91t0yul_`~6Tm6> zsfmPgK%^=YeaI{FFQJqwuk<2PQ%8YEYegiRNJ^FGQED~;91t0~6hS}rAHZ#q6y+UA zXu~alC>7yUc}$23@4ty9N0VgrTOmZL2&d?4FcA*ugD;W$NQ6@5t0=XH(Dg|5Q~&e9 zIYzd}7%}S+?i)uKq5-5PGo^4k#{CsZQT`{w=D~3=PN@i|(so1(RvSrCUKe5WCF6lp zD#EE|EL6sLYr^GifG8E=)YZhJPXk0^0bOg2j3j_k{2kq?n+PN~X-^4jrmDN?@> zk5c9TP^vniRPsnRQWdga5@OMGe1emV)3kC#*R=XCEPdBBkIB zJk>t5*%py4lqm;Y=OM*G*oaxz zRU8eQ!qJUSa5Q2!M>oC8(WsLg-SQ_#qc8Y_jNRIXqcQzB8h0B<6P9vx`(}>rc!#4& zpK~<%M~?2SbdJ=g)Z%DrF-Oxb=V*FQj%EzyXy$m1X3gPf_HvHqJkQbGUpbnW`6n5> ztC*t&Z8*BS7e|Y3ym+CpmilCyqA%&CwR$-<020>a&A0w$Vm#aK?)n%-j*+sJ&|2 z%Zr%m(1D|lLpkbnCr6!EaMWcBM_u3LsM{Hiy8Hhjn^zQa)T0eYJqK}gQU8G)4H(bS>>qH8|szM!!%rTDd#sF2=^L;%MA+ z9F5=4(S&a~x~&4vHU?+hUYDbZtvR}bF2N7Zm^7ZF$%i?*^GA-R;MHniQ=4)$?MjZO zU(eBunHH3Dj00Y`Ur`K@6gD>C=!wfX8b()x2WJc)&C!kXI2y5rqnoyKH1aSGQ=Mr1 z?@Ucle%_|~+3m}54SR6L#4Q}%@is@3zUOFiWn4=hoN*^z-o}K~iKD4Ea5QZeN7I*a zG-E4AGylWUtgktmE&Zf7CyS%G7jZPNBS&{#&(ZuT94&Z|qq|?==$<1S-TMS7Zlgth$h+hud+qdN4<8rgOA* zIY*B?!_lMrIa>D>M~@{}A@#@eI9lJDqYVQ&+PH|LCm!MG$*mkc^&Ur0|IX1fwX2f) zrWPDM+n=M&GdbFFFGnvt!O@F*INEW9qn+O&s&LspAqs-HW%qJ^BShK7Ytt$Y_>`|c z1?>V{8AH1GTZwC)Z9lC~_lG0-VKPQ1&r5eJV0c$|1&5ij^|i6wp|@+6bvFUB>c z*Fc^k5|?LAv7H?<_yZE3lHf}$_zLux+y&AXJOJ`Ep}Rq*i<0;77{o=;D4ropUPAh* z3z429+kODK?Bav6y`M69n@nA9Ar6u~I#n({%;rA>X_Lr1L<+WlA{{o4fX2J)y}!Z@ z(?+1D%C-~Xb9V73GB_29GbHpGE49jK4kOh-|3H^g|203WAR9pO8NQPnXa@mH^kf#M zAo?kuzatP)(*Fzm2}B{}r%9#vr$f(wCCMoMUv9oKpg^H6-*IOC{xK!YcCieJ?^NCHkwrg&PW9?ebq1*!w0ez%pi@25DM6K^GH~aTomh-( zTs1{5OPHo;x*tB2_)ftQYPvghQ`B>sAsMGD4V>V-AESk6K$PDA_pk!x?oKw zc9SHs&Q0|c3WaX95^TCKTih(^IpV}xk-LO_!r&n{&aH1Z>ZtWwyK!!4`&NUuapT+` z_6r6NyKye6o!-gfzm6^Loiyj&VUXOG{ytnOAzHX-ed3+K;Br_{eD}&ou6IjDmj+?u z_JGQ6Ln0wzPcisLH_ns3D)SpgXun&C%N#1~Wr?vkiVrw?mtS?{JHda0u!9av*zbUK zfV#mUS2GJcr?-Z1GGKa>?vz6SRiSSDACJ~X10D8g{RHTOi=cJH?Y^q=K7BO)z8hCf z_Nc)>bmM9<_|f2>xN&!rUDj9Ubiys^XtMc6=&M9Rcv;-wC*8QC$?8UQPUqZ0s+&#$ zeh^3TKW?0jsDd9cLL&J&bUxQ)<5#uUvY)o(ODN>7g1d}(rG(;+dicOd`p+vV?EG?_ zdul=|T3!pGZ*UYBoYy;HpD{x9 z6Il{=_W{~SQ6ikZ$Nz{z=pP)#jn12s+U?pE25QNY^Gm9h9c3ghI=`g5dG{Ed=I7UO zv~k)X?M&(a78mvaBiZ8ol8)xtXvE9h;@sLCs7_vOuy!GIeo0jy_ZZ2`&M)aG+pk8v z&Hok`cKJ2hg?8tcbd+tk5$|?>an=7yueC&{#^@D2lSx0erSb1|EhaM{`BMmzS0&SF zszZ`9ra*)aLFiaB2=(R<&*&2oni_hgjy_%6 zyf3}M67RNw_mka14(}Hkp($=5hxh*&p{Z^mxA#{M(|JxmuOz;wY=maIg&f}h1)-#N z@P3Y4$l?8!!?n;nw~)j8Jx1s*w~*WW%p0}21?QC%_HZL~w_C{J{SF8<3&Z=xZXt*F zStGR261R}U`*}v_KDUtD`!9{;((_6RyVXrP&j;N?4)2#h=(hIoez{x7;r(|;Xr)`o z;r*bI+R`ewklXuhMsoFeCGlyaQQF*Ew~)j8>mjs?=A3oObk8j|9qF}mi@_gv)fpMH@NZWEUI@+vy9{u=a-}!!*vxw`f1MxOJ%RggxHiFSzlTpGtC{ zk=**fCH1tIIocA}<0#&q9DVLs@7>3My@#NkZm8%@uxs23=*{HUs`1*Puj>`n0hf`3 z$#iuI4H8i13U2_igLF>NTBMgEUZ#rP0=wQAK;N0BHcCyvokhrR9;N%i{+gh3ZlyoK z?JyR|-)^PCE5Ux0AlzJVIq^K$6~+NdP9d)xo@au46Cpl_5?y^2MN`0jkD$~PVnl6< zqEiN`nsV32PID!t$MI=rI=P-Ji|!l`eH_Kr-1=V|q=rkssLcdR+>4{QrdwyVL2_I= zg+Bo)yA3*lSP?`~TW}T=x1lMr>J^16!8}dC#W8WeYZMorF+xof35mkc?b^sC4xGCy z4Pa3?2l!DO#hu)EtWU?MMB#rS-)~r?sXPx!aXpnCX{KN^iNYh!CS7g?mG&n`9REMkKBm54o=O{;J)SI>OSG%V|4xF@q~1_ z8-~%ZHUjOg;BG#YjmV)zG1Oz~_*9*Xz!@MWo>%963JnT^z^Hl)tmtB3CuC%IRx^$f zSrd|cuBU!k{`gVdTPb#{EN(eu^@jypp^}_MjHZf(+hHDFzw8DkxRO!@PdU@+%$T#zG5RZr zRRu&l=>k>O!5<^qUJ9cKaJig^GYS$Xf~hM0ZKssL?kR$DK<_jXo0k^F`7c#eQ*@#; z#%6Q}T$@ZE?8=1pByoT#-s%xEp@>gFtQ_5GI+`hUJ(q~T@Q6LB)jSf;sv3Y>LaMng zIE)&d(MmSgL%Y?`O7CrOU2{;kQGuxBzwB6751bmSmGaFODC>#e#r~#}{9?zQ?>kC8 z#n;N(!6)6K;De~Apt_a%0AHiVB=Bvnn!XN>pRW+Hk|}M&RT(v*v};5Ah|=C}kG_IH zb~LT)ki9Sz*sQDBte#=G!``GL6l|7Z7dvc!ruo8d)Ci?4cA>2c_gzVd7>-gf)EyyJ zDZQ!4T_y8|p5dAZ@pbf#*la#E?tt22AK1Ebi6Opq6#ED+*rEf`CCUS_Pi)(?TZOiB z*cmQn!yE6hf7#S0R5*lG-milR`8B9-q&&M%ja_6tXWfXt2)xu#Tt7 zucMRL;=U^K5R@0>V{EvdqOHOeY7&rNPO%3Is|6h<6 zii5^?mqmj#qwPpYdC4vA;>$D|L#j%DC6fkSk>aI8V*zbkAM~^KkJM0)*)JvkkpF6s z(+u8Vwa`_i;(r-D|9J3knn@`){Bwg>jr?EC8lzk%@@oJ=UkYzaBJ1ePs8JicOi5|btY3?B7zbKpo9Ntckzu~1{ zxIQGjT^)bRTQU<|-mQ+m?JYS8E^o8P|K9CZ=G>#?_Ido5g&RPDchBSRc_|g11}^V) z$3O6voCcS-y5s-ymgE7Kce>;MVZEsO&;>5s8eEQy_-9^{#Cec#4~8RgZ_!zZco!LG zchb4c3QWugHt!)#8Y7N zwqShz=R`Td=C$YeA~rT=hO$;|3=!{%#}_5n>~>XWfpwPbQW@CV-Ky8XkE#k89~g=b9+;&fapiqPCS{`y0(H*R@ngL!l!Xzc!=}<(-b&ohh?4VFu{6tD$(lGs zv$mI;zTI%x_|r!-bxu9J8CMe_EyT^m_M$+D@z-^mAoCRZ)$FTsiu)Q1xmc6 zAHUaIDT8BIOr^u#N*NrBsv(w+dnw5{=cZtaODR0uTc$GC2g)OzMd0+7axD)Z1{>CfBXC5Kt;uTv?1 zIvfj1cqMEqD4kBIisOthK99<&G$9ek7U6RtOQ^vKdkOb<`h6RUjcQ8NRL!kQW)xly zW$qjkT2ezvK4L1P@F7TeoRFa2G0Z5r4GE73657*+3=&na>~*jYzL)M@)|b1G;;QoS&v3_j7(6<_TW?@^UhOj6O_TyZo-S{A^_mB*9^h6`p#co>3*bro z{&^CkZbsdF;@vqHf7SLGM)r4oYk@4tK0K@;=(az>8o{pcI%2HZ>?6??!kU?}H+&)k z!&)NtIW=M3wG*nY~!;GOia(Pp}_cn3XfGGc7L>=W<`de|()Zc=k1 z-arp~2eH2xo8%MuYS?1La^lsG>~H!+)(zW_SR=+J`$RSgJA#q*%( zpU7Temk?84Pxpx&5Ox)@RLW-gM5c%Rf!IXGX8S}A344T?vNG2va%k8SGu=D($jP=a z-~EQcH&3!Jut(0a8E!tKU9lZ>96rANK!UQj2}=W2)#YY&4Koe2MRghO-%yecbVOdK zdzvY(4_|b@&5LY0FfaYinhGh2vjUhO!EE+M&Kd}Qj9`vB>h0jq5Dav=n=z@CiRX1V z!`%;(CTF2#>p|ChjzZjS^tuU-UltDwC1d|_FNC-PLrKdSy0!qk^$5v(>JJc?K34Eu zh}0iHh3!^<=NRH&(lw@5A;n`fi5)*ly`XM;0O{=ap!_rne?g3@&^zQ6W>kfI79#3m zRE7AFWp`CZRY?6Mlh>3y72*ei-JKX^D5(!a%@%{lulBl!F{(o9uMK(A$x|VIsMfuR zQHGLMFjVz@@HQ}1lOc}3Bwi<|ph6V5mEbgaQ@=kq#C|~PN zay&#-g(z?q)Ytbmfx{(?}5BGzwzSchr-AaTDgT2|?;2adb7B|NHXs}Rjij9Tuh0fNCb#QCnl;CTBNyKTzv73FaIA`SeTncjhF3>oMx4fh}s6s!M~BTfNBfD?ZLvTq2hz$QH>(^cKr3;MT7eoI)!F*^Gio= zem%u~j;R?+y3Eke>%ilyofXt;uJ_4P@2ztf^bNqiw^LAAym@A*7f1^r?kM9d@|R&0 zM=)2BiU}aTLCyql5)sVZvY%h>W?{7uN%SLuXNcNb9XRxRjea*liN{mD!Vgw%xZEmk~@<(jjnij zJ;joY7`LzQ4J1kk+(RLo_~4psxkd=zMRZ#C|7?*a!n?9k1sD%KqKnUNUlr4k{6_COu+{k zD?wL#atjJRG6mm1fhkszmbxz^UNH$O4&UUi)I4Nrs*4pA8_9hr_>fgcZ@f$-r%`&) zl&WM^@J6p>P#wVvG~;ZF&`9X!EmUzlh|}ie(b!A`^A&RP?PPwwGqj+SZzwNgu#l5) zDQ{%3u#;~p?_scrlW!}3&0x5bZ!BMAFv7{H>sJONoqTioF@r^wUH?1?Mk%|w8H`qT zBN!~H?8Y)!O4+T#U}iaVz5ezGmJPD*gU9;Dz zZe#U2BY8Td^8A>4W|kAbkQ9?3$@=Xh$3N_sNT| z{sILXXDSahjO3CK6lh`^_c-gH06{CJdcN`u{|*q0p|ITxOiqTNK${nsoC(23rs|U^ zm9Cu6n5yjy1bZl`|FXgzg!B|Onwm*Sw<&}Ztt1Qh(EksdvOJubkM8zn|Yl&1jlzbk}&kZa(ikq-5=;Rwz1^?W0;do$B zZ7b|Ms0qTXbsQNC>SBe1j8v?;V`N|ZGSjI;DPC`hEvEuh&Z%Q4UT29j7guzqP$x9A zj>q}rITYW{SeHifyX4(5`+%}a1=UPO^81uNFjII0{>vd)OW{LPsPfT$Va${yg-t?pOQyrUu2!?1|~;4=zkb0r>OR?sb)=mT335?o+`g(^eCXa z58IRHkja-ReUeG4c7Eg-$u}tdCzJF8l@=d|G%6?qcc}8z-2195OWY?}jNaoQ;UN8!gd5<}nd^t2J3PB8oe?2GEex#P8 zG>cW=Y&Rpd3YmVHnA+grnv~?QiM7-QjOMmw>@ddQW@H*>>eRN3+A`~;b|f>v)G-HX zcXB_;#Ff6>j}m((35I7Hxekk~S}1h{nNEwTOEiYee3_Wqvj1dA<^qMzm=&$e_%8x) z75U#~=5GM+bMh}|=6?y^N%C)G=AQ@eI{8+I)AnzJ_ZRtpX4W_I+l)Y<(BGN)xxgzz zzBQDTo#-g=%98I@57AY?tV=;wtJpe46ENFR5bP!B2IfEtJQbx=3h1E^u)d&U-aGnJBGX%pmcRzwfqMSFtJ%?aKVdozR{zz^~^F~Y|agae^Kz_$)7?+@^wX22CokJvoi6Mn}Anz zSVmp|zfxi(x20eN!xOaeP+gB zEHG@Z8GD^qTo0MCCO(n5!cLm8ro7^M-i$T#i7XIy*^J@JL6NXqh;c$Mjw=UIVSggV zDX(}-T#Yr7pCDSIr`aT&8UuLpfx{Kwf{^rjktC3kG*hBZXViX766U6Ouqn1o>M1L^ zFr`+X$(&eJqN$Q@8c^p#Vmh9Zk4=fU>B^L@HKkTMv09VTE@nSqS|hnWd0puQyMS_r z$>ortDW%=a6g&qLK^qFXXUa(1>qvn$u#|t)GLpMf(AzYnmHU!6(Bx$>Kahe!rhruP z9Y(<{^FoR$VCMjIWj8%f9z*GR^CF5zn*1gOpPE-sG6-f;Fvr~4TLOLkAbCEeo6VDM zZ|M?B=b2YeyrnBB-D+Mv@s_TqbWEmdr;3rhm4Y{)6Ud?UZc0Z!CpD74qF~~40!en9 zQfoF+zUbV}P%t`EGit#_3MM@#5PR1tonalMv0Eskbr$sctgz&{rR z6)BvRNvLx5e-(l*6uy&5s8jZVU^<0MG6{9cxe#olaCs)7>Qc(9U zAEaPHMuCz1HF?uA@>Bth*UVC#GcXeHr_xg@rKr-+R8d}e=_Qw;$_P_MowTT;DJ#jZP}<*= zDg*CfSEI|ORbHdY6jMbR7@Zw6207vjDh+OAC%0j2omn(hOX}P#xf2D8G77LO z=t*X(Sz)R}CJ!KQct%B;XNOU+Fry&N7#b8Z7xUoIpj>v|RNz;{-T8B%CK*a%$jxi| z?)S1FT809KhV2N))dB=;wZR&G8nLDbKv_x8o6>HXr6Zyn+x~zo(GMxdJTD7~5ZR*4 zvXL0RYI{YftyL6MBY~han=J>qd1o^+WFu|{UO;p@${I9?-h{S-vFwsCLTJ#S5T26I zzdRLRAdhZt3z-cC77r$-f|Qh`2||O0gd`(KSM&6LfgEKGsRsp?6I;@NAXHviJap(D z&Je$tou%P;_e@@kJ_t(Uo7=C2@<1x7I5|pPp!#F0iMf9Jjmxu_;k0TLV z0DG8GcsrO}&LgNqL4R1oOFaR_5HJcCorE_BfuL9~K|e6pQ&8PYuocWl6tv1LC`nJ4 zrLE8&+#bMjZlPHqK3MLETXy&@0(`D~18U(EI2BZge{M$IEJe~U6eN5K9;0q9M&SMz zytex5=x!yV(imG6l!03l)n`$%R*~T6cnX#pVENSmn*pgBU13noL>BA}Ht)J9FLjDhpGI8n z4fY7I)jAGby+X;~rp3Ub<8Z^ce>UFw)}Q!JVsL`3DLR*J!*huaFi~kH3Jz22qPcm0 zdW@}$RNZB(3M;bj{()+)gdQ7If+I9&n_c>DH2ZE)IBs_rnGI=4R+#F)10?+fp+V6h zbCAgDzut28-~LdL{(A#$;@-H-4_n}|CNS-I;d&t>%p(``U7n$kvOjJz| zlcBsXXxiOk%1edRLP6Myp#|~xiSSK%aB4_T$k~#xPzhw0XzVvFln$8!4K`@#>-gK_ zB@gZ$@+ahMS@FS4dC+6wWJVvn{vM|Zk;|2WSf_jjddf%G*F(D05 zYt|t1mUEDmfPxG%_2v8twolk`pWVc}`mTvqOI@3VCg9wX!wG%W7<4UTh4+m1i zXGu1#Qa#eAGgNA1QZe4NUBZ!wO|RbaNjRT62yDV+>%y6=Oe==hhhGEVaBs$LWK@r$ z+lnCtuc)i6<{^N=$F(LfW*mJWTMw3l3r)Ou%rvF3B>qpZ4dQV5@j3mB!{q>^7%2lV zB)H8&<#4mL>cf$85(d;rsjfy!V@z{umanNs%5aRHG8`$j_;^atVnn%P4N{*j4qA?# zVIrlqDV>a$UQpVg`n-1$bO^FKl-1+zKj>FP8!=k9&_nD!LT4dZhe0*^#))rpga*|N zDG5ic(dRAa=yO6rM&CU&teNx^(?qS1RA{ixa~WAs1)(AMn=evRD|leYJZQ1qa~aY2 z&r=?MABq+yYi>RTB15)Ajcsq_;d(r##I!?=U{ub0$a0rO;6nuRG=lzfn#YQT+<~nY zkmd62M2px$M!R7FGLZ>K~tBJb5u7G z^f48htEs7{7aLPkb`)JtO_OZp5H?eAT2{5wJoG54&Ww(-*pqDUy?}2{IHulsQ@=&X zP*}Gn9B(-%oEA`!31^JW9AK?6=Ww&N8qa~Y2s&z@wNeAEK%fk?Hfo^N%O(R&JrNev z4CgLtWVKb}?hVW_%{Y46spv$Ew)Tv+S3_-ju#CzMjGDu+i;``CObtWzf^N_aM0+u1 zM~=N9e~e`{Dm!^bWs)^2mq`t5F>9ht$RiZO8kOF1j>>PKkYQAsNl%z2+#%IbaIaCh zU8JTKdTcjnd5y|1MeC?g_QyA&=IODf#I!?=%g|6g){YvsdhBzW=&`$?`GOv68vE5# zgyJye8I`7hPj_<*Y8x^L&F3{L??`e}3uR1(8Lv^v0|ssmvBeV1f|{p{ro^;Eja$%A zWeh~VRvDkuL>Ui2^95xzjq$*U8;TGMQ=T%G7D0Vep{J;mAYhg8IZc%D57>G^8BJr|Jw<2>Q=T%K zg7Kz8`;em;XsV2MtBk!wYHFd3OJPQp(QcJ-sA!EA$`agwnx~AW#I!?=YRFENu?qrL z8K2Wc84EzctBl-1OqJ|b3k~WJQW`^C6~Wgk!VE7h6k!$YsUrAVMOY$Q%Z1XxJ5ci! z!IYS}QKJqf7*&Km2v|jUP7_5a3I(qsaQ=^$Su<8>P(L;Qm-b>~{(l`M%Q*j=Dav|M za{f1?H7&ND|GoL<{BP>jHT9E2-a$^*{O>L2{GSR1YyNK|2`A$Og`2HaQ_laNLr2a3 zv1t$b~aqPRt2vhF^;4AV$mZ5@OKA+=f23QqLp@eU50KvEY|i$5wwL zI+DueIOPXVW3VjO-BHI@{luL&%<{yCltSLtEbc8=$5v3tFpHZ>-!V-jgbad)>QbLJJiU9`p}~v0jpa*r^(R|TVCCY$5y7X z^`0WMg(=VI-ywpFrb5|VoU?JVi4lW+v3AhSt-A z9s#Rp&uMbdLm_j~^4^!Mnn+&@YLo{@0PFyjR6iPks5)S;%$}l-GHs$-z)Vspq$IRd zP3Y6aRwC(SY9y*5*xrkcAvgyKGY&yBMR!k14nZ@TZn5Q@W-9ywV< z&|A(SxD^WKIp5xmaO>A%xB$k`1l#;g7=^yYUB4VsO2dQ zH`5MVGZhc>Az-TvWlt(&*fCSkJhK4T8hv^|zmLft#9Xj?U3bHH%l2(}&$wVqV9BSfjZfy6xySH@a20;S@OR-AaODLlkA(+&Qs&B#GM7!gQ-yQfImC1jB`Y8wpOM3zlW2N99Q!iM%Tf(z}mkN z_6|7=MERm}sR48)$3R5iMjtFSkV~=!CFVoF9)oBq&yJ_sX2DX>aWHwFSt^~?9K0Dv zt)&KWWwzk=s5*qbH+T_^jHJy_uHJb?xp?A^jSw$gK zXzBVP9U*5A$h{hY{0JDKui@X+FinEg(cH{s$gi1G}7f!ybKc*w_47!O&K8Z z=Ri%f?M(BdLiw?q84_J&vd4wYK}t4w?(GPKAs_`dRhF5mlR{FUVHMb0&H~qif)sev zE0I5=xVE~{884I=qgF(&K`CqQfpIWIixUfo#iPGpKK1kO2YmdIEvEE;lD!~s4Q&GaKU9u_~30S z(GNHlv<0fX2Pxe$_L*D$RobCJn~%3fTYB)ICA_SXS*J zt{jz*SVh@oQ}(Nt@kOIi)gmUWVtGn=Ux`&pdM^4}&nP`-qISNvsVl4#Y(rTMWspo2 zClLW;$IG;D+3XSRX;UX|>Z7iEsfnzq58J+sn!FqlYVsP@B4QntC(!}kjYvi=%A|I{ z9~Xmse0+FyJCL)AkKKp2D+2kU4j*5ie~}h**w`&FvBz{qUkV>JFd}Is*x#CLUFzhd%hMuc=hUJW4& znTS9e1ahxJpc?|18@7O$e%YnKWt)T!%)ovqw#v2)xr2nWAPPB(z#;^48LRMbgdWAe zsb`sKrAuM*pPD|UMdY~({bv$4^?lMKX4$d_c|OFl*k(Ln9(Eh*pBry}ltf#7f*xZ# z9V4Ad-~5H9=l46FfH7%ios1%{hyrbxL6N>CMWOU~R^68d4#;C3lKdeF@JOE3t zXC6No8&Mnt7fmnqAee45z1wJcX^+K`uTyWct+tIH463R@VWYO_^6nOFX;DNIHhV=&u7zZroZiR zVUU}x)lR5vQGORFl40N}zjum9`%KT0O}{52)tACOYD!b`^vb|KENq{+h>5oT5XeyY zUig2T$p)&SV6tzU?3N*u;gA{%-4XB}3Z|ZArd1wRwaNZd%=n}scTVeu8W0bJZKnF4 z2gGb!2dS%GR-OGGXEXi=Le{{sEb%ZtY%RLy-^~kufSFVi}v3A5`!(ZJA53=Tj^~&98H8W?px#JXb*d zmX&7-n6u_s)zk|`^FuSw5@u6(MapHu{lt_;=NxHq| zOj&ZKjlJ8OkKS#Ba;7#FkC+KcsdhElJIxF#nC;3P*jL!6*~TVFjZ8xTdsBS}-mHRJ zID+M7YjqmEJ;xll&trzNL%E`P&}~Fl&c+puVQjY0!LV>&a(Zk!GA!gUw3v(b)DVk# zgq9sKQ5_^Ge@$T)5&C5C*SMu!G42Sh2b0{I2-Pvqe}ddds35eL(EdU_nmS}2a+l1a z<39*BPd2>uzmTJU^9c2S(tjlO9t-_fsE_P!yzReCuk=gwjk?XN*JWMQ1!e&_T2UK$ zcHzhD#z1qR1<(p;4Y+|0Kxd!}&<(%|tI-4K z1M~%Oa%Q9esX!W#4h#W?0>gmez$joWFbONLMtasIa27%@aS`m z*Vp*APOmQ)zS%MDsxk3X*P$<#USD12_bRsrhd2HE+rxX?20pIQ_QKvX3r`*oxqqwY z_!diEeRK2WLPx6l8O5q@vvnLaJL|Yl_P+XQ%;_t4YY!=RX~>6jT-6*CMt0mfV`RnV z+w8rr?_W5%->K9*l?$oSgNwBMH-1^=lG%{@tCw z?Y?QWACSWWtA_@B9Q(tyK~07=U(sd$gu`3&EPHoJ z-$m69PCC13b+#=N4=0?>b|j(Tdo6#<^LG{Bt)s8SOlo~HvH1NqCwDJ<=Uk5M4bwJ^ z9PZaE!8d#L?xFo63Qo@2r9_Eh*9z41AK^Tju=Blg{To#F**)h%@Z-53cbUIAq3itX z&Sl?xb$n}{JUNdfJgo6b$2WThg>@R{c(Y!~!!7E~|E5Kyi3>(X2M*s6aV|V&=cANq z4XWSSHu8tGMUI};vS*uKIQ&8RuJgO^|L&*6;@5*KoNU&ojXi(4lUw@tZ*slOnb3>( z9N+D~U%S+Iza`Y_*uT*t65k(`zmDm$WOA}Ki^?N(U~)Q9(3fL zFgEJ);d)5}!zX9``}mJ*dLQe*ulHARck{O@`#ADUrLGI-lv{QG!;M`p#eI}>#e4Oa z*IxPczC8}ZI0IYr+5yvmRls)O zI`9|Z7XUwi(g5$THUx$O(|}dLcHj_j5eURgT>yv!UIm%}ygNAySO%N{t^EJ7 zfm%QdfVb3!0+WFaz#iZva2dD{_~PDB6`%#s4M+zj01JRsz;@sya2v>lNvsOc5a#$^vzPZa_M)4A=}D11!A>vSv8 zhW~`%)uAY@_hS~kjs*EByuGyruO{`x#bSm^0#c3WNSj?#N z3FM5w25{q1A>%o5V8yKm; z0{EegZoq2X&^ip{N1gI*qWlq{z+znC+XZm@3w6o*>y5f=gx8s#q5iI+{tm+Snj$tM z1*c$Nq5hUi{VkcHeK??#8+Boiz6T@!Ik3g8kN7!T%CcAL=o$R}Q_39tudb5=az^@i zEIy2ZwEV0o>!ms{Npu(EREw5dOPf_0qx0nH%`VB4&;3z{U*6!>5jqU{Nqi`-H!yx$ zZ2tI`KEn6~WwxPienB~HC`&TxWrEbrzoVbe=iMUOZVt(JE{xJ{K2`#@?c=n(xRi?* zwJ0yb!eQexiHy&|`|aF#M!}>kH_OcJ$H`i!DH{e`0V)3$DgQ1UtWeV&15IAl zIVkPP^A1eWYOWoH@EO#_QQUdt7-t)CZ2c(Z--m(B^2OjUkOLnZFWNEJM-tyC{UhTT z;#mxJ%s%jRs*WF*I=BWIKnSh^?cm#S@sCe|QmZ*^bK^w{hB!BH`|Ab$`*c}d|Bo;)eUGs< z9ph>s##KvTSyyZF`Qi$7$H2#U;`Q8&%hFb1vvVQ|Da@d6$=dHW}lAY0U9)5anQUj%{%y(rDUAB#~KQrfo9Ddr5O{i1O-Q0f2rN@tX%tYQ; zX`%NYvd~wDo7` zn~Tv;#-cCQLR~IIUmPs+JKyVJeVE5TK{0whF^{v7{+IR^cTr2PMu|9l6a0D953V+8*PdalQk|t+V7eMe;MtzXr0_P{eek zHcpeQBRkHteB}}wTmxLCtG@T@daD^aA<- z{Q>H58;I~AU@*XId?SH3fYHEMU>qBvjEof+rT_vKJYHE5Lg5(0hR(E z0?UBaz&c<(un}P1JZ0Vjd14U__SI1~$%0m=i^sRUXT zcva#xKwksu0S$mgKx5!_pgGVAn0@Wg)SR_D#Z7pqEcn?-oDq8d>hi zuLb-4TeR7z&p-A_D0_SNqf&+LHgEgc%kUp(^q!Q~q#jQlfS#U0&; zzV`E+b^qR7{IFG_>fw8L9o+fb#a$m(jGj5<-^5qy_L}Is?%Tlmm!6euKW#z6lc^bNrua*PgzeQ1j`gqp+p)auZ#EBpwNlfm zL4kue-`xGE(CKJ>7F?{KciejCeYK$j+npDxHn- z;q~BaJ9d5F{O*9;&3>LZ`iq>EmVO@FrNetqcAR{_*prhLCvU&><&QNUd^q@@dQ}(w z)ZS-)%iy1GG@E*?^v()Z=W6RB2#r7^ZUp@J)v6GfuAGK&>V9CYn z9(A4(QKx?PCUJ@V3Qs=1aMXz1PuKqY{(-}XHZ5;gAR@GDk$EFGcI;BN_UN#*-@WBGT24;PG`}!pR!#k&it(^J67019H4K9osb1r)s|CqGO zb1yEub87b3ai84(aZt%UOJ)yDi+OwaJMGfn`{#4#&R$oG_4su0cS8nUT{rIH%1Z6e zT^TjJ+^&0-eoyIgeDJp;=2Uy48T!-wR*;Zflp4g|B>GrK~w_@wT|hR1`N-Okdr$`_4Z4Lg3?_u88Bm4~K3{V=3S^6deI$7TESI5!^B!JE-h1JfWeYcyjUG|ugZDo?abfzB2Jgr3&FXWhQqNlpue5MvY2Ig0 z6X$z%@KL_WwSJp>yR&^}&U*b@4Jp)V!;awC7{6(UE+yQGsZ{w^Oq-#PzTCBT;gx|o z&aS^yvPXeELF=nMtPt_`PwjS``}5S175^6UTfDu+gC73VR!{5p(6_2Baa-x!)s8iA zEpFQ9Xo*VQ{+Tvs>eMk8)7-c|xaRA_XGWa4_Tgtgk8}YgB9#F7qj@qjx_V*hd-Za<2 zD(|(Jo%|Q{hL$VUJh;e;9c)GO5N*{F3ljKb3+V~>Qa{9%5%LC5D*+4$%3 zLPpzH3l}@#w{7CkzB88$Z-2SuzooNoUzY3L9lwrRw|5$L`0oQ7fvKD5hx8L0V%*(U@ou{*a18O0&>D1fY;M&0__1_ zPahAg0d@nYfa|~`ARq+#KpapXXb%hkrT~k94Zwcj9B>Qx2grkiq-dZD@H)^N7zxY- zJ_NP^hk);aJAhwqJlP1ifa*XCpeHaKm<}ujb^ynL%K#sf&y@%D15^h1sB|YF4VVPH z3v2=o02hGUz%w8x4%~_X6@dmo2Y`>bP5|BkJ_dFHCxL6gL%<&gdIf-3pa#$q=mm@b zW&j@mn}LJCcffA|Zvck?#eqsdLx7L1rUDaz1;83$H*gBL4m<(^a6nlQhy!W@t$^OZ zNMI)LA+QBF1bh$N0c^Pbk_#vSR0diAJ%QoCbYLm42{-^;0B!@%fSfqrC=FBtngQK` zp}A+H86L0{y0Ne(i0XYkyu7Qd`1E2#i5SReG z1AGkZ0=@-)0iFUug>f7Wln3eo?STHkTfibr0NIP+K08nrr~|YGl7TV6 z9AE|T8E_2v5x569!g2f#lmZfgra(7f2rva$3~T`Q13v(dfPe_J4G;&^2igMzfbqb5 zU^VbLa00jrJOKP~QV<5Xfa*XCpeHaKm<}ujHUS5K3&3sQ8IZFm>JF#~Gy}Q=LxHKl z5@0)U6u1QZ0r(cf@hDIds0y?O`T%bLvw)9)t-xX6BJexlQyj;!Kon2|XbJQJMgTK_ z4}i_ULEt;!H^3-?ehm}{Dgh0FjzB6f5m*4M0d@nYfa|~`AOI&t1%Wt#E63Sjifg=K zNOIfXMICkHd#M&{!+Fg*^?^Q9hE}Tqnw2ox(&8F!z7X*%BCy3(20^$SAPB!rA{k8n zRwtdZ)UtLJr;>Do-`PS9a%FjxZh9TBdT3oWk43bIcVu6&CazpVuF1U(akOS^(_+q_oW>o~`<*GsNy z;^Lm!jk#0=9m(zKR8LT8WO1byUs?i@%XldW!#vN}C6_%FwQ`9bR&iTOL6)NiM2idk z($p_74c3Ayif~O`#0u*YFrQnp zxQaE?a~W~?a{RKDo=bEvvj9(J&;DAc=jt>}gpD81rWU`XEtAbFaayZ42DfM}jnynJ z)xxU9#*0u)$oEvFEL#!?*)xH(T&fdtoj0kAs7adj7&c9h12wCC z1&ft$rDnx@O0U*lhWTrrjyk!t)=Fw_x%x^E&GH#)u__(XEG}pzrS~hNS$sKBSTo={ zz2|aF!un^bW?h_UwaTK8H0uEhWY&Zfs1WvKl5nIHyC$?`0L4fd$D)kF+PFm9nmo-) zSX-QUvc;M*^2spcTVpbd6qJ6-#d=2H$ant#%zPlVAU;mD{ec zeBpgP`f>&)r9$}0Z?gE+Rx!y1a>$zLX}dp4=!91qS>}HnqqX=gL@5M6`pty=)T}gA zRBN4Z@c_%?euFjZ;utI8eW~yA-7VI7*@ZvVyYMcTt@Itn>hw*~+a#AS#_Ei7cq()= z+@dds&>c`U-0~mREUwij9`4cC$_&RrdeExNVI%V>2&HyLrW{Dzh*rfW%V$`?S*)F>G;9B2i?y!4uHb)B zg<|XWYg%h~UrWnbTC4f~8spL30Kx;jUwpeN3Xcku_6s_9QCAxLCSU=s- zT7x_tnu|iQLb(Q%__b1|zlx|4u@&@%PRP|jg>@6H%!Dh^%F>B?pl!)2?J>VMzh>2| zWhHzPpc8TlJh648j1Kbsd^phrLr{EqO~%`}H!W6!tJ)+NEtK?J1CJRO`O6xWT#bsX z<(_hd57Y^}jJ7<^CKoJ*LsJTo=cLx+x{zXi!8pz0C&|(OxaG##5v9eBD8IVhvfNuP zZO^45B|X>Sq%T~aQ_58ixpfzXqmR32Us;tevwhCoXl-tfGS~t)jSj%!K?juoS!6V9lz1*J`Le8+F3O z1WT(#ak1r@Fs{q~w;XIq3m=ga#HZIS)+Aw_@UV)aPtpl~gF=e^3{kSUxTV;-g5FOS z&uPWg6seqgp2~SmD!OlF%N7?^WzYbGbIMPI-FR zb=>GDYuHa#!Zx^8mo9;^0;Pk30t$FNVpUZbKwd( z!b%C$tRrwh>g6mt3$?ONuvjaaYSyF_i{+TFS+7j7SnZIC3E#z#74xr|yMZwlORWtH zEv^^~Eq-W2l$*)^z8j`n@uhVRZIUkri&pvo%}N|?v5LtI%+INd)~_-#B%=!miwhdk zJ-??GE7+}Vp7<)&Wo7 zd*ZJXK8>;xK9r-1`RIpYzWQLTHEoQ=8X-BBg3FTQ37HDsuV}Hpldj1%Pl_UEY+M|h zPH?$0siV{>+ONH+HnCM*c7j|fT3C(abi(u`i2);!^RxpxBP? z)T|iHA!2?8WW{0^x=aRWfZ=B!+p=IMoL3dTmXF6Ri2q$-4*#J?e$_ zFN++<*G6zw-{;bs9|kT0$&2LX_e>8${v!X{IJ9H9MfXCv`4y>-FOi!sd}A+Wbhg={ zm3cG2!}85b^CRKa=t5OXTL~DAv40-a#^cS^m95@Ur~* zJ`%Tnz>EAdKMv61C2~wZYO@V*X5f=OwxGZ)ezQoK z%E$U>0i6X0wLbgx|D->G`iHbW`}u#;XS-~M&cVZ4pZ#8KW_jz4SEZ%iMd&3Q(R%Fv zYBTj}d-QxUpIsC^=}s?fkJ8ZFEqd%5ne5fjpFC#1Eugni^j_6k9(x(|Mndn1=y80g z&GavW-ZJPlKB~*{pZq%py*SbPPyXG9UQyBGxOrK=1<+%Ai5|z#i}d(zvX7DK#OSj< z$({}WYK}n7+gz?#{8Bon7_lwWx~Hba4oK}kpjY>_-m$Kf{@uFA^c*%IwxTP+6(8F> zrE9-I-MYt;ZNyd|FrZ)WuAS3+_fJWSZPS&iUAm`tc6A;wAhu@zl=SW?>1naGx)1K& zum6DVsj*G^bx!ZmKQ%cmwo&J`Y(V$4|8@Q?`uFeGwO8lfrn9xW_vk#RU%G2(*K|{&vg+5nOKjJEol|@i7*ZKWFDewQWtp88)?p>y0`Tt)^{r^j*vFKU`#z9(Y*Z+0?|83VY$4}Q%rD6xi z;}U1*l#X3H_v_cCbJxCUu3p$N8iOl>V%&3x=}^Z(y;IT$q^EXFM;s$PExlW}?mZCp z#Ul)q#g|ti9H6LZMJonbnFKSLl1Y@R5SA~SNhnbY)d)itm@cT8IrrZEA<2?K3#SBK z2KDICJ#|oe?|!bXUHNiIrlNI>Pk@R1k}|~8(o=h<^fawY z7}mS862!s~n6T=~tQ=Oskgn;eom0{*+lV8TS5zC(A~BfUB`v*kx>kg{>AjOBt09=8 zQq2T92wzZ};GyzZtts7ycp|-%2lVTnjHy=5!*BKRle;JP zPaVdP_Bpk4@ANcA*%GV=hIOdp;NIPbFxoq%cY1F$&hYN39sBi8OIN)9X+4H?V~Cx$ zWB)FFx_3?QI3%_60Jw>+jCU6ee^RyC|1@mA(T*Yk_8)EM9QmEIe1jZzr~RW*Yr)N8 zKW`fchRwcu)HsJ>Up9J)*4^&oS4An8bObu>i$+t)&%S8*r$!I@5ly4REX2QU>6kW&yR161IMr*$v%tKcQMT`J#&??^hK{{EPH*FJ=)=P z+TUv6a`@YOuZ6}hX{bt@{nJ2QxE<5j19$te1l&%TEK zWpUPb#5rRfQTAdz90ATMj`B|Xossn&A@*&K`i_!LR6JWIx6^)U8)^s!?4{Q}pS&W> zL^=PnjcBL+^0v`yKXHVOcQ^(+?OR5>9C7xeM!F-$HE{CHE1ZdmihRYGq z-D%&9nycfqe{Jk=M8my0&Z-%xi}mfahq|l^M}c$Of7ms;3OG6Jv-cWpQ19vB>Uw8c z?Dk2caPoIl*UdjR>4*Qvx>3odY#)97|6D2eQ7Nio^ZcJG)^vbf(yLKl)GDZeDElYu zfo#iMFX##{NmbOo4yhbb;~mv8wxXRq9pSSbj$V$kPM3Z0=pK$&?AMGQj!G^^Dcz21 z9c3wKgQ0A{fu82q%@NSRX*?D(|*iso5bhZrl;d26;;AMkrfp(5hZuo>$)5fPJ5*tXq^!I zxGv_|0}?8SkuOpNYW7aI-v>(Q-8T$$52=)hmr+uAs zt)sYo$T`d|~ZW2gPi(f6Q-dHei+B+R0wjRZ&3D;Upz?!v4CZTp7N zRUCn_j?kmDXn*MNiL@z`5ZdhT4Ik$S^eY5WG5fFk44)DL%C^-)WhMgFogI(g(0M^5`ccFq;s(ai#!_H73ZR@!U!`=5wj=joM^>l(C!>B<%oB%DI9pZh01WJ)*a6}K?9=S`z;M_f zjBFE&agfb9-jVMxM5XML?c*?&vO4US_rPy^ti#WZ8kvVep&sw=Gpg8Mb2+lxtDJ-F z-1U*<+3wMPIn6|i_99U>`{Ge9WMH@NWhZj1^!rv#=Jov07Ti(w0GZ`%L#LefgK9@q zD!~5OXBN%SGqlbdnEmW;eu>H`>jcYU3Y|P_e1GE zoIeM~ELCxz+Ruse=wl~GYFF-th4J{9fgSybT=sVHh|(1cg!r%+<2IB3@Gjd#-xJcB6mzTp>9yxdmWVa z>I$tcw6e(KBpxj^LMR`sXL^3WfawE-+J)Z4@q7u$FM;BYWYu+`)L#ZleJ+?rI$!8S zQ2Lz$N`E_n(%)u6`JFhXPXuMU3PR(AMvJ_##PbQ|+GEtehZ7F^a}$*Qd2rcIeHPF#(0_1xg|onz`=F7a zS3&9b51<7=kAoHj-7oTwL_P>K6#UK-uMJui@d}`2L5qNv1I-PJ+Zr(epv=byl=dIv zEGP!Q%b?{!H-R$U8c^yl1*QH1Q0fl@%?Fw+@miqFKThIb;v9|Xw+Q_hv;yK2gmwU> z-R7XQ+W?eyi-9s-L6PSad4R~Tp|P3nJSfwh1ZBEULFvzOiH`=QKYb;h50rMZ33Y(d z&SNwd?c4*U9bSiHJ?#ahe5=UUiF_s~^BFJk-k?PhZw<=)8iSSrcK*f*9Qmg~nf^0ST$YP@A2b)55OM=y{?0gzgYJOXy^wjfK`0T0m$np+Df_KFf1f=xU)K2%REyoX|9( zeTCK(`ijufLW>Fw6zVJVfqo9h`J2#hg`N<)TIdHtTL^6^w5rf@LJJGcEA$WjY>xAm z(D#MDBXqRTAwnAnttm7}sGrcA7(lF_%R(0joh5XP(4j(m3GF1bqR=>@;X*@&-qw$Z zIIjymBlMWi9YW<%66XgJe^=;Op~Hms5!yv)oX{wt#q?82&VoW6LZ9l#Fr42B{YL11 zp*w|65IRz5H=*r>mK9oBXfC0FLVwXWR4DNBU`X=kG#$3GF1bj?ijC zO9(A2G>6bELLY_e_W51tWug3TAlq%1&@Dn&2wfs{gwQmhO@-DI8Y{GfP=BE|q1TG& ze7+aDUFZg(GlWhO+D~XVp|yo33N0cupU`J`*n;JFB=n5XV?y~2SIR#WI$7u#p>2-6Iw!OVWByMW)b=b-wC6CzYD!A z^t{krLbnKAA#{n*i9+8H+E!>Yp>aZ^gk~4&6naxXMdQ3Ibf3^2LO&4tuF%0kQ-n4Y zT1#k2p%FrTh5i$&%XvxYIiWj+ZW6js=p3Q^h!X4Pk4lgy{4agdP#PPv}yi3xvKQ^#3dE zdP3u26Y~l<8#ilC0UxgvsuvxoAa1 zL_rkKwJ3-Pg6O4)VDQq5Aol1f)Pqz7BjDxB{#K`Evr6e+>9A5Pf#X`3)}2{|R^#cmc@I^~`^kZr&OB zxsLG|@GrXQR`Y>3fu95UIga`70p9|)fdTL=a2j|DcoO(KJ!i3=Ux42MzXpB+yb62; z*auz&E&+caWvuT8@JV`DV49xw6i!2K9LOIAF#iDZ`@n0!E5J*@Y2Y~U2=D;<_kq`d zSAds*)4*{c0joIv8a<>jl3Ud8vek*;gP)U6kd6GBK|UTNffK~jy=foQLm!1)db~sr zbz?{O`Lh~zTqOCiqgRfsK;{-`-8=U<#SQc6^E!201z-2xy-I7dKHaOvFHvDy_qOrx zi88Hw>88j|rVp^*9Xc=8uY1MXG|v2(*5QNSX~4AZrQ_d+WBN<*CDzluYL9}}y=}K4 zuY1+LW&V9+5B7^+eaiH8(ELhZn5NcOFS%3yO8(;iWo+_mq|cp*>BSP_Ii_E zPx3Nd;Q?Zr{P)RUCjE`Ye~#=o`A=E)KX2LlCaq-3f1l)8y1umLziZ9^+mgR&*>}Uz z|Dq*NpHb!3|IylycP#lwEc!QV{zn$QV$rv){dwB5_fN||1#5plwCJKG|AxhX!dm~j zb$*{&H2Z@8=;H&6f5fM+^jq6|^acKfn(O$nT&J(->6`kjJEPCM)lOaEqT4T*UQl1x z7u<&I&T!L(T&+jc?I7c7SY-%<&Rkn|R=svMsq9@&IE6*I>(v(<{$zD0qINFnWkT+9 zS-8!p7Eyt>T?)nz^n@n>k(&zaJ3^FE$Y2X z83SiDD=xB#dP26M)m}%Y0ZBpV2Rqbj*!AOX$RQc- zZZR~MO+$FZj8SqO{cl|iielmzy(_Mu2p$qDZ9SpXP)#jDP|VK7(biITt!%~ae2YR^ za8M_*P3qt+^l-ZY7qKp@}7VJ;FIFgY9H1nR5@S zGLwd?87LS-D%@QE+&rD7>*zXCK?`3sT#Is!G+f>&`t0c$<>{#g722TNi>2pzZPF#C zC>*HOsz<%3@oBjc^xILaeA--I9LToR*<~I4g@O1gE(TkyT?bcjHs}V5_QhnK8hk1F z_GY@25-U9_+iCa=4T*}#CyJKNIdGH^g>ZQx*pzn($a=qyO%){;%WY^MR_8b>GnE+w zyCYmvg-5f`0+WGP@yDkW81U&sFaj3hknE^n4*zIy3Sz`S8jn&vP}?Y>SG z9k7D$H!2;v2&g#C?KTQExm|Czz7;6hC0->@wvTBARTB$~L0F*v$eLTw%j>}6{iF;) zaE#1kk=10S(cA%57$~@Sl~D@V$;kyC=VB@-Ernab&L-RNzjYKB?p4FYf{fSYe>Q@h zYGuG+rObJC@Xkg%So>*mF5vRFSLHAqCZ4QtSow7`r%@gfm0WWhB~^ecT!39aSAo-L rnWFewkll@Fb(9TUP7{S>eZT4W)u!*&=Ucjdjfw=GrX#`Q`}cnUrc)5d literal 0 HcmV?d00001 diff --git a/deploy/node_modules/websocket/build/Release/obj.target/validation/src/validation.o b/deploy/node_modules/websocket/build/Release/obj.target/validation/src/validation.o new file mode 100644 index 0000000000000000000000000000000000000000..1d644acc26cea76db18812fd4b101abaaa6ebfd3 GIT binary patch literal 222752 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 literal 0 HcmV?d00001 diff --git a/deploy/node_modules/websocket/build/Release/validation.node b/deploy/node_modules/websocket/build/Release/validation.node new file mode 100755 index 0000000000000000000000000000000000000000..da00df48c8455459dee86b3540f4996efc502249 GIT binary patch literal 22692 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 A@&Et; literal 0 HcmV?d00001 diff --git a/deploy/node_modules/websocket/build/binding.Makefile b/deploy/node_modules/websocket/build/binding.Makefile new file mode 100644 index 0000000..5d26a45 --- /dev/null +++ b/deploy/node_modules/websocket/build/binding.Makefile @@ -0,0 +1,6 @@ +# This file is generated by gyp; do not edit. + +export builddir_name ?= ./build/. +.PHONY: all +all: + $(MAKE) validation bufferutil diff --git a/deploy/node_modules/websocket/build/bufferutil.target.mk b/deploy/node_modules/websocket/build/bufferutil.target.mk new file mode 100644 index 0000000..3dd8f7f --- /dev/null +++ b/deploy/node_modules/websocket/build/bufferutil.target.mk @@ -0,0 +1,180 @@ +# This file is generated by gyp; do not edit. + +TOOLSET := target +TARGET := bufferutil +DEFS_Debug := \ + '-DNODE_GYP_MODULE_NAME=bufferutil' \ + '-DUSING_UV_SHARED=1' \ + '-DUSING_V8_SHARED=1' \ + '-DV8_DEPRECATION_WARNINGS=1' \ + '-D_DARWIN_USE_64_BIT_INODE=1' \ + '-D_LARGEFILE_SOURCE' \ + '-D_FILE_OFFSET_BITS=64' \ + '-DBUILDING_NODE_EXTENSION' \ + '-DDEBUG' \ + '-D_DEBUG' \ + '-DV8_ENABLE_CHECKS' + +# Flags passed to all source files. +CFLAGS_Debug := \ + -O0 \ + -gdwarf-2 \ + -mmacosx-version-min=10.7 \ + -arch x86_64 \ + -Wall \ + -Wendif-labels \ + -W \ + -Wno-unused-parameter + +# Flags passed to only C files. +CFLAGS_C_Debug := \ + -fno-strict-aliasing + +# Flags passed to only C++ files. +CFLAGS_CC_Debug := \ + -std=gnu++0x \ + -stdlib=libc++ \ + -fno-rtti \ + -fno-exceptions \ + -fno-threadsafe-statics \ + -fno-strict-aliasing + +# Flags passed to only ObjC files. +CFLAGS_OBJC_Debug := + +# Flags passed to only ObjC++ files. +CFLAGS_OBJCC_Debug := + +INCS_Debug := \ + -I/Users/prophesi/.node-gyp/8.2.1/include/node \ + -I/Users/prophesi/.node-gyp/8.2.1/src \ + -I/Users/prophesi/.node-gyp/8.2.1/deps/uv/include \ + -I/Users/prophesi/.node-gyp/8.2.1/deps/v8/include \ + -I$(srcdir)/../nan + +DEFS_Release := \ + '-DNODE_GYP_MODULE_NAME=bufferutil' \ + '-DUSING_UV_SHARED=1' \ + '-DUSING_V8_SHARED=1' \ + '-DV8_DEPRECATION_WARNINGS=1' \ + '-D_DARWIN_USE_64_BIT_INODE=1' \ + '-D_LARGEFILE_SOURCE' \ + '-D_FILE_OFFSET_BITS=64' \ + '-DBUILDING_NODE_EXTENSION' + +# Flags passed to all source files. +CFLAGS_Release := \ + -Os \ + -gdwarf-2 \ + -mmacosx-version-min=10.7 \ + -arch x86_64 \ + -Wall \ + -Wendif-labels \ + -W \ + -Wno-unused-parameter + +# Flags passed to only C files. +CFLAGS_C_Release := \ + -fno-strict-aliasing + +# Flags passed to only C++ files. +CFLAGS_CC_Release := \ + -std=gnu++0x \ + -stdlib=libc++ \ + -fno-rtti \ + -fno-exceptions \ + -fno-threadsafe-statics \ + -fno-strict-aliasing + +# Flags passed to only ObjC files. +CFLAGS_OBJC_Release := + +# Flags passed to only ObjC++ files. +CFLAGS_OBJCC_Release := + +INCS_Release := \ + -I/Users/prophesi/.node-gyp/8.2.1/include/node \ + -I/Users/prophesi/.node-gyp/8.2.1/src \ + -I/Users/prophesi/.node-gyp/8.2.1/deps/uv/include \ + -I/Users/prophesi/.node-gyp/8.2.1/deps/v8/include \ + -I$(srcdir)/../nan + +OBJS := \ + $(obj).target/$(TARGET)/src/bufferutil.o + +# Add to the list of files we specially track dependencies for. +all_deps += $(OBJS) + +# CFLAGS et al overrides must be target-local. +# See "Target-specific Variable Values" in the GNU Make manual. +$(OBJS): TOOLSET := $(TOOLSET) +$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) +$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) +$(OBJS): GYP_OBJCFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(CFLAGS_OBJC_$(BUILDTYPE)) +$(OBJS): GYP_OBJCXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(CFLAGS_OBJCC_$(BUILDTYPE)) + +# Suffix rules, putting all outputs into $(obj). + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) + +# Try building from generated source, too. + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) + +# End of this set of suffix rules +### Rules for final target. +LDFLAGS_Debug := \ + -undefined dynamic_lookup \ + -Wl,-no_pie \ + -Wl,-search_paths_first \ + -mmacosx-version-min=10.7 \ + -arch x86_64 \ + -L$(builddir) \ + -stdlib=libc++ + +LIBTOOLFLAGS_Debug := \ + -undefined dynamic_lookup \ + -Wl,-no_pie \ + -Wl,-search_paths_first + +LDFLAGS_Release := \ + -undefined dynamic_lookup \ + -Wl,-no_pie \ + -Wl,-search_paths_first \ + -mmacosx-version-min=10.7 \ + -arch x86_64 \ + -L$(builddir) \ + -stdlib=libc++ + +LIBTOOLFLAGS_Release := \ + -undefined dynamic_lookup \ + -Wl,-no_pie \ + -Wl,-search_paths_first + +LIBS := + +$(builddir)/bufferutil.node: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE)) +$(builddir)/bufferutil.node: LIBS := $(LIBS) +$(builddir)/bufferutil.node: GYP_LIBTOOLFLAGS := $(LIBTOOLFLAGS_$(BUILDTYPE)) +$(builddir)/bufferutil.node: TOOLSET := $(TOOLSET) +$(builddir)/bufferutil.node: $(OBJS) FORCE_DO_CMD + $(call do_cmd,solink_module) + +all_deps += $(builddir)/bufferutil.node +# Add target alias +.PHONY: bufferutil +bufferutil: $(builddir)/bufferutil.node + +# Short alias for building this executable. +.PHONY: bufferutil.node +bufferutil.node: $(builddir)/bufferutil.node + +# Add executable to "all" target. +.PHONY: all +all: $(builddir)/bufferutil.node + diff --git a/deploy/node_modules/websocket/build/config.gypi b/deploy/node_modules/websocket/build/config.gypi new file mode 100644 index 0000000..0fbc051 --- /dev/null +++ b/deploy/node_modules/websocket/build/config.gypi @@ -0,0 +1,170 @@ +# Do not edit. File was generated by node-gyp's "configure" step +{ + "target_defaults": { + "cflags": [], + "default_configuration": "Release", + "defines": [], + "include_dirs": [], + "libraries": [] + }, + "variables": { + "asan": 0, + "coverage": "false", + "debug_devtools": "node", + "force_dynamic_crt": 0, + "host_arch": "x64", + "icu_gyp_path": "tools/icu/icu-system.gyp", + "icu_small": "false", + "llvm_version": 0, + "node_byteorder": "little", + "node_enable_d8": "false", + "node_enable_v8_vtunejit": "false", + "node_install_npm": "false", + "node_module_version": 57, + "node_no_browser_globals": "false", + "node_prefix": "/usr/local/Cellar/node/8.2.1", + "node_release_urlbase": "", + "node_shared": "false", + "node_shared_cares": "false", + "node_shared_http_parser": "false", + "node_shared_libuv": "false", + "node_shared_openssl": "false", + "node_shared_zlib": "false", + "node_tag": "", + "node_use_bundled_v8": "true", + "node_use_dtrace": "true", + "node_use_etw": "false", + "node_use_lttng": "false", + "node_use_openssl": "true", + "node_use_perfctr": "false", + "node_use_v8_platform": "true", + "node_without_node_options": "false", + "openssl_fips": "", + "openssl_no_asm": 0, + "shlib_suffix": "57.dylib", + "target_arch": "x64", + "uv_parent_path": "/deps/uv/", + "uv_use_dtrace": "true", + "v8_enable_gdbjit": 0, + "v8_enable_i18n_support": 1, + "v8_enable_inspector": 1, + "v8_no_strict_aliasing": 1, + "v8_optimized_debug": 0, + "v8_promise_internal_field_count": 1, + "v8_random_seed": 0, + "v8_trace_maps": 0, + "v8_use_snapshot": "false", + "want_separate_host_toolset": 0, + "want_separate_host_toolset_mkpeephole": 0, + "xcode_version": "8.1", + "nodedir": "/Users/prophesi/.node-gyp/8.2.1", + "standalone_static_library": 1, + "dry_run": "", + "legacy_bundling": "", + "save_dev": "", + "browser": "", + "only": "", + "viewer": "man", + "also": "", + "rollback": "true", + "usage": "", + "globalignorefile": "/usr/local/etc/npmignore", + "init_author_url": "", + "maxsockets": "50", + "shell": "/bin/bash", + "metrics_registry": "https://registry.npmjs.org/", + "parseable": "", + "shrinkwrap": "true", + "init_license": "ISC", + "timing": "", + "if_present": "", + "cache_max": "Infinity", + "init_author_email": "", + "sign_git_tag": "", + "cert": "", + "git_tag_version": "true", + "local_address": "", + "long": "", + "fetch_retries": "2", + "registry": "https://registry.npmjs.org/", + "key": "", + "message": "%s", + "versions": "", + "globalconfig": "/usr/local/etc/npmrc", + "always_auth": "", + "logs_max": "10", + "prefer_online": "", + "cache_lock_retries": "10", + "global_style": "", + "heading": "npm", + "fetch_retry_mintimeout": "10000", + "offline": "", + "proprietary_attribs": "true", + "searchlimit": "20", + "access": "", + "json": "", + "allow_same_version": "", + "description": "true", + "engine_strict": "", + "https_proxy": "", + "init_module": "/Users/prophesi/.npm-init.js", + "userconfig": "/Users/prophesi/.npmrc", + "node_version": "8.2.1", + "user": "", + "auth_type": "legacy", + "editor": "vi", + "ignore_prepublish": "", + "save": "true", + "script_shell": "", + "tag": "latest", + "global": "", + "progress": "true", + "ham_it_up": "", + "optional": "true", + "searchstaleness": "900", + "bin_links": "true", + "force": "", + "save_prod": "", + "searchopts": "", + "depth": "Infinity", + "rebuild_bundle": "true", + "sso_poll_frequency": "500", + "unicode": "true", + "fetch_retry_maxtimeout": "60000", + "ca": "", + "save_prefix": "^", + "scripts_prepend_node_path": "warn-only", + "sso_type": "oauth", + "strict_ssl": "true", + "tag_version_prefix": "v", + "dev": "", + "fetch_retry_factor": "10", + "group": "20", + "save_exact": "", + "cache_lock_stale": "60000", + "prefer_offline": "", + "version": "", + "cache_min": "10", + "cache": "/Users/prophesi/.npm", + "searchexclude": "", + "color": "true", + "package_lock": "true", + "save_optional": "", + "user_agent": "npm/5.3.0 node/v8.2.1 darwin x64", + "ignore_scripts": "", + "cache_lock_wait": "10000", + "production": "", + "save_bundle": "", + "send_metrics": "", + "init_version": "1.0.0", + "umask": "0022", + "scope": "", + "git": "git", + "init_author_name": "", + "onload_script": "", + "tmp": "/var/folders/cb/xw2m0t6j0k54rmmmqfgz2pb00000gn/T", + "unsafe_perm": "true", + "prefix": "/usr/local", + "link": "" + } +} diff --git a/deploy/node_modules/websocket/build/gyp-mac-tool b/deploy/node_modules/websocket/build/gyp-mac-tool new file mode 100755 index 0000000..8ef02b0 --- /dev/null +++ b/deploy/node_modules/websocket/build/gyp-mac-tool @@ -0,0 +1,611 @@ +#!/usr/bin/env python +# Generated by gyp. Do not edit. +# Copyright (c) 2012 Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Utility functions to perform Xcode-style build steps. + +These functions are executed via gyp-mac-tool when using the Makefile generator. +""" + +import fcntl +import fnmatch +import glob +import json +import os +import plistlib +import re +import shutil +import string +import subprocess +import sys +import tempfile + + +def main(args): + executor = MacTool() + exit_code = executor.Dispatch(args) + if exit_code is not None: + sys.exit(exit_code) + + +class MacTool(object): + """This class performs all the Mac tooling steps. The methods can either be + executed directly, or dispatched from an argument list.""" + + def Dispatch(self, args): + """Dispatches a string command to a method.""" + if len(args) < 1: + raise Exception("Not enough arguments") + + method = "Exec%s" % self._CommandifyName(args[0]) + return getattr(self, method)(*args[1:]) + + def _CommandifyName(self, name_string): + """Transforms a tool name like copy-info-plist to CopyInfoPlist""" + return name_string.title().replace('-', '') + + def ExecCopyBundleResource(self, source, dest, convert_to_binary): + """Copies a resource file to the bundle/Resources directory, performing any + necessary compilation on each resource.""" + extension = os.path.splitext(source)[1].lower() + if os.path.isdir(source): + # Copy tree. + # TODO(thakis): This copies file attributes like mtime, while the + # single-file branch below doesn't. This should probably be changed to + # be consistent with the single-file branch. + if os.path.exists(dest): + shutil.rmtree(dest) + shutil.copytree(source, dest) + elif extension == '.xib': + return self._CopyXIBFile(source, dest) + elif extension == '.storyboard': + return self._CopyXIBFile(source, dest) + elif extension == '.strings': + self._CopyStringsFile(source, dest, convert_to_binary) + else: + shutil.copy(source, dest) + + def _CopyXIBFile(self, source, dest): + """Compiles a XIB file with ibtool into a binary plist in the bundle.""" + + # ibtool sometimes crashes with relative paths. See crbug.com/314728. + base = os.path.dirname(os.path.realpath(__file__)) + if os.path.relpath(source): + source = os.path.join(base, source) + if os.path.relpath(dest): + dest = os.path.join(base, dest) + + args = ['xcrun', 'ibtool', '--errors', '--warnings', '--notices', + '--output-format', 'human-readable-text', '--compile', dest, source] + ibtool_section_re = re.compile(r'/\*.*\*/') + ibtool_re = re.compile(r'.*note:.*is clipping its content') + ibtoolout = subprocess.Popen(args, stdout=subprocess.PIPE) + current_section_header = None + for line in ibtoolout.stdout: + if ibtool_section_re.match(line): + current_section_header = line + elif not ibtool_re.match(line): + if current_section_header: + sys.stdout.write(current_section_header) + current_section_header = None + sys.stdout.write(line) + return ibtoolout.returncode + + def _ConvertToBinary(self, dest): + subprocess.check_call([ + 'xcrun', 'plutil', '-convert', 'binary1', '-o', dest, dest]) + + def _CopyStringsFile(self, source, dest, convert_to_binary): + """Copies a .strings file using iconv to reconvert the input into UTF-16.""" + input_code = self._DetectInputEncoding(source) or "UTF-8" + + # Xcode's CpyCopyStringsFile / builtin-copyStrings seems to call + # CFPropertyListCreateFromXMLData() behind the scenes; at least it prints + # CFPropertyListCreateFromXMLData(): Old-style plist parser: missing + # semicolon in dictionary. + # on invalid files. Do the same kind of validation. + import CoreFoundation + s = open(source, 'rb').read() + d = CoreFoundation.CFDataCreate(None, s, len(s)) + _, error = CoreFoundation.CFPropertyListCreateFromXMLData(None, d, 0, None) + if error: + return + + fp = open(dest, 'wb') + fp.write(s.decode(input_code).encode('UTF-16')) + fp.close() + + if convert_to_binary == 'True': + self._ConvertToBinary(dest) + + def _DetectInputEncoding(self, file_name): + """Reads the first few bytes from file_name and tries to guess the text + encoding. Returns None as a guess if it can't detect it.""" + fp = open(file_name, 'rb') + try: + header = fp.read(3) + except e: + fp.close() + return None + fp.close() + if header.startswith("\xFE\xFF"): + return "UTF-16" + elif header.startswith("\xFF\xFE"): + return "UTF-16" + elif header.startswith("\xEF\xBB\xBF"): + return "UTF-8" + else: + return None + + def ExecCopyInfoPlist(self, source, dest, convert_to_binary, *keys): + """Copies the |source| Info.plist to the destination directory |dest|.""" + # Read the source Info.plist into memory. + fd = open(source, 'r') + lines = fd.read() + fd.close() + + # Insert synthesized key/value pairs (e.g. BuildMachineOSBuild). + plist = plistlib.readPlistFromString(lines) + if keys: + plist = dict(plist.items() + json.loads(keys[0]).items()) + lines = plistlib.writePlistToString(plist) + + # Go through all the environment variables and replace them as variables in + # the file. + IDENT_RE = re.compile(r'[/\s]') + for key in os.environ: + if key.startswith('_'): + continue + evar = '${%s}' % key + evalue = os.environ[key] + lines = string.replace(lines, evar, evalue) + + # Xcode supports various suffices on environment variables, which are + # all undocumented. :rfc1034identifier is used in the standard project + # template these days, and :identifier was used earlier. They are used to + # convert non-url characters into things that look like valid urls -- + # except that the replacement character for :identifier, '_' isn't valid + # in a URL either -- oops, hence :rfc1034identifier was born. + evar = '${%s:identifier}' % key + evalue = IDENT_RE.sub('_', os.environ[key]) + lines = string.replace(lines, evar, evalue) + + evar = '${%s:rfc1034identifier}' % key + evalue = IDENT_RE.sub('-', os.environ[key]) + lines = string.replace(lines, evar, evalue) + + # Remove any keys with values that haven't been replaced. + lines = lines.split('\n') + for i in range(len(lines)): + if lines[i].strip().startswith("${"): + lines[i] = None + lines[i - 1] = None + lines = '\n'.join(filter(lambda x: x is not None, lines)) + + # Write out the file with variables replaced. + fd = open(dest, 'w') + fd.write(lines) + fd.close() + + # Now write out PkgInfo file now that the Info.plist file has been + # "compiled". + self._WritePkgInfo(dest) + + if convert_to_binary == 'True': + self._ConvertToBinary(dest) + + def _WritePkgInfo(self, info_plist): + """This writes the PkgInfo file from the data stored in Info.plist.""" + plist = plistlib.readPlist(info_plist) + if not plist: + return + + # Only create PkgInfo for executable types. + package_type = plist['CFBundlePackageType'] + if package_type != 'APPL': + return + + # The format of PkgInfo is eight characters, representing the bundle type + # and bundle signature, each four characters. If that is missing, four + # '?' characters are used instead. + signature_code = plist.get('CFBundleSignature', '????') + if len(signature_code) != 4: # Wrong length resets everything, too. + signature_code = '?' * 4 + + dest = os.path.join(os.path.dirname(info_plist), 'PkgInfo') + fp = open(dest, 'w') + fp.write('%s%s' % (package_type, signature_code)) + fp.close() + + def ExecFlock(self, lockfile, *cmd_list): + """Emulates the most basic behavior of Linux's flock(1).""" + # Rely on exception handling to report errors. + fd = os.open(lockfile, os.O_RDONLY|os.O_NOCTTY|os.O_CREAT, 0o666) + fcntl.flock(fd, fcntl.LOCK_EX) + return subprocess.call(cmd_list) + + def ExecFilterLibtool(self, *cmd_list): + """Calls libtool and filters out '/path/to/libtool: file: foo.o has no + symbols'.""" + libtool_re = re.compile(r'^.*libtool: file: .* has no symbols$') + libtool_re5 = re.compile( + r'^.*libtool: warning for library: ' + + r'.* the table of contents is empty ' + + r'\(no object file members in the library define global symbols\)$') + env = os.environ.copy() + # Ref: + # http://www.opensource.apple.com/source/cctools/cctools-809/misc/libtool.c + # The problem with this flag is that it resets the file mtime on the file to + # epoch=0, e.g. 1970-1-1 or 1969-12-31 depending on timezone. + env['ZERO_AR_DATE'] = '1' + libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE, env=env) + _, err = libtoolout.communicate() + for line in err.splitlines(): + if not libtool_re.match(line) and not libtool_re5.match(line): + print >>sys.stderr, line + # Unconditionally touch the output .a file on the command line if present + # and the command succeeded. A bit hacky. + if not libtoolout.returncode: + for i in range(len(cmd_list) - 1): + if cmd_list[i] == "-o" and cmd_list[i+1].endswith('.a'): + os.utime(cmd_list[i+1], None) + break + return libtoolout.returncode + + def ExecPackageFramework(self, framework, version): + """Takes a path to Something.framework and the Current version of that and + sets up all the symlinks.""" + # Find the name of the binary based on the part before the ".framework". + binary = os.path.basename(framework).split('.')[0] + + CURRENT = 'Current' + RESOURCES = 'Resources' + VERSIONS = 'Versions' + + if not os.path.exists(os.path.join(framework, VERSIONS, version, binary)): + # Binary-less frameworks don't seem to contain symlinks (see e.g. + # chromium's out/Debug/org.chromium.Chromium.manifest/ bundle). + return + + # Move into the framework directory to set the symlinks correctly. + pwd = os.getcwd() + os.chdir(framework) + + # Set up the Current version. + self._Relink(version, os.path.join(VERSIONS, CURRENT)) + + # Set up the root symlinks. + self._Relink(os.path.join(VERSIONS, CURRENT, binary), binary) + self._Relink(os.path.join(VERSIONS, CURRENT, RESOURCES), RESOURCES) + + # Back to where we were before! + os.chdir(pwd) + + def _Relink(self, dest, link): + """Creates a symlink to |dest| named |link|. If |link| already exists, + it is overwritten.""" + if os.path.lexists(link): + os.remove(link) + os.symlink(dest, link) + + def ExecCompileXcassets(self, keys, *inputs): + """Compiles multiple .xcassets files into a single .car file. + + This invokes 'actool' to compile all the inputs .xcassets files. The + |keys| arguments is a json-encoded dictionary of extra arguments to + pass to 'actool' when the asset catalogs contains an application icon + or a launch image. + + Note that 'actool' does not create the Assets.car file if the asset + catalogs does not contains imageset. + """ + command_line = [ + 'xcrun', 'actool', '--output-format', 'human-readable-text', + '--compress-pngs', '--notices', '--warnings', '--errors', + ] + is_iphone_target = 'IPHONEOS_DEPLOYMENT_TARGET' in os.environ + if is_iphone_target: + platform = os.environ['CONFIGURATION'].split('-')[-1] + if platform not in ('iphoneos', 'iphonesimulator'): + platform = 'iphonesimulator' + command_line.extend([ + '--platform', platform, '--target-device', 'iphone', + '--target-device', 'ipad', '--minimum-deployment-target', + os.environ['IPHONEOS_DEPLOYMENT_TARGET'], '--compile', + os.path.abspath(os.environ['CONTENTS_FOLDER_PATH']), + ]) + else: + command_line.extend([ + '--platform', 'macosx', '--target-device', 'mac', + '--minimum-deployment-target', os.environ['MACOSX_DEPLOYMENT_TARGET'], + '--compile', + os.path.abspath(os.environ['UNLOCALIZED_RESOURCES_FOLDER_PATH']), + ]) + if keys: + keys = json.loads(keys) + for key, value in keys.iteritems(): + arg_name = '--' + key + if isinstance(value, bool): + if value: + command_line.append(arg_name) + elif isinstance(value, list): + for v in value: + command_line.append(arg_name) + command_line.append(str(v)) + else: + command_line.append(arg_name) + command_line.append(str(value)) + # Note: actool crashes if inputs path are relative, so use os.path.abspath + # to get absolute path name for inputs. + command_line.extend(map(os.path.abspath, inputs)) + subprocess.check_call(command_line) + + def ExecMergeInfoPlist(self, output, *inputs): + """Merge multiple .plist files into a single .plist file.""" + merged_plist = {} + for path in inputs: + plist = self._LoadPlistMaybeBinary(path) + self._MergePlist(merged_plist, plist) + plistlib.writePlist(merged_plist, output) + + def ExecCodeSignBundle(self, key, resource_rules, entitlements, provisioning): + """Code sign a bundle. + + This function tries to code sign an iOS bundle, following the same + algorithm as Xcode: + 1. copy ResourceRules.plist from the user or the SDK into the bundle, + 2. pick the provisioning profile that best match the bundle identifier, + and copy it into the bundle as embedded.mobileprovision, + 3. copy Entitlements.plist from user or SDK next to the bundle, + 4. code sign the bundle. + """ + resource_rules_path = self._InstallResourceRules(resource_rules) + substitutions, overrides = self._InstallProvisioningProfile( + provisioning, self._GetCFBundleIdentifier()) + entitlements_path = self._InstallEntitlements( + entitlements, substitutions, overrides) + subprocess.check_call([ + 'codesign', '--force', '--sign', key, '--resource-rules', + resource_rules_path, '--entitlements', entitlements_path, + os.path.join( + os.environ['TARGET_BUILD_DIR'], + os.environ['FULL_PRODUCT_NAME'])]) + + def _InstallResourceRules(self, resource_rules): + """Installs ResourceRules.plist from user or SDK into the bundle. + + Args: + resource_rules: string, optional, path to the ResourceRules.plist file + to use, default to "${SDKROOT}/ResourceRules.plist" + + Returns: + Path to the copy of ResourceRules.plist into the bundle. + """ + source_path = resource_rules + target_path = os.path.join( + os.environ['BUILT_PRODUCTS_DIR'], + os.environ['CONTENTS_FOLDER_PATH'], + 'ResourceRules.plist') + if not source_path: + source_path = os.path.join( + os.environ['SDKROOT'], 'ResourceRules.plist') + shutil.copy2(source_path, target_path) + return target_path + + def _InstallProvisioningProfile(self, profile, bundle_identifier): + """Installs embedded.mobileprovision into the bundle. + + Args: + profile: string, optional, short name of the .mobileprovision file + to use, if empty or the file is missing, the best file installed + will be used + bundle_identifier: string, value of CFBundleIdentifier from Info.plist + + Returns: + A tuple containing two dictionary: variables substitutions and values + to overrides when generating the entitlements file. + """ + source_path, provisioning_data, team_id = self._FindProvisioningProfile( + profile, bundle_identifier) + target_path = os.path.join( + os.environ['BUILT_PRODUCTS_DIR'], + os.environ['CONTENTS_FOLDER_PATH'], + 'embedded.mobileprovision') + shutil.copy2(source_path, target_path) + substitutions = self._GetSubstitutions(bundle_identifier, team_id + '.') + return substitutions, provisioning_data['Entitlements'] + + def _FindProvisioningProfile(self, profile, bundle_identifier): + """Finds the .mobileprovision file to use for signing the bundle. + + Checks all the installed provisioning profiles (or if the user specified + the PROVISIONING_PROFILE variable, only consult it) and select the most + specific that correspond to the bundle identifier. + + Args: + profile: string, optional, short name of the .mobileprovision file + to use, if empty or the file is missing, the best file installed + will be used + bundle_identifier: string, value of CFBundleIdentifier from Info.plist + + Returns: + A tuple of the path to the selected provisioning profile, the data of + the embedded plist in the provisioning profile and the team identifier + to use for code signing. + + Raises: + SystemExit: if no .mobileprovision can be used to sign the bundle. + """ + profiles_dir = os.path.join( + os.environ['HOME'], 'Library', 'MobileDevice', 'Provisioning Profiles') + if not os.path.isdir(profiles_dir): + print >>sys.stderr, ( + 'cannot find mobile provisioning for %s' % bundle_identifier) + sys.exit(1) + provisioning_profiles = None + if profile: + profile_path = os.path.join(profiles_dir, profile + '.mobileprovision') + if os.path.exists(profile_path): + provisioning_profiles = [profile_path] + if not provisioning_profiles: + provisioning_profiles = glob.glob( + os.path.join(profiles_dir, '*.mobileprovision')) + valid_provisioning_profiles = {} + for profile_path in provisioning_profiles: + profile_data = self._LoadProvisioningProfile(profile_path) + app_id_pattern = profile_data.get( + 'Entitlements', {}).get('application-identifier', '') + for team_identifier in profile_data.get('TeamIdentifier', []): + app_id = '%s.%s' % (team_identifier, bundle_identifier) + if fnmatch.fnmatch(app_id, app_id_pattern): + valid_provisioning_profiles[app_id_pattern] = ( + profile_path, profile_data, team_identifier) + if not valid_provisioning_profiles: + print >>sys.stderr, ( + 'cannot find mobile provisioning for %s' % bundle_identifier) + sys.exit(1) + # If the user has multiple provisioning profiles installed that can be + # used for ${bundle_identifier}, pick the most specific one (ie. the + # provisioning profile whose pattern is the longest). + selected_key = max(valid_provisioning_profiles, key=lambda v: len(v)) + return valid_provisioning_profiles[selected_key] + + def _LoadProvisioningProfile(self, profile_path): + """Extracts the plist embedded in a provisioning profile. + + Args: + profile_path: string, path to the .mobileprovision file + + Returns: + Content of the plist embedded in the provisioning profile as a dictionary. + """ + with tempfile.NamedTemporaryFile() as temp: + subprocess.check_call([ + 'security', 'cms', '-D', '-i', profile_path, '-o', temp.name]) + return self._LoadPlistMaybeBinary(temp.name) + + def _MergePlist(self, merged_plist, plist): + """Merge |plist| into |merged_plist|.""" + for key, value in plist.iteritems(): + if isinstance(value, dict): + merged_value = merged_plist.get(key, {}) + if isinstance(merged_value, dict): + self._MergePlist(merged_value, value) + merged_plist[key] = merged_value + else: + merged_plist[key] = value + else: + merged_plist[key] = value + + def _LoadPlistMaybeBinary(self, plist_path): + """Loads into a memory a plist possibly encoded in binary format. + + This is a wrapper around plistlib.readPlist that tries to convert the + plist to the XML format if it can't be parsed (assuming that it is in + the binary format). + + Args: + plist_path: string, path to a plist file, in XML or binary format + + Returns: + Content of the plist as a dictionary. + """ + try: + # First, try to read the file using plistlib that only supports XML, + # and if an exception is raised, convert a temporary copy to XML and + # load that copy. + return plistlib.readPlist(plist_path) + except: + pass + with tempfile.NamedTemporaryFile() as temp: + shutil.copy2(plist_path, temp.name) + subprocess.check_call(['plutil', '-convert', 'xml1', temp.name]) + return plistlib.readPlist(temp.name) + + def _GetSubstitutions(self, bundle_identifier, app_identifier_prefix): + """Constructs a dictionary of variable substitutions for Entitlements.plist. + + Args: + bundle_identifier: string, value of CFBundleIdentifier from Info.plist + app_identifier_prefix: string, value for AppIdentifierPrefix + + Returns: + Dictionary of substitutions to apply when generating Entitlements.plist. + """ + return { + 'CFBundleIdentifier': bundle_identifier, + 'AppIdentifierPrefix': app_identifier_prefix, + } + + def _GetCFBundleIdentifier(self): + """Extracts CFBundleIdentifier value from Info.plist in the bundle. + + Returns: + Value of CFBundleIdentifier in the Info.plist located in the bundle. + """ + info_plist_path = os.path.join( + os.environ['TARGET_BUILD_DIR'], + os.environ['INFOPLIST_PATH']) + info_plist_data = self._LoadPlistMaybeBinary(info_plist_path) + return info_plist_data['CFBundleIdentifier'] + + def _InstallEntitlements(self, entitlements, substitutions, overrides): + """Generates and install the ${BundleName}.xcent entitlements file. + + Expands variables "$(variable)" pattern in the source entitlements file, + add extra entitlements defined in the .mobileprovision file and the copy + the generated plist to "${BundlePath}.xcent". + + Args: + entitlements: string, optional, path to the Entitlements.plist template + to use, defaults to "${SDKROOT}/Entitlements.plist" + substitutions: dictionary, variable substitutions + overrides: dictionary, values to add to the entitlements + + Returns: + Path to the generated entitlements file. + """ + source_path = entitlements + target_path = os.path.join( + os.environ['BUILT_PRODUCTS_DIR'], + os.environ['PRODUCT_NAME'] + '.xcent') + if not source_path: + source_path = os.path.join( + os.environ['SDKROOT'], + 'Entitlements.plist') + shutil.copy2(source_path, target_path) + data = self._LoadPlistMaybeBinary(target_path) + data = self._ExpandVariables(data, substitutions) + if overrides: + for key in overrides: + if key not in data: + data[key] = overrides[key] + plistlib.writePlist(data, target_path) + return target_path + + def _ExpandVariables(self, data, substitutions): + """Expands variables "$(variable)" in data. + + Args: + data: object, can be either string, list or dictionary + substitutions: dictionary, variable substitutions to perform + + Returns: + Copy of data where each references to "$(variable)" has been replaced + by the corresponding value found in substitutions, or left intact if + the key was not found. + """ + if isinstance(data, str): + for key, value in substitutions.iteritems(): + data = data.replace('$(%s)' % key, value) + return data + if isinstance(data, list): + return [self._ExpandVariables(v, substitutions) for v in data] + if isinstance(data, dict): + return {k: self._ExpandVariables(data[k], substitutions) for k in data} + return data + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) diff --git a/deploy/node_modules/websocket/build/validation.target.mk b/deploy/node_modules/websocket/build/validation.target.mk new file mode 100644 index 0000000..052bdf8 --- /dev/null +++ b/deploy/node_modules/websocket/build/validation.target.mk @@ -0,0 +1,180 @@ +# This file is generated by gyp; do not edit. + +TOOLSET := target +TARGET := validation +DEFS_Debug := \ + '-DNODE_GYP_MODULE_NAME=validation' \ + '-DUSING_UV_SHARED=1' \ + '-DUSING_V8_SHARED=1' \ + '-DV8_DEPRECATION_WARNINGS=1' \ + '-D_DARWIN_USE_64_BIT_INODE=1' \ + '-D_LARGEFILE_SOURCE' \ + '-D_FILE_OFFSET_BITS=64' \ + '-DBUILDING_NODE_EXTENSION' \ + '-DDEBUG' \ + '-D_DEBUG' \ + '-DV8_ENABLE_CHECKS' + +# Flags passed to all source files. +CFLAGS_Debug := \ + -O0 \ + -gdwarf-2 \ + -mmacosx-version-min=10.7 \ + -arch x86_64 \ + -Wall \ + -Wendif-labels \ + -W \ + -Wno-unused-parameter + +# Flags passed to only C files. +CFLAGS_C_Debug := \ + -fno-strict-aliasing + +# Flags passed to only C++ files. +CFLAGS_CC_Debug := \ + -std=gnu++0x \ + -stdlib=libc++ \ + -fno-rtti \ + -fno-exceptions \ + -fno-threadsafe-statics \ + -fno-strict-aliasing + +# Flags passed to only ObjC files. +CFLAGS_OBJC_Debug := + +# Flags passed to only ObjC++ files. +CFLAGS_OBJCC_Debug := + +INCS_Debug := \ + -I/Users/prophesi/.node-gyp/8.2.1/include/node \ + -I/Users/prophesi/.node-gyp/8.2.1/src \ + -I/Users/prophesi/.node-gyp/8.2.1/deps/uv/include \ + -I/Users/prophesi/.node-gyp/8.2.1/deps/v8/include \ + -I$(srcdir)/../nan + +DEFS_Release := \ + '-DNODE_GYP_MODULE_NAME=validation' \ + '-DUSING_UV_SHARED=1' \ + '-DUSING_V8_SHARED=1' \ + '-DV8_DEPRECATION_WARNINGS=1' \ + '-D_DARWIN_USE_64_BIT_INODE=1' \ + '-D_LARGEFILE_SOURCE' \ + '-D_FILE_OFFSET_BITS=64' \ + '-DBUILDING_NODE_EXTENSION' + +# Flags passed to all source files. +CFLAGS_Release := \ + -Os \ + -gdwarf-2 \ + -mmacosx-version-min=10.7 \ + -arch x86_64 \ + -Wall \ + -Wendif-labels \ + -W \ + -Wno-unused-parameter + +# Flags passed to only C files. +CFLAGS_C_Release := \ + -fno-strict-aliasing + +# Flags passed to only C++ files. +CFLAGS_CC_Release := \ + -std=gnu++0x \ + -stdlib=libc++ \ + -fno-rtti \ + -fno-exceptions \ + -fno-threadsafe-statics \ + -fno-strict-aliasing + +# Flags passed to only ObjC files. +CFLAGS_OBJC_Release := + +# Flags passed to only ObjC++ files. +CFLAGS_OBJCC_Release := + +INCS_Release := \ + -I/Users/prophesi/.node-gyp/8.2.1/include/node \ + -I/Users/prophesi/.node-gyp/8.2.1/src \ + -I/Users/prophesi/.node-gyp/8.2.1/deps/uv/include \ + -I/Users/prophesi/.node-gyp/8.2.1/deps/v8/include \ + -I$(srcdir)/../nan + +OBJS := \ + $(obj).target/$(TARGET)/src/validation.o + +# Add to the list of files we specially track dependencies for. +all_deps += $(OBJS) + +# CFLAGS et al overrides must be target-local. +# See "Target-specific Variable Values" in the GNU Make manual. +$(OBJS): TOOLSET := $(TOOLSET) +$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) +$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) +$(OBJS): GYP_OBJCFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(CFLAGS_OBJC_$(BUILDTYPE)) +$(OBJS): GYP_OBJCXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(CFLAGS_OBJCC_$(BUILDTYPE)) + +# Suffix rules, putting all outputs into $(obj). + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) + +# Try building from generated source, too. + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) + +# End of this set of suffix rules +### Rules for final target. +LDFLAGS_Debug := \ + -undefined dynamic_lookup \ + -Wl,-no_pie \ + -Wl,-search_paths_first \ + -mmacosx-version-min=10.7 \ + -arch x86_64 \ + -L$(builddir) \ + -stdlib=libc++ + +LIBTOOLFLAGS_Debug := \ + -undefined dynamic_lookup \ + -Wl,-no_pie \ + -Wl,-search_paths_first + +LDFLAGS_Release := \ + -undefined dynamic_lookup \ + -Wl,-no_pie \ + -Wl,-search_paths_first \ + -mmacosx-version-min=10.7 \ + -arch x86_64 \ + -L$(builddir) \ + -stdlib=libc++ + +LIBTOOLFLAGS_Release := \ + -undefined dynamic_lookup \ + -Wl,-no_pie \ + -Wl,-search_paths_first + +LIBS := + +$(builddir)/validation.node: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE)) +$(builddir)/validation.node: LIBS := $(LIBS) +$(builddir)/validation.node: GYP_LIBTOOLFLAGS := $(LIBTOOLFLAGS_$(BUILDTYPE)) +$(builddir)/validation.node: TOOLSET := $(TOOLSET) +$(builddir)/validation.node: $(OBJS) FORCE_DO_CMD + $(call do_cmd,solink_module) + +all_deps += $(builddir)/validation.node +# Add target alias +.PHONY: validation +validation: $(builddir)/validation.node + +# Short alias for building this executable. +.PHONY: validation.node +validation.node: $(builddir)/validation.node + +# Add executable to "all" target. +.PHONY: all +all: $(builddir)/validation.node + diff --git a/deploy/node_modules/websocket/builderror.log b/deploy/node_modules/websocket/builderror.log new file mode 100644 index 0000000..e69de29 diff --git a/deploy/node_modules/websocket/gulpfile.js b/deploy/node_modules/websocket/gulpfile.js new file mode 100644 index 0000000..b515b92 --- /dev/null +++ b/deploy/node_modules/websocket/gulpfile.js @@ -0,0 +1,14 @@ +/** + * Dependencies. + */ +var gulp = require('gulp'); +var jshint = require('gulp-jshint'); + +gulp.task('lint', function() { + return gulp.src(['gulpfile.js', 'lib/**/*.js', 'test/**/*.js']) + .pipe(jshint('.jshintrc')) + .pipe(jshint.reporter('jshint-stylish', {verbose: true})) + .pipe(jshint.reporter('fail')); +}); + +gulp.task('default', gulp.series('lint')); diff --git a/deploy/node_modules/websocket/index.js b/deploy/node_modules/websocket/index.js new file mode 100644 index 0000000..573969f --- /dev/null +++ b/deploy/node_modules/websocket/index.js @@ -0,0 +1 @@ +module.exports = require('./lib/websocket'); \ No newline at end of file diff --git a/deploy/node_modules/websocket/lib/BufferUtil.fallback.js b/deploy/node_modules/websocket/lib/BufferUtil.fallback.js new file mode 100644 index 0000000..de18bfb --- /dev/null +++ b/deploy/node_modules/websocket/lib/BufferUtil.fallback.js @@ -0,0 +1,52 @@ +/*! + * Copied from: + * ws: a node.js websocket client + * Copyright(c) 2011 Einar Otto Stangvik + * MIT Licensed + */ + +/* jshint -W086 */ + +module.exports.BufferUtil = { + merge: function(mergedBuffer, buffers) { + var offset = 0; + for (var i = 0, l = buffers.length; i < l; ++i) { + var buf = buffers[i]; + buf.copy(mergedBuffer, offset); + offset += buf.length; + } + }, + mask: function(source, mask, output, offset, length) { + var maskNum = mask.readUInt32LE(0, true); + var i = 0; + for (; i < length - 3; i += 4) { + var num = maskNum ^ source.readUInt32LE(i, true); + if (num < 0) { num = 4294967296 + num; } + output.writeUInt32LE(num, offset + i, true); + } + switch (length % 4) { + case 3: output[offset + i + 2] = source[i + 2] ^ mask[2]; + case 2: output[offset + i + 1] = source[i + 1] ^ mask[1]; + case 1: output[offset + i] = source[i] ^ mask[0]; + case 0: + } + }, + unmask: function(data, mask) { + var maskNum = mask.readUInt32LE(0, true); + var length = data.length; + var i = 0; + for (; i < length - 3; i += 4) { + var num = maskNum ^ data.readUInt32LE(i, true); + if (num < 0) { num = 4294967296 + num; } + data.writeUInt32LE(num, i, true); + } + switch (length % 4) { + case 3: data[i + 2] = data[i + 2] ^ mask[2]; + case 2: data[i + 1] = data[i + 1] ^ mask[1]; + case 1: data[i] = data[i] ^ mask[0]; + case 0: + } + } +}; + +/* jshint +W086 */ \ No newline at end of file diff --git a/deploy/node_modules/websocket/lib/BufferUtil.js b/deploy/node_modules/websocket/lib/BufferUtil.js new file mode 100644 index 0000000..fa37c80 --- /dev/null +++ b/deploy/node_modules/websocket/lib/BufferUtil.js @@ -0,0 +1,17 @@ +/*! + * Copied from: + * ws: a node.js websocket client + * Copyright(c) 2011 Einar Otto Stangvik + * MIT Licensed + */ + +try { + module.exports = require('../build/Release/bufferutil'); +} catch (e) { try { + module.exports = require('../build/default/bufferutil'); +} catch (e) { try { + module.exports = require('./BufferUtil.fallback'); +} catch (e) { + console.error('bufferutil.node seems to not have been built. Run npm install.'); + throw e; +}}} diff --git a/deploy/node_modules/websocket/lib/Deprecation.js b/deploy/node_modules/websocket/lib/Deprecation.js new file mode 100644 index 0000000..094f160 --- /dev/null +++ b/deploy/node_modules/websocket/lib/Deprecation.js @@ -0,0 +1,32 @@ +/************************************************************************ + * Copyright 2010-2015 Brian McKelvey. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ***********************************************************************/ + +var Deprecation = { + disableWarnings: false, + + deprecationWarningMap: { + + }, + + warn: function(deprecationName) { + if (!this.disableWarnings && this.deprecationWarningMap[deprecationName]) { + console.warn('DEPRECATION WARNING: ' + this.deprecationWarningMap[deprecationName]); + this.deprecationWarningMap[deprecationName] = false; + } + } +}; + +module.exports = Deprecation; diff --git a/deploy/node_modules/websocket/lib/Validation.fallback.js b/deploy/node_modules/websocket/lib/Validation.fallback.js new file mode 100644 index 0000000..6160f88 --- /dev/null +++ b/deploy/node_modules/websocket/lib/Validation.fallback.js @@ -0,0 +1,12 @@ +/*! + * UTF-8 Validation Fallback Code originally from: + * ws: a node.js websocket client + * Copyright(c) 2011 Einar Otto Stangvik + * MIT Licensed + */ + +module.exports.Validation = { + isValidUTF8: function() { + return true; + } +}; diff --git a/deploy/node_modules/websocket/lib/Validation.js b/deploy/node_modules/websocket/lib/Validation.js new file mode 100644 index 0000000..b4106e8 --- /dev/null +++ b/deploy/node_modules/websocket/lib/Validation.js @@ -0,0 +1,17 @@ +/*! + * UTF-8 Validation Code originally from: + * ws: a node.js websocket client + * Copyright(c) 2011 Einar Otto Stangvik + * MIT Licensed + */ + +try { + module.exports = require('../build/Release/validation'); +} catch (e) { try { + module.exports = require('../build/default/validation'); +} catch (e) { try { + module.exports = require('./Validation.fallback'); +} catch (e) { + console.error('validation.node seems not to have been built. Run npm install.'); + throw e; +}}} diff --git a/deploy/node_modules/websocket/lib/W3CWebSocket.js b/deploy/node_modules/websocket/lib/W3CWebSocket.js new file mode 100644 index 0000000..44a4ac9 --- /dev/null +++ b/deploy/node_modules/websocket/lib/W3CWebSocket.js @@ -0,0 +1,257 @@ +/************************************************************************ + * Copyright 2010-2015 Brian McKelvey. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ***********************************************************************/ + +var WebSocketClient = require('./WebSocketClient'); +var toBuffer = require('typedarray-to-buffer'); +var yaeti = require('yaeti'); + + +const CONNECTING = 0; +const OPEN = 1; +const CLOSING = 2; +const CLOSED = 3; + + +module.exports = W3CWebSocket; + + +function W3CWebSocket(url, protocols, origin, headers, requestOptions, clientConfig) { + // Make this an EventTarget. + yaeti.EventTarget.call(this); + + // Sanitize clientConfig. + clientConfig = clientConfig || {}; + clientConfig.assembleFragments = true; // Required in the W3C API. + + var self = this; + + this._url = url; + this._readyState = CONNECTING; + this._protocol = undefined; + this._extensions = ''; + this._bufferedAmount = 0; // Hack, always 0. + this._binaryType = 'arraybuffer'; // TODO: Should be 'blob' by default, but Node has no Blob. + + // The WebSocketConnection instance. + this._connection = undefined; + + // WebSocketClient instance. + this._client = new WebSocketClient(clientConfig); + + this._client.on('connect', function(connection) { + onConnect.call(self, connection); + }); + + this._client.on('connectFailed', function() { + onConnectFailed.call(self); + }); + + this._client.connect(url, protocols, origin, headers, requestOptions); +} + + +// Expose W3C read only attributes. +Object.defineProperties(W3CWebSocket.prototype, { + url: { get: function() { return this._url; } }, + readyState: { get: function() { return this._readyState; } }, + protocol: { get: function() { return this._protocol; } }, + extensions: { get: function() { return this._extensions; } }, + bufferedAmount: { get: function() { return this._bufferedAmount; } } +}); + + +// Expose W3C write/read attributes. +Object.defineProperties(W3CWebSocket.prototype, { + binaryType: { + get: function() { + return this._binaryType; + }, + set: function(type) { + // TODO: Just 'arraybuffer' supported. + if (type !== 'arraybuffer') { + throw new SyntaxError('just "arraybuffer" type allowed for "binaryType" attribute'); + } + this._binaryType = type; + } + } +}); + + +// Expose W3C readyState constants into the WebSocket instance as W3C states. +[['CONNECTING',CONNECTING], ['OPEN',OPEN], ['CLOSING',CLOSING], ['CLOSED',CLOSED]].forEach(function(property) { + Object.defineProperty(W3CWebSocket.prototype, property[0], { + get: function() { return property[1]; } + }); +}); + +// Also expose W3C readyState constants into the WebSocket class (not defined by the W3C, +// but there are so many libs relying on them). +[['CONNECTING',CONNECTING], ['OPEN',OPEN], ['CLOSING',CLOSING], ['CLOSED',CLOSED]].forEach(function(property) { + Object.defineProperty(W3CWebSocket, property[0], { + get: function() { return property[1]; } + }); +}); + + +W3CWebSocket.prototype.send = function(data) { + if (this._readyState !== OPEN) { + throw new Error('cannot call send() while not connected'); + } + + // Text. + if (typeof data === 'string' || data instanceof String) { + this._connection.sendUTF(data); + } + // Binary. + else { + // Node Buffer. + if (data instanceof Buffer) { + this._connection.sendBytes(data); + } + // If ArrayBuffer or ArrayBufferView convert it to Node Buffer. + else if (data.byteLength || data.byteLength === 0) { + data = toBuffer(data); + this._connection.sendBytes(data); + } + else { + throw new Error('unknown binary data:', data); + } + } +}; + + +W3CWebSocket.prototype.close = function(code, reason) { + switch(this._readyState) { + case CONNECTING: + // NOTE: We don't have the WebSocketConnection instance yet so no + // way to close the TCP connection. + // Artificially invoke the onConnectFailed event. + onConnectFailed.call(this); + // And close if it connects after a while. + this._client.on('connect', function(connection) { + if (code) { + connection.close(code, reason); + } else { + connection.close(); + } + }); + break; + case OPEN: + this._readyState = CLOSING; + if (code) { + this._connection.close(code, reason); + } else { + this._connection.close(); + } + break; + case CLOSING: + case CLOSED: + break; + } +}; + + +/** + * Private API. + */ + + +function createCloseEvent(code, reason) { + var event = new yaeti.Event('close'); + + event.code = code; + event.reason = reason; + event.wasClean = (typeof code === 'undefined' || code === 1000); + + return event; +} + + +function createMessageEvent(data) { + var event = new yaeti.Event('message'); + + event.data = data; + + return event; +} + + +function onConnect(connection) { + var self = this; + + this._readyState = OPEN; + this._connection = connection; + this._protocol = connection.protocol; + this._extensions = connection.extensions; + + this._connection.on('close', function(code, reason) { + onClose.call(self, code, reason); + }); + + this._connection.on('message', function(msg) { + onMessage.call(self, msg); + }); + + this.dispatchEvent(new yaeti.Event('open')); +} + + +function onConnectFailed() { + destroy.call(this); + this._readyState = CLOSED; + + try { + this.dispatchEvent(new yaeti.Event('error')); + } finally { + this.dispatchEvent(createCloseEvent(1006, 'connection failed')); + } +} + + +function onClose(code, reason) { + destroy.call(this); + this._readyState = CLOSED; + + this.dispatchEvent(createCloseEvent(code, reason || '')); +} + + +function onMessage(message) { + if (message.utf8Data) { + this.dispatchEvent(createMessageEvent(message.utf8Data)); + } + else if (message.binaryData) { + // Must convert from Node Buffer to ArrayBuffer. + // TODO: or to a Blob (which does not exist in Node!). + if (this.binaryType === 'arraybuffer') { + var buffer = message.binaryData; + var arraybuffer = new ArrayBuffer(buffer.length); + var view = new Uint8Array(arraybuffer); + for (var i=0, len=buffer.length; i', '@', + ',', ';', ':', '\\', '\"', + '/', '[', ']', '?', '=', + '{', '}', ' ', String.fromCharCode(9) +]; + +function WebSocketClient(config) { + // Superclass Constructor + EventEmitter.call(this); + + // TODO: Implement extensions + + this.config = { + // 1MiB max frame size. + maxReceivedFrameSize: 0x100000, + + // 8MiB max message size, only applicable if + // assembleFragments is true + maxReceivedMessageSize: 0x800000, + + // Outgoing messages larger than fragmentationThreshold will be + // split into multiple fragments. + fragmentOutgoingMessages: true, + + // Outgoing frames are fragmented if they exceed this threshold. + // Default is 16KiB + fragmentationThreshold: 0x4000, + + // Which version of the protocol to use for this session. This + // option will be removed once the protocol is finalized by the IETF + // It is only available to ease the transition through the + // intermediate draft protocol versions. + // At present, it only affects the name of the Origin header. + webSocketVersion: 13, + + // If true, fragmented messages will be automatically assembled + // and the full message will be emitted via a 'message' event. + // If false, each frame will be emitted via a 'frame' event and + // the application will be responsible for aggregating multiple + // fragmented frames. Single-frame messages will emit a 'message' + // event in addition to the 'frame' event. + // Most users will want to leave this set to 'true' + assembleFragments: true, + + // The Nagle Algorithm makes more efficient use of network resources + // by introducing a small delay before sending small packets so that + // multiple messages can be batched together before going onto the + // wire. This however comes at the cost of latency, so the default + // is to disable it. If you don't need low latency and are streaming + // lots of small messages, you can change this to 'false' + disableNagleAlgorithm: true, + + // The number of milliseconds to wait after sending a close frame + // for an acknowledgement to come back before giving up and just + // closing the socket. + closeTimeout: 5000, + + // Options to pass to https.connect if connecting via TLS + tlsOptions: {} + }; + + if (config) { + var tlsOptions; + if (config.tlsOptions) { + tlsOptions = config.tlsOptions; + delete config.tlsOptions; + } + else { + tlsOptions = {}; + } + extend(this.config, config); + extend(this.config.tlsOptions, tlsOptions); + } + + this._req = null; + + switch (this.config.webSocketVersion) { + case 8: + case 13: + break; + default: + throw new Error('Requested webSocketVersion is not supported. Allowed values are 8 and 13.'); + } +} + +util.inherits(WebSocketClient, EventEmitter); + +WebSocketClient.prototype.connect = function(requestUrl, protocols, origin, headers, extraRequestOptions) { + var self = this; + if (typeof(protocols) === 'string') { + if (protocols.length > 0) { + protocols = [protocols]; + } + else { + protocols = []; + } + } + if (!(protocols instanceof Array)) { + protocols = []; + } + this.protocols = protocols; + this.origin = origin; + + if (typeof(requestUrl) === 'string') { + this.url = url.parse(requestUrl); + } + else { + this.url = requestUrl; // in case an already parsed url is passed in. + } + if (!this.url.protocol) { + throw new Error('You must specify a full WebSocket URL, including protocol.'); + } + if (!this.url.host) { + throw new Error('You must specify a full WebSocket URL, including hostname. Relative URLs are not supported.'); + } + + this.secure = (this.url.protocol === 'wss:'); + + // validate protocol characters: + this.protocols.forEach(function(protocol) { + for (var i=0; i < protocol.length; i ++) { + var charCode = protocol.charCodeAt(i); + var character = protocol.charAt(i); + if (charCode < 0x0021 || charCode > 0x007E || protocolSeparators.indexOf(character) !== -1) { + throw new Error('Protocol list contains invalid character "' + String.fromCharCode(charCode) + '"'); + } + } + }); + + var defaultPorts = { + 'ws:': '80', + 'wss:': '443' + }; + + if (!this.url.port) { + this.url.port = defaultPorts[this.url.protocol]; + } + + var nonce = new Buffer(16); + for (var i=0; i < 16; i++) { + nonce[i] = Math.round(Math.random()*0xFF); + } + this.base64nonce = nonce.toString('base64'); + + var hostHeaderValue = this.url.hostname; + if ((this.url.protocol === 'ws:' && this.url.port !== '80') || + (this.url.protocol === 'wss:' && this.url.port !== '443')) { + hostHeaderValue += (':' + this.url.port); + } + + var reqHeaders = headers || {}; + extend(reqHeaders, { + 'Upgrade': 'websocket', + 'Connection': 'Upgrade', + 'Sec-WebSocket-Version': this.config.webSocketVersion.toString(10), + 'Sec-WebSocket-Key': this.base64nonce, + 'Host': hostHeaderValue + }); + + if (this.protocols.length > 0) { + reqHeaders['Sec-WebSocket-Protocol'] = this.protocols.join(', '); + } + if (this.origin) { + if (this.config.webSocketVersion === 13) { + reqHeaders['Origin'] = this.origin; + } + else if (this.config.webSocketVersion === 8) { + reqHeaders['Sec-WebSocket-Origin'] = this.origin; + } + } + + // TODO: Implement extensions + + var pathAndQuery; + // Ensure it begins with '/'. + if (this.url.pathname) { + pathAndQuery = this.url.path; + } + else if (this.url.path) { + pathAndQuery = '/' + this.url.path; + } + else { + pathAndQuery = '/'; + } + + function handleRequestError(error) { + self._req = null; + self.emit('connectFailed', error); + } + + var requestOptions = { + agent: false + }; + if (extraRequestOptions) { + extend(requestOptions, extraRequestOptions); + } + // These options are always overridden by the library. The user is not + // allowed to specify these directly. + extend(requestOptions, { + hostname: this.url.hostname, + port: this.url.port, + method: 'GET', + path: pathAndQuery, + headers: reqHeaders + }); + if (this.secure) { + for (var key in self.config.tlsOptions) { + if (self.config.tlsOptions.hasOwnProperty(key)) { + requestOptions[key] = self.config.tlsOptions[key]; + } + } + } + + var req = this._req = (this.secure ? https : http).request(requestOptions); + req.on('upgrade', function handleRequestUpgrade(response, socket, head) { + self._req = null; + req.removeListener('error', handleRequestError); + self.socket = socket; + self.response = response; + self.firstDataChunk = head; + self.validateHandshake(); + }); + req.on('error', handleRequestError); + + req.on('response', function(response) { + self._req = null; + if (utils.eventEmitterListenerCount(self, 'httpResponse') > 0) { + self.emit('httpResponse', response, self); + if (response.socket) { + response.socket.end(); + } + } + else { + var headerDumpParts = []; + for (var headerName in response.headers) { + headerDumpParts.push(headerName + ': ' + response.headers[headerName]); + } + self.failHandshake( + 'Server responded with a non-101 status: ' + + response.statusCode + + '\nResponse Headers Follow:\n' + + headerDumpParts.join('\n') + '\n' + ); + } + }); + req.end(); +}; + +WebSocketClient.prototype.validateHandshake = function() { + var headers = this.response.headers; + + if (this.protocols.length > 0) { + this.protocol = headers['sec-websocket-protocol']; + if (this.protocol) { + if (this.protocols.indexOf(this.protocol) === -1) { + this.failHandshake('Server did not respond with a requested protocol.'); + return; + } + } + else { + this.failHandshake('Expected a Sec-WebSocket-Protocol header.'); + return; + } + } + + if (!(headers['connection'] && headers['connection'].toLocaleLowerCase() === 'upgrade')) { + this.failHandshake('Expected a Connection: Upgrade header from the server'); + return; + } + + if (!(headers['upgrade'] && headers['upgrade'].toLocaleLowerCase() === 'websocket')) { + this.failHandshake('Expected an Upgrade: websocket header from the server'); + return; + } + + var sha1 = crypto.createHash('sha1'); + sha1.update(this.base64nonce + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'); + var expectedKey = sha1.digest('base64'); + + if (!headers['sec-websocket-accept']) { + this.failHandshake('Expected Sec-WebSocket-Accept header from server'); + return; + } + + if (headers['sec-websocket-accept'] !== expectedKey) { + this.failHandshake('Sec-WebSocket-Accept header from server didn\'t match expected value of ' + expectedKey); + return; + } + + // TODO: Support extensions + + this.succeedHandshake(); +}; + +WebSocketClient.prototype.failHandshake = function(errorDescription) { + if (this.socket && this.socket.writable) { + this.socket.end(); + } + this.emit('connectFailed', new Error(errorDescription)); +}; + +WebSocketClient.prototype.succeedHandshake = function() { + var connection = new WebSocketConnection(this.socket, [], this.protocol, true, this.config); + + connection.webSocketVersion = this.config.webSocketVersion; + connection._addSocketEventListeners(); + + this.emit('connect', connection); + if (this.firstDataChunk.length > 0) { + connection.handleSocketData(this.firstDataChunk); + } + this.firstDataChunk = null; +}; + +WebSocketClient.prototype.abort = function() { + if (this._req) { + this._req.abort(); + } +}; + +module.exports = WebSocketClient; diff --git a/deploy/node_modules/websocket/lib/WebSocketConnection.js b/deploy/node_modules/websocket/lib/WebSocketConnection.js new file mode 100644 index 0000000..c8b1001 --- /dev/null +++ b/deploy/node_modules/websocket/lib/WebSocketConnection.js @@ -0,0 +1,889 @@ +/************************************************************************ + * Copyright 2010-2015 Brian McKelvey. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ***********************************************************************/ + +var util = require('util'); +var utils = require('./utils'); +var EventEmitter = require('events').EventEmitter; +var WebSocketFrame = require('./WebSocketFrame'); +var BufferList = require('../vendor/FastBufferList'); +var Validation = require('./Validation').Validation; + +// Connected, fully-open, ready to send and receive frames +const STATE_OPEN = 'open'; +// Received a close frame from the remote peer +const STATE_PEER_REQUESTED_CLOSE = 'peer_requested_close'; +// Sent close frame to remote peer. No further data can be sent. +const STATE_ENDING = 'ending'; +// Connection is fully closed. No further data can be sent or received. +const STATE_CLOSED = 'closed'; + +var setImmediateImpl = ('setImmediate' in global) ? + global.setImmediate.bind(global) : + process.nextTick.bind(process); + +var idCounter = 0; + +function WebSocketConnection(socket, extensions, protocol, maskOutgoingPackets, config) { + this._debug = utils.BufferingLogger('websocket:connection', ++idCounter); + this._debug('constructor'); + + if (this._debug.enabled) { + instrumentSocketForDebugging(this, socket); + } + + // Superclass Constructor + EventEmitter.call(this); + + this._pingListenerCount = 0; + this.on('newListener', function(ev) { + if (ev === 'ping'){ + this._pingListenerCount++; + } + }).on('removeListener', function(ev) { + if (ev === 'ping') { + this._pingListenerCount--; + } + }); + + this.config = config; + this.socket = socket; + this.protocol = protocol; + this.extensions = extensions; + this.remoteAddress = socket.remoteAddress; + this.closeReasonCode = -1; + this.closeDescription = null; + this.closeEventEmitted = false; + + // We have to mask outgoing packets if we're acting as a WebSocket client. + this.maskOutgoingPackets = maskOutgoingPackets; + + // We re-use the same buffers for the mask and frame header for all frames + // received on each connection to avoid a small memory allocation for each + // frame. + this.maskBytes = new Buffer(4); + this.frameHeader = new Buffer(10); + + // the BufferList will handle the data streaming in + this.bufferList = new BufferList(); + + // Prepare for receiving first frame + this.currentFrame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); + this.fragmentationSize = 0; // data received so far... + this.frameQueue = []; + + // Various bits of connection state + this.connected = true; + this.state = STATE_OPEN; + this.waitingForCloseResponse = false; + // Received TCP FIN, socket's readable stream is finished. + this.receivedEnd = false; + + this.closeTimeout = this.config.closeTimeout; + this.assembleFragments = this.config.assembleFragments; + this.maxReceivedMessageSize = this.config.maxReceivedMessageSize; + + this.outputBufferFull = false; + this.inputPaused = false; + this.receivedDataHandler = this.processReceivedData.bind(this); + this._closeTimerHandler = this.handleCloseTimer.bind(this); + + // Disable nagle algorithm? + this.socket.setNoDelay(this.config.disableNagleAlgorithm); + + // Make sure there is no socket inactivity timeout + this.socket.setTimeout(0); + + if (this.config.keepalive && !this.config.useNativeKeepalive) { + if (typeof(this.config.keepaliveInterval) !== 'number') { + throw new Error('keepaliveInterval must be specified and numeric ' + + 'if keepalive is true.'); + } + this._keepaliveTimerHandler = this.handleKeepaliveTimer.bind(this); + this.setKeepaliveTimer(); + + if (this.config.dropConnectionOnKeepaliveTimeout) { + if (typeof(this.config.keepaliveGracePeriod) !== 'number') { + throw new Error('keepaliveGracePeriod must be specified and ' + + 'numeric if dropConnectionOnKeepaliveTimeout ' + + 'is true.'); + } + this._gracePeriodTimerHandler = this.handleGracePeriodTimer.bind(this); + } + } + else if (this.config.keepalive && this.config.useNativeKeepalive) { + if (!('setKeepAlive' in this.socket)) { + throw new Error('Unable to use native keepalive: unsupported by ' + + 'this version of Node.'); + } + this.socket.setKeepAlive(true, this.config.keepaliveInterval); + } + + // The HTTP Client seems to subscribe to socket error events + // and re-dispatch them in such a way that doesn't make sense + // for users of our client, so we want to make sure nobody + // else is listening for error events on the socket besides us. + this.socket.removeAllListeners('error'); +} + +WebSocketConnection.CLOSE_REASON_NORMAL = 1000; +WebSocketConnection.CLOSE_REASON_GOING_AWAY = 1001; +WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR = 1002; +WebSocketConnection.CLOSE_REASON_UNPROCESSABLE_INPUT = 1003; +WebSocketConnection.CLOSE_REASON_RESERVED = 1004; // Reserved value. Undefined meaning. +WebSocketConnection.CLOSE_REASON_NOT_PROVIDED = 1005; // Not to be used on the wire +WebSocketConnection.CLOSE_REASON_ABNORMAL = 1006; // Not to be used on the wire +WebSocketConnection.CLOSE_REASON_INVALID_DATA = 1007; +WebSocketConnection.CLOSE_REASON_POLICY_VIOLATION = 1008; +WebSocketConnection.CLOSE_REASON_MESSAGE_TOO_BIG = 1009; +WebSocketConnection.CLOSE_REASON_EXTENSION_REQUIRED = 1010; +WebSocketConnection.CLOSE_REASON_INTERNAL_SERVER_ERROR = 1011; +WebSocketConnection.CLOSE_REASON_TLS_HANDSHAKE_FAILED = 1015; // Not to be used on the wire + +WebSocketConnection.CLOSE_DESCRIPTIONS = { + 1000: 'Normal connection closure', + 1001: 'Remote peer is going away', + 1002: 'Protocol error', + 1003: 'Unprocessable input', + 1004: 'Reserved', + 1005: 'Reason not provided', + 1006: 'Abnormal closure, no further detail available', + 1007: 'Invalid data received', + 1008: 'Policy violation', + 1009: 'Message too big', + 1010: 'Extension requested by client is required', + 1011: 'Internal Server Error', + 1015: 'TLS Handshake Failed' +}; + +function validateCloseReason(code) { + if (code < 1000) { + // Status codes in the range 0-999 are not used + return false; + } + if (code >= 1000 && code <= 2999) { + // Codes from 1000 - 2999 are reserved for use by the protocol. Only + // a few codes are defined, all others are currently illegal. + return [1000, 1001, 1002, 1003, 1007, 1008, 1009, 1010, 1011].indexOf(code) !== -1; + } + if (code >= 3000 && code <= 3999) { + // Reserved for use by libraries, frameworks, and applications. + // Should be registered with IANA. Interpretation of these codes is + // undefined by the WebSocket protocol. + return true; + } + if (code >= 4000 && code <= 4999) { + // Reserved for private use. Interpretation of these codes is + // undefined by the WebSocket protocol. + return true; + } + if (code >= 5000) { + return false; + } +} + +util.inherits(WebSocketConnection, EventEmitter); + +WebSocketConnection.prototype._addSocketEventListeners = function() { + this.socket.on('error', this.handleSocketError.bind(this)); + this.socket.on('end', this.handleSocketEnd.bind(this)); + this.socket.on('close', this.handleSocketClose.bind(this)); + this.socket.on('drain', this.handleSocketDrain.bind(this)); + this.socket.on('pause', this.handleSocketPause.bind(this)); + this.socket.on('resume', this.handleSocketResume.bind(this)); + this.socket.on('data', this.handleSocketData.bind(this)); +}; + +// set or reset the keepalive timer when data is received. +WebSocketConnection.prototype.setKeepaliveTimer = function() { + this._debug('setKeepaliveTimer'); + if (!this.config.keepalive || this.config.useNativeKeepalive) { return; } + this.clearKeepaliveTimer(); + this.clearGracePeriodTimer(); + this._keepaliveTimeoutID = setTimeout(this._keepaliveTimerHandler, this.config.keepaliveInterval); +}; + +WebSocketConnection.prototype.clearKeepaliveTimer = function() { + if (this._keepaliveTimeoutID) { + clearTimeout(this._keepaliveTimeoutID); + } +}; + +// No data has been received within config.keepaliveTimeout ms. +WebSocketConnection.prototype.handleKeepaliveTimer = function() { + this._debug('handleKeepaliveTimer'); + this._keepaliveTimeoutID = null; + this.ping(); + + // If we are configured to drop connections if the client doesn't respond + // then set the grace period timer. + if (this.config.dropConnectionOnKeepaliveTimeout) { + this.setGracePeriodTimer(); + } + else { + // Otherwise reset the keepalive timer to send the next ping. + this.setKeepaliveTimer(); + } +}; + +WebSocketConnection.prototype.setGracePeriodTimer = function() { + this._debug('setGracePeriodTimer'); + this.clearGracePeriodTimer(); + this._gracePeriodTimeoutID = setTimeout(this._gracePeriodTimerHandler, this.config.keepaliveGracePeriod); +}; + +WebSocketConnection.prototype.clearGracePeriodTimer = function() { + if (this._gracePeriodTimeoutID) { + clearTimeout(this._gracePeriodTimeoutID); + } +}; + +WebSocketConnection.prototype.handleGracePeriodTimer = function() { + this._debug('handleGracePeriodTimer'); + // If this is called, the client has not responded and is assumed dead. + this._gracePeriodTimeoutID = null; + this.drop(WebSocketConnection.CLOSE_REASON_ABNORMAL, 'Peer not responding.', true); +}; + +WebSocketConnection.prototype.handleSocketData = function(data) { + this._debug('handleSocketData'); + // Reset the keepalive timer when receiving data of any kind. + this.setKeepaliveTimer(); + + // Add received data to our bufferList, which efficiently holds received + // data chunks in a linked list of Buffer objects. + this.bufferList.write(data); + + this.processReceivedData(); +}; + +WebSocketConnection.prototype.processReceivedData = function() { + this._debug('processReceivedData'); + // If we're not connected, we should ignore any data remaining on the buffer. + if (!this.connected) { return; } + + // Receiving/parsing is expected to be halted when paused. + if (this.inputPaused) { return; } + + var frame = this.currentFrame; + + // WebSocketFrame.prototype.addData returns true if all data necessary to + // parse the frame was available. It returns false if we are waiting for + // more data to come in on the wire. + if (!frame.addData(this.bufferList)) { this._debug('-- insufficient data for frame'); return; } + + var self = this; + + // Handle possible parsing errors + if (frame.protocolError) { + // Something bad happened.. get rid of this client. + this._debug('-- protocol error'); + process.nextTick(function() { + self.drop(WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR, frame.dropReason); + }); + return; + } + else if (frame.frameTooLarge) { + this._debug('-- frame too large'); + process.nextTick(function() { + self.drop(WebSocketConnection.CLOSE_REASON_MESSAGE_TOO_BIG, frame.dropReason); + }); + return; + } + + // For now since we don't support extensions, all RSV bits are illegal + if (frame.rsv1 || frame.rsv2 || frame.rsv3) { + this._debug('-- illegal rsv flag'); + process.nextTick(function() { + self.drop(WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR, + 'Unsupported usage of rsv bits without negotiated extension.'); + }); + return; + } + + if (!this.assembleFragments) { + this._debug('-- emitting frame'); + process.nextTick(function() { self.emit('frame', frame); }); + } + + process.nextTick(function() { self.processFrame(frame); }); + + this.currentFrame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); + + // If there's data remaining, schedule additional processing, but yield + // for now so that other connections have a chance to have their data + // processed. We use setImmediate here instead of process.nextTick to + // explicitly indicate that we wish for other I/O to be handled first. + if (this.bufferList.length > 0) { + setImmediateImpl(this.receivedDataHandler); + } +}; + +WebSocketConnection.prototype.handleSocketError = function(error) { + this._debug('handleSocketError: %j', error); + this.closeReasonCode = WebSocketConnection.CLOSE_REASON_ABNORMAL; + this.closeDescription = 'Socket Error: ' + error.syscall + ' ' + error.code; + this.connected = false; + this.state = STATE_CLOSED; + this.fragmentationSize = 0; + if (utils.eventEmitterListenerCount(this, 'error') > 0) { + this.emit('error', error); + } + this.socket.destroy(error); + this._debug.printOutput(); +}; + +WebSocketConnection.prototype.handleSocketEnd = function() { + this._debug('handleSocketEnd: received socket end. state = %s', this.state); + this.receivedEnd = true; + if (this.state === STATE_CLOSED) { + // When using the TLS module, sometimes the socket will emit 'end' + // after it emits 'close'. I don't think that's correct behavior, + // but we should deal with it gracefully by ignoring it. + this._debug(' --- Socket \'end\' after \'close\''); + return; + } + if (this.state !== STATE_PEER_REQUESTED_CLOSE && + this.state !== STATE_ENDING) { + this._debug(' --- UNEXPECTED socket end.'); + this.socket.end(); + } +}; + +WebSocketConnection.prototype.handleSocketClose = function(hadError) { + this._debug('handleSocketClose: received socket close'); + this.socketHadError = hadError; + this.connected = false; + this.state = STATE_CLOSED; + // If closeReasonCode is still set to -1 at this point then we must + // not have received a close frame!! + if (this.closeReasonCode === -1) { + this.closeReasonCode = WebSocketConnection.CLOSE_REASON_ABNORMAL; + this.closeDescription = 'Connection dropped by remote peer.'; + } + this.clearCloseTimer(); + this.clearKeepaliveTimer(); + this.clearGracePeriodTimer(); + if (!this.closeEventEmitted) { + this.closeEventEmitted = true; + this._debug('-- Emitting WebSocketConnection close event'); + this.emit('close', this.closeReasonCode, this.closeDescription); + } +}; + +WebSocketConnection.prototype.handleSocketDrain = function() { + this._debug('handleSocketDrain: socket drain event'); + this.outputBufferFull = false; + this.emit('drain'); +}; + +WebSocketConnection.prototype.handleSocketPause = function() { + this._debug('handleSocketPause: socket pause event'); + this.inputPaused = true; + this.emit('pause'); +}; + +WebSocketConnection.prototype.handleSocketResume = function() { + this._debug('handleSocketResume: socket resume event'); + this.inputPaused = false; + this.emit('resume'); + this.processReceivedData(); +}; + +WebSocketConnection.prototype.pause = function() { + this._debug('pause: pause requested'); + this.socket.pause(); +}; + +WebSocketConnection.prototype.resume = function() { + this._debug('resume: resume requested'); + this.socket.resume(); +}; + +WebSocketConnection.prototype.close = function(reasonCode, description) { + if (this.connected) { + this._debug('close: Initating clean WebSocket close sequence.'); + if ('number' !== typeof reasonCode) { + reasonCode = WebSocketConnection.CLOSE_REASON_NORMAL; + } + if (!validateCloseReason(reasonCode)) { + throw new Error('Close code ' + reasonCode + ' is not valid.'); + } + if ('string' !== typeof description) { + description = WebSocketConnection.CLOSE_DESCRIPTIONS[reasonCode]; + } + this.closeReasonCode = reasonCode; + this.closeDescription = description; + this.setCloseTimer(); + this.sendCloseFrame(this.closeReasonCode, this.closeDescription); + this.state = STATE_ENDING; + this.connected = false; + } +}; + +WebSocketConnection.prototype.drop = function(reasonCode, description, skipCloseFrame) { + this._debug('drop'); + if (typeof(reasonCode) !== 'number') { + reasonCode = WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR; + } + + if (typeof(description) !== 'string') { + // If no description is provided, try to look one up based on the + // specified reasonCode. + description = WebSocketConnection.CLOSE_DESCRIPTIONS[reasonCode]; + } + + this._debug('Forcefully dropping connection. skipCloseFrame: %s, code: %d, description: %s', + skipCloseFrame, reasonCode, description + ); + + this.closeReasonCode = reasonCode; + this.closeDescription = description; + this.frameQueue = []; + this.fragmentationSize = 0; + if (!skipCloseFrame) { + this.sendCloseFrame(reasonCode, description); + } + this.connected = false; + this.state = STATE_CLOSED; + this.clearCloseTimer(); + this.clearKeepaliveTimer(); + this.clearGracePeriodTimer(); + + if (!this.closeEventEmitted) { + this.closeEventEmitted = true; + this._debug('Emitting WebSocketConnection close event'); + this.emit('close', this.closeReasonCode, this.closeDescription); + } + + this._debug('Drop: destroying socket'); + this.socket.destroy(); +}; + +WebSocketConnection.prototype.setCloseTimer = function() { + this._debug('setCloseTimer'); + this.clearCloseTimer(); + this._debug('Setting close timer'); + this.waitingForCloseResponse = true; + this.closeTimer = setTimeout(this._closeTimerHandler, this.closeTimeout); +}; + +WebSocketConnection.prototype.clearCloseTimer = function() { + this._debug('clearCloseTimer'); + if (this.closeTimer) { + this._debug('Clearing close timer'); + clearTimeout(this.closeTimer); + this.waitingForCloseResponse = false; + this.closeTimer = null; + } +}; + +WebSocketConnection.prototype.handleCloseTimer = function() { + this._debug('handleCloseTimer'); + this.closeTimer = null; + if (this.waitingForCloseResponse) { + this._debug('Close response not received from client. Forcing socket end.'); + this.waitingForCloseResponse = false; + this.state = STATE_CLOSED; + this.socket.end(); + } +}; + +WebSocketConnection.prototype.processFrame = function(frame) { + this._debug('processFrame'); + this._debug(' -- frame: %s', frame); + + // Any non-control opcode besides 0x00 (continuation) received in the + // middle of a fragmented message is illegal. + if (this.frameQueue.length !== 0 && (frame.opcode > 0x00 && frame.opcode < 0x08)) { + this.drop(WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR, + 'Illegal frame opcode 0x' + frame.opcode.toString(16) + ' ' + + 'received in middle of fragmented message.'); + return; + } + + switch(frame.opcode) { + case 0x02: // WebSocketFrame.BINARY_FRAME + this._debug('-- Binary Frame'); + if (this.assembleFragments) { + if (frame.fin) { + // Complete single-frame message received + this._debug('---- Emitting \'message\' event'); + this.emit('message', { + type: 'binary', + binaryData: frame.binaryPayload + }); + } + else { + // beginning of a fragmented message + this.frameQueue.push(frame); + this.fragmentationSize = frame.length; + } + } + break; + case 0x01: // WebSocketFrame.TEXT_FRAME + this._debug('-- Text Frame'); + if (this.assembleFragments) { + if (frame.fin) { + if (!Validation.isValidUTF8(frame.binaryPayload)) { + this.drop(WebSocketConnection.CLOSE_REASON_INVALID_DATA, + 'Invalid UTF-8 Data Received'); + return; + } + // Complete single-frame message received + this._debug('---- Emitting \'message\' event'); + this.emit('message', { + type: 'utf8', + utf8Data: frame.binaryPayload.toString('utf8') + }); + } + else { + // beginning of a fragmented message + this.frameQueue.push(frame); + this.fragmentationSize = frame.length; + } + } + break; + case 0x00: // WebSocketFrame.CONTINUATION + this._debug('-- Continuation Frame'); + if (this.assembleFragments) { + if (this.frameQueue.length === 0) { + this.drop(WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR, + 'Unexpected Continuation Frame'); + return; + } + + this.fragmentationSize += frame.length; + + if (this.fragmentationSize > this.maxReceivedMessageSize) { + this.drop(WebSocketConnection.CLOSE_REASON_MESSAGE_TOO_BIG, + 'Maximum message size exceeded.'); + return; + } + + this.frameQueue.push(frame); + + if (frame.fin) { + // end of fragmented message, so we process the whole + // message now. We also have to decode the utf-8 data + // for text frames after combining all the fragments. + var bytesCopied = 0; + var binaryPayload = new Buffer(this.fragmentationSize); + var opcode = this.frameQueue[0].opcode; + this.frameQueue.forEach(function (currentFrame) { + currentFrame.binaryPayload.copy(binaryPayload, bytesCopied); + bytesCopied += currentFrame.binaryPayload.length; + }); + this.frameQueue = []; + this.fragmentationSize = 0; + + switch (opcode) { + case 0x02: // WebSocketOpcode.BINARY_FRAME + this.emit('message', { + type: 'binary', + binaryData: binaryPayload + }); + break; + case 0x01: // WebSocketOpcode.TEXT_FRAME + if (!Validation.isValidUTF8(binaryPayload)) { + this.drop(WebSocketConnection.CLOSE_REASON_INVALID_DATA, + 'Invalid UTF-8 Data Received'); + return; + } + this.emit('message', { + type: 'utf8', + utf8Data: binaryPayload.toString('utf8') + }); + break; + default: + this.drop(WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR, + 'Unexpected first opcode in fragmentation sequence: 0x' + opcode.toString(16)); + return; + } + } + } + break; + case 0x09: // WebSocketFrame.PING + this._debug('-- Ping Frame'); + + if (this._pingListenerCount > 0) { + // logic to emit the ping frame: this is only done when a listener is known to exist + // Expose a function allowing the user to override the default ping() behavior + var cancelled = false; + var cancel = function() { + cancelled = true; + }; + this.emit('ping', cancel, frame.binaryPayload); + + // Only send a pong if the client did not indicate that he would like to cancel + if (!cancelled) { + this.pong(frame.binaryPayload); + } + } + else { + this.pong(frame.binaryPayload); + } + + break; + case 0x0A: // WebSocketFrame.PONG + this._debug('-- Pong Frame'); + this.emit('pong', frame.binaryPayload); + break; + case 0x08: // WebSocketFrame.CONNECTION_CLOSE + this._debug('-- Close Frame'); + if (this.waitingForCloseResponse) { + // Got response to our request to close the connection. + // Close is complete, so we just hang up. + this._debug('---- Got close response from peer. Completing closing handshake.'); + this.clearCloseTimer(); + this.waitingForCloseResponse = false; + this.state = STATE_CLOSED; + this.socket.end(); + return; + } + + this._debug('---- Closing handshake initiated by peer.'); + // Got request from other party to close connection. + // Send back acknowledgement and then hang up. + this.state = STATE_PEER_REQUESTED_CLOSE; + var respondCloseReasonCode; + + // Make sure the close reason provided is legal according to + // the protocol spec. Providing no close status is legal. + // WebSocketFrame sets closeStatus to -1 by default, so if it + // is still -1, then no status was provided. + if (frame.invalidCloseFrameLength) { + this.closeReasonCode = 1005; // 1005 = No reason provided. + respondCloseReasonCode = WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR; + } + else if (frame.closeStatus === -1 || validateCloseReason(frame.closeStatus)) { + this.closeReasonCode = frame.closeStatus; + respondCloseReasonCode = WebSocketConnection.CLOSE_REASON_NORMAL; + } + else { + this.closeReasonCode = frame.closeStatus; + respondCloseReasonCode = WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR; + } + + // If there is a textual description in the close frame, extract it. + if (frame.binaryPayload.length > 1) { + if (!Validation.isValidUTF8(frame.binaryPayload)) { + this.drop(WebSocketConnection.CLOSE_REASON_INVALID_DATA, + 'Invalid UTF-8 Data Received'); + return; + } + this.closeDescription = frame.binaryPayload.toString('utf8'); + } + else { + this.closeDescription = WebSocketConnection.CLOSE_DESCRIPTIONS[this.closeReasonCode]; + } + this._debug( + '------ Remote peer %s - code: %d - %s - close frame payload length: %d', + this.remoteAddress, this.closeReasonCode, + this.closeDescription, frame.length + ); + this._debug('------ responding to remote peer\'s close request.'); + this.sendCloseFrame(respondCloseReasonCode, null); + this.connected = false; + break; + default: + this._debug('-- Unrecognized Opcode %d', frame.opcode); + this.drop(WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR, + 'Unrecognized Opcode: 0x' + frame.opcode.toString(16)); + break; + } +}; + +WebSocketConnection.prototype.send = function(data, cb) { + this._debug('send'); + if (Buffer.isBuffer(data)) { + this.sendBytes(data, cb); + } + else if (typeof(data['toString']) === 'function') { + this.sendUTF(data, cb); + } + else { + throw new Error('Data provided must either be a Node Buffer or implement toString()'); + } +}; + +WebSocketConnection.prototype.sendUTF = function(data, cb) { + data = new Buffer(data.toString(), 'utf8'); + this._debug('sendUTF: %d bytes', data.length); + var frame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); + frame.opcode = 0x01; // WebSocketOpcode.TEXT_FRAME + frame.binaryPayload = data; + this.fragmentAndSend(frame, cb); +}; + +WebSocketConnection.prototype.sendBytes = function(data, cb) { + this._debug('sendBytes'); + if (!Buffer.isBuffer(data)) { + throw new Error('You must pass a Node Buffer object to WebSocketConnection.prototype.sendBytes()'); + } + var frame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); + frame.opcode = 0x02; // WebSocketOpcode.BINARY_FRAME + frame.binaryPayload = data; + this.fragmentAndSend(frame, cb); +}; + +WebSocketConnection.prototype.ping = function(data) { + this._debug('ping'); + var frame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); + frame.opcode = 0x09; // WebSocketOpcode.PING + frame.fin = true; + if (data) { + if (!Buffer.isBuffer(data)) { + data = new Buffer(data.toString(), 'utf8'); + } + if (data.length > 125) { + this._debug('WebSocket: Data for ping is longer than 125 bytes. Truncating.'); + data = data.slice(0,124); + } + frame.binaryPayload = data; + } + this.sendFrame(frame); +}; + +// Pong frames have to echo back the contents of the data portion of the +// ping frame exactly, byte for byte. +WebSocketConnection.prototype.pong = function(binaryPayload) { + this._debug('pong'); + var frame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); + frame.opcode = 0x0A; // WebSocketOpcode.PONG + if (Buffer.isBuffer(binaryPayload) && binaryPayload.length > 125) { + this._debug('WebSocket: Data for pong is longer than 125 bytes. Truncating.'); + binaryPayload = binaryPayload.slice(0,124); + } + frame.binaryPayload = binaryPayload; + frame.fin = true; + this.sendFrame(frame); +}; + +WebSocketConnection.prototype.fragmentAndSend = function(frame, cb) { + this._debug('fragmentAndSend'); + if (frame.opcode > 0x07) { + throw new Error('You cannot fragment control frames.'); + } + + var threshold = this.config.fragmentationThreshold; + var length = frame.binaryPayload.length; + + // Send immediately if fragmentation is disabled or the message is not + // larger than the fragmentation threshold. + if (!this.config.fragmentOutgoingMessages || (frame.binaryPayload && length <= threshold)) { + frame.fin = true; + this.sendFrame(frame, cb); + return; + } + + var numFragments = Math.ceil(length / threshold); + var sentFragments = 0; + var sentCallback = function fragmentSentCallback(err) { + if (err) { + if (typeof cb === 'function') { + // pass only the first error + cb(err); + cb = null; + } + return; + } + ++sentFragments; + if ((sentFragments === numFragments) && (typeof cb === 'function')) { + cb(); + } + }; + for (var i=1; i <= numFragments; i++) { + var currentFrame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); + + // continuation opcode except for first frame. + currentFrame.opcode = (i === 1) ? frame.opcode : 0x00; + + // fin set on last frame only + currentFrame.fin = (i === numFragments); + + // length is likely to be shorter on the last fragment + var currentLength = (i === numFragments) ? length - (threshold * (i-1)) : threshold; + var sliceStart = threshold * (i-1); + + // Slice the right portion of the original payload + currentFrame.binaryPayload = frame.binaryPayload.slice(sliceStart, sliceStart + currentLength); + + this.sendFrame(currentFrame, sentCallback); + } +}; + +WebSocketConnection.prototype.sendCloseFrame = function(reasonCode, description, cb) { + if (typeof(reasonCode) !== 'number') { + reasonCode = WebSocketConnection.CLOSE_REASON_NORMAL; + } + + this._debug('sendCloseFrame state: %s, reasonCode: %d, description: %s', this.state, reasonCode, description); + + if (this.state !== STATE_OPEN && this.state !== STATE_PEER_REQUESTED_CLOSE) { return; } + + var frame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); + frame.fin = true; + frame.opcode = 0x08; // WebSocketOpcode.CONNECTION_CLOSE + frame.closeStatus = reasonCode; + if (typeof(description) === 'string') { + frame.binaryPayload = new Buffer(description, 'utf8'); + } + + this.sendFrame(frame, cb); + this.socket.end(); +}; + +WebSocketConnection.prototype.sendFrame = function(frame, cb) { + this._debug('sendFrame'); + frame.mask = this.maskOutgoingPackets; + var flushed = this.socket.write(frame.toBuffer(), cb); + this.outputBufferFull = !flushed; + return flushed; +}; + +module.exports = WebSocketConnection; + + + +function instrumentSocketForDebugging(connection, socket) { + /* jshint loopfunc: true */ + if (!connection._debug.enabled) { return; } + + var originalSocketEmit = socket.emit; + socket.emit = function(event) { + connection._debug('||| Socket Event \'%s\'', event); + originalSocketEmit.apply(this, arguments); + }; + + for (var key in socket) { + if ('function' !== typeof(socket[key])) { continue; } + if (['emit'].indexOf(key) !== -1) { continue; } + (function(key) { + var original = socket[key]; + if (key === 'on') { + socket[key] = function proxyMethod__EventEmitter__On() { + connection._debug('||| Socket method called: %s (%s)', key, arguments[0]); + return original.apply(this, arguments); + }; + return; + } + socket[key] = function proxyMethod() { + connection._debug('||| Socket method called: %s', key); + return original.apply(this, arguments); + }; + })(key); + } +} diff --git a/deploy/node_modules/websocket/lib/WebSocketFrame.js b/deploy/node_modules/websocket/lib/WebSocketFrame.js new file mode 100644 index 0000000..859e879 --- /dev/null +++ b/deploy/node_modules/websocket/lib/WebSocketFrame.js @@ -0,0 +1,279 @@ +/************************************************************************ + * Copyright 2010-2015 Brian McKelvey. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ***********************************************************************/ + +var bufferUtil = require('./BufferUtil').BufferUtil; + +const DECODE_HEADER = 1; +const WAITING_FOR_16_BIT_LENGTH = 2; +const WAITING_FOR_64_BIT_LENGTH = 3; +const WAITING_FOR_MASK_KEY = 4; +const WAITING_FOR_PAYLOAD = 5; +const COMPLETE = 6; + +// WebSocketConnection will pass shared buffer objects for maskBytes and +// frameHeader into the constructor to avoid tons of small memory allocations +// for each frame we have to parse. This is only used for parsing frames +// we receive off the wire. +function WebSocketFrame(maskBytes, frameHeader, config) { + this.maskBytes = maskBytes; + this.frameHeader = frameHeader; + this.config = config; + this.maxReceivedFrameSize = config.maxReceivedFrameSize; + this.protocolError = false; + this.frameTooLarge = false; + this.invalidCloseFrameLength = false; + this.parseState = DECODE_HEADER; + this.closeStatus = -1; +} + +WebSocketFrame.prototype.addData = function(bufferList) { + if (this.parseState === DECODE_HEADER) { + if (bufferList.length >= 2) { + bufferList.joinInto(this.frameHeader, 0, 0, 2); + bufferList.advance(2); + var firstByte = this.frameHeader[0]; + var secondByte = this.frameHeader[1]; + + this.fin = Boolean(firstByte & 0x80); + this.rsv1 = Boolean(firstByte & 0x40); + this.rsv2 = Boolean(firstByte & 0x20); + this.rsv3 = Boolean(firstByte & 0x10); + this.mask = Boolean(secondByte & 0x80); + + this.opcode = firstByte & 0x0F; + this.length = secondByte & 0x7F; + + // Control frame sanity check + if (this.opcode >= 0x08) { + if (this.length > 125) { + this.protocolError = true; + this.dropReason = 'Illegal control frame longer than 125 bytes.'; + return true; + } + if (!this.fin) { + this.protocolError = true; + this.dropReason = 'Control frames must not be fragmented.'; + return true; + } + } + + if (this.length === 126) { + this.parseState = WAITING_FOR_16_BIT_LENGTH; + } + else if (this.length === 127) { + this.parseState = WAITING_FOR_64_BIT_LENGTH; + } + else { + this.parseState = WAITING_FOR_MASK_KEY; + } + } + } + if (this.parseState === WAITING_FOR_16_BIT_LENGTH) { + if (bufferList.length >= 2) { + bufferList.joinInto(this.frameHeader, 2, 0, 2); + bufferList.advance(2); + this.length = this.frameHeader.readUInt16BE(2, true); + this.parseState = WAITING_FOR_MASK_KEY; + } + } + else if (this.parseState === WAITING_FOR_64_BIT_LENGTH) { + if (bufferList.length >= 8) { + bufferList.joinInto(this.frameHeader, 2, 0, 8); + bufferList.advance(8); + var lengthPair = [ + this.frameHeader.readUInt32BE(2, true), + this.frameHeader.readUInt32BE(2+4, true) + ]; + + if (lengthPair[0] !== 0) { + this.protocolError = true; + this.dropReason = 'Unsupported 64-bit length frame received'; + return true; + } + this.length = lengthPair[1]; + this.parseState = WAITING_FOR_MASK_KEY; + } + } + + if (this.parseState === WAITING_FOR_MASK_KEY) { + if (this.mask) { + if (bufferList.length >= 4) { + bufferList.joinInto(this.maskBytes, 0, 0, 4); + bufferList.advance(4); + this.parseState = WAITING_FOR_PAYLOAD; + } + } + else { + this.parseState = WAITING_FOR_PAYLOAD; + } + } + + if (this.parseState === WAITING_FOR_PAYLOAD) { + if (this.length > this.maxReceivedFrameSize) { + this.frameTooLarge = true; + this.dropReason = 'Frame size of ' + this.length.toString(10) + + ' bytes exceeds maximum accepted frame size'; + return true; + } + + if (this.length === 0) { + this.binaryPayload = new Buffer(0); + this.parseState = COMPLETE; + return true; + } + if (bufferList.length >= this.length) { + this.binaryPayload = bufferList.take(this.length); + bufferList.advance(this.length); + if (this.mask) { + bufferUtil.unmask(this.binaryPayload, this.maskBytes); + // xor(this.binaryPayload, this.maskBytes, 0); + } + + if (this.opcode === 0x08) { // WebSocketOpcode.CONNECTION_CLOSE + if (this.length === 1) { + // Invalid length for a close frame. Must be zero or at least two. + this.binaryPayload = new Buffer(0); + this.invalidCloseFrameLength = true; + } + if (this.length >= 2) { + this.closeStatus = this.binaryPayload.readUInt16BE(0, true); + this.binaryPayload = this.binaryPayload.slice(2); + } + } + + this.parseState = COMPLETE; + return true; + } + } + return false; +}; + +WebSocketFrame.prototype.throwAwayPayload = function(bufferList) { + if (bufferList.length >= this.length) { + bufferList.advance(this.length); + this.parseState = COMPLETE; + return true; + } + return false; +}; + +WebSocketFrame.prototype.toBuffer = function(nullMask) { + var maskKey; + var headerLength = 2; + var data; + var outputPos; + var firstByte = 0x00; + var secondByte = 0x00; + + if (this.fin) { + firstByte |= 0x80; + } + if (this.rsv1) { + firstByte |= 0x40; + } + if (this.rsv2) { + firstByte |= 0x20; + } + if (this.rsv3) { + firstByte |= 0x10; + } + if (this.mask) { + secondByte |= 0x80; + } + + firstByte |= (this.opcode & 0x0F); + + // the close frame is a special case because the close reason is + // prepended to the payload data. + if (this.opcode === 0x08) { + this.length = 2; + if (this.binaryPayload) { + this.length += this.binaryPayload.length; + } + data = new Buffer(this.length); + data.writeUInt16BE(this.closeStatus, 0, true); + if (this.length > 2) { + this.binaryPayload.copy(data, 2); + } + } + else if (this.binaryPayload) { + data = this.binaryPayload; + this.length = data.length; + } + else { + this.length = 0; + } + + if (this.length <= 125) { + // encode the length directly into the two-byte frame header + secondByte |= (this.length & 0x7F); + } + else if (this.length > 125 && this.length <= 0xFFFF) { + // Use 16-bit length + secondByte |= 126; + headerLength += 2; + } + else if (this.length > 0xFFFF) { + // Use 64-bit length + secondByte |= 127; + headerLength += 8; + } + + var output = new Buffer(this.length + headerLength + (this.mask ? 4 : 0)); + + // write the frame header + output[0] = firstByte; + output[1] = secondByte; + + outputPos = 2; + + if (this.length > 125 && this.length <= 0xFFFF) { + // write 16-bit length + output.writeUInt16BE(this.length, outputPos, true); + outputPos += 2; + } + else if (this.length > 0xFFFF) { + // write 64-bit length + output.writeUInt32BE(0x00000000, outputPos, true); + output.writeUInt32BE(this.length, outputPos + 4, true); + outputPos += 8; + } + + if (this.mask) { + maskKey = nullMask ? 0 : (Math.random()*0xFFFFFFFF) | 0; + this.maskBytes.writeUInt32BE(maskKey, 0, true); + + // write the mask key + this.maskBytes.copy(output, outputPos); + outputPos += 4; + + if (data) { + bufferUtil.mask(data, this.maskBytes, output, outputPos, this.length); + } + } + else if (data) { + data.copy(output, outputPos); + } + + return output; +}; + +WebSocketFrame.prototype.toString = function() { + return 'Opcode: ' + this.opcode + ', fin: ' + this.fin + ', length: ' + this.length + ', hasPayload: ' + Boolean(this.binaryPayload) + ', masked: ' + this.mask; +}; + + +module.exports = WebSocketFrame; diff --git a/deploy/node_modules/websocket/lib/WebSocketRequest.js b/deploy/node_modules/websocket/lib/WebSocketRequest.js new file mode 100644 index 0000000..f4d9655 --- /dev/null +++ b/deploy/node_modules/websocket/lib/WebSocketRequest.js @@ -0,0 +1,524 @@ +/************************************************************************ + * Copyright 2010-2015 Brian McKelvey. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ***********************************************************************/ + +var crypto = require('crypto'); +var util = require('util'); +var url = require('url'); +var EventEmitter = require('events').EventEmitter; +var WebSocketConnection = require('./WebSocketConnection'); + +var headerValueSplitRegExp = /,\s*/; +var headerParamSplitRegExp = /;\s*/; +var headerSanitizeRegExp = /[\r\n]/g; +var xForwardedForSeparatorRegExp = /,\s*/; +var separators = [ + '(', ')', '<', '>', '@', + ',', ';', ':', '\\', '\"', + '/', '[', ']', '?', '=', + '{', '}', ' ', String.fromCharCode(9) +]; +var controlChars = [String.fromCharCode(127) /* DEL */]; +for (var i=0; i < 31; i ++) { + /* US-ASCII Control Characters */ + controlChars.push(String.fromCharCode(i)); +} + +var cookieNameValidateRegEx = /([\x00-\x20\x22\x28\x29\x2c\x2f\x3a-\x3f\x40\x5b-\x5e\x7b\x7d\x7f])/; +var cookieValueValidateRegEx = /[^\x21\x23-\x2b\x2d-\x3a\x3c-\x5b\x5d-\x7e]/; +var cookieValueDQuoteValidateRegEx = /^"[^"]*"$/; +var controlCharsAndSemicolonRegEx = /[\x00-\x20\x3b]/g; + +var cookieSeparatorRegEx = /[;,] */; + +var httpStatusDescriptions = { + 100: 'Continue', + 101: 'Switching Protocols', + 200: 'OK', + 201: 'Created', + 203: 'Non-Authoritative Information', + 204: 'No Content', + 205: 'Reset Content', + 206: 'Partial Content', + 300: 'Multiple Choices', + 301: 'Moved Permanently', + 302: 'Found', + 303: 'See Other', + 304: 'Not Modified', + 305: 'Use Proxy', + 307: 'Temporary Redirect', + 400: 'Bad Request', + 401: 'Unauthorized', + 402: 'Payment Required', + 403: 'Forbidden', + 404: 'Not Found', + 406: 'Not Acceptable', + 407: 'Proxy Authorization Required', + 408: 'Request Timeout', + 409: 'Conflict', + 410: 'Gone', + 411: 'Length Required', + 412: 'Precondition Failed', + 413: 'Request Entity Too Long', + 414: 'Request-URI Too Long', + 415: 'Unsupported Media Type', + 416: 'Requested Range Not Satisfiable', + 417: 'Expectation Failed', + 426: 'Upgrade Required', + 500: 'Internal Server Error', + 501: 'Not Implemented', + 502: 'Bad Gateway', + 503: 'Service Unavailable', + 504: 'Gateway Timeout', + 505: 'HTTP Version Not Supported' +}; + +function WebSocketRequest(socket, httpRequest, serverConfig) { + // Superclass Constructor + EventEmitter.call(this); + + this.socket = socket; + this.httpRequest = httpRequest; + this.resource = httpRequest.url; + this.remoteAddress = socket.remoteAddress; + this.remoteAddresses = [this.remoteAddress]; + this.serverConfig = serverConfig; + + // Watch for the underlying TCP socket closing before we call accept + this._socketIsClosing = false; + this._socketCloseHandler = this._handleSocketCloseBeforeAccept.bind(this); + this.socket.on('end', this._socketCloseHandler); + this.socket.on('close', this._socketCloseHandler); + + this._resolved = false; +} + +util.inherits(WebSocketRequest, EventEmitter); + +WebSocketRequest.prototype.readHandshake = function() { + var self = this; + var request = this.httpRequest; + + // Decode URL + this.resourceURL = url.parse(this.resource, true); + + this.host = request.headers['host']; + if (!this.host) { + throw new Error('Client must provide a Host header.'); + } + + this.key = request.headers['sec-websocket-key']; + if (!this.key) { + throw new Error('Client must provide a value for Sec-WebSocket-Key.'); + } + + this.webSocketVersion = parseInt(request.headers['sec-websocket-version'], 10); + + if (!this.webSocketVersion || isNaN(this.webSocketVersion)) { + throw new Error('Client must provide a value for Sec-WebSocket-Version.'); + } + + switch (this.webSocketVersion) { + case 8: + case 13: + break; + default: + var e = new Error('Unsupported websocket client version: ' + this.webSocketVersion + + 'Only versions 8 and 13 are supported.'); + e.httpCode = 426; + e.headers = { + 'Sec-WebSocket-Version': '13' + }; + throw e; + } + + if (this.webSocketVersion === 13) { + this.origin = request.headers['origin']; + } + else if (this.webSocketVersion === 8) { + this.origin = request.headers['sec-websocket-origin']; + } + + // Protocol is optional. + var protocolString = request.headers['sec-websocket-protocol']; + this.protocolFullCaseMap = {}; + this.requestedProtocols = []; + if (protocolString) { + var requestedProtocolsFullCase = protocolString.split(headerValueSplitRegExp); + requestedProtocolsFullCase.forEach(function(protocol) { + var lcProtocol = protocol.toLocaleLowerCase(); + self.requestedProtocols.push(lcProtocol); + self.protocolFullCaseMap[lcProtocol] = protocol; + }); + } + + if (!this.serverConfig.ignoreXForwardedFor && + request.headers['x-forwarded-for']) { + var immediatePeerIP = this.remoteAddress; + this.remoteAddresses = request.headers['x-forwarded-for'] + .split(xForwardedForSeparatorRegExp); + this.remoteAddresses.push(immediatePeerIP); + this.remoteAddress = this.remoteAddresses[0]; + } + + // Extensions are optional. + var extensionsString = request.headers['sec-websocket-extensions']; + this.requestedExtensions = this.parseExtensions(extensionsString); + + // Cookies are optional + var cookieString = request.headers['cookie']; + this.cookies = this.parseCookies(cookieString); +}; + +WebSocketRequest.prototype.parseExtensions = function(extensionsString) { + if (!extensionsString || extensionsString.length === 0) { + return []; + } + var extensions = extensionsString.toLocaleLowerCase().split(headerValueSplitRegExp); + extensions.forEach(function(extension, index, array) { + var params = extension.split(headerParamSplitRegExp); + var extensionName = params[0]; + var extensionParams = params.slice(1); + extensionParams.forEach(function(rawParam, index, array) { + var arr = rawParam.split('='); + var obj = { + name: arr[0], + value: arr[1] + }; + array.splice(index, 1, obj); + }); + var obj = { + name: extensionName, + params: extensionParams + }; + array.splice(index, 1, obj); + }); + return extensions; +}; + +// This function adapted from node-cookie +// https://github.com/shtylman/node-cookie +WebSocketRequest.prototype.parseCookies = function(str) { + // Sanity Check + if (!str || typeof(str) !== 'string') { + return []; + } + + var cookies = []; + var pairs = str.split(cookieSeparatorRegEx); + + pairs.forEach(function(pair) { + var eq_idx = pair.indexOf('='); + if (eq_idx === -1) { + cookies.push({ + name: pair, + value: null + }); + return; + } + + var key = pair.substr(0, eq_idx).trim(); + var val = pair.substr(++eq_idx, pair.length).trim(); + + // quoted values + if ('"' === val[0]) { + val = val.slice(1, -1); + } + + cookies.push({ + name: key, + value: decodeURIComponent(val) + }); + }); + + return cookies; +}; + +WebSocketRequest.prototype.accept = function(acceptedProtocol, allowedOrigin, cookies) { + this._verifyResolution(); + + // TODO: Handle extensions + + var protocolFullCase; + + if (acceptedProtocol) { + protocolFullCase = this.protocolFullCaseMap[acceptedProtocol.toLocaleLowerCase()]; + if (typeof(protocolFullCase) === 'undefined') { + protocolFullCase = acceptedProtocol; + } + } + else { + protocolFullCase = acceptedProtocol; + } + this.protocolFullCaseMap = null; + + // Create key validation hash + var sha1 = crypto.createHash('sha1'); + sha1.update(this.key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'); + var acceptKey = sha1.digest('base64'); + + var response = 'HTTP/1.1 101 Switching Protocols\r\n' + + 'Upgrade: websocket\r\n' + + 'Connection: Upgrade\r\n' + + 'Sec-WebSocket-Accept: ' + acceptKey + '\r\n'; + + if (protocolFullCase) { + // validate protocol + for (var i=0; i < protocolFullCase.length; i++) { + var charCode = protocolFullCase.charCodeAt(i); + var character = protocolFullCase.charAt(i); + if (charCode < 0x21 || charCode > 0x7E || separators.indexOf(character) !== -1) { + this.reject(500); + throw new Error('Illegal character "' + String.fromCharCode(character) + '" in subprotocol.'); + } + } + if (this.requestedProtocols.indexOf(acceptedProtocol) === -1) { + this.reject(500); + throw new Error('Specified protocol was not requested by the client.'); + } + + protocolFullCase = protocolFullCase.replace(headerSanitizeRegExp, ''); + response += 'Sec-WebSocket-Protocol: ' + protocolFullCase + '\r\n'; + } + this.requestedProtocols = null; + + if (allowedOrigin) { + allowedOrigin = allowedOrigin.replace(headerSanitizeRegExp, ''); + if (this.webSocketVersion === 13) { + response += 'Origin: ' + allowedOrigin + '\r\n'; + } + else if (this.webSocketVersion === 8) { + response += 'Sec-WebSocket-Origin: ' + allowedOrigin + '\r\n'; + } + } + + if (cookies) { + if (!Array.isArray(cookies)) { + this.reject(500); + throw new Error('Value supplied for "cookies" argument must be an array.'); + } + var seenCookies = {}; + cookies.forEach(function(cookie) { + if (!cookie.name || !cookie.value) { + this.reject(500); + throw new Error('Each cookie to set must at least provide a "name" and "value"'); + } + + // Make sure there are no \r\n sequences inserted + cookie.name = cookie.name.replace(controlCharsAndSemicolonRegEx, ''); + cookie.value = cookie.value.replace(controlCharsAndSemicolonRegEx, ''); + + if (seenCookies[cookie.name]) { + this.reject(500); + throw new Error('You may not specify the same cookie name twice.'); + } + seenCookies[cookie.name] = true; + + // token (RFC 2616, Section 2.2) + var invalidChar = cookie.name.match(cookieNameValidateRegEx); + if (invalidChar) { + this.reject(500); + throw new Error('Illegal character ' + invalidChar[0] + ' in cookie name'); + } + + // RFC 6265, Section 4.1.1 + // *cookie-octet / ( DQUOTE *cookie-octet DQUOTE ) | %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E + if (cookie.value.match(cookieValueDQuoteValidateRegEx)) { + invalidChar = cookie.value.slice(1, -1).match(cookieValueValidateRegEx); + } else { + invalidChar = cookie.value.match(cookieValueValidateRegEx); + } + if (invalidChar) { + this.reject(500); + throw new Error('Illegal character ' + invalidChar[0] + ' in cookie value'); + } + + var cookieParts = [cookie.name + '=' + cookie.value]; + + // RFC 6265, Section 4.1.1 + // 'Path=' path-value | + if(cookie.path){ + invalidChar = cookie.path.match(controlCharsAndSemicolonRegEx); + if (invalidChar) { + this.reject(500); + throw new Error('Illegal character ' + invalidChar[0] + ' in cookie path'); + } + cookieParts.push('Path=' + cookie.path); + } + + // RFC 6265, Section 4.1.2.3 + // 'Domain=' subdomain + if (cookie.domain) { + if (typeof(cookie.domain) !== 'string') { + this.reject(500); + throw new Error('Domain must be specified and must be a string.'); + } + invalidChar = cookie.domain.match(controlCharsAndSemicolonRegEx); + if (invalidChar) { + this.reject(500); + throw new Error('Illegal character ' + invalidChar[0] + ' in cookie domain'); + } + cookieParts.push('Domain=' + cookie.domain.toLowerCase()); + } + + // RFC 6265, Section 4.1.1 + //'Expires=' sane-cookie-date | Force Date object requirement by using only epoch + if (cookie.expires) { + if (!(cookie.expires instanceof Date)){ + this.reject(500); + throw new Error('Value supplied for cookie "expires" must be a vaild date object'); + } + cookieParts.push('Expires=' + cookie.expires.toGMTString()); + } + + // RFC 6265, Section 4.1.1 + //'Max-Age=' non-zero-digit *DIGIT + if (cookie.maxage) { + var maxage = cookie.maxage; + if (typeof(maxage) === 'string') { + maxage = parseInt(maxage, 10); + } + if (isNaN(maxage) || maxage <= 0 ) { + this.reject(500); + throw new Error('Value supplied for cookie "maxage" must be a non-zero number'); + } + maxage = Math.round(maxage); + cookieParts.push('Max-Age=' + maxage.toString(10)); + } + + // RFC 6265, Section 4.1.1 + //'Secure;' + if (cookie.secure) { + if (typeof(cookie.secure) !== 'boolean') { + this.reject(500); + throw new Error('Value supplied for cookie "secure" must be of type boolean'); + } + cookieParts.push('Secure'); + } + + // RFC 6265, Section 4.1.1 + //'HttpOnly;' + if (cookie.httponly) { + if (typeof(cookie.httponly) !== 'boolean') { + this.reject(500); + throw new Error('Value supplied for cookie "httponly" must be of type boolean'); + } + cookieParts.push('HttpOnly'); + } + + response += ('Set-Cookie: ' + cookieParts.join(';') + '\r\n'); + }.bind(this)); + } + + // TODO: handle negotiated extensions + // if (negotiatedExtensions) { + // response += 'Sec-WebSocket-Extensions: ' + negotiatedExtensions.join(', ') + '\r\n'; + // } + + // Mark the request resolved now so that the user can't call accept or + // reject a second time. + this._resolved = true; + this.emit('requestResolved', this); + + response += '\r\n'; + + var connection = new WebSocketConnection(this.socket, [], acceptedProtocol, false, this.serverConfig); + connection.webSocketVersion = this.webSocketVersion; + connection.remoteAddress = this.remoteAddress; + connection.remoteAddresses = this.remoteAddresses; + + var self = this; + + if (this._socketIsClosing) { + // Handle case when the client hangs up before we get a chance to + // accept the connection and send our side of the opening handshake. + cleanupFailedConnection(connection); + } + else { + this.socket.write(response, 'ascii', function(error) { + if (error) { + cleanupFailedConnection(connection); + return; + } + + self._removeSocketCloseListeners(); + connection._addSocketEventListeners(); + }); + } + + this.emit('requestAccepted', connection); + return connection; +}; + +WebSocketRequest.prototype.reject = function(status, reason, extraHeaders) { + this._verifyResolution(); + + // Mark the request resolved now so that the user can't call accept or + // reject a second time. + this._resolved = true; + this.emit('requestResolved', this); + + if (typeof(status) !== 'number') { + status = 403; + } + var response = 'HTTP/1.1 ' + status + ' ' + httpStatusDescriptions[status] + '\r\n' + + 'Connection: close\r\n'; + if (reason) { + reason = reason.replace(headerSanitizeRegExp, ''); + response += 'X-WebSocket-Reject-Reason: ' + reason + '\r\n'; + } + + if (extraHeaders) { + for (var key in extraHeaders) { + var sanitizedValue = extraHeaders[key].toString().replace(headerSanitizeRegExp, ''); + var sanitizedKey = key.replace(headerSanitizeRegExp, ''); + response += (sanitizedKey + ': ' + sanitizedValue + '\r\n'); + } + } + + response += '\r\n'; + this.socket.end(response, 'ascii'); + + this.emit('requestRejected', this); +}; + +WebSocketRequest.prototype._handleSocketCloseBeforeAccept = function() { + this._socketIsClosing = true; + this._removeSocketCloseListeners(); +}; + +WebSocketRequest.prototype._removeSocketCloseListeners = function() { + this.socket.removeListener('end', this._socketCloseHandler); + this.socket.removeListener('close', this._socketCloseHandler); +}; + +WebSocketRequest.prototype._verifyResolution = function() { + if (this._resolved) { + throw new Error('WebSocketRequest may only be accepted or rejected one time.'); + } +}; + +function cleanupFailedConnection(connection) { + // Since we have to return a connection object even if the socket is + // already dead in order not to break the API, we schedule a 'close' + // event on the connection object to occur immediately. + process.nextTick(function() { + // WebSocketConnection.CLOSE_REASON_ABNORMAL = 1006 + // Third param: Skip sending the close frame to a dead socket + connection.drop(1006, 'TCP connection lost before handshake completed.', true); + }); +} + +module.exports = WebSocketRequest; diff --git a/deploy/node_modules/websocket/lib/WebSocketRouter.js b/deploy/node_modules/websocket/lib/WebSocketRouter.js new file mode 100644 index 0000000..35bced9 --- /dev/null +++ b/deploy/node_modules/websocket/lib/WebSocketRouter.js @@ -0,0 +1,157 @@ +/************************************************************************ + * Copyright 2010-2015 Brian McKelvey. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ***********************************************************************/ + +var extend = require('./utils').extend; +var util = require('util'); +var EventEmitter = require('events').EventEmitter; +var WebSocketRouterRequest = require('./WebSocketRouterRequest'); + +function WebSocketRouter(config) { + // Superclass Constructor + EventEmitter.call(this); + + this.config = { + // The WebSocketServer instance to attach to. + server: null + }; + if (config) { + extend(this.config, config); + } + this.handlers = []; + + this._requestHandler = this.handleRequest.bind(this); + if (this.config.server) { + this.attachServer(this.config.server); + } +} + +util.inherits(WebSocketRouter, EventEmitter); + +WebSocketRouter.prototype.attachServer = function(server) { + if (server) { + this.server = server; + this.server.on('request', this._requestHandler); + } + else { + throw new Error('You must specify a WebSocketServer instance to attach to.'); + } +}; + +WebSocketRouter.prototype.detachServer = function() { + if (this.server) { + this.server.removeListener('request', this._requestHandler); + this.server = null; + } + else { + throw new Error('Cannot detach from server: not attached.'); + } +}; + +WebSocketRouter.prototype.mount = function(path, protocol, callback) { + if (!path) { + throw new Error('You must specify a path for this handler.'); + } + if (!protocol) { + protocol = '____no_protocol____'; + } + if (!callback) { + throw new Error('You must specify a callback for this handler.'); + } + + path = this.pathToRegExp(path); + if (!(path instanceof RegExp)) { + throw new Error('Path must be specified as either a string or a RegExp.'); + } + var pathString = path.toString(); + + // normalize protocol to lower-case + protocol = protocol.toLocaleLowerCase(); + + if (this.findHandlerIndex(pathString, protocol) !== -1) { + throw new Error('You may only mount one handler per path/protocol combination.'); + } + + this.handlers.push({ + 'path': path, + 'pathString': pathString, + 'protocol': protocol, + 'callback': callback + }); +}; +WebSocketRouter.prototype.unmount = function(path, protocol) { + var index = this.findHandlerIndex(this.pathToRegExp(path).toString(), protocol); + if (index !== -1) { + this.handlers.splice(index, 1); + } + else { + throw new Error('Unable to find a route matching the specified path and protocol.'); + } +}; + +WebSocketRouter.prototype.findHandlerIndex = function(pathString, protocol) { + protocol = protocol.toLocaleLowerCase(); + for (var i=0, len=this.handlers.length; i < len; i++) { + var handler = this.handlers[i]; + if (handler.pathString === pathString && handler.protocol === protocol) { + return i; + } + } + return -1; +}; + +WebSocketRouter.prototype.pathToRegExp = function(path) { + if (typeof(path) === 'string') { + if (path === '*') { + path = /^.*$/; + } + else { + path = path.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); + path = new RegExp('^' + path + '$'); + } + } + return path; +}; + +WebSocketRouter.prototype.handleRequest = function(request) { + var requestedProtocols = request.requestedProtocols; + if (requestedProtocols.length === 0) { + requestedProtocols = ['____no_protocol____']; + } + + // Find a handler with the first requested protocol first + for (var i=0; i < requestedProtocols.length; i++) { + var requestedProtocol = requestedProtocols[i].toLocaleLowerCase(); + + // find the first handler that can process this request + for (var j=0, len=this.handlers.length; j < len; j++) { + var handler = this.handlers[j]; + if (handler.path.test(request.resourceURL.pathname)) { + if (requestedProtocol === handler.protocol || + handler.protocol === '*') + { + var routerRequest = new WebSocketRouterRequest(request, requestedProtocol); + handler.callback(routerRequest); + return; + } + } + } + } + + // If we get here we were unable to find a suitable handler. + request.reject(404, 'No handler is available for the given request.'); +}; + +module.exports = WebSocketRouter; diff --git a/deploy/node_modules/websocket/lib/WebSocketRouterRequest.js b/deploy/node_modules/websocket/lib/WebSocketRouterRequest.js new file mode 100644 index 0000000..d3e3745 --- /dev/null +++ b/deploy/node_modules/websocket/lib/WebSocketRouterRequest.js @@ -0,0 +1,54 @@ +/************************************************************************ + * Copyright 2010-2015 Brian McKelvey. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ***********************************************************************/ + +var util = require('util'); +var EventEmitter = require('events').EventEmitter; + +function WebSocketRouterRequest(webSocketRequest, resolvedProtocol) { + // Superclass Constructor + EventEmitter.call(this); + + this.webSocketRequest = webSocketRequest; + if (resolvedProtocol === '____no_protocol____') { + this.protocol = null; + } + else { + this.protocol = resolvedProtocol; + } + this.origin = webSocketRequest.origin; + this.resource = webSocketRequest.resource; + this.resourceURL = webSocketRequest.resourceURL; + this.httpRequest = webSocketRequest.httpRequest; + this.remoteAddress = webSocketRequest.remoteAddress; + this.webSocketVersion = webSocketRequest.webSocketVersion; + this.requestedExtensions = webSocketRequest.requestedExtensions; + this.cookies = webSocketRequest.cookies; +} + +util.inherits(WebSocketRouterRequest, EventEmitter); + +WebSocketRouterRequest.prototype.accept = function(origin, cookies) { + var connection = this.webSocketRequest.accept(this.protocol, origin, cookies); + this.emit('requestAccepted', connection); + return connection; +}; + +WebSocketRouterRequest.prototype.reject = function(status, reason, extraHeaders) { + this.webSocketRequest.reject(status, reason, extraHeaders); + this.emit('requestRejected', this); +}; + +module.exports = WebSocketRouterRequest; diff --git a/deploy/node_modules/websocket/lib/WebSocketServer.js b/deploy/node_modules/websocket/lib/WebSocketServer.js new file mode 100644 index 0000000..c27d967 --- /dev/null +++ b/deploy/node_modules/websocket/lib/WebSocketServer.js @@ -0,0 +1,245 @@ +/************************************************************************ + * Copyright 2010-2015 Brian McKelvey. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ***********************************************************************/ + +var extend = require('./utils').extend; +var utils = require('./utils'); +var util = require('util'); +var debug = require('debug')('websocket:server'); +var EventEmitter = require('events').EventEmitter; +var WebSocketRequest = require('./WebSocketRequest'); + +var WebSocketServer = function WebSocketServer(config) { + // Superclass Constructor + EventEmitter.call(this); + + this._handlers = { + upgrade: this.handleUpgrade.bind(this), + requestAccepted: this.handleRequestAccepted.bind(this), + requestResolved: this.handleRequestResolved.bind(this) + }; + this.connections = []; + this.pendingRequests = []; + if (config) { + this.mount(config); + } +}; + +util.inherits(WebSocketServer, EventEmitter); + +WebSocketServer.prototype.mount = function(config) { + this.config = { + // The http server instance to attach to. Required. + httpServer: null, + + // 64KiB max frame size. + maxReceivedFrameSize: 0x10000, + + // 1MiB max message size, only applicable if + // assembleFragments is true + maxReceivedMessageSize: 0x100000, + + // Outgoing messages larger than fragmentationThreshold will be + // split into multiple fragments. + fragmentOutgoingMessages: true, + + // Outgoing frames are fragmented if they exceed this threshold. + // Default is 16KiB + fragmentationThreshold: 0x4000, + + // If true, the server will automatically send a ping to all + // clients every 'keepaliveInterval' milliseconds. The timer is + // reset on any received data from the client. + keepalive: true, + + // The interval to send keepalive pings to connected clients if the + // connection is idle. Any received data will reset the counter. + keepaliveInterval: 20000, + + // If true, the server will consider any connection that has not + // received any data within the amount of time specified by + // 'keepaliveGracePeriod' after a keepalive ping has been sent to + // be dead, and will drop the connection. + // Ignored if keepalive is false. + dropConnectionOnKeepaliveTimeout: true, + + // The amount of time to wait after sending a keepalive ping before + // closing the connection if the connected peer does not respond. + // Ignored if keepalive is false. + keepaliveGracePeriod: 10000, + + // Whether to use native TCP keep-alive instead of WebSockets ping + // and pong packets. Native TCP keep-alive sends smaller packets + // on the wire and so uses bandwidth more efficiently. This may + // be more important when talking to mobile devices. + // If this value is set to true, then these values will be ignored: + // keepaliveGracePeriod + // dropConnectionOnKeepaliveTimeout + useNativeKeepalive: false, + + // If true, fragmented messages will be automatically assembled + // and the full message will be emitted via a 'message' event. + // If false, each frame will be emitted via a 'frame' event and + // the application will be responsible for aggregating multiple + // fragmented frames. Single-frame messages will emit a 'message' + // event in addition to the 'frame' event. + // Most users will want to leave this set to 'true' + assembleFragments: true, + + // If this is true, websocket connections will be accepted + // regardless of the path and protocol specified by the client. + // The protocol accepted will be the first that was requested + // by the client. Clients from any origin will be accepted. + // This should only be used in the simplest of cases. You should + // probably leave this set to 'false' and inspect the request + // object to make sure it's acceptable before accepting it. + autoAcceptConnections: false, + + // Whether or not the X-Forwarded-For header should be respected. + // It's important to set this to 'true' when accepting connections + // from untrusted clients, as a malicious client could spoof its + // IP address by simply setting this header. It's meant to be added + // by a trusted proxy or other intermediary within your own + // infrastructure. + // See: http://en.wikipedia.org/wiki/X-Forwarded-For + ignoreXForwardedFor: false, + + // The Nagle Algorithm makes more efficient use of network resources + // by introducing a small delay before sending small packets so that + // multiple messages can be batched together before going onto the + // wire. This however comes at the cost of latency, so the default + // is to disable it. If you don't need low latency and are streaming + // lots of small messages, you can change this to 'false' + disableNagleAlgorithm: true, + + // The number of milliseconds to wait after sending a close frame + // for an acknowledgement to come back before giving up and just + // closing the socket. + closeTimeout: 5000 + }; + extend(this.config, config); + + if (this.config.httpServer) { + if (!Array.isArray(this.config.httpServer)) { + this.config.httpServer = [this.config.httpServer]; + } + var upgradeHandler = this._handlers.upgrade; + this.config.httpServer.forEach(function(httpServer) { + httpServer.on('upgrade', upgradeHandler); + }); + } + else { + throw new Error('You must specify an httpServer on which to mount the WebSocket server.'); + } +}; + +WebSocketServer.prototype.unmount = function() { + var upgradeHandler = this._handlers.upgrade; + this.config.httpServer.forEach(function(httpServer) { + httpServer.removeListener('upgrade', upgradeHandler); + }); +}; + +WebSocketServer.prototype.closeAllConnections = function() { + this.connections.forEach(function(connection) { + connection.close(); + }); + this.pendingRequests.forEach(function(request) { + process.nextTick(function() { + request.reject(503); // HTTP 503 Service Unavailable + }); + }); +}; + +WebSocketServer.prototype.broadcast = function(data) { + if (Buffer.isBuffer(data)) { + this.broadcastBytes(data); + } + else if (typeof(data.toString) === 'function') { + this.broadcastUTF(data); + } +}; + +WebSocketServer.prototype.broadcastUTF = function(utfData) { + this.connections.forEach(function(connection) { + connection.sendUTF(utfData); + }); +}; + +WebSocketServer.prototype.broadcastBytes = function(binaryData) { + this.connections.forEach(function(connection) { + connection.sendBytes(binaryData); + }); +}; + +WebSocketServer.prototype.shutDown = function() { + this.unmount(); + this.closeAllConnections(); +}; + +WebSocketServer.prototype.handleUpgrade = function(request, socket) { + var wsRequest = new WebSocketRequest(socket, request, this.config); + try { + wsRequest.readHandshake(); + } + catch(e) { + wsRequest.reject( + e.httpCode ? e.httpCode : 400, + e.message, + e.headers + ); + debug('Invalid handshake: %s', e.message); + return; + } + + this.pendingRequests.push(wsRequest); + + wsRequest.once('requestAccepted', this._handlers.requestAccepted); + wsRequest.once('requestResolved', this._handlers.requestResolved); + + if (!this.config.autoAcceptConnections && utils.eventEmitterListenerCount(this, 'request') > 0) { + this.emit('request', wsRequest); + } + else if (this.config.autoAcceptConnections) { + wsRequest.accept(wsRequest.requestedProtocols[0], wsRequest.origin); + } + else { + wsRequest.reject(404, 'No handler is configured to accept the connection.'); + } +}; + +WebSocketServer.prototype.handleRequestAccepted = function(connection) { + var self = this; + connection.once('close', function(closeReason, description) { + self.handleConnectionClose(connection, closeReason, description); + }); + this.connections.push(connection); + this.emit('connect', connection); +}; + +WebSocketServer.prototype.handleConnectionClose = function(connection, closeReason, description) { + var index = this.connections.indexOf(connection); + if (index !== -1) { + this.connections.splice(index, 1); + } + this.emit('close', connection, closeReason, description); +}; + +WebSocketServer.prototype.handleRequestResolved = function(request) { + var index = this.pendingRequests.indexOf(request); + if (index !== -1) { this.pendingRequests.splice(index, 1); } +}; + +module.exports = WebSocketServer; diff --git a/deploy/node_modules/websocket/lib/browser.js b/deploy/node_modules/websocket/lib/browser.js new file mode 100644 index 0000000..2a653fe --- /dev/null +++ b/deploy/node_modules/websocket/lib/browser.js @@ -0,0 +1,36 @@ +var _global = (function() { return this; })(); +var NativeWebSocket = _global.WebSocket || _global.MozWebSocket; +var websocket_version = require('./version'); + + +/** + * Expose a W3C WebSocket class with just one or two arguments. + */ +function W3CWebSocket(uri, protocols) { + var native_instance; + + if (protocols) { + native_instance = new NativeWebSocket(uri, protocols); + } + else { + native_instance = new NativeWebSocket(uri); + } + + /** + * 'native_instance' is an instance of nativeWebSocket (the browser's WebSocket + * class). Since it is an Object it will be returned as it is when creating an + * instance of W3CWebSocket via 'new W3CWebSocket()'. + * + * ECMAScript 5: http://bclary.com/2004/11/07/#a-13.2.2 + */ + return native_instance; +} + + +/** + * Module exports. + */ +module.exports = { + 'w3cwebsocket' : NativeWebSocket ? W3CWebSocket : null, + 'version' : websocket_version +}; diff --git a/deploy/node_modules/websocket/lib/utils.js b/deploy/node_modules/websocket/lib/utils.js new file mode 100644 index 0000000..6506dc9 --- /dev/null +++ b/deploy/node_modules/websocket/lib/utils.js @@ -0,0 +1,60 @@ +var noop = exports.noop = function(){}; + +exports.extend = function extend(dest, source) { + for (var prop in source) { + dest[prop] = source[prop]; + } +}; + +exports.eventEmitterListenerCount = + require('events').EventEmitter.listenerCount || + function(emitter, type) { return emitter.listeners(type).length; }; + + + + + +exports.BufferingLogger = function createBufferingLogger(identifier, uniqueID) { + var logFunction = require('debug')(identifier); + if (logFunction.enabled) { + var logger = new BufferingLogger(identifier, uniqueID, logFunction); + var debug = logger.log.bind(logger); + debug.printOutput = logger.printOutput.bind(logger); + debug.enabled = logFunction.enabled; + return debug; + } + logFunction.printOutput = noop; + return logFunction; +}; + +function BufferingLogger(identifier, uniqueID, logFunction) { + this.logFunction = logFunction; + this.identifier = identifier; + this.uniqueID = uniqueID; + this.buffer = []; +} + +BufferingLogger.prototype.log = function() { + this.buffer.push([ new Date(), Array.prototype.slice.call(arguments) ]); + return this; +}; + +BufferingLogger.prototype.clear = function() { + this.buffer = []; + return this; +}; + +BufferingLogger.prototype.printOutput = function(logFunction) { + if (!logFunction) { logFunction = this.logFunction; } + var uniqueID = this.uniqueID; + this.buffer.forEach(function(entry) { + var date = entry[0].toLocaleString(); + var args = entry[1].slice(); + var formatString = args[0]; + if (formatString !== (void 0) && formatString !== null) { + formatString = '%s - %s - ' + formatString.toString(); + args.splice(0, 1, formatString, date, uniqueID); + logFunction.apply(global, args); + } + }); +}; diff --git a/deploy/node_modules/websocket/lib/version.js b/deploy/node_modules/websocket/lib/version.js new file mode 100644 index 0000000..81f6e78 --- /dev/null +++ b/deploy/node_modules/websocket/lib/version.js @@ -0,0 +1 @@ +module.exports = require('../package.json').version; diff --git a/deploy/node_modules/websocket/lib/websocket.js b/deploy/node_modules/websocket/lib/websocket.js new file mode 100644 index 0000000..6242d56 --- /dev/null +++ b/deploy/node_modules/websocket/lib/websocket.js @@ -0,0 +1,11 @@ +module.exports = { + 'server' : require('./WebSocketServer'), + 'client' : require('./WebSocketClient'), + 'router' : require('./WebSocketRouter'), + 'frame' : require('./WebSocketFrame'), + 'request' : require('./WebSocketRequest'), + 'connection' : require('./WebSocketConnection'), + 'w3cwebsocket' : require('./W3CWebSocket'), + 'deprecation' : require('./Deprecation'), + 'version' : require('./version') +}; diff --git a/deploy/node_modules/websocket/package.json b/deploy/node_modules/websocket/package.json new file mode 100644 index 0000000..1caa16d --- /dev/null +++ b/deploy/node_modules/websocket/package.json @@ -0,0 +1,94 @@ +{ + "_from": "websocket@~1", + "_id": "websocket@1.0.24", + "_inBundle": false, + "_integrity": "sha1-dJA+dfJUW2suHeFCW8HJBZF6GJA=", + "_location": "/websocket", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "websocket@~1", + "name": "websocket", + "escapedName": "websocket", + "rawSpec": "~1", + "saveSpec": null, + "fetchSpec": "~1" + }, + "_requiredBy": [ + "/" + ], + "_resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.24.tgz", + "_shasum": "74903e75f2545b6b2e1de1425bc1c905917a1890", + "_spec": "websocket@~1", + "_where": "/Users/prophesi/Projects/websocket-kinect/deploy", + "author": { + "name": "Brian McKelvey", + "email": "brian@worlize.com", + "url": "https://www.worlize.com/" + }, + "browser": "lib/browser.js", + "bugs": { + "url": "https://github.com/theturtle32/WebSocket-Node/issues" + }, + "bundleDependencies": false, + "config": { + "verbose": false + }, + "contributors": [ + { + "name": "Iñaki Baz Castillo", + "email": "ibc@aliax.net", + "url": "http://dev.sipdoc.net" + } + ], + "dependencies": { + "debug": "^2.2.0", + "nan": "^2.3.3", + "typedarray-to-buffer": "^3.1.2", + "yaeti": "^0.0.6" + }, + "deprecated": false, + "description": "Websocket Client & Server Library implementing the WebSocket protocol as specified in RFC 6455.", + "devDependencies": { + "buffer-equal": "^1.0.0", + "faucet": "^0.0.1", + "gulp": "git+https://github.com/gulpjs/gulp.git#4.0", + "gulp-jshint": "^2.0.4", + "jshint": "^2.0.0", + "jshint-stylish": "^2.2.1", + "tape": "^4.0.1" + }, + "directories": { + "lib": "./lib" + }, + "engines": { + "node": ">=0.8.0" + }, + "homepage": "https://github.com/theturtle32/WebSocket-Node", + "keywords": [ + "websocket", + "websockets", + "socket", + "networking", + "comet", + "push", + "RFC-6455", + "realtime", + "server", + "client" + ], + "license": "Apache-2.0", + "main": "index", + "name": "websocket", + "repository": { + "type": "git", + "url": "git+https://github.com/theturtle32/WebSocket-Node.git" + }, + "scripts": { + "gulp": "gulp", + "install": "(node-gyp rebuild 2> builderror.log) || (exit 0)", + "test": "faucet test/unit" + }, + "version": "1.0.24" +} diff --git a/deploy/node_modules/websocket/src/bufferutil.cc b/deploy/node_modules/websocket/src/bufferutil.cc new file mode 100644 index 0000000..d2f8d2d --- /dev/null +++ b/deploy/node_modules/websocket/src/bufferutil.cc @@ -0,0 +1,121 @@ +/*! + * BufferUtil originally from: + * ws: a node.js websocket client + * Copyright(c) 2015 Einar Otto Stangvik + * MIT Licensed + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "nan.h" + +using namespace v8; +using namespace node; + +class BufferUtil : public ObjectWrap +{ +public: + + static void Initialize(v8::Handle target) + { + Nan::HandleScope scope; + Local t = Nan::New(New); + t->InstanceTemplate()->SetInternalFieldCount(1); + Nan::SetMethod(t, "unmask", BufferUtil::Unmask); + Nan::SetMethod(t, "mask", BufferUtil::Mask); + Nan::SetMethod(t, "merge", BufferUtil::Merge); + Nan::Set(target, Nan::New("BufferUtil").ToLocalChecked(), t->GetFunction()); + } + +protected: + + static NAN_METHOD(New) + { + Nan::HandleScope scope; + BufferUtil* bufferUtil = new BufferUtil(); + bufferUtil->Wrap(info.This()); + info.GetReturnValue().Set(info.This()); + } + + static NAN_METHOD(Merge) + { + Nan::HandleScope scope; + Local bufferObj = info[0]->ToObject(); + char* buffer = Buffer::Data(bufferObj); + Local array = Local::Cast(info[1]); + unsigned int arrayLength = array->Length(); + size_t offset = 0; + unsigned int i; + for (i = 0; i < arrayLength; ++i) { + Local src = array->Get(i)->ToObject(); + size_t length = Buffer::Length(src); + memcpy(buffer + offset, Buffer::Data(src), length); + offset += length; + } + info.GetReturnValue().Set(Nan::True()); + } + + static NAN_METHOD(Unmask) + { + Nan::HandleScope scope; + Local buffer_obj = info[0]->ToObject(); + size_t length = Buffer::Length(buffer_obj); + Local mask_obj = info[1]->ToObject(); + unsigned int *mask = (unsigned int*)Buffer::Data(mask_obj); + unsigned int* from = (unsigned int*)Buffer::Data(buffer_obj); + size_t len32 = length / 4; + unsigned int i; + for (i = 0; i < len32; ++i) *(from + i) ^= *mask; + from += i; + switch (length % 4) { + case 3: *((unsigned char*)from+2) = *((unsigned char*)from+2) ^ ((unsigned char*)mask)[2]; + case 2: *((unsigned char*)from+1) = *((unsigned char*)from+1) ^ ((unsigned char*)mask)[1]; + case 1: *((unsigned char*)from ) = *((unsigned char*)from ) ^ ((unsigned char*)mask)[0]; + case 0:; + } + info.GetReturnValue().Set(Nan::True()); + } + + static NAN_METHOD(Mask) + { + Nan::HandleScope scope; + Local buffer_obj = info[0]->ToObject(); + Local mask_obj = info[1]->ToObject(); + unsigned int *mask = (unsigned int*)Buffer::Data(mask_obj); + Local output_obj = info[2]->ToObject(); + unsigned int dataOffset = info[3]->Int32Value(); + unsigned int length = info[4]->Int32Value(); + unsigned int* to = (unsigned int*)(Buffer::Data(output_obj) + dataOffset); + unsigned int* from = (unsigned int*)Buffer::Data(buffer_obj); + unsigned int len32 = length / 4; + unsigned int i; + for (i = 0; i < len32; ++i) *(to + i) = *(from + i) ^ *mask; + to += i; + from += i; + switch (length % 4) { + case 3: *((unsigned char*)to+2) = *((unsigned char*)from+2) ^ *((unsigned char*)mask+2); + case 2: *((unsigned char*)to+1) = *((unsigned char*)from+1) ^ *((unsigned char*)mask+1); + case 1: *((unsigned char*)to ) = *((unsigned char*)from ) ^ *((unsigned char*)mask); + case 0:; + } + info.GetReturnValue().Set(Nan::True()); + } +}; + +#if !NODE_VERSION_AT_LEAST(0,10,0) +extern "C" +#endif +void init (Handle target) +{ + Nan::HandleScope scope; + BufferUtil::Initialize(target); +} + +NODE_MODULE(bufferutil, init) diff --git a/deploy/node_modules/websocket/src/validation.cc b/deploy/node_modules/websocket/src/validation.cc new file mode 100644 index 0000000..8e2347e --- /dev/null +++ b/deploy/node_modules/websocket/src/validation.cc @@ -0,0 +1,148 @@ +/*! + * UTF-8 Validation Code originally from: + * ws: a node.js websocket client + * Copyright(c) 2015 Einar Otto Stangvik + * MIT Licensed + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "nan.h" + +using namespace v8; +using namespace node; + +#define UNI_SUR_HIGH_START (uint32_t) 0xD800 +#define UNI_SUR_LOW_END (uint32_t) 0xDFFF +#define UNI_REPLACEMENT_CHAR (uint32_t) 0x0000FFFD +#define UNI_MAX_LEGAL_UTF32 (uint32_t) 0x0010FFFF + +static const uint8_t trailingBytesForUTF8[256] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 +}; + +static const uint32_t offsetsFromUTF8[6] = { + 0x00000000, 0x00003080, 0x000E2080, + 0x03C82080, 0xFA082080, 0x82082080 +}; + +static int isLegalUTF8(const uint8_t *source, const int length) +{ + uint8_t a; + const uint8_t *srcptr = source+length; + switch (length) { + default: return 0; + /* Everything else falls through when "true"... */ + /* RFC3629 makes 5 & 6 bytes UTF-8 illegal + case 6: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0; + case 5: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0; */ + case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0; + case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0; + case 2: if ((a = (*--srcptr)) > 0xBF) return 0; + switch (*source) { + /* no fall-through in this inner switch */ + case 0xE0: if (a < 0xA0) return 0; break; + case 0xED: if (a > 0x9F) return 0; break; + case 0xF0: if (a < 0x90) return 0; break; + case 0xF4: if (a > 0x8F) return 0; break; + default: if (a < 0x80) return 0; + } + + case 1: if (*source >= 0x80 && *source < 0xC2) return 0; + } + if (*source > 0xF4) return 0; + return 1; +} + +int is_valid_utf8 (size_t len, char *value) +{ + /* is the string valid UTF-8? */ + for (unsigned int i = 0; i < len; i++) { + uint32_t ch = 0; + uint8_t extrabytes = trailingBytesForUTF8[(uint8_t) value[i]]; + + if (extrabytes + i >= len) + return 0; + + if (isLegalUTF8 ((uint8_t *) (value + i), extrabytes + 1) == 0) return 0; + + switch (extrabytes) { + case 5 : ch += (uint8_t) value[i++]; ch <<= 6; + case 4 : ch += (uint8_t) value[i++]; ch <<= 6; + case 3 : ch += (uint8_t) value[i++]; ch <<= 6; + case 2 : ch += (uint8_t) value[i++]; ch <<= 6; + case 1 : ch += (uint8_t) value[i++]; ch <<= 6; + case 0 : ch += (uint8_t) value[i]; + } + + ch -= offsetsFromUTF8[extrabytes]; + + if (ch <= UNI_MAX_LEGAL_UTF32) { + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) + return 0; + } else { + return 0; + } + } + + return 1; +} + +class Validation : public ObjectWrap +{ +public: + + static void Initialize(v8::Handle target) + { + Nan::HandleScope scope; + Local t = Nan::New(New); + t->InstanceTemplate()->SetInternalFieldCount(1); + Nan::SetMethod(t, "isValidUTF8", Validation::IsValidUTF8); + Nan::Set(target, Nan::New("Validation").ToLocalChecked(), t->GetFunction()); + } + +protected: + + static NAN_METHOD(New) + { + Nan::HandleScope scope; + Validation* validation = new Validation(); + validation->Wrap(info.This()); + info.GetReturnValue().Set(info.This()); + } + + static NAN_METHOD(IsValidUTF8) + { + Nan::HandleScope scope; + if (!Buffer::HasInstance(info[0])) { + return Nan::ThrowTypeError("First argument needs to be a buffer"); + } + Local buffer_obj = info[0]->ToObject(); + char *buffer_data = Buffer::Data(buffer_obj); + size_t buffer_length = Buffer::Length(buffer_obj); + info.GetReturnValue().Set(is_valid_utf8(buffer_length, buffer_data) == 1 ? Nan::True() : Nan::False()); + } +}; +#if !NODE_VERSION_AT_LEAST(0,10,0) +extern "C" +#endif +void init (Handle target) +{ + Nan::HandleScope scope; + Validation::Initialize(target); +} + +NODE_MODULE(validation, init) diff --git a/deploy/node_modules/websocket/vendor/FastBufferList.js b/deploy/node_modules/websocket/vendor/FastBufferList.js new file mode 100644 index 0000000..aabf096 --- /dev/null +++ b/deploy/node_modules/websocket/vendor/FastBufferList.js @@ -0,0 +1,193 @@ +// This file was copied from https://github.com/substack/node-bufferlist +// and modified to be able to copy bytes from the bufferlist directly into +// a pre-existing fixed-size buffer without an additional memory allocation. + +// bufferlist.js +// Treat a linked list of buffers as a single variable-size buffer. +var Buffer = require('buffer').Buffer; +var EventEmitter = require('events').EventEmitter; + +module.exports = BufferList; +module.exports.BufferList = BufferList; // backwards compatibility + +function BufferList(opts) { + if (!(this instanceof BufferList)) return new BufferList(opts); + EventEmitter.call(this); + var self = this; + + if (typeof(opts) == 'undefined') opts = {}; + + // default encoding to use for take(). Leaving as 'undefined' + // makes take() return a Buffer instead. + self.encoding = opts.encoding; + + // constructor to use for Buffer-esque operations + self.construct = opts.construct || Buffer; + + var head = { next : null, buffer : null }; + var last = { next : null, buffer : null }; + + // length can get negative when advanced past the end + // and this is the desired behavior + var length = 0; + self.__defineGetter__('length', function () { + return length; + }); + + // keep an offset of the head to decide when to head = head.next + var offset = 0; + + // Write to the bufferlist. Emits 'write'. Always returns true. + self.write = function (buf) { + if (!head.buffer) { + head.buffer = buf; + last = head; + } + else { + last.next = { next : null, buffer : buf }; + last = last.next; + } + length += buf.length; + self.emit('write', buf); + return true; + }; + + self.end = function (buf) { + if (Buffer.isBuffer(buf)) self.write(buf); + }; + + // Push buffers to the end of the linked list. (deprecated) + // Return this (self). + self.push = function () { + var args = [].concat.apply([], arguments); + args.forEach(self.write); + return self; + }; + + // For each buffer, perform some action. + // If fn's result is a true value, cut out early. + // Returns this (self). + self.forEach = function (fn) { + if (!head.buffer) return new self.construct(0); + + if (head.buffer.length - offset <= 0) return self; + var firstBuf = head.buffer.slice(offset); + + var b = { buffer : firstBuf, next : head.next }; + + while (b && b.buffer) { + var r = fn(b.buffer); + if (r) break; + b = b.next; + } + + return self; + }; + + // Create a single Buffer out of all the chunks or some subset specified by + // start and one-past the end (like slice) in bytes. + self.join = function (start, end) { + if (!head.buffer) return new self.construct(0); + if (start == undefined) start = 0; + if (end == undefined) end = self.length; + + var big = new self.construct(end - start); + var ix = 0; + self.forEach(function (buffer) { + if (start < (ix + buffer.length) && ix < end) { + // at least partially contained in the range + buffer.copy( + big, + Math.max(0, ix - start), + Math.max(0, start - ix), + Math.min(buffer.length, end - ix) + ); + } + ix += buffer.length; + if (ix > end) return true; // stop processing past end + }); + + return big; + }; + + self.joinInto = function (targetBuffer, targetStart, sourceStart, sourceEnd) { + if (!head.buffer) return new self.construct(0); + if (sourceStart == undefined) sourceStart = 0; + if (sourceEnd == undefined) sourceEnd = self.length; + + var big = targetBuffer; + if (big.length - targetStart < sourceEnd - sourceStart) { + throw new Error("Insufficient space available in target Buffer."); + } + var ix = 0; + self.forEach(function (buffer) { + if (sourceStart < (ix + buffer.length) && ix < sourceEnd) { + // at least partially contained in the range + buffer.copy( + big, + Math.max(targetStart, targetStart + ix - sourceStart), + Math.max(0, sourceStart - ix), + Math.min(buffer.length, sourceEnd - ix) + ); + } + ix += buffer.length; + if (ix > sourceEnd) return true; // stop processing past end + }); + + return big; + }; + + // Advance the buffer stream by n bytes. + // If n the aggregate advance offset passes the end of the buffer list, + // operations such as .take() will return empty strings until enough data is + // pushed. + // Returns this (self). + self.advance = function (n) { + offset += n; + length -= n; + while (head.buffer && offset >= head.buffer.length) { + offset -= head.buffer.length; + head = head.next + ? head.next + : { buffer : null, next : null } + ; + } + if (head.buffer === null) last = { next : null, buffer : null }; + self.emit('advance', n); + return self; + }; + + // Take n bytes from the start of the buffers. + // Returns a string. + // If there are less than n bytes in all the buffers or n is undefined, + // returns the entire concatenated buffer string. + self.take = function (n, encoding) { + if (n == undefined) n = self.length; + else if (typeof n !== 'number') { + encoding = n; + n = self.length; + } + var b = head; + if (!encoding) encoding = self.encoding; + if (encoding) { + var acc = ''; + self.forEach(function (buffer) { + if (n <= 0) return true; + acc += buffer.toString( + encoding, 0, Math.min(n,buffer.length) + ); + n -= buffer.length; + }); + return acc; + } else { + // If no 'encoding' is specified, then return a Buffer. + return self.join(0, n); + } + }; + + // The entire concatenated buffer as a string. + self.toString = function () { + return self.take('binary'); + }; +} +require('util').inherits(BufferList, EventEmitter); diff --git a/deploy/node_modules/yaeti/.jscsrc b/deploy/node_modules/yaeti/.jscsrc new file mode 100644 index 0000000..a37d119 --- /dev/null +++ b/deploy/node_modules/yaeti/.jscsrc @@ -0,0 +1,6 @@ +{ + "preset": "crockford", + "validateIndentation": "\t", + "disallowKeywords": ["with"], + "disallowDanglingUnderscores": null +} diff --git a/deploy/node_modules/yaeti/.jshintrc b/deploy/node_modules/yaeti/.jshintrc new file mode 100644 index 0000000..1cca0fa --- /dev/null +++ b/deploy/node_modules/yaeti/.jshintrc @@ -0,0 +1,27 @@ +{ + "bitwise": false, + "curly": true, + "eqeqeq": true, + "forin": true, + "freeze": true, + "latedef": "function", + "noarg": true, + "nonbsp": true, + "nonew": true, + "plusplus": false, + "undef": true, + "unused": true, + "strict": false, + "maxparams": 6, + "maxdepth": 4, + "maxstatements": false, + "maxlen": 200, + "browser": true, + "browserify": true, + "devel": true, + "jquery": false, + "mocha": true, + "node": false, + "shelljs": false, + "worker": false +} diff --git a/deploy/node_modules/yaeti/.npmignore b/deploy/node_modules/yaeti/.npmignore new file mode 100644 index 0000000..2ccbe46 --- /dev/null +++ b/deploy/node_modules/yaeti/.npmignore @@ -0,0 +1 @@ +/node_modules/ diff --git a/deploy/node_modules/yaeti/LICENSE b/deploy/node_modules/yaeti/LICENSE new file mode 100644 index 0000000..a64a412 --- /dev/null +++ b/deploy/node_modules/yaeti/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Iñaki Baz Castillo, + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/deploy/node_modules/yaeti/README.md b/deploy/node_modules/yaeti/README.md new file mode 100644 index 0000000..db253a4 --- /dev/null +++ b/deploy/node_modules/yaeti/README.md @@ -0,0 +1,98 @@ +# yaeti + +Yet Another [EventTarget](https://developer.mozilla.org/es/docs/Web/API/EventTarget) Implementation. + +The library exposes both the [EventTarget](https://developer.mozilla.org/es/docs/Web/API/EventTarget) interface and the [Event](https://developer.mozilla.org/en-US/docs/Web/API/Event) interface. + + +## Installation + +```bash +$ npm install yaeti --save +``` + + +## Usage + +```javascript +var yaeti = require('yaeti'); + + +// Custom class we want to make an EventTarget. +function Foo() { + // Make Foo an EventTarget. + yaeti.EventTarget.call(this); +} + +// Create an instance. +var foo = new Foo(); + +function listener1() { + console.log('listener1'); +} + +function listener2() { + console.log('listener2'); +} + +foo.addEventListener('bar', listener1); +foo.addEventListener('bar', listener2); +foo.removeEventListener('bar', listener1); + +var event = new yaeti.Event('bar'); + +foo.dispatchEvent(event); + + +// Output: +// => "listener2" +``` + + + +## API + + +#### `yaeti.EventTarget` interface + +Implementation of the [EventTarget](https://developer.mozilla.org/es/docs/Web/API/EventTarget) interface. + +* Make a custom class inherit from `EventTarget`: +```javascript +function Foo() { + yaeti.EventTarget.call(this); +} +``` + +* Make an existing object an `EventTarget`: +```javascript +yaeti.EventTarget.call(obj); +``` + +The interface implements the `addEventListener`, `removeEventListener` and `dispatchEvent` methods as defined by the W3C. + + +##### `listeners` read-only property + +Returns an object whose keys are configured event types (String) and whose values are an array of listeners (functions) for those event types. + + +#### `yaeti.Event` interface + +Implementation of the [Event](https://developer.mozilla.org/en-US/docs/Web/API/Event) interface. + +*NOTE:* Just useful in Node (the browser already exposes the native `Event` interface). + +```javascript +var event = new yaeti.Event('bar'); +``` + + +## Author + +[Iñaki Baz Castillo](https://github.com/ibc) + + +## License + +[MIT](./LICENSE) diff --git a/deploy/node_modules/yaeti/gulpfile.js b/deploy/node_modules/yaeti/gulpfile.js new file mode 100644 index 0000000..294cd9c --- /dev/null +++ b/deploy/node_modules/yaeti/gulpfile.js @@ -0,0 +1,23 @@ +var + /** + * Dependencies. + */ + gulp = require('gulp'), + jscs = require('gulp-jscs'), + jshint = require('gulp-jshint'), + stylish = require('gulp-jscs-stylish'); + + +gulp.task('lint', function () { + var src = ['gulpfile.js', 'index.js', 'lib/**/*.js']; + + return gulp.src(src) + .pipe(jshint('.jshintrc')) // Enforce good practics. + .pipe(jscs('.jscsrc')) // Enforce style guide. + .pipe(stylish.combineWithHintResults()) + .pipe(jshint.reporter('jshint-stylish', {verbose: true})) + .pipe(jshint.reporter('fail')); +}); + + +gulp.task('default', gulp.task('lint')); diff --git a/deploy/node_modules/yaeti/index.js b/deploy/node_modules/yaeti/index.js new file mode 100644 index 0000000..b1e6db4 --- /dev/null +++ b/deploy/node_modules/yaeti/index.js @@ -0,0 +1,4 @@ +module.exports = { + EventTarget : require('./lib/EventTarget'), + Event : require('./lib/Event') +}; diff --git a/deploy/node_modules/yaeti/lib/Event.browser.js b/deploy/node_modules/yaeti/lib/Event.browser.js new file mode 100644 index 0000000..0cd5ea6 --- /dev/null +++ b/deploy/node_modules/yaeti/lib/Event.browser.js @@ -0,0 +1,5 @@ +/** + * In browsers export the native Event interface. + */ + +module.exports = global.Event; diff --git a/deploy/node_modules/yaeti/lib/Event.js b/deploy/node_modules/yaeti/lib/Event.js new file mode 100644 index 0000000..cd245a2 --- /dev/null +++ b/deploy/node_modules/yaeti/lib/Event.js @@ -0,0 +1,13 @@ +/** + * Expose the Event class. + */ +module.exports = _Event; + + +function _Event(type) { + this.type = type; + this.isTrusted = false; + + // Set a flag indicating this is not a DOM Event object + this._yaeti = true; +} diff --git a/deploy/node_modules/yaeti/lib/EventTarget.js b/deploy/node_modules/yaeti/lib/EventTarget.js new file mode 100644 index 0000000..403c75b --- /dev/null +++ b/deploy/node_modules/yaeti/lib/EventTarget.js @@ -0,0 +1,119 @@ +/** + * Expose the _EventTarget class. + */ +module.exports = _EventTarget; + +function _EventTarget() { + // Do nothing if called for a native EventTarget object.. + if (typeof this.addEventListener === 'function') { + return; + } + + this._listeners = {}; + + this.addEventListener = _addEventListener; + this.removeEventListener = _removeEventListener; + this.dispatchEvent = _dispatchEvent; +} + +Object.defineProperties(_EventTarget.prototype, { + listeners: { + get: function () { + return this._listeners; + } + } +}); + +function _addEventListener(type, newListener) { + var + listenersType, + i, listener; + + if (!type || !newListener) { + return; + } + + listenersType = this._listeners[type]; + if (listenersType === undefined) { + this._listeners[type] = listenersType = []; + } + + for (i = 0; !!(listener = listenersType[i]); i++) { + if (listener === newListener) { + return; + } + } + + listenersType.push(newListener); +} + +function _removeEventListener(type, oldListener) { + var + listenersType, + i, listener; + + if (!type || !oldListener) { + return; + } + + listenersType = this._listeners[type]; + if (listenersType === undefined) { + return; + } + + for (i = 0; !!(listener = listenersType[i]); i++) { + if (listener === oldListener) { + listenersType.splice(i, 1); + break; + } + } + + if (listenersType.length === 0) { + delete this._listeners[type]; + } +} + +function _dispatchEvent(event) { + var + type, + listenersType, + dummyListener, + stopImmediatePropagation = false, + i, listener; + + if (!event || typeof event.type !== 'string') { + throw new Error('`event` must have a valid `type` property'); + } + + // Do some stuff to emulate DOM Event behavior (just if this is not a + // DOM Event object) + if (event._yaeti) { + event.target = this; + event.cancelable = true; + } + + // Attempt to override the stopImmediatePropagation() method + try { + event.stopImmediatePropagation = function () { + stopImmediatePropagation = true; + }; + } catch (error) {} + + type = event.type; + listenersType = (this._listeners[type] || []); + + dummyListener = this['on' + type]; + if (typeof dummyListener === 'function') { + dummyListener.call(this, event); + } + + for (i = 0; !!(listener = listenersType[i]); i++) { + if (stopImmediatePropagation) { + break; + } + + listener.call(this, event); + } + + return !event.defaultPrevented; +} diff --git a/deploy/node_modules/yaeti/package.json b/deploy/node_modules/yaeti/package.json new file mode 100644 index 0000000..acdf98f --- /dev/null +++ b/deploy/node_modules/yaeti/package.json @@ -0,0 +1,57 @@ +{ + "_from": "yaeti@^0.0.6", + "_id": "yaeti@0.0.6", + "_inBundle": false, + "_integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", + "_location": "/yaeti", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "yaeti@^0.0.6", + "name": "yaeti", + "escapedName": "yaeti", + "rawSpec": "^0.0.6", + "saveSpec": null, + "fetchSpec": "^0.0.6" + }, + "_requiredBy": [ + "/websocket" + ], + "_resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "_shasum": "f26f484d72684cf42bedfb76970aa1608fbf9577", + "_spec": "yaeti@^0.0.6", + "_where": "/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/websocket", + "author": { + "name": "Iñaki Baz Castillo", + "email": "ibc@aliax.net" + }, + "browser": { + "./lib/Event.js": "./lib/Event.browser.js" + }, + "bugs": { + "url": "https://github.com/ibc/yaeti/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Yet Another EventTarget Implementation", + "devDependencies": { + "gulp": "git+https://github.com/gulpjs/gulp.git#4.0", + "gulp-jscs": "^1.6.0", + "gulp-jscs-stylish": "^1.1.0", + "gulp-jshint": "^1.11.2", + "jshint-stylish": "~1.0.2" + }, + "engines": { + "node": ">=0.10.32" + }, + "homepage": "https://github.com/ibc/yaeti#readme", + "license": "MIT", + "main": "index.js", + "name": "yaeti", + "repository": { + "type": "git", + "url": "git+https://github.com/ibc/yaeti.git" + }, + "version": "0.0.6" +} diff --git a/deploy/package-lock.json b/deploy/package-lock.json new file mode 100644 index 0000000..07f1545 --- /dev/null +++ b/deploy/package-lock.json @@ -0,0 +1,75 @@ +{ + "name": "websocket-kinect", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "coffee-script": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==" + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "requires": { + "ms": "2.0.0" + } + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nan": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", + "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=" + }, + "typedarray-to-buffer": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.2.tgz", + "integrity": "sha1-EBezLZhP9VbroQD1AViauhrOLgQ=", + "requires": { + "is-typedarray": "1.0.0" + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + }, + "websocket": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.24.tgz", + "integrity": "sha1-dJA+dfJUW2suHeFCW8HJBZF6GJA=", + "requires": { + "debug": "2.6.8", + "nan": "2.7.0", + "typedarray-to-buffer": "3.1.2", + "yaeti": "0.0.6" + } + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + } + } +} diff --git a/deploy/package.json b/deploy/package.json index 1089095..bf814f7 100644 --- a/deploy/package.json +++ b/deploy/package.json @@ -1,3 +1,14 @@ -{ "name": "websocket-kinect" -, "version": "0.1.0" -, "dependencies": { "websocket": "~1", "coffee-script": "~1" } } +{ + "name": "websocket-kinect", + "version": "0.1.0", + "scripts": { + "start": "node_modules/coffee-script/bin/coffee forwarding.coffee" + }, + "dependencies": { + "websocket": "~1", + "coffee-script": "~1" + }, + "devDependencies": { + "util": "^0.10.3" + } +} From 9a5ed1ddda2a13dba69b168d04214171f55804e0 Mon Sep 17 00:00:00 2001 From: Prophesi Date: Thu, 21 Sep 2017 14:42:46 -0400 Subject: [PATCH 6/6] see previous commit. and take node_modules out of repo. --- .gitignore | 1 + client-webgl/inline-scripts.rb | 12 +- client-webgl/package-lock.json | 191 + client-webgl/websocket-kinect.js | 1 - deploy/node_modules/.bin/cake | 1 - deploy/node_modules/.bin/coffee | 1 - deploy/node_modules/coffee-script/LICENSE | 22 - deploy/node_modules/coffee-script/README.md | 57 - deploy/node_modules/coffee-script/bin/cake | 18 - deploy/node_modules/coffee-script/bin/coffee | 18 - .../lib/coffee-script/browser.js | 132 - .../coffee-script/lib/coffee-script/cake.js | 114 - .../lib/coffee-script/coffee-script.js | 426 -- .../lib/coffee-script/command.js | 610 --- .../lib/coffee-script/grammar.js | 816 ---- .../lib/coffee-script/helpers.js | 249 -- .../coffee-script/lib/coffee-script/index.js | 11 - .../coffee-script/lib/coffee-script/lexer.js | 1166 ----- .../coffee-script/lib/coffee-script/nodes.js | 3899 ----------------- .../lib/coffee-script/optparse.js | 139 - .../coffee-script/lib/coffee-script/parser.js | 891 ---- .../lib/coffee-script/register.js | 66 - .../coffee-script/lib/coffee-script/repl.js | 203 - .../lib/coffee-script/rewriter.js | 537 --- .../coffee-script/lib/coffee-script/scope.js | 165 - .../lib/coffee-script/sourcemap.js | 161 - .../node_modules/coffee-script/package.json | 77 - deploy/node_modules/coffee-script/register.js | 1 - deploy/node_modules/coffee-script/repl.js | 1 - deploy/node_modules/debug/.coveralls.yml | 1 - deploy/node_modules/debug/.eslintrc | 11 - deploy/node_modules/debug/.npmignore | 9 - deploy/node_modules/debug/.travis.yml | 14 - deploy/node_modules/debug/CHANGELOG.md | 357 -- deploy/node_modules/debug/LICENSE | 19 - deploy/node_modules/debug/Makefile | 50 - deploy/node_modules/debug/README.md | 312 -- deploy/node_modules/debug/component.json | 19 - deploy/node_modules/debug/karma.conf.js | 70 - deploy/node_modules/debug/node.js | 1 - deploy/node_modules/debug/package.json | 88 - deploy/node_modules/debug/src/browser.js | 185 - deploy/node_modules/debug/src/debug.js | 202 - deploy/node_modules/debug/src/index.js | 10 - deploy/node_modules/debug/src/node.js | 246 -- deploy/node_modules/inherits/LICENSE | 16 - deploy/node_modules/inherits/README.md | 42 - deploy/node_modules/inherits/inherits.js | 1 - .../node_modules/inherits/inherits_browser.js | 23 - deploy/node_modules/inherits/package.json | 54 - deploy/node_modules/inherits/test.js | 25 - deploy/node_modules/is-typedarray/LICENSE.md | 18 - deploy/node_modules/is-typedarray/README.md | 16 - deploy/node_modules/is-typedarray/index.js | 41 - .../node_modules/is-typedarray/package.json | 59 - deploy/node_modules/is-typedarray/test.js | 34 - deploy/node_modules/ms/index.js | 152 - deploy/node_modules/ms/license.md | 21 - deploy/node_modules/ms/package.json | 69 - deploy/node_modules/ms/readme.md | 51 - deploy/node_modules/nan/CHANGELOG.md | 458 -- deploy/node_modules/nan/LICENSE.md | 13 - deploy/node_modules/nan/README.md | 424 -- deploy/node_modules/nan/doc/asyncworker.md | 104 - deploy/node_modules/nan/doc/buffers.md | 54 - deploy/node_modules/nan/doc/callback.md | 56 - deploy/node_modules/nan/doc/converters.md | 41 - deploy/node_modules/nan/doc/errors.md | 226 - deploy/node_modules/nan/doc/json.md | 62 - deploy/node_modules/nan/doc/maybe_types.md | 560 --- deploy/node_modules/nan/doc/methods.md | 659 --- deploy/node_modules/nan/doc/new.md | 147 - deploy/node_modules/nan/doc/node_misc.md | 63 - .../node_modules/nan/doc/object_wrappers.md | 263 -- deploy/node_modules/nan/doc/persistent.md | 295 -- deploy/node_modules/nan/doc/scopes.md | 73 - deploy/node_modules/nan/doc/script.md | 38 - deploy/node_modules/nan/doc/string_bytes.md | 62 - deploy/node_modules/nan/doc/v8_internals.md | 199 - deploy/node_modules/nan/doc/v8_misc.md | 85 - deploy/node_modules/nan/include_dirs.js | 1 - deploy/node_modules/nan/nan.h | 2321 ---------- deploy/node_modules/nan/nan_callbacks.h | 88 - .../node_modules/nan/nan_callbacks_12_inl.h | 512 --- .../nan/nan_callbacks_pre_12_inl.h | 520 --- deploy/node_modules/nan/nan_converters.h | 72 - .../node_modules/nan/nan_converters_43_inl.h | 48 - .../nan/nan_converters_pre_43_inl.h | 42 - .../nan/nan_implementation_12_inl.h | 399 -- .../nan/nan_implementation_pre_12_inl.h | 263 -- deploy/node_modules/nan/nan_json.h | 159 - deploy/node_modules/nan/nan_maybe_43_inl.h | 337 -- .../node_modules/nan/nan_maybe_pre_43_inl.h | 305 -- deploy/node_modules/nan/nan_new.h | 340 -- deploy/node_modules/nan/nan_object_wrap.h | 155 - .../node_modules/nan/nan_persistent_12_inl.h | 132 - .../nan/nan_persistent_pre_12_inl.h | 242 - deploy/node_modules/nan/nan_private.h | 73 - deploy/node_modules/nan/nan_string_bytes.h | 305 -- .../nan/nan_typedarray_contents.h | 90 - deploy/node_modules/nan/nan_weak.h | 432 -- deploy/node_modules/nan/package.json | 96 - deploy/node_modules/nan/tools/1to2.js | 412 -- deploy/node_modules/nan/tools/README.md | 14 - deploy/node_modules/nan/tools/package.json | 19 - .../typedarray-to-buffer/.travis.yml | 7 - .../typedarray-to-buffer/.zuul.yml | 20 - .../node_modules/typedarray-to-buffer/LICENSE | 21 - .../typedarray-to-buffer/README.md | 81 - .../typedarray-to-buffer/index.js | 25 - .../typedarray-to-buffer/package.json | 75 - .../typedarray-to-buffer/test/basic.js | 50 - deploy/node_modules/util/.npmignore | 1 - deploy/node_modules/util/.travis.yml | 8 - deploy/node_modules/util/.zuul.yml | 10 - deploy/node_modules/util/LICENSE | 18 - deploy/node_modules/util/README.md | 15 - deploy/node_modules/util/package.json | 60 - deploy/node_modules/util/support/isBuffer.js | 3 - .../util/support/isBufferBrowser.js | 6 - .../node_modules/util/test/browser/inspect.js | 41 - deploy/node_modules/util/test/browser/is.js | 91 - deploy/node_modules/util/test/node/debug.js | 86 - deploy/node_modules/util/test/node/format.js | 77 - deploy/node_modules/util/test/node/inspect.js | 195 - deploy/node_modules/util/test/node/log.js | 58 - deploy/node_modules/util/test/node/util.js | 83 - deploy/node_modules/util/util.js | 586 --- deploy/node_modules/websocket/.jshintrc | 88 - deploy/node_modules/websocket/CHANGELOG.md | 213 - deploy/node_modules/websocket/LICENSE | 177 - deploy/node_modules/websocket/Makefile | 11 - deploy/node_modules/websocket/README.md | 314 -- deploy/node_modules/websocket/binding.gyp | 18 - deploy/node_modules/websocket/build/Makefile | 347 -- .../Release/.deps/Release/bufferutil.node.d | 1 - .../obj.target/bufferutil/src/bufferutil.o.d | 52 - .../obj.target/validation/src/validation.o.d | 52 - .../Release/.deps/Release/validation.node.d | 1 - .../websocket/build/Release/bufferutil.node | Bin 22764 -> 0 bytes .../obj.target/bufferutil/src/bufferutil.o | Bin 227176 -> 0 bytes .../obj.target/validation/src/validation.o | Bin 222752 -> 0 bytes .../websocket/build/Release/validation.node | Bin 22692 -> 0 bytes .../websocket/build/binding.Makefile | 6 - .../websocket/build/bufferutil.target.mk | 180 - .../node_modules/websocket/build/config.gypi | 170 - .../node_modules/websocket/build/gyp-mac-tool | 611 --- .../websocket/build/validation.target.mk | 180 - deploy/node_modules/websocket/builderror.log | 0 deploy/node_modules/websocket/gulpfile.js | 14 - deploy/node_modules/websocket/index.js | 1 - .../websocket/lib/BufferUtil.fallback.js | 52 - .../node_modules/websocket/lib/BufferUtil.js | 17 - .../node_modules/websocket/lib/Deprecation.js | 32 - .../websocket/lib/Validation.fallback.js | 12 - .../node_modules/websocket/lib/Validation.js | 17 - .../websocket/lib/W3CWebSocket.js | 257 -- .../websocket/lib/WebSocketClient.js | 348 -- .../websocket/lib/WebSocketConnection.js | 889 ---- .../websocket/lib/WebSocketFrame.js | 279 -- .../websocket/lib/WebSocketRequest.js | 524 --- .../websocket/lib/WebSocketRouter.js | 157 - .../websocket/lib/WebSocketRouterRequest.js | 54 - .../websocket/lib/WebSocketServer.js | 245 -- deploy/node_modules/websocket/lib/browser.js | 36 - deploy/node_modules/websocket/lib/utils.js | 60 - deploy/node_modules/websocket/lib/version.js | 1 - .../node_modules/websocket/lib/websocket.js | 11 - deploy/node_modules/websocket/package.json | 94 - .../node_modules/websocket/src/bufferutil.cc | 121 - .../node_modules/websocket/src/validation.cc | 148 - .../websocket/vendor/FastBufferList.js | 193 - deploy/node_modules/yaeti/.jscsrc | 6 - deploy/node_modules/yaeti/.jshintrc | 27 - deploy/node_modules/yaeti/.npmignore | 1 - deploy/node_modules/yaeti/LICENSE | 21 - deploy/node_modules/yaeti/README.md | 98 - deploy/node_modules/yaeti/gulpfile.js | 23 - deploy/node_modules/yaeti/index.js | 4 - .../node_modules/yaeti/lib/Event.browser.js | 5 - deploy/node_modules/yaeti/lib/Event.js | 13 - deploy/node_modules/yaeti/lib/EventTarget.js | 119 - deploy/node_modules/yaeti/package.json | 57 - server/INSTALL.txt | 4 +- 184 files changed, 200 insertions(+), 31239 deletions(-) create mode 100644 client-webgl/package-lock.json delete mode 120000 deploy/node_modules/.bin/cake delete mode 120000 deploy/node_modules/.bin/coffee delete mode 100644 deploy/node_modules/coffee-script/LICENSE delete mode 100644 deploy/node_modules/coffee-script/README.md delete mode 100755 deploy/node_modules/coffee-script/bin/cake delete mode 100755 deploy/node_modules/coffee-script/bin/coffee delete mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/browser.js delete mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/cake.js delete mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/coffee-script.js delete mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/command.js delete mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/grammar.js delete mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/helpers.js delete mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/index.js delete mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/lexer.js delete mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/nodes.js delete mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/optparse.js delete mode 100755 deploy/node_modules/coffee-script/lib/coffee-script/parser.js delete mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/register.js delete mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/repl.js delete mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/rewriter.js delete mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/scope.js delete mode 100644 deploy/node_modules/coffee-script/lib/coffee-script/sourcemap.js delete mode 100644 deploy/node_modules/coffee-script/package.json delete mode 100644 deploy/node_modules/coffee-script/register.js delete mode 100644 deploy/node_modules/coffee-script/repl.js delete mode 100644 deploy/node_modules/debug/.coveralls.yml delete mode 100644 deploy/node_modules/debug/.eslintrc delete mode 100644 deploy/node_modules/debug/.npmignore delete mode 100644 deploy/node_modules/debug/.travis.yml delete mode 100644 deploy/node_modules/debug/CHANGELOG.md delete mode 100644 deploy/node_modules/debug/LICENSE delete mode 100644 deploy/node_modules/debug/Makefile delete mode 100644 deploy/node_modules/debug/README.md delete mode 100644 deploy/node_modules/debug/component.json delete mode 100644 deploy/node_modules/debug/karma.conf.js delete mode 100644 deploy/node_modules/debug/node.js delete mode 100644 deploy/node_modules/debug/package.json delete mode 100644 deploy/node_modules/debug/src/browser.js delete mode 100644 deploy/node_modules/debug/src/debug.js delete mode 100644 deploy/node_modules/debug/src/index.js delete mode 100644 deploy/node_modules/debug/src/node.js delete mode 100644 deploy/node_modules/inherits/LICENSE delete mode 100644 deploy/node_modules/inherits/README.md delete mode 100644 deploy/node_modules/inherits/inherits.js delete mode 100644 deploy/node_modules/inherits/inherits_browser.js delete mode 100644 deploy/node_modules/inherits/package.json delete mode 100644 deploy/node_modules/inherits/test.js delete mode 100644 deploy/node_modules/is-typedarray/LICENSE.md delete mode 100644 deploy/node_modules/is-typedarray/README.md delete mode 100644 deploy/node_modules/is-typedarray/index.js delete mode 100644 deploy/node_modules/is-typedarray/package.json delete mode 100644 deploy/node_modules/is-typedarray/test.js delete mode 100644 deploy/node_modules/ms/index.js delete mode 100644 deploy/node_modules/ms/license.md delete mode 100644 deploy/node_modules/ms/package.json delete mode 100644 deploy/node_modules/ms/readme.md delete mode 100644 deploy/node_modules/nan/CHANGELOG.md delete mode 100644 deploy/node_modules/nan/LICENSE.md delete mode 100644 deploy/node_modules/nan/README.md delete mode 100644 deploy/node_modules/nan/doc/asyncworker.md delete mode 100644 deploy/node_modules/nan/doc/buffers.md delete mode 100644 deploy/node_modules/nan/doc/callback.md delete mode 100644 deploy/node_modules/nan/doc/converters.md delete mode 100644 deploy/node_modules/nan/doc/errors.md delete mode 100644 deploy/node_modules/nan/doc/json.md delete mode 100644 deploy/node_modules/nan/doc/maybe_types.md delete mode 100644 deploy/node_modules/nan/doc/methods.md delete mode 100644 deploy/node_modules/nan/doc/new.md delete mode 100644 deploy/node_modules/nan/doc/node_misc.md delete mode 100644 deploy/node_modules/nan/doc/object_wrappers.md delete mode 100644 deploy/node_modules/nan/doc/persistent.md delete mode 100644 deploy/node_modules/nan/doc/scopes.md delete mode 100644 deploy/node_modules/nan/doc/script.md delete mode 100644 deploy/node_modules/nan/doc/string_bytes.md delete mode 100644 deploy/node_modules/nan/doc/v8_internals.md delete mode 100644 deploy/node_modules/nan/doc/v8_misc.md delete mode 100644 deploy/node_modules/nan/include_dirs.js delete mode 100644 deploy/node_modules/nan/nan.h delete mode 100644 deploy/node_modules/nan/nan_callbacks.h delete mode 100644 deploy/node_modules/nan/nan_callbacks_12_inl.h delete mode 100644 deploy/node_modules/nan/nan_callbacks_pre_12_inl.h delete mode 100644 deploy/node_modules/nan/nan_converters.h delete mode 100644 deploy/node_modules/nan/nan_converters_43_inl.h delete mode 100644 deploy/node_modules/nan/nan_converters_pre_43_inl.h delete mode 100644 deploy/node_modules/nan/nan_implementation_12_inl.h delete mode 100644 deploy/node_modules/nan/nan_implementation_pre_12_inl.h delete mode 100644 deploy/node_modules/nan/nan_json.h delete mode 100644 deploy/node_modules/nan/nan_maybe_43_inl.h delete mode 100644 deploy/node_modules/nan/nan_maybe_pre_43_inl.h delete mode 100644 deploy/node_modules/nan/nan_new.h delete mode 100644 deploy/node_modules/nan/nan_object_wrap.h delete mode 100644 deploy/node_modules/nan/nan_persistent_12_inl.h delete mode 100644 deploy/node_modules/nan/nan_persistent_pre_12_inl.h delete mode 100644 deploy/node_modules/nan/nan_private.h delete mode 100644 deploy/node_modules/nan/nan_string_bytes.h delete mode 100644 deploy/node_modules/nan/nan_typedarray_contents.h delete mode 100644 deploy/node_modules/nan/nan_weak.h delete mode 100644 deploy/node_modules/nan/package.json delete mode 100755 deploy/node_modules/nan/tools/1to2.js delete mode 100644 deploy/node_modules/nan/tools/README.md delete mode 100644 deploy/node_modules/nan/tools/package.json delete mode 100644 deploy/node_modules/typedarray-to-buffer/.travis.yml delete mode 100644 deploy/node_modules/typedarray-to-buffer/.zuul.yml delete mode 100644 deploy/node_modules/typedarray-to-buffer/LICENSE delete mode 100644 deploy/node_modules/typedarray-to-buffer/README.md delete mode 100644 deploy/node_modules/typedarray-to-buffer/index.js delete mode 100644 deploy/node_modules/typedarray-to-buffer/package.json delete mode 100644 deploy/node_modules/typedarray-to-buffer/test/basic.js delete mode 100644 deploy/node_modules/util/.npmignore delete mode 100644 deploy/node_modules/util/.travis.yml delete mode 100644 deploy/node_modules/util/.zuul.yml delete mode 100644 deploy/node_modules/util/LICENSE delete mode 100644 deploy/node_modules/util/README.md delete mode 100644 deploy/node_modules/util/package.json delete mode 100644 deploy/node_modules/util/support/isBuffer.js delete mode 100644 deploy/node_modules/util/support/isBufferBrowser.js delete mode 100644 deploy/node_modules/util/test/browser/inspect.js delete mode 100644 deploy/node_modules/util/test/browser/is.js delete mode 100644 deploy/node_modules/util/test/node/debug.js delete mode 100644 deploy/node_modules/util/test/node/format.js delete mode 100644 deploy/node_modules/util/test/node/inspect.js delete mode 100644 deploy/node_modules/util/test/node/log.js delete mode 100644 deploy/node_modules/util/test/node/util.js delete mode 100644 deploy/node_modules/util/util.js delete mode 100644 deploy/node_modules/websocket/.jshintrc delete mode 100644 deploy/node_modules/websocket/CHANGELOG.md delete mode 100644 deploy/node_modules/websocket/LICENSE delete mode 100644 deploy/node_modules/websocket/Makefile delete mode 100644 deploy/node_modules/websocket/README.md delete mode 100644 deploy/node_modules/websocket/binding.gyp delete mode 100644 deploy/node_modules/websocket/build/Makefile delete mode 100644 deploy/node_modules/websocket/build/Release/.deps/Release/bufferutil.node.d delete mode 100644 deploy/node_modules/websocket/build/Release/.deps/Release/obj.target/bufferutil/src/bufferutil.o.d delete mode 100644 deploy/node_modules/websocket/build/Release/.deps/Release/obj.target/validation/src/validation.o.d delete mode 100644 deploy/node_modules/websocket/build/Release/.deps/Release/validation.node.d delete mode 100755 deploy/node_modules/websocket/build/Release/bufferutil.node delete mode 100644 deploy/node_modules/websocket/build/Release/obj.target/bufferutil/src/bufferutil.o delete mode 100644 deploy/node_modules/websocket/build/Release/obj.target/validation/src/validation.o delete mode 100755 deploy/node_modules/websocket/build/Release/validation.node delete mode 100644 deploy/node_modules/websocket/build/binding.Makefile delete mode 100644 deploy/node_modules/websocket/build/bufferutil.target.mk delete mode 100644 deploy/node_modules/websocket/build/config.gypi delete mode 100755 deploy/node_modules/websocket/build/gyp-mac-tool delete mode 100644 deploy/node_modules/websocket/build/validation.target.mk delete mode 100644 deploy/node_modules/websocket/builderror.log delete mode 100644 deploy/node_modules/websocket/gulpfile.js delete mode 100644 deploy/node_modules/websocket/index.js delete mode 100644 deploy/node_modules/websocket/lib/BufferUtil.fallback.js delete mode 100644 deploy/node_modules/websocket/lib/BufferUtil.js delete mode 100644 deploy/node_modules/websocket/lib/Deprecation.js delete mode 100644 deploy/node_modules/websocket/lib/Validation.fallback.js delete mode 100644 deploy/node_modules/websocket/lib/Validation.js delete mode 100644 deploy/node_modules/websocket/lib/W3CWebSocket.js delete mode 100644 deploy/node_modules/websocket/lib/WebSocketClient.js delete mode 100644 deploy/node_modules/websocket/lib/WebSocketConnection.js delete mode 100644 deploy/node_modules/websocket/lib/WebSocketFrame.js delete mode 100644 deploy/node_modules/websocket/lib/WebSocketRequest.js delete mode 100644 deploy/node_modules/websocket/lib/WebSocketRouter.js delete mode 100644 deploy/node_modules/websocket/lib/WebSocketRouterRequest.js delete mode 100644 deploy/node_modules/websocket/lib/WebSocketServer.js delete mode 100644 deploy/node_modules/websocket/lib/browser.js delete mode 100644 deploy/node_modules/websocket/lib/utils.js delete mode 100644 deploy/node_modules/websocket/lib/version.js delete mode 100644 deploy/node_modules/websocket/lib/websocket.js delete mode 100644 deploy/node_modules/websocket/package.json delete mode 100644 deploy/node_modules/websocket/src/bufferutil.cc delete mode 100644 deploy/node_modules/websocket/src/validation.cc delete mode 100644 deploy/node_modules/websocket/vendor/FastBufferList.js delete mode 100644 deploy/node_modules/yaeti/.jscsrc delete mode 100644 deploy/node_modules/yaeti/.jshintrc delete mode 100644 deploy/node_modules/yaeti/.npmignore delete mode 100644 deploy/node_modules/yaeti/LICENSE delete mode 100644 deploy/node_modules/yaeti/README.md delete mode 100644 deploy/node_modules/yaeti/gulpfile.js delete mode 100644 deploy/node_modules/yaeti/index.js delete mode 100644 deploy/node_modules/yaeti/lib/Event.browser.js delete mode 100644 deploy/node_modules/yaeti/lib/Event.js delete mode 100644 deploy/node_modules/yaeti/lib/EventTarget.js delete mode 100644 deploy/node_modules/yaeti/package.json diff --git a/.gitignore b/.gitignore index e43b0f9..58b805f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .DS_Store +node_modules/ \ No newline at end of file diff --git a/client-webgl/inline-scripts.rb b/client-webgl/inline-scripts.rb index 83e25e3..f5a363b 100755 --- a/client-webgl/inline-scripts.rb +++ b/client-webgl/inline-scripts.rb @@ -5,13 +5,13 @@ html.gsub!(%r{}) do |tag| js = tag.match(/(?<=").+(?=")/)[0] src = open(js) { |f| f.read } -# src = if js.match(/\.min\./) -# open(js) { |f| f.read } -# else -# `java -jar ~/bin/closure-compiler.jar --compilation_level SIMPLE_OPTIMIZATIONS --js '#{js}'` -# end + src = if js.match(/\.min\./) + open(js) { |f| f.read } + else + `java -jar ./node_modules/google-closure-compiler/compiler.jar --compilation_level SIMPLE_OPTIMIZATIONS --js '#{js}'` + end "" end target = '../deploy/index.html' open(target, 'w') { |f| f.write(html) } -#`gzip --best --no-name --force #{target}` +`gzip --best --no-name --force #{target}` diff --git a/client-webgl/package-lock.json b/client-webgl/package-lock.json new file mode 100644 index 0000000..15e0c23 --- /dev/null +++ b/client-webgl/package-lock.json @@ -0,0 +1,191 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "cloneable-readable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", + "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", + "requires": { + "inherits": "2.0.3", + "process-nextick-args": "1.0.7", + "through2": "2.0.3" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "google-closure-compiler": { + "version": "20170910.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20170910.0.0.tgz", + "integrity": "sha1-enz1ER1zdrN2znRhE34bA5MD8eo=", + "requires": { + "chalk": "1.1.3", + "vinyl": "2.1.0", + "vinyl-sourcemaps-apply": "0.2.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "vinyl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "requires": { + "clone": "2.1.1", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.0.0", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "requires": { + "source-map": "0.5.7" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } +} diff --git a/client-webgl/websocket-kinect.js b/client-webgl/websocket-kinect.js index 313fbdf..78c8e0e 100644 --- a/client-webgl/websocket-kinect.js +++ b/client-webgl/websocket-kinect.js @@ -149,7 +149,6 @@ seenKeyFrame = null; qtl = qtr = qbl = qbr = null; pvs = particles.vertices; - console.log(pvs); pLen = pvs.length; rawDataLen = 5 + pLen; outArrays = (function() { diff --git a/deploy/node_modules/.bin/cake b/deploy/node_modules/.bin/cake deleted file mode 120000 index d95f32a..0000000 --- a/deploy/node_modules/.bin/cake +++ /dev/null @@ -1 +0,0 @@ -../coffee-script/bin/cake \ No newline at end of file diff --git a/deploy/node_modules/.bin/coffee b/deploy/node_modules/.bin/coffee deleted file mode 120000 index b57f275..0000000 --- a/deploy/node_modules/.bin/coffee +++ /dev/null @@ -1 +0,0 @@ -../coffee-script/bin/coffee \ No newline at end of file diff --git a/deploy/node_modules/coffee-script/LICENSE b/deploy/node_modules/coffee-script/LICENSE deleted file mode 100644 index 2b8b228..0000000 --- a/deploy/node_modules/coffee-script/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2009-2017 Jeremy Ashkenas - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/deploy/node_modules/coffee-script/README.md b/deploy/node_modules/coffee-script/README.md deleted file mode 100644 index 1097e36..0000000 --- a/deploy/node_modules/coffee-script/README.md +++ /dev/null @@ -1,57 +0,0 @@ - { - } } { - { { } } - } }{ { - { }{ } } _____ __ __ - { }{ }{ { } / ____| / _|/ _| - .- { { } { }} -. | | ___ | |_| |_ ___ ___ - ( { } { } { } } ) | | / _ \| _| _/ _ \/ _ \ - |`-..________ ..-'| | |___| (_) | | | || __/ __/ - | | \_____\___/|_| |_| \___|\___| - | ;--. - | (__ \ _____ _ _ - | | ) ) / ____| (_) | | - | |/ / | (___ ___ _ __ _ _ __ | |_ - | ( / \___ \ / __| '__| | '_ \| __| - | |/ ____) | (__| | | | |_) | |_ - | | |_____/ \___|_| |_| .__/ \__| - `-.._________..-' | | - |_| - -CoffeeScript is a little language that compiles into JavaScript. - -## Installation - -Once you have Node.js installed: - -```shell -npm install --global coffeescript -``` - -Leave off the `--global` if you don’t wish to install globally. - -## Getting Started - -Execute a script: - -```shell -coffee /path/to/script.coffee -``` - -Compile a script: - -```shell -coffee -c /path/to/script.coffee -``` - -For documentation, usage, and examples, see: http://coffeescript.org/ - -To suggest a feature or report a bug: https://github.com/jashkenas/coffeescript/issues - -If you’d like to chat, drop by #coffeescript on Freenode IRC. - -The source repository: https://github.com/jashkenas/coffeescript.git - -Changelog: http://coffeescript.org/#changelog - -Our lovely and talented contributors are listed here: https://github.com/jashkenas/coffeescript/contributors diff --git a/deploy/node_modules/coffee-script/bin/cake b/deploy/node_modules/coffee-script/bin/cake deleted file mode 100755 index 1c6f9f5..0000000 --- a/deploy/node_modules/coffee-script/bin/cake +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env node - -var path = require('path'); -var fs = require('fs'); - -var potentialPaths = [ - path.join(process.cwd(), 'node_modules/coffeescript/lib/coffeescript'), - path.join(process.cwd(), 'node_modules/coffeescript/lib/coffee-script'), - path.join(process.cwd(), 'node_modules/coffee-script/lib/coffee-script'), - path.join(__dirname, '../lib/coffee-script') -]; - -for (var i = 0, len = potentialPaths.length; i < len; i++) { - if (fs.existsSync(potentialPaths[i])) { - require(potentialPaths[i] + '/cake').run(); - break; - } -} diff --git a/deploy/node_modules/coffee-script/bin/coffee b/deploy/node_modules/coffee-script/bin/coffee deleted file mode 100755 index 1bcdd1e..0000000 --- a/deploy/node_modules/coffee-script/bin/coffee +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env node - -var path = require('path'); -var fs = require('fs'); - -var potentialPaths = [ - path.join(process.cwd(), 'node_modules/coffeescript/lib/coffeescript'), - path.join(process.cwd(), 'node_modules/coffeescript/lib/coffee-script'), - path.join(process.cwd(), 'node_modules/coffee-script/lib/coffee-script'), - path.join(__dirname, '../lib/coffee-script') -]; - -for (var i = 0, len = potentialPaths.length; i < len; i++) { - if (fs.existsSync(potentialPaths[i])) { - require(potentialPaths[i] + '/command').run(); - break; - } -} diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/browser.js b/deploy/node_modules/coffee-script/lib/coffee-script/browser.js deleted file mode 100644 index e6e5d6e..0000000 --- a/deploy/node_modules/coffee-script/lib/coffee-script/browser.js +++ /dev/null @@ -1,132 +0,0 @@ -// Generated by CoffeeScript 1.12.7 -(function() { - var CoffeeScript, compile, runScripts, - indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - CoffeeScript = require('./coffee-script'); - - CoffeeScript.require = require; - - compile = CoffeeScript.compile; - - CoffeeScript["eval"] = function(code, options) { - if (options == null) { - options = {}; - } - if (options.bare == null) { - options.bare = true; - } - return eval(compile(code, options)); - }; - - CoffeeScript.run = function(code, options) { - if (options == null) { - options = {}; - } - options.bare = true; - options.shiftLine = true; - return Function(compile(code, options))(); - }; - - if (typeof window === "undefined" || window === null) { - return; - } - - if ((typeof btoa !== "undefined" && btoa !== null) && (typeof JSON !== "undefined" && JSON !== null)) { - compile = function(code, options) { - if (options == null) { - options = {}; - } - options.inlineMap = true; - return CoffeeScript.compile(code, options); - }; - } - - CoffeeScript.load = function(url, callback, options, hold) { - var xhr; - if (options == null) { - options = {}; - } - if (hold == null) { - hold = false; - } - options.sourceFiles = [url]; - xhr = window.ActiveXObject ? new window.ActiveXObject('Microsoft.XMLHTTP') : new window.XMLHttpRequest(); - xhr.open('GET', url, true); - if ('overrideMimeType' in xhr) { - xhr.overrideMimeType('text/plain'); - } - xhr.onreadystatechange = function() { - var param, ref; - if (xhr.readyState === 4) { - if ((ref = xhr.status) === 0 || ref === 200) { - param = [xhr.responseText, options]; - if (!hold) { - CoffeeScript.run.apply(CoffeeScript, param); - } - } else { - throw new Error("Could not load " + url); - } - if (callback) { - return callback(param); - } - } - }; - return xhr.send(null); - }; - - runScripts = function() { - var coffees, coffeetypes, execute, fn, i, index, j, len, s, script, scripts; - scripts = window.document.getElementsByTagName('script'); - coffeetypes = ['text/coffeescript', 'text/literate-coffeescript']; - coffees = (function() { - var j, len, ref, results; - results = []; - for (j = 0, len = scripts.length; j < len; j++) { - s = scripts[j]; - if (ref = s.type, indexOf.call(coffeetypes, ref) >= 0) { - results.push(s); - } - } - return results; - })(); - index = 0; - execute = function() { - var param; - param = coffees[index]; - if (param instanceof Array) { - CoffeeScript.run.apply(CoffeeScript, param); - index++; - return execute(); - } - }; - fn = function(script, i) { - var options, source; - options = { - literate: script.type === coffeetypes[1] - }; - source = script.src || script.getAttribute('data-src'); - if (source) { - return CoffeeScript.load(source, function(param) { - coffees[i] = param; - return execute(); - }, options, true); - } else { - options.sourceFiles = ['embedded']; - return coffees[i] = [script.innerHTML, options]; - } - }; - for (i = j = 0, len = coffees.length; j < len; i = ++j) { - script = coffees[i]; - fn(script, i); - } - return execute(); - }; - - if (window.addEventListener) { - window.addEventListener('DOMContentLoaded', runScripts, false); - } else { - window.attachEvent('onload', runScripts); - } - -}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/cake.js b/deploy/node_modules/coffee-script/lib/coffee-script/cake.js deleted file mode 100644 index d7155fc..0000000 --- a/deploy/node_modules/coffee-script/lib/coffee-script/cake.js +++ /dev/null @@ -1,114 +0,0 @@ -// Generated by CoffeeScript 1.12.7 -(function() { - var CoffeeScript, cakefileDirectory, fatalError, fs, helpers, missingTask, oparse, options, optparse, path, printTasks, switches, tasks; - - fs = require('fs'); - - path = require('path'); - - helpers = require('./helpers'); - - optparse = require('./optparse'); - - CoffeeScript = require('./coffee-script'); - - CoffeeScript.register(); - - tasks = {}; - - options = {}; - - switches = []; - - oparse = null; - - helpers.extend(global, { - task: function(name, description, action) { - var ref; - if (!action) { - ref = [description, action], action = ref[0], description = ref[1]; - } - return tasks[name] = { - name: name, - description: description, - action: action - }; - }, - option: function(letter, flag, description) { - return switches.push([letter, flag, description]); - }, - invoke: function(name) { - if (!tasks[name]) { - missingTask(name); - } - return tasks[name].action(options); - } - }); - - exports.run = function() { - var arg, args, e, i, len, ref, results; - global.__originalDirname = fs.realpathSync('.'); - process.chdir(cakefileDirectory(__originalDirname)); - args = process.argv.slice(2); - CoffeeScript.run(fs.readFileSync('Cakefile').toString(), { - filename: 'Cakefile' - }); - oparse = new optparse.OptionParser(switches); - if (!args.length) { - return printTasks(); - } - try { - options = oparse.parse(args); - } catch (error) { - e = error; - return fatalError("" + e); - } - ref = options["arguments"]; - results = []; - for (i = 0, len = ref.length; i < len; i++) { - arg = ref[i]; - results.push(invoke(arg)); - } - return results; - }; - - printTasks = function() { - var cakefilePath, desc, name, relative, spaces, task; - relative = path.relative || path.resolve; - cakefilePath = path.join(relative(__originalDirname, process.cwd()), 'Cakefile'); - console.log(cakefilePath + " defines the following tasks:\n"); - for (name in tasks) { - task = tasks[name]; - spaces = 20 - name.length; - spaces = spaces > 0 ? Array(spaces + 1).join(' ') : ''; - desc = task.description ? "# " + task.description : ''; - console.log("cake " + name + spaces + " " + desc); - } - if (switches.length) { - return console.log(oparse.help()); - } - }; - - fatalError = function(message) { - console.error(message + '\n'); - console.log('To see a list of all tasks/options, run "cake"'); - return process.exit(1); - }; - - missingTask = function(task) { - return fatalError("No such task: " + task); - }; - - cakefileDirectory = function(dir) { - var parent; - if (fs.existsSync(path.join(dir, 'Cakefile'))) { - return dir; - } - parent = path.normalize(path.join(dir, '..')); - if (parent !== dir) { - return cakefileDirectory(parent); - } - throw new Error("Cakefile not found in " + (process.cwd())); - }; - -}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/coffee-script.js b/deploy/node_modules/coffee-script/lib/coffee-script/coffee-script.js deleted file mode 100644 index 7e77237..0000000 --- a/deploy/node_modules/coffee-script/lib/coffee-script/coffee-script.js +++ /dev/null @@ -1,426 +0,0 @@ -// Generated by CoffeeScript 1.12.7 -(function() { - var Lexer, SourceMap, base64encode, compile, ext, fn1, formatSourcePosition, fs, getSourceMap, helpers, i, len, lexer, packageJson, parser, path, ref, sourceMaps, sources, vm, withPrettyErrors, - hasProp = {}.hasOwnProperty; - - fs = require('fs'); - - vm = require('vm'); - - path = require('path'); - - Lexer = require('./lexer').Lexer; - - parser = require('./parser').parser; - - helpers = require('./helpers'); - - SourceMap = require('./sourcemap'); - - packageJson = require('../../package.json'); - - exports.VERSION = packageJson.version; - - exports.FILE_EXTENSIONS = ['.coffee', '.litcoffee', '.coffee.md']; - - exports.helpers = helpers; - - base64encode = function(src) { - switch (false) { - case typeof Buffer !== 'function': - return new Buffer(src).toString('base64'); - case typeof btoa !== 'function': - return btoa(encodeURIComponent(src).replace(/%([0-9A-F]{2})/g, function(match, p1) { - return String.fromCharCode('0x' + p1); - })); - default: - throw new Error('Unable to base64 encode inline sourcemap.'); - } - }; - - withPrettyErrors = function(fn) { - return function(code, options) { - var err; - if (options == null) { - options = {}; - } - try { - return fn.call(this, code, options); - } catch (error) { - err = error; - if (typeof code !== 'string') { - throw err; - } - throw helpers.updateSyntaxError(err, code, options.filename); - } - }; - }; - - sources = {}; - - sourceMaps = {}; - - exports.compile = compile = withPrettyErrors(function(code, options) { - var currentColumn, currentLine, encoded, extend, filename, fragment, fragments, generateSourceMap, header, i, j, js, len, len1, map, merge, newLines, ref, ref1, sourceMapDataURI, sourceURL, token, tokens, v3SourceMap; - merge = helpers.merge, extend = helpers.extend; - options = extend({}, options); - generateSourceMap = options.sourceMap || options.inlineMap || (options.filename == null); - filename = options.filename || ''; - sources[filename] = code; - if (generateSourceMap) { - map = new SourceMap; - } - tokens = lexer.tokenize(code, options); - options.referencedVars = (function() { - var i, len, results; - results = []; - for (i = 0, len = tokens.length; i < len; i++) { - token = tokens[i]; - if (token[0] === 'IDENTIFIER') { - results.push(token[1]); - } - } - return results; - })(); - if (!((options.bare != null) && options.bare === true)) { - for (i = 0, len = tokens.length; i < len; i++) { - token = tokens[i]; - if ((ref = token[0]) === 'IMPORT' || ref === 'EXPORT') { - options.bare = true; - break; - } - } - } - fragments = parser.parse(tokens).compileToFragments(options); - currentLine = 0; - if (options.header) { - currentLine += 1; - } - if (options.shiftLine) { - currentLine += 1; - } - currentColumn = 0; - js = ""; - for (j = 0, len1 = fragments.length; j < len1; j++) { - fragment = fragments[j]; - if (generateSourceMap) { - if (fragment.locationData && !/^[;\s]*$/.test(fragment.code)) { - map.add([fragment.locationData.first_line, fragment.locationData.first_column], [currentLine, currentColumn], { - noReplace: true - }); - } - newLines = helpers.count(fragment.code, "\n"); - currentLine += newLines; - if (newLines) { - currentColumn = fragment.code.length - (fragment.code.lastIndexOf("\n") + 1); - } else { - currentColumn += fragment.code.length; - } - } - js += fragment.code; - } - if (options.header) { - header = "Generated by CoffeeScript " + this.VERSION; - js = "// " + header + "\n" + js; - } - if (generateSourceMap) { - v3SourceMap = map.generate(options, code); - sourceMaps[filename] = map; - } - if (options.inlineMap) { - encoded = base64encode(JSON.stringify(v3SourceMap)); - sourceMapDataURI = "//# sourceMappingURL=data:application/json;base64," + encoded; - sourceURL = "//# sourceURL=" + ((ref1 = options.filename) != null ? ref1 : 'coffeescript'); - js = js + "\n" + sourceMapDataURI + "\n" + sourceURL; - } - if (options.sourceMap) { - return { - js: js, - sourceMap: map, - v3SourceMap: JSON.stringify(v3SourceMap, null, 2) - }; - } else { - return js; - } - }); - - exports.tokens = withPrettyErrors(function(code, options) { - return lexer.tokenize(code, options); - }); - - exports.nodes = withPrettyErrors(function(source, options) { - if (typeof source === 'string') { - return parser.parse(lexer.tokenize(source, options)); - } else { - return parser.parse(source); - } - }); - - exports.run = function(code, options) { - var answer, dir, mainModule, ref; - if (options == null) { - options = {}; - } - mainModule = require.main; - mainModule.filename = process.argv[1] = options.filename ? fs.realpathSync(options.filename) : ''; - mainModule.moduleCache && (mainModule.moduleCache = {}); - dir = options.filename != null ? path.dirname(fs.realpathSync(options.filename)) : fs.realpathSync('.'); - mainModule.paths = require('module')._nodeModulePaths(dir); - if (!helpers.isCoffee(mainModule.filename) || require.extensions) { - answer = compile(code, options); - code = (ref = answer.js) != null ? ref : answer; - } - return mainModule._compile(code, mainModule.filename); - }; - - exports["eval"] = function(code, options) { - var Module, _module, _require, createContext, i, isContext, js, k, len, o, r, ref, ref1, ref2, ref3, sandbox, v; - if (options == null) { - options = {}; - } - if (!(code = code.trim())) { - return; - } - createContext = (ref = vm.Script.createContext) != null ? ref : vm.createContext; - isContext = (ref1 = vm.isContext) != null ? ref1 : function(ctx) { - return options.sandbox instanceof createContext().constructor; - }; - if (createContext) { - if (options.sandbox != null) { - if (isContext(options.sandbox)) { - sandbox = options.sandbox; - } else { - sandbox = createContext(); - ref2 = options.sandbox; - for (k in ref2) { - if (!hasProp.call(ref2, k)) continue; - v = ref2[k]; - sandbox[k] = v; - } - } - sandbox.global = sandbox.root = sandbox.GLOBAL = sandbox; - } else { - sandbox = global; - } - sandbox.__filename = options.filename || 'eval'; - sandbox.__dirname = path.dirname(sandbox.__filename); - if (!(sandbox !== global || sandbox.module || sandbox.require)) { - Module = require('module'); - sandbox.module = _module = new Module(options.modulename || 'eval'); - sandbox.require = _require = function(path) { - return Module._load(path, _module, true); - }; - _module.filename = sandbox.__filename; - ref3 = Object.getOwnPropertyNames(require); - for (i = 0, len = ref3.length; i < len; i++) { - r = ref3[i]; - if (r !== 'paths' && r !== 'arguments' && r !== 'caller') { - _require[r] = require[r]; - } - } - _require.paths = _module.paths = Module._nodeModulePaths(process.cwd()); - _require.resolve = function(request) { - return Module._resolveFilename(request, _module); - }; - } - } - o = {}; - for (k in options) { - if (!hasProp.call(options, k)) continue; - v = options[k]; - o[k] = v; - } - o.bare = true; - js = compile(code, o); - if (sandbox === global) { - return vm.runInThisContext(js); - } else { - return vm.runInContext(js, sandbox); - } - }; - - exports.register = function() { - return require('./register'); - }; - - if (require.extensions) { - ref = this.FILE_EXTENSIONS; - fn1 = function(ext) { - var base; - return (base = require.extensions)[ext] != null ? base[ext] : base[ext] = function() { - throw new Error("Use CoffeeScript.register() or require the coffee-script/register module to require " + ext + " files."); - }; - }; - for (i = 0, len = ref.length; i < len; i++) { - ext = ref[i]; - fn1(ext); - } - } - - exports._compileFile = function(filename, sourceMap, inlineMap) { - var answer, err, raw, stripped; - if (sourceMap == null) { - sourceMap = false; - } - if (inlineMap == null) { - inlineMap = false; - } - raw = fs.readFileSync(filename, 'utf8'); - stripped = raw.charCodeAt(0) === 0xFEFF ? raw.substring(1) : raw; - try { - answer = compile(stripped, { - filename: filename, - sourceMap: sourceMap, - inlineMap: inlineMap, - sourceFiles: [filename], - literate: helpers.isLiterate(filename) - }); - } catch (error) { - err = error; - throw helpers.updateSyntaxError(err, stripped, filename); - } - return answer; - }; - - lexer = new Lexer; - - parser.lexer = { - lex: function() { - var tag, token; - token = parser.tokens[this.pos++]; - if (token) { - tag = token[0], this.yytext = token[1], this.yylloc = token[2]; - parser.errorToken = token.origin || token; - this.yylineno = this.yylloc.first_line; - } else { - tag = ''; - } - return tag; - }, - setInput: function(tokens) { - parser.tokens = tokens; - return this.pos = 0; - }, - upcomingInput: function() { - return ""; - } - }; - - parser.yy = require('./nodes'); - - parser.yy.parseError = function(message, arg) { - var errorLoc, errorTag, errorText, errorToken, token, tokens; - token = arg.token; - errorToken = parser.errorToken, tokens = parser.tokens; - errorTag = errorToken[0], errorText = errorToken[1], errorLoc = errorToken[2]; - errorText = (function() { - switch (false) { - case errorToken !== tokens[tokens.length - 1]: - return 'end of input'; - case errorTag !== 'INDENT' && errorTag !== 'OUTDENT': - return 'indentation'; - case errorTag !== 'IDENTIFIER' && errorTag !== 'NUMBER' && errorTag !== 'INFINITY' && errorTag !== 'STRING' && errorTag !== 'STRING_START' && errorTag !== 'REGEX' && errorTag !== 'REGEX_START': - return errorTag.replace(/_START$/, '').toLowerCase(); - default: - return helpers.nameWhitespaceCharacter(errorText); - } - })(); - return helpers.throwSyntaxError("unexpected " + errorText, errorLoc); - }; - - formatSourcePosition = function(frame, getSourceMapping) { - var as, column, fileLocation, filename, functionName, isConstructor, isMethodCall, line, methodName, source, tp, typeName; - filename = void 0; - fileLocation = ''; - if (frame.isNative()) { - fileLocation = "native"; - } else { - if (frame.isEval()) { - filename = frame.getScriptNameOrSourceURL(); - if (!filename) { - fileLocation = (frame.getEvalOrigin()) + ", "; - } - } else { - filename = frame.getFileName(); - } - filename || (filename = ""); - line = frame.getLineNumber(); - column = frame.getColumnNumber(); - source = getSourceMapping(filename, line, column); - fileLocation = source ? filename + ":" + source[0] + ":" + source[1] : filename + ":" + line + ":" + column; - } - functionName = frame.getFunctionName(); - isConstructor = frame.isConstructor(); - isMethodCall = !(frame.isToplevel() || isConstructor); - if (isMethodCall) { - methodName = frame.getMethodName(); - typeName = frame.getTypeName(); - if (functionName) { - tp = as = ''; - if (typeName && functionName.indexOf(typeName)) { - tp = typeName + "."; - } - if (methodName && functionName.indexOf("." + methodName) !== functionName.length - methodName.length - 1) { - as = " [as " + methodName + "]"; - } - return "" + tp + functionName + as + " (" + fileLocation + ")"; - } else { - return typeName + "." + (methodName || '') + " (" + fileLocation + ")"; - } - } else if (isConstructor) { - return "new " + (functionName || '') + " (" + fileLocation + ")"; - } else if (functionName) { - return functionName + " (" + fileLocation + ")"; - } else { - return fileLocation; - } - }; - - getSourceMap = function(filename) { - var answer; - if (sourceMaps[filename] != null) { - return sourceMaps[filename]; - } else if (sourceMaps[''] != null) { - return sourceMaps['']; - } else if (sources[filename] != null) { - answer = compile(sources[filename], { - filename: filename, - sourceMap: true, - literate: helpers.isLiterate(filename) - }); - return answer.sourceMap; - } else { - return null; - } - }; - - Error.prepareStackTrace = function(err, stack) { - var frame, frames, getSourceMapping; - getSourceMapping = function(filename, line, column) { - var answer, sourceMap; - sourceMap = getSourceMap(filename); - if (sourceMap != null) { - answer = sourceMap.sourceLocation([line - 1, column - 1]); - } - if (answer != null) { - return [answer[0] + 1, answer[1] + 1]; - } else { - return null; - } - }; - frames = (function() { - var j, len1, results; - results = []; - for (j = 0, len1 = stack.length; j < len1; j++) { - frame = stack[j]; - if (frame.getFunction() === exports.run) { - break; - } - results.push(" at " + (formatSourcePosition(frame, getSourceMapping))); - } - return results; - })(); - return (err.toString()) + "\n" + (frames.join('\n')) + "\n"; - }; - -}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/command.js b/deploy/node_modules/coffee-script/lib/coffee-script/command.js deleted file mode 100644 index 59f11ac..0000000 --- a/deploy/node_modules/coffee-script/lib/coffee-script/command.js +++ /dev/null @@ -1,610 +0,0 @@ -// Generated by CoffeeScript 1.12.7 -(function() { - var BANNER, CoffeeScript, EventEmitter, SWITCHES, compileJoin, compileOptions, compilePath, compileScript, compileStdio, exec, findDirectoryIndex, forkNode, fs, helpers, hidden, joinTimeout, makePrelude, mkdirp, notSources, optionParser, optparse, opts, outputPath, parseOptions, path, printLine, printTokens, printWarn, ref, removeSource, removeSourceDir, silentUnlink, sourceCode, sources, spawn, timeLog, usage, useWinPathSep, version, wait, watch, watchDir, watchedDirs, writeJs, - indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - fs = require('fs'); - - path = require('path'); - - helpers = require('./helpers'); - - optparse = require('./optparse'); - - CoffeeScript = require('./coffee-script'); - - ref = require('child_process'), spawn = ref.spawn, exec = ref.exec; - - EventEmitter = require('events').EventEmitter; - - useWinPathSep = path.sep === '\\'; - - helpers.extend(CoffeeScript, new EventEmitter); - - printLine = function(line) { - return process.stdout.write(line + '\n'); - }; - - printWarn = function(line) { - return process.stderr.write(line + '\n'); - }; - - hidden = function(file) { - return /^\.|~$/.test(file); - }; - - BANNER = 'Usage: coffee [options] path/to/script.coffee -- [args]\n\nIf called without options, `coffee` will run your script.'; - - SWITCHES = [['-b', '--bare', 'compile without a top-level function wrapper'], ['-c', '--compile', 'compile to JavaScript and save as .js files'], ['-e', '--eval', 'pass a string from the command line as input'], ['-h', '--help', 'display this help message'], ['-i', '--interactive', 'run an interactive CoffeeScript REPL'], ['-j', '--join [FILE]', 'concatenate the source CoffeeScript before compiling'], ['-m', '--map', 'generate source map and save as .js.map files'], ['-M', '--inline-map', 'generate source map and include it directly in output'], ['-n', '--nodes', 'print out the parse tree that the parser produces'], ['--nodejs [ARGS]', 'pass options directly to the "node" binary'], ['--no-header', 'suppress the "Generated by" header'], ['-o', '--output [DIR]', 'set the output directory for compiled JavaScript'], ['-p', '--print', 'print out the compiled JavaScript'], ['-r', '--require [MODULE*]', 'require the given module before eval or REPL'], ['-s', '--stdio', 'listen for and compile scripts over stdio'], ['-l', '--literate', 'treat stdio as literate style coffee-script'], ['-t', '--tokens', 'print out the tokens that the lexer/rewriter produce'], ['-v', '--version', 'display the version number'], ['-w', '--watch', 'watch scripts for changes and rerun commands']]; - - opts = {}; - - sources = []; - - sourceCode = []; - - notSources = {}; - - watchedDirs = {}; - - optionParser = null; - - exports.run = function() { - var i, len, literals, ref1, replCliOpts, results, source; - parseOptions(); - replCliOpts = { - useGlobal: true - }; - if (opts.require) { - opts.prelude = makePrelude(opts.require); - } - replCliOpts.prelude = opts.prelude; - if (opts.nodejs) { - return forkNode(); - } - if (opts.help) { - return usage(); - } - if (opts.version) { - return version(); - } - if (opts.interactive) { - return require('./repl').start(replCliOpts); - } - if (opts.stdio) { - return compileStdio(); - } - if (opts["eval"]) { - return compileScript(null, opts["arguments"][0]); - } - if (!opts["arguments"].length) { - return require('./repl').start(replCliOpts); - } - literals = opts.run ? opts["arguments"].splice(1) : []; - process.argv = process.argv.slice(0, 2).concat(literals); - process.argv[0] = 'coffee'; - if (opts.output) { - opts.output = path.resolve(opts.output); - } - if (opts.join) { - opts.join = path.resolve(opts.join); - console.error('\nThe --join option is deprecated and will be removed in a future version.\n\nIf for some reason it\'s necessary to share local variables between files,\nreplace...\n\n $ coffee --compile --join bundle.js -- a.coffee b.coffee c.coffee\n\nwith...\n\n $ cat a.coffee b.coffee c.coffee | coffee --compile --stdio > bundle.js\n'); - } - ref1 = opts["arguments"]; - results = []; - for (i = 0, len = ref1.length; i < len; i++) { - source = ref1[i]; - source = path.resolve(source); - results.push(compilePath(source, true, source)); - } - return results; - }; - - makePrelude = function(requires) { - return requires.map(function(module) { - var _, match, name; - if (match = module.match(/^(.*)=(.*)$/)) { - _ = match[0], name = match[1], module = match[2]; - } - name || (name = helpers.baseFileName(module, true, useWinPathSep)); - return name + " = require('" + module + "')"; - }).join(';'); - }; - - compilePath = function(source, topLevel, base) { - var code, err, file, files, i, len, results, stats; - if (indexOf.call(sources, source) >= 0 || watchedDirs[source] || !topLevel && (notSources[source] || hidden(source))) { - return; - } - try { - stats = fs.statSync(source); - } catch (error) { - err = error; - if (err.code === 'ENOENT') { - console.error("File not found: " + source); - process.exit(1); - } - throw err; - } - if (stats.isDirectory()) { - if (path.basename(source) === 'node_modules') { - notSources[source] = true; - return; - } - if (opts.run) { - compilePath(findDirectoryIndex(source), topLevel, base); - return; - } - if (opts.watch) { - watchDir(source, base); - } - try { - files = fs.readdirSync(source); - } catch (error) { - err = error; - if (err.code === 'ENOENT') { - return; - } else { - throw err; - } - } - results = []; - for (i = 0, len = files.length; i < len; i++) { - file = files[i]; - results.push(compilePath(path.join(source, file), false, base)); - } - return results; - } else if (topLevel || helpers.isCoffee(source)) { - sources.push(source); - sourceCode.push(null); - delete notSources[source]; - if (opts.watch) { - watch(source, base); - } - try { - code = fs.readFileSync(source); - } catch (error) { - err = error; - if (err.code === 'ENOENT') { - return; - } else { - throw err; - } - } - return compileScript(source, code.toString(), base); - } else { - return notSources[source] = true; - } - }; - - findDirectoryIndex = function(source) { - var err, ext, i, index, len, ref1; - ref1 = CoffeeScript.FILE_EXTENSIONS; - for (i = 0, len = ref1.length; i < len; i++) { - ext = ref1[i]; - index = path.join(source, "index" + ext); - try { - if ((fs.statSync(index)).isFile()) { - return index; - } - } catch (error) { - err = error; - if (err.code !== 'ENOENT') { - throw err; - } - } - } - console.error("Missing index.coffee or index.litcoffee in " + source); - return process.exit(1); - }; - - compileScript = function(file, input, base) { - var compiled, err, message, o, options, t, task; - if (base == null) { - base = null; - } - o = opts; - options = compileOptions(file, base); - try { - t = task = { - file: file, - input: input, - options: options - }; - CoffeeScript.emit('compile', task); - if (o.tokens) { - return printTokens(CoffeeScript.tokens(t.input, t.options)); - } else if (o.nodes) { - return printLine(CoffeeScript.nodes(t.input, t.options).toString().trim()); - } else if (o.run) { - CoffeeScript.register(); - if (opts.prelude) { - CoffeeScript["eval"](opts.prelude, t.options); - } - return CoffeeScript.run(t.input, t.options); - } else if (o.join && t.file !== o.join) { - if (helpers.isLiterate(file)) { - t.input = helpers.invertLiterate(t.input); - } - sourceCode[sources.indexOf(t.file)] = t.input; - return compileJoin(); - } else { - compiled = CoffeeScript.compile(t.input, t.options); - t.output = compiled; - if (o.map) { - t.output = compiled.js; - t.sourceMap = compiled.v3SourceMap; - } - CoffeeScript.emit('success', task); - if (o.print) { - return printLine(t.output.trim()); - } else if (o.compile || o.map) { - return writeJs(base, t.file, t.output, options.jsPath, t.sourceMap); - } - } - } catch (error) { - err = error; - CoffeeScript.emit('failure', err, task); - if (CoffeeScript.listeners('failure').length) { - return; - } - message = (err != null ? err.stack : void 0) || ("" + err); - if (o.watch) { - return printLine(message + '\x07'); - } else { - printWarn(message); - return process.exit(1); - } - } - }; - - compileStdio = function() { - var buffers, stdin; - buffers = []; - stdin = process.openStdin(); - stdin.on('data', function(buffer) { - if (buffer) { - return buffers.push(buffer); - } - }); - return stdin.on('end', function() { - return compileScript(null, Buffer.concat(buffers).toString()); - }); - }; - - joinTimeout = null; - - compileJoin = function() { - if (!opts.join) { - return; - } - if (!sourceCode.some(function(code) { - return code === null; - })) { - clearTimeout(joinTimeout); - return joinTimeout = wait(100, function() { - return compileScript(opts.join, sourceCode.join('\n'), opts.join); - }); - } - }; - - watch = function(source, base) { - var compile, compileTimeout, err, prevStats, rewatch, startWatcher, watchErr, watcher; - watcher = null; - prevStats = null; - compileTimeout = null; - watchErr = function(err) { - if (err.code !== 'ENOENT') { - throw err; - } - if (indexOf.call(sources, source) < 0) { - return; - } - try { - rewatch(); - return compile(); - } catch (error) { - removeSource(source, base); - return compileJoin(); - } - }; - compile = function() { - clearTimeout(compileTimeout); - return compileTimeout = wait(25, function() { - return fs.stat(source, function(err, stats) { - if (err) { - return watchErr(err); - } - if (prevStats && stats.size === prevStats.size && stats.mtime.getTime() === prevStats.mtime.getTime()) { - return rewatch(); - } - prevStats = stats; - return fs.readFile(source, function(err, code) { - if (err) { - return watchErr(err); - } - compileScript(source, code.toString(), base); - return rewatch(); - }); - }); - }); - }; - startWatcher = function() { - return watcher = fs.watch(source).on('change', compile).on('error', function(err) { - if (err.code !== 'EPERM') { - throw err; - } - return removeSource(source, base); - }); - }; - rewatch = function() { - if (watcher != null) { - watcher.close(); - } - return startWatcher(); - }; - try { - return startWatcher(); - } catch (error) { - err = error; - return watchErr(err); - } - }; - - watchDir = function(source, base) { - var err, readdirTimeout, startWatcher, stopWatcher, watcher; - watcher = null; - readdirTimeout = null; - startWatcher = function() { - return watcher = fs.watch(source).on('error', function(err) { - if (err.code !== 'EPERM') { - throw err; - } - return stopWatcher(); - }).on('change', function() { - clearTimeout(readdirTimeout); - return readdirTimeout = wait(25, function() { - var err, file, files, i, len, results; - try { - files = fs.readdirSync(source); - } catch (error) { - err = error; - if (err.code !== 'ENOENT') { - throw err; - } - return stopWatcher(); - } - results = []; - for (i = 0, len = files.length; i < len; i++) { - file = files[i]; - results.push(compilePath(path.join(source, file), false, base)); - } - return results; - }); - }); - }; - stopWatcher = function() { - watcher.close(); - return removeSourceDir(source, base); - }; - watchedDirs[source] = true; - try { - return startWatcher(); - } catch (error) { - err = error; - if (err.code !== 'ENOENT') { - throw err; - } - } - }; - - removeSourceDir = function(source, base) { - var file, i, len, sourcesChanged; - delete watchedDirs[source]; - sourcesChanged = false; - for (i = 0, len = sources.length; i < len; i++) { - file = sources[i]; - if (!(source === path.dirname(file))) { - continue; - } - removeSource(file, base); - sourcesChanged = true; - } - if (sourcesChanged) { - return compileJoin(); - } - }; - - removeSource = function(source, base) { - var index; - index = sources.indexOf(source); - sources.splice(index, 1); - sourceCode.splice(index, 1); - if (!opts.join) { - silentUnlink(outputPath(source, base)); - silentUnlink(outputPath(source, base, '.js.map')); - return timeLog("removed " + source); - } - }; - - silentUnlink = function(path) { - var err, ref1; - try { - return fs.unlinkSync(path); - } catch (error) { - err = error; - if ((ref1 = err.code) !== 'ENOENT' && ref1 !== 'EPERM') { - throw err; - } - } - }; - - outputPath = function(source, base, extension) { - var basename, dir, srcDir; - if (extension == null) { - extension = ".js"; - } - basename = helpers.baseFileName(source, true, useWinPathSep); - srcDir = path.dirname(source); - if (!opts.output) { - dir = srcDir; - } else if (source === base) { - dir = opts.output; - } else { - dir = path.join(opts.output, path.relative(base, srcDir)); - } - return path.join(dir, basename + extension); - }; - - mkdirp = function(dir, fn) { - var mkdirs, mode; - mode = 0x1ff & ~process.umask(); - return (mkdirs = function(p, fn) { - return fs.exists(p, function(exists) { - if (exists) { - return fn(); - } else { - return mkdirs(path.dirname(p), function() { - return fs.mkdir(p, mode, function(err) { - if (err) { - return fn(err); - } - return fn(); - }); - }); - } - }); - })(dir, fn); - }; - - writeJs = function(base, sourcePath, js, jsPath, generatedSourceMap) { - var compile, jsDir, sourceMapPath; - if (generatedSourceMap == null) { - generatedSourceMap = null; - } - sourceMapPath = outputPath(sourcePath, base, ".js.map"); - jsDir = path.dirname(jsPath); - compile = function() { - if (opts.compile) { - if (js.length <= 0) { - js = ' '; - } - if (generatedSourceMap) { - js = js + "\n//# sourceMappingURL=" + (helpers.baseFileName(sourceMapPath, false, useWinPathSep)) + "\n"; - } - fs.writeFile(jsPath, js, function(err) { - if (err) { - printLine(err.message); - return process.exit(1); - } else if (opts.compile && opts.watch) { - return timeLog("compiled " + sourcePath); - } - }); - } - if (generatedSourceMap) { - return fs.writeFile(sourceMapPath, generatedSourceMap, function(err) { - if (err) { - printLine("Could not write source map: " + err.message); - return process.exit(1); - } - }); - } - }; - return fs.exists(jsDir, function(itExists) { - if (itExists) { - return compile(); - } else { - return mkdirp(jsDir, compile); - } - }); - }; - - wait = function(milliseconds, func) { - return setTimeout(func, milliseconds); - }; - - timeLog = function(message) { - return console.log(((new Date).toLocaleTimeString()) + " - " + message); - }; - - printTokens = function(tokens) { - var strings, tag, token, value; - strings = (function() { - var i, len, results; - results = []; - for (i = 0, len = tokens.length; i < len; i++) { - token = tokens[i]; - tag = token[0]; - value = token[1].toString().replace(/\n/, '\\n'); - results.push("[" + tag + " " + value + "]"); - } - return results; - })(); - return printLine(strings.join(' ')); - }; - - parseOptions = function() { - var o; - optionParser = new optparse.OptionParser(SWITCHES, BANNER); - o = opts = optionParser.parse(process.argv.slice(2)); - o.compile || (o.compile = !!o.output); - o.run = !(o.compile || o.print || o.map); - return o.print = !!(o.print || (o["eval"] || o.stdio && o.compile)); - }; - - compileOptions = function(filename, base) { - var answer, cwd, jsDir, jsPath; - answer = { - filename: filename, - literate: opts.literate || helpers.isLiterate(filename), - bare: opts.bare, - header: opts.compile && !opts['no-header'], - sourceMap: opts.map, - inlineMap: opts['inline-map'] - }; - if (filename) { - if (base) { - cwd = process.cwd(); - jsPath = outputPath(filename, base); - jsDir = path.dirname(jsPath); - answer = helpers.merge(answer, { - jsPath: jsPath, - sourceRoot: path.relative(jsDir, cwd), - sourceFiles: [path.relative(cwd, filename)], - generatedFile: helpers.baseFileName(jsPath, false, useWinPathSep) - }); - } else { - answer = helpers.merge(answer, { - sourceRoot: "", - sourceFiles: [helpers.baseFileName(filename, false, useWinPathSep)], - generatedFile: helpers.baseFileName(filename, true, useWinPathSep) + ".js" - }); - } - } - return answer; - }; - - forkNode = function() { - var args, nodeArgs, p; - nodeArgs = opts.nodejs.split(/\s+/); - args = process.argv.slice(1); - args.splice(args.indexOf('--nodejs'), 2); - p = spawn(process.execPath, nodeArgs.concat(args), { - cwd: process.cwd(), - env: process.env, - stdio: [0, 1, 2] - }); - return p.on('exit', function(code) { - return process.exit(code); - }); - }; - - usage = function() { - return printLine((new optparse.OptionParser(SWITCHES, BANNER)).help()); - }; - - version = function() { - return printLine("CoffeeScript version " + CoffeeScript.VERSION); - }; - -}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/grammar.js b/deploy/node_modules/coffee-script/lib/coffee-script/grammar.js deleted file mode 100644 index b0f6e80..0000000 --- a/deploy/node_modules/coffee-script/lib/coffee-script/grammar.js +++ /dev/null @@ -1,816 +0,0 @@ -// Generated by CoffeeScript 1.12.7 -(function() { - var Parser, alt, alternatives, grammar, name, o, operators, token, tokens, unwrap; - - Parser = require('jison').Parser; - - unwrap = /^function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/; - - o = function(patternString, action, options) { - var addLocationDataFn, match, patternCount; - patternString = patternString.replace(/\s{2,}/g, ' '); - patternCount = patternString.split(' ').length; - if (!action) { - return [patternString, '$$ = $1;', options]; - } - action = (match = unwrap.exec(action)) ? match[1] : "(" + action + "())"; - action = action.replace(/\bnew /g, '$&yy.'); - action = action.replace(/\b(?:Block\.wrap|extend)\b/g, 'yy.$&'); - addLocationDataFn = function(first, last) { - if (!last) { - return "yy.addLocationDataFn(@" + first + ")"; - } else { - return "yy.addLocationDataFn(@" + first + ", @" + last + ")"; - } - }; - action = action.replace(/LOC\(([0-9]*)\)/g, addLocationDataFn('$1')); - action = action.replace(/LOC\(([0-9]*),\s*([0-9]*)\)/g, addLocationDataFn('$1', '$2')); - return [patternString, "$$ = " + (addLocationDataFn(1, patternCount)) + "(" + action + ");", options]; - }; - - grammar = { - Root: [ - o('', function() { - return new Block; - }), o('Body') - ], - Body: [ - o('Line', function() { - return Block.wrap([$1]); - }), o('Body TERMINATOR Line', function() { - return $1.push($3); - }), o('Body TERMINATOR') - ], - Line: [o('Expression'), o('Statement'), o('YieldReturn')], - Statement: [ - o('Return'), o('Comment'), o('STATEMENT', function() { - return new StatementLiteral($1); - }), o('Import'), o('Export') - ], - Expression: [o('Value'), o('Invocation'), o('Code'), o('Operation'), o('Assign'), o('If'), o('Try'), o('While'), o('For'), o('Switch'), o('Class'), o('Throw'), o('Yield')], - Yield: [ - o('YIELD', function() { - return new Op($1, new Value(new Literal(''))); - }), o('YIELD Expression', function() { - return new Op($1, $2); - }), o('YIELD FROM Expression', function() { - return new Op($1.concat($2), $3); - }) - ], - Block: [ - o('INDENT OUTDENT', function() { - return new Block; - }), o('INDENT Body OUTDENT', function() { - return $2; - }) - ], - Identifier: [ - o('IDENTIFIER', function() { - return new IdentifierLiteral($1); - }) - ], - Property: [ - o('PROPERTY', function() { - return new PropertyName($1); - }) - ], - AlphaNumeric: [ - o('NUMBER', function() { - return new NumberLiteral($1); - }), o('String') - ], - String: [ - o('STRING', function() { - return new StringLiteral($1); - }), o('STRING_START Body STRING_END', function() { - return new StringWithInterpolations($2); - }) - ], - Regex: [ - o('REGEX', function() { - return new RegexLiteral($1); - }), o('REGEX_START Invocation REGEX_END', function() { - return new RegexWithInterpolations($2.args); - }) - ], - Literal: [ - o('AlphaNumeric'), o('JS', function() { - return new PassthroughLiteral($1); - }), o('Regex'), o('UNDEFINED', function() { - return new UndefinedLiteral; - }), o('NULL', function() { - return new NullLiteral; - }), o('BOOL', function() { - return new BooleanLiteral($1); - }), o('INFINITY', function() { - return new InfinityLiteral($1); - }), o('NAN', function() { - return new NaNLiteral; - }) - ], - Assign: [ - o('Assignable = Expression', function() { - return new Assign($1, $3); - }), o('Assignable = TERMINATOR Expression', function() { - return new Assign($1, $4); - }), o('Assignable = INDENT Expression OUTDENT', function() { - return new Assign($1, $4); - }) - ], - AssignObj: [ - o('ObjAssignable', function() { - return new Value($1); - }), o('ObjAssignable : Expression', function() { - return new Assign(LOC(1)(new Value($1)), $3, 'object', { - operatorToken: LOC(2)(new Literal($2)) - }); - }), o('ObjAssignable : INDENT Expression OUTDENT', function() { - return new Assign(LOC(1)(new Value($1)), $4, 'object', { - operatorToken: LOC(2)(new Literal($2)) - }); - }), o('SimpleObjAssignable = Expression', function() { - return new Assign(LOC(1)(new Value($1)), $3, null, { - operatorToken: LOC(2)(new Literal($2)) - }); - }), o('SimpleObjAssignable = INDENT Expression OUTDENT', function() { - return new Assign(LOC(1)(new Value($1)), $4, null, { - operatorToken: LOC(2)(new Literal($2)) - }); - }), o('Comment') - ], - SimpleObjAssignable: [o('Identifier'), o('Property'), o('ThisProperty')], - ObjAssignable: [o('SimpleObjAssignable'), o('AlphaNumeric')], - Return: [ - o('RETURN Expression', function() { - return new Return($2); - }), o('RETURN INDENT Object OUTDENT', function() { - return new Return(new Value($3)); - }), o('RETURN', function() { - return new Return; - }) - ], - YieldReturn: [ - o('YIELD RETURN Expression', function() { - return new YieldReturn($3); - }), o('YIELD RETURN', function() { - return new YieldReturn; - }) - ], - Comment: [ - o('HERECOMMENT', function() { - return new Comment($1); - }) - ], - Code: [ - o('PARAM_START ParamList PARAM_END FuncGlyph Block', function() { - return new Code($2, $5, $4); - }), o('FuncGlyph Block', function() { - return new Code([], $2, $1); - }) - ], - FuncGlyph: [ - o('->', function() { - return 'func'; - }), o('=>', function() { - return 'boundfunc'; - }) - ], - OptComma: [o(''), o(',')], - ParamList: [ - o('', function() { - return []; - }), o('Param', function() { - return [$1]; - }), o('ParamList , Param', function() { - return $1.concat($3); - }), o('ParamList OptComma TERMINATOR Param', function() { - return $1.concat($4); - }), o('ParamList OptComma INDENT ParamList OptComma OUTDENT', function() { - return $1.concat($4); - }) - ], - Param: [ - o('ParamVar', function() { - return new Param($1); - }), o('ParamVar ...', function() { - return new Param($1, null, true); - }), o('ParamVar = Expression', function() { - return new Param($1, $3); - }), o('...', function() { - return new Expansion; - }) - ], - ParamVar: [o('Identifier'), o('ThisProperty'), o('Array'), o('Object')], - Splat: [ - o('Expression ...', function() { - return new Splat($1); - }) - ], - SimpleAssignable: [ - o('Identifier', function() { - return new Value($1); - }), o('Value Accessor', function() { - return $1.add($2); - }), o('Invocation Accessor', function() { - return new Value($1, [].concat($2)); - }), o('ThisProperty') - ], - Assignable: [ - o('SimpleAssignable'), o('Array', function() { - return new Value($1); - }), o('Object', function() { - return new Value($1); - }) - ], - Value: [ - o('Assignable'), o('Literal', function() { - return new Value($1); - }), o('Parenthetical', function() { - return new Value($1); - }), o('Range', function() { - return new Value($1); - }), o('This') - ], - Accessor: [ - o('. Property', function() { - return new Access($2); - }), o('?. Property', function() { - return new Access($2, 'soak'); - }), o(':: Property', function() { - return [LOC(1)(new Access(new PropertyName('prototype'))), LOC(2)(new Access($2))]; - }), o('?:: Property', function() { - return [LOC(1)(new Access(new PropertyName('prototype'), 'soak')), LOC(2)(new Access($2))]; - }), o('::', function() { - return new Access(new PropertyName('prototype')); - }), o('Index') - ], - Index: [ - o('INDEX_START IndexValue INDEX_END', function() { - return $2; - }), o('INDEX_SOAK Index', function() { - return extend($2, { - soak: true - }); - }) - ], - IndexValue: [ - o('Expression', function() { - return new Index($1); - }), o('Slice', function() { - return new Slice($1); - }) - ], - Object: [ - o('{ AssignList OptComma }', function() { - return new Obj($2, $1.generated); - }) - ], - AssignList: [ - o('', function() { - return []; - }), o('AssignObj', function() { - return [$1]; - }), o('AssignList , AssignObj', function() { - return $1.concat($3); - }), o('AssignList OptComma TERMINATOR AssignObj', function() { - return $1.concat($4); - }), o('AssignList OptComma INDENT AssignList OptComma OUTDENT', function() { - return $1.concat($4); - }) - ], - Class: [ - o('CLASS', function() { - return new Class; - }), o('CLASS Block', function() { - return new Class(null, null, $2); - }), o('CLASS EXTENDS Expression', function() { - return new Class(null, $3); - }), o('CLASS EXTENDS Expression Block', function() { - return new Class(null, $3, $4); - }), o('CLASS SimpleAssignable', function() { - return new Class($2); - }), o('CLASS SimpleAssignable Block', function() { - return new Class($2, null, $3); - }), o('CLASS SimpleAssignable EXTENDS Expression', function() { - return new Class($2, $4); - }), o('CLASS SimpleAssignable EXTENDS Expression Block', function() { - return new Class($2, $4, $5); - }) - ], - Import: [ - o('IMPORT String', function() { - return new ImportDeclaration(null, $2); - }), o('IMPORT ImportDefaultSpecifier FROM String', function() { - return new ImportDeclaration(new ImportClause($2, null), $4); - }), o('IMPORT ImportNamespaceSpecifier FROM String', function() { - return new ImportDeclaration(new ImportClause(null, $2), $4); - }), o('IMPORT { } FROM String', function() { - return new ImportDeclaration(new ImportClause(null, new ImportSpecifierList([])), $5); - }), o('IMPORT { ImportSpecifierList OptComma } FROM String', function() { - return new ImportDeclaration(new ImportClause(null, new ImportSpecifierList($3)), $7); - }), o('IMPORT ImportDefaultSpecifier , ImportNamespaceSpecifier FROM String', function() { - return new ImportDeclaration(new ImportClause($2, $4), $6); - }), o('IMPORT ImportDefaultSpecifier , { ImportSpecifierList OptComma } FROM String', function() { - return new ImportDeclaration(new ImportClause($2, new ImportSpecifierList($5)), $9); - }) - ], - ImportSpecifierList: [ - o('ImportSpecifier', function() { - return [$1]; - }), o('ImportSpecifierList , ImportSpecifier', function() { - return $1.concat($3); - }), o('ImportSpecifierList OptComma TERMINATOR ImportSpecifier', function() { - return $1.concat($4); - }), o('INDENT ImportSpecifierList OptComma OUTDENT', function() { - return $2; - }), o('ImportSpecifierList OptComma INDENT ImportSpecifierList OptComma OUTDENT', function() { - return $1.concat($4); - }) - ], - ImportSpecifier: [ - o('Identifier', function() { - return new ImportSpecifier($1); - }), o('Identifier AS Identifier', function() { - return new ImportSpecifier($1, $3); - }), o('DEFAULT', function() { - return new ImportSpecifier(new Literal($1)); - }), o('DEFAULT AS Identifier', function() { - return new ImportSpecifier(new Literal($1), $3); - }) - ], - ImportDefaultSpecifier: [ - o('Identifier', function() { - return new ImportDefaultSpecifier($1); - }) - ], - ImportNamespaceSpecifier: [ - o('IMPORT_ALL AS Identifier', function() { - return new ImportNamespaceSpecifier(new Literal($1), $3); - }) - ], - Export: [ - o('EXPORT { }', function() { - return new ExportNamedDeclaration(new ExportSpecifierList([])); - }), o('EXPORT { ExportSpecifierList OptComma }', function() { - return new ExportNamedDeclaration(new ExportSpecifierList($3)); - }), o('EXPORT Class', function() { - return new ExportNamedDeclaration($2); - }), o('EXPORT Identifier = Expression', function() { - return new ExportNamedDeclaration(new Assign($2, $4, null, { - moduleDeclaration: 'export' - })); - }), o('EXPORT Identifier = TERMINATOR Expression', function() { - return new ExportNamedDeclaration(new Assign($2, $5, null, { - moduleDeclaration: 'export' - })); - }), o('EXPORT Identifier = INDENT Expression OUTDENT', function() { - return new ExportNamedDeclaration(new Assign($2, $5, null, { - moduleDeclaration: 'export' - })); - }), o('EXPORT DEFAULT Expression', function() { - return new ExportDefaultDeclaration($3); - }), o('EXPORT EXPORT_ALL FROM String', function() { - return new ExportAllDeclaration(new Literal($2), $4); - }), o('EXPORT { ExportSpecifierList OptComma } FROM String', function() { - return new ExportNamedDeclaration(new ExportSpecifierList($3), $7); - }) - ], - ExportSpecifierList: [ - o('ExportSpecifier', function() { - return [$1]; - }), o('ExportSpecifierList , ExportSpecifier', function() { - return $1.concat($3); - }), o('ExportSpecifierList OptComma TERMINATOR ExportSpecifier', function() { - return $1.concat($4); - }), o('INDENT ExportSpecifierList OptComma OUTDENT', function() { - return $2; - }), o('ExportSpecifierList OptComma INDENT ExportSpecifierList OptComma OUTDENT', function() { - return $1.concat($4); - }) - ], - ExportSpecifier: [ - o('Identifier', function() { - return new ExportSpecifier($1); - }), o('Identifier AS Identifier', function() { - return new ExportSpecifier($1, $3); - }), o('Identifier AS DEFAULT', function() { - return new ExportSpecifier($1, new Literal($3)); - }), o('DEFAULT', function() { - return new ExportSpecifier(new Literal($1)); - }), o('DEFAULT AS Identifier', function() { - return new ExportSpecifier(new Literal($1), $3); - }) - ], - Invocation: [ - o('Value OptFuncExist String', function() { - return new TaggedTemplateCall($1, $3, $2); - }), o('Value OptFuncExist Arguments', function() { - return new Call($1, $3, $2); - }), o('Invocation OptFuncExist Arguments', function() { - return new Call($1, $3, $2); - }), o('Super') - ], - Super: [ - o('SUPER', function() { - return new SuperCall; - }), o('SUPER Arguments', function() { - return new SuperCall($2); - }) - ], - OptFuncExist: [ - o('', function() { - return false; - }), o('FUNC_EXIST', function() { - return true; - }) - ], - Arguments: [ - o('CALL_START CALL_END', function() { - return []; - }), o('CALL_START ArgList OptComma CALL_END', function() { - return $2; - }) - ], - This: [ - o('THIS', function() { - return new Value(new ThisLiteral); - }), o('@', function() { - return new Value(new ThisLiteral); - }) - ], - ThisProperty: [ - o('@ Property', function() { - return new Value(LOC(1)(new ThisLiteral), [LOC(2)(new Access($2))], 'this'); - }) - ], - Array: [ - o('[ ]', function() { - return new Arr([]); - }), o('[ ArgList OptComma ]', function() { - return new Arr($2); - }) - ], - RangeDots: [ - o('..', function() { - return 'inclusive'; - }), o('...', function() { - return 'exclusive'; - }) - ], - Range: [ - o('[ Expression RangeDots Expression ]', function() { - return new Range($2, $4, $3); - }) - ], - Slice: [ - o('Expression RangeDots Expression', function() { - return new Range($1, $3, $2); - }), o('Expression RangeDots', function() { - return new Range($1, null, $2); - }), o('RangeDots Expression', function() { - return new Range(null, $2, $1); - }), o('RangeDots', function() { - return new Range(null, null, $1); - }) - ], - ArgList: [ - o('Arg', function() { - return [$1]; - }), o('ArgList , Arg', function() { - return $1.concat($3); - }), o('ArgList OptComma TERMINATOR Arg', function() { - return $1.concat($4); - }), o('INDENT ArgList OptComma OUTDENT', function() { - return $2; - }), o('ArgList OptComma INDENT ArgList OptComma OUTDENT', function() { - return $1.concat($4); - }) - ], - Arg: [ - o('Expression'), o('Splat'), o('...', function() { - return new Expansion; - }) - ], - SimpleArgs: [ - o('Expression'), o('SimpleArgs , Expression', function() { - return [].concat($1, $3); - }) - ], - Try: [ - o('TRY Block', function() { - return new Try($2); - }), o('TRY Block Catch', function() { - return new Try($2, $3[0], $3[1]); - }), o('TRY Block FINALLY Block', function() { - return new Try($2, null, null, $4); - }), o('TRY Block Catch FINALLY Block', function() { - return new Try($2, $3[0], $3[1], $5); - }) - ], - Catch: [ - o('CATCH Identifier Block', function() { - return [$2, $3]; - }), o('CATCH Object Block', function() { - return [LOC(2)(new Value($2)), $3]; - }), o('CATCH Block', function() { - return [null, $2]; - }) - ], - Throw: [ - o('THROW Expression', function() { - return new Throw($2); - }) - ], - Parenthetical: [ - o('( Body )', function() { - return new Parens($2); - }), o('( INDENT Body OUTDENT )', function() { - return new Parens($3); - }) - ], - WhileSource: [ - o('WHILE Expression', function() { - return new While($2); - }), o('WHILE Expression WHEN Expression', function() { - return new While($2, { - guard: $4 - }); - }), o('UNTIL Expression', function() { - return new While($2, { - invert: true - }); - }), o('UNTIL Expression WHEN Expression', function() { - return new While($2, { - invert: true, - guard: $4 - }); - }) - ], - While: [ - o('WhileSource Block', function() { - return $1.addBody($2); - }), o('Statement WhileSource', function() { - return $2.addBody(LOC(1)(Block.wrap([$1]))); - }), o('Expression WhileSource', function() { - return $2.addBody(LOC(1)(Block.wrap([$1]))); - }), o('Loop', function() { - return $1; - }) - ], - Loop: [ - o('LOOP Block', function() { - return new While(LOC(1)(new BooleanLiteral('true'))).addBody($2); - }), o('LOOP Expression', function() { - return new While(LOC(1)(new BooleanLiteral('true'))).addBody(LOC(2)(Block.wrap([$2]))); - }) - ], - For: [ - o('Statement ForBody', function() { - return new For($1, $2); - }), o('Expression ForBody', function() { - return new For($1, $2); - }), o('ForBody Block', function() { - return new For($2, $1); - }) - ], - ForBody: [ - o('FOR Range', function() { - return { - source: LOC(2)(new Value($2)) - }; - }), o('FOR Range BY Expression', function() { - return { - source: LOC(2)(new Value($2)), - step: $4 - }; - }), o('ForStart ForSource', function() { - $2.own = $1.own; - $2.ownTag = $1.ownTag; - $2.name = $1[0]; - $2.index = $1[1]; - return $2; - }) - ], - ForStart: [ - o('FOR ForVariables', function() { - return $2; - }), o('FOR OWN ForVariables', function() { - $3.own = true; - $3.ownTag = LOC(2)(new Literal($2)); - return $3; - }) - ], - ForValue: [ - o('Identifier'), o('ThisProperty'), o('Array', function() { - return new Value($1); - }), o('Object', function() { - return new Value($1); - }) - ], - ForVariables: [ - o('ForValue', function() { - return [$1]; - }), o('ForValue , ForValue', function() { - return [$1, $3]; - }) - ], - ForSource: [ - o('FORIN Expression', function() { - return { - source: $2 - }; - }), o('FOROF Expression', function() { - return { - source: $2, - object: true - }; - }), o('FORIN Expression WHEN Expression', function() { - return { - source: $2, - guard: $4 - }; - }), o('FOROF Expression WHEN Expression', function() { - return { - source: $2, - guard: $4, - object: true - }; - }), o('FORIN Expression BY Expression', function() { - return { - source: $2, - step: $4 - }; - }), o('FORIN Expression WHEN Expression BY Expression', function() { - return { - source: $2, - guard: $4, - step: $6 - }; - }), o('FORIN Expression BY Expression WHEN Expression', function() { - return { - source: $2, - step: $4, - guard: $6 - }; - }), o('FORFROM Expression', function() { - return { - source: $2, - from: true - }; - }), o('FORFROM Expression WHEN Expression', function() { - return { - source: $2, - guard: $4, - from: true - }; - }) - ], - Switch: [ - o('SWITCH Expression INDENT Whens OUTDENT', function() { - return new Switch($2, $4); - }), o('SWITCH Expression INDENT Whens ELSE Block OUTDENT', function() { - return new Switch($2, $4, $6); - }), o('SWITCH INDENT Whens OUTDENT', function() { - return new Switch(null, $3); - }), o('SWITCH INDENT Whens ELSE Block OUTDENT', function() { - return new Switch(null, $3, $5); - }) - ], - Whens: [ - o('When'), o('Whens When', function() { - return $1.concat($2); - }) - ], - When: [ - o('LEADING_WHEN SimpleArgs Block', function() { - return [[$2, $3]]; - }), o('LEADING_WHEN SimpleArgs Block TERMINATOR', function() { - return [[$2, $3]]; - }) - ], - IfBlock: [ - o('IF Expression Block', function() { - return new If($2, $3, { - type: $1 - }); - }), o('IfBlock ELSE IF Expression Block', function() { - return $1.addElse(LOC(3, 5)(new If($4, $5, { - type: $3 - }))); - }) - ], - If: [ - o('IfBlock'), o('IfBlock ELSE Block', function() { - return $1.addElse($3); - }), o('Statement POST_IF Expression', function() { - return new If($3, LOC(1)(Block.wrap([$1])), { - type: $2, - statement: true - }); - }), o('Expression POST_IF Expression', function() { - return new If($3, LOC(1)(Block.wrap([$1])), { - type: $2, - statement: true - }); - }) - ], - Operation: [ - o('UNARY Expression', function() { - return new Op($1, $2); - }), o('UNARY_MATH Expression', function() { - return new Op($1, $2); - }), o('- Expression', (function() { - return new Op('-', $2); - }), { - prec: 'UNARY_MATH' - }), o('+ Expression', (function() { - return new Op('+', $2); - }), { - prec: 'UNARY_MATH' - }), o('-- SimpleAssignable', function() { - return new Op('--', $2); - }), o('++ SimpleAssignable', function() { - return new Op('++', $2); - }), o('SimpleAssignable --', function() { - return new Op('--', $1, null, true); - }), o('SimpleAssignable ++', function() { - return new Op('++', $1, null, true); - }), o('Expression ?', function() { - return new Existence($1); - }), o('Expression + Expression', function() { - return new Op('+', $1, $3); - }), o('Expression - Expression', function() { - return new Op('-', $1, $3); - }), o('Expression MATH Expression', function() { - return new Op($2, $1, $3); - }), o('Expression ** Expression', function() { - return new Op($2, $1, $3); - }), o('Expression SHIFT Expression', function() { - return new Op($2, $1, $3); - }), o('Expression COMPARE Expression', function() { - return new Op($2, $1, $3); - }), o('Expression & Expression', function() { - return new Op($2, $1, $3); - }), o('Expression ^ Expression', function() { - return new Op($2, $1, $3); - }), o('Expression | Expression', function() { - return new Op($2, $1, $3); - }), o('Expression && Expression', function() { - return new Op($2, $1, $3); - }), o('Expression || Expression', function() { - return new Op($2, $1, $3); - }), o('Expression BIN? Expression', function() { - return new Op($2, $1, $3); - }), o('Expression RELATION Expression', function() { - if ($2.charAt(0) === '!') { - return new Op($2.slice(1), $1, $3).invert(); - } else { - return new Op($2, $1, $3); - } - }), o('SimpleAssignable COMPOUND_ASSIGN Expression', function() { - return new Assign($1, $3, $2); - }), o('SimpleAssignable COMPOUND_ASSIGN INDENT Expression OUTDENT', function() { - return new Assign($1, $4, $2); - }), o('SimpleAssignable COMPOUND_ASSIGN TERMINATOR Expression', function() { - return new Assign($1, $4, $2); - }), o('SimpleAssignable EXTENDS Expression', function() { - return new Extends($1, $3); - }) - ] - }; - - operators = [['left', '.', '?.', '::', '?::'], ['left', 'CALL_START', 'CALL_END'], ['nonassoc', '++', '--'], ['left', '?'], ['right', 'UNARY'], ['right', '**'], ['right', 'UNARY_MATH'], ['left', 'MATH'], ['left', '+', '-'], ['left', 'SHIFT'], ['left', 'RELATION'], ['left', 'COMPARE'], ['left', '&'], ['left', '^'], ['left', '|'], ['left', '&&'], ['left', '||'], ['left', 'BIN?'], ['nonassoc', 'INDENT', 'OUTDENT'], ['right', 'YIELD'], ['right', '=', ':', 'COMPOUND_ASSIGN', 'RETURN', 'THROW', 'EXTENDS'], ['right', 'FORIN', 'FOROF', 'FORFROM', 'BY', 'WHEN'], ['right', 'IF', 'ELSE', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'SUPER', 'CLASS', 'IMPORT', 'EXPORT'], ['left', 'POST_IF']]; - - tokens = []; - - for (name in grammar) { - alternatives = grammar[name]; - grammar[name] = (function() { - var i, j, len, len1, ref, results; - results = []; - for (i = 0, len = alternatives.length; i < len; i++) { - alt = alternatives[i]; - ref = alt[0].split(' '); - for (j = 0, len1 = ref.length; j < len1; j++) { - token = ref[j]; - if (!grammar[token]) { - tokens.push(token); - } - } - if (name === 'Root') { - alt[1] = "return " + alt[1]; - } - results.push(alt); - } - return results; - })(); - } - - exports.parser = new Parser({ - tokens: tokens.join(' '), - bnf: grammar, - operators: operators.reverse(), - startSymbol: 'Root' - }); - -}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/helpers.js b/deploy/node_modules/coffee-script/lib/coffee-script/helpers.js deleted file mode 100644 index 043a465..0000000 --- a/deploy/node_modules/coffee-script/lib/coffee-script/helpers.js +++ /dev/null @@ -1,249 +0,0 @@ -// Generated by CoffeeScript 1.12.7 -(function() { - var buildLocationData, extend, flatten, ref, repeat, syntaxErrorToString; - - exports.starts = function(string, literal, start) { - return literal === string.substr(start, literal.length); - }; - - exports.ends = function(string, literal, back) { - var len; - len = literal.length; - return literal === string.substr(string.length - len - (back || 0), len); - }; - - exports.repeat = repeat = function(str, n) { - var res; - res = ''; - while (n > 0) { - if (n & 1) { - res += str; - } - n >>>= 1; - str += str; - } - return res; - }; - - exports.compact = function(array) { - var i, item, len1, results; - results = []; - for (i = 0, len1 = array.length; i < len1; i++) { - item = array[i]; - if (item) { - results.push(item); - } - } - return results; - }; - - exports.count = function(string, substr) { - var num, pos; - num = pos = 0; - if (!substr.length) { - return 1 / 0; - } - while (pos = 1 + string.indexOf(substr, pos)) { - num++; - } - return num; - }; - - exports.merge = function(options, overrides) { - return extend(extend({}, options), overrides); - }; - - extend = exports.extend = function(object, properties) { - var key, val; - for (key in properties) { - val = properties[key]; - object[key] = val; - } - return object; - }; - - exports.flatten = flatten = function(array) { - var element, flattened, i, len1; - flattened = []; - for (i = 0, len1 = array.length; i < len1; i++) { - element = array[i]; - if ('[object Array]' === Object.prototype.toString.call(element)) { - flattened = flattened.concat(flatten(element)); - } else { - flattened.push(element); - } - } - return flattened; - }; - - exports.del = function(obj, key) { - var val; - val = obj[key]; - delete obj[key]; - return val; - }; - - exports.some = (ref = Array.prototype.some) != null ? ref : function(fn) { - var e, i, len1, ref1; - ref1 = this; - for (i = 0, len1 = ref1.length; i < len1; i++) { - e = ref1[i]; - if (fn(e)) { - return true; - } - } - return false; - }; - - exports.invertLiterate = function(code) { - var line, lines, maybe_code; - maybe_code = true; - lines = (function() { - var i, len1, ref1, results; - ref1 = code.split('\n'); - results = []; - for (i = 0, len1 = ref1.length; i < len1; i++) { - line = ref1[i]; - if (maybe_code && /^([ ]{4}|[ ]{0,3}\t)/.test(line)) { - results.push(line); - } else if (maybe_code = /^\s*$/.test(line)) { - results.push(line); - } else { - results.push('# ' + line); - } - } - return results; - })(); - return lines.join('\n'); - }; - - buildLocationData = function(first, last) { - if (!last) { - return first; - } else { - return { - first_line: first.first_line, - first_column: first.first_column, - last_line: last.last_line, - last_column: last.last_column - }; - } - }; - - exports.addLocationDataFn = function(first, last) { - return function(obj) { - if (((typeof obj) === 'object') && (!!obj['updateLocationDataIfMissing'])) { - obj.updateLocationDataIfMissing(buildLocationData(first, last)); - } - return obj; - }; - }; - - exports.locationDataToString = function(obj) { - var locationData; - if (("2" in obj) && ("first_line" in obj[2])) { - locationData = obj[2]; - } else if ("first_line" in obj) { - locationData = obj; - } - if (locationData) { - return ((locationData.first_line + 1) + ":" + (locationData.first_column + 1) + "-") + ((locationData.last_line + 1) + ":" + (locationData.last_column + 1)); - } else { - return "No location data"; - } - }; - - exports.baseFileName = function(file, stripExt, useWinPathSep) { - var parts, pathSep; - if (stripExt == null) { - stripExt = false; - } - if (useWinPathSep == null) { - useWinPathSep = false; - } - pathSep = useWinPathSep ? /\\|\// : /\//; - parts = file.split(pathSep); - file = parts[parts.length - 1]; - if (!(stripExt && file.indexOf('.') >= 0)) { - return file; - } - parts = file.split('.'); - parts.pop(); - if (parts[parts.length - 1] === 'coffee' && parts.length > 1) { - parts.pop(); - } - return parts.join('.'); - }; - - exports.isCoffee = function(file) { - return /\.((lit)?coffee|coffee\.md)$/.test(file); - }; - - exports.isLiterate = function(file) { - return /\.(litcoffee|coffee\.md)$/.test(file); - }; - - exports.throwSyntaxError = function(message, location) { - var error; - error = new SyntaxError(message); - error.location = location; - error.toString = syntaxErrorToString; - error.stack = error.toString(); - throw error; - }; - - exports.updateSyntaxError = function(error, code, filename) { - if (error.toString === syntaxErrorToString) { - error.code || (error.code = code); - error.filename || (error.filename = filename); - error.stack = error.toString(); - } - return error; - }; - - syntaxErrorToString = function() { - var codeLine, colorize, colorsEnabled, end, filename, first_column, first_line, last_column, last_line, marker, ref1, ref2, ref3, ref4, start; - if (!(this.code && this.location)) { - return Error.prototype.toString.call(this); - } - ref1 = this.location, first_line = ref1.first_line, first_column = ref1.first_column, last_line = ref1.last_line, last_column = ref1.last_column; - if (last_line == null) { - last_line = first_line; - } - if (last_column == null) { - last_column = first_column; - } - filename = this.filename || '[stdin]'; - codeLine = this.code.split('\n')[first_line]; - start = first_column; - end = first_line === last_line ? last_column + 1 : codeLine.length; - marker = codeLine.slice(0, start).replace(/[^\s]/g, ' ') + repeat('^', end - start); - if (typeof process !== "undefined" && process !== null) { - colorsEnabled = ((ref2 = process.stdout) != null ? ref2.isTTY : void 0) && !((ref3 = process.env) != null ? ref3.NODE_DISABLE_COLORS : void 0); - } - if ((ref4 = this.colorful) != null ? ref4 : colorsEnabled) { - colorize = function(str) { - return "\x1B[1;31m" + str + "\x1B[0m"; - }; - codeLine = codeLine.slice(0, start) + colorize(codeLine.slice(start, end)) + codeLine.slice(end); - marker = colorize(marker); - } - return filename + ":" + (first_line + 1) + ":" + (first_column + 1) + ": error: " + this.message + "\n" + codeLine + "\n" + marker; - }; - - exports.nameWhitespaceCharacter = function(string) { - switch (string) { - case ' ': - return 'space'; - case '\n': - return 'newline'; - case '\r': - return 'carriage return'; - case '\t': - return 'tab'; - default: - return string; - } - }; - -}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/index.js b/deploy/node_modules/coffee-script/lib/coffee-script/index.js deleted file mode 100644 index c6813d5..0000000 --- a/deploy/node_modules/coffee-script/lib/coffee-script/index.js +++ /dev/null @@ -1,11 +0,0 @@ -// Generated by CoffeeScript 1.12.7 -(function() { - var key, ref, val; - - ref = require('./coffee-script'); - for (key in ref) { - val = ref[key]; - exports[key] = val; - } - -}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/lexer.js b/deploy/node_modules/coffee-script/lib/coffee-script/lexer.js deleted file mode 100644 index 1c93ea1..0000000 --- a/deploy/node_modules/coffee-script/lib/coffee-script/lexer.js +++ /dev/null @@ -1,1166 +0,0 @@ -// Generated by CoffeeScript 1.12.7 -(function() { - var BOM, BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HERECOMMENT_ILLEGAL, HEREDOC_DOUBLE, HEREDOC_INDENT, HEREDOC_SINGLE, HEREGEX, HEREGEX_OMIT, HERE_JSTOKEN, IDENTIFIER, INDENTABLE_CLOSERS, INDEXABLE, INVERSES, JSTOKEN, JS_KEYWORDS, LEADING_BLANK_LINE, LINE_BREAK, LINE_CONTINUER, Lexer, MATH, MULTI_DENT, NOT_REGEX, NUMBER, OPERATOR, POSSIBLY_DIVISION, REGEX, REGEX_FLAGS, REGEX_ILLEGAL, REGEX_INVALID_ESCAPE, RELATION, RESERVED, Rewriter, SHIFT, SIMPLE_STRING_OMIT, STRICT_PROSCRIBED, STRING_DOUBLE, STRING_INVALID_ESCAPE, STRING_OMIT, STRING_SINGLE, STRING_START, TRAILING_BLANK_LINE, TRAILING_SPACES, UNARY, UNARY_MATH, UNFINISHED, UNICODE_CODE_POINT_ESCAPE, VALID_FLAGS, WHITESPACE, compact, count, invertLiterate, isForFrom, isUnassignable, key, locationDataToString, ref, ref1, repeat, starts, throwSyntaxError, - indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, - slice = [].slice; - - ref = require('./rewriter'), Rewriter = ref.Rewriter, INVERSES = ref.INVERSES; - - ref1 = require('./helpers'), count = ref1.count, starts = ref1.starts, compact = ref1.compact, repeat = ref1.repeat, invertLiterate = ref1.invertLiterate, locationDataToString = ref1.locationDataToString, throwSyntaxError = ref1.throwSyntaxError; - - exports.Lexer = Lexer = (function() { - function Lexer() {} - - Lexer.prototype.tokenize = function(code, opts) { - var consumed, end, i, ref2; - if (opts == null) { - opts = {}; - } - this.literate = opts.literate; - this.indent = 0; - this.baseIndent = 0; - this.indebt = 0; - this.outdebt = 0; - this.indents = []; - this.ends = []; - this.tokens = []; - this.seenFor = false; - this.seenImport = false; - this.seenExport = false; - this.importSpecifierList = false; - this.exportSpecifierList = false; - this.chunkLine = opts.line || 0; - this.chunkColumn = opts.column || 0; - code = this.clean(code); - i = 0; - while (this.chunk = code.slice(i)) { - consumed = this.identifierToken() || this.commentToken() || this.whitespaceToken() || this.lineToken() || this.stringToken() || this.numberToken() || this.regexToken() || this.jsToken() || this.literalToken(); - ref2 = this.getLineAndColumnFromChunk(consumed), this.chunkLine = ref2[0], this.chunkColumn = ref2[1]; - i += consumed; - if (opts.untilBalanced && this.ends.length === 0) { - return { - tokens: this.tokens, - index: i - }; - } - } - this.closeIndentation(); - if (end = this.ends.pop()) { - this.error("missing " + end.tag, end.origin[2]); - } - if (opts.rewrite === false) { - return this.tokens; - } - return (new Rewriter).rewrite(this.tokens); - }; - - Lexer.prototype.clean = function(code) { - if (code.charCodeAt(0) === BOM) { - code = code.slice(1); - } - code = code.replace(/\r/g, '').replace(TRAILING_SPACES, ''); - if (WHITESPACE.test(code)) { - code = "\n" + code; - this.chunkLine--; - } - if (this.literate) { - code = invertLiterate(code); - } - return code; - }; - - Lexer.prototype.identifierToken = function() { - var alias, colon, colonOffset, id, idLength, input, match, poppedToken, prev, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9, tag, tagToken; - if (!(match = IDENTIFIER.exec(this.chunk))) { - return 0; - } - input = match[0], id = match[1], colon = match[2]; - idLength = id.length; - poppedToken = void 0; - if (id === 'own' && this.tag() === 'FOR') { - this.token('OWN', id); - return id.length; - } - if (id === 'from' && this.tag() === 'YIELD') { - this.token('FROM', id); - return id.length; - } - if (id === 'as' && this.seenImport) { - if (this.value() === '*') { - this.tokens[this.tokens.length - 1][0] = 'IMPORT_ALL'; - } else if (ref2 = this.value(), indexOf.call(COFFEE_KEYWORDS, ref2) >= 0) { - this.tokens[this.tokens.length - 1][0] = 'IDENTIFIER'; - } - if ((ref3 = this.tag()) === 'DEFAULT' || ref3 === 'IMPORT_ALL' || ref3 === 'IDENTIFIER') { - this.token('AS', id); - return id.length; - } - } - if (id === 'as' && this.seenExport && ((ref4 = this.tag()) === 'IDENTIFIER' || ref4 === 'DEFAULT')) { - this.token('AS', id); - return id.length; - } - if (id === 'default' && this.seenExport && ((ref5 = this.tag()) === 'EXPORT' || ref5 === 'AS')) { - this.token('DEFAULT', id); - return id.length; - } - ref6 = this.tokens, prev = ref6[ref6.length - 1]; - tag = colon || (prev != null) && (((ref7 = prev[0]) === '.' || ref7 === '?.' || ref7 === '::' || ref7 === '?::') || !prev.spaced && prev[0] === '@') ? 'PROPERTY' : 'IDENTIFIER'; - if (tag === 'IDENTIFIER' && (indexOf.call(JS_KEYWORDS, id) >= 0 || indexOf.call(COFFEE_KEYWORDS, id) >= 0) && !(this.exportSpecifierList && indexOf.call(COFFEE_KEYWORDS, id) >= 0)) { - tag = id.toUpperCase(); - if (tag === 'WHEN' && (ref8 = this.tag(), indexOf.call(LINE_BREAK, ref8) >= 0)) { - tag = 'LEADING_WHEN'; - } else if (tag === 'FOR') { - this.seenFor = true; - } else if (tag === 'UNLESS') { - tag = 'IF'; - } else if (tag === 'IMPORT') { - this.seenImport = true; - } else if (tag === 'EXPORT') { - this.seenExport = true; - } else if (indexOf.call(UNARY, tag) >= 0) { - tag = 'UNARY'; - } else if (indexOf.call(RELATION, tag) >= 0) { - if (tag !== 'INSTANCEOF' && this.seenFor) { - tag = 'FOR' + tag; - this.seenFor = false; - } else { - tag = 'RELATION'; - if (this.value() === '!') { - poppedToken = this.tokens.pop(); - id = '!' + id; - } - } - } - } else if (tag === 'IDENTIFIER' && this.seenFor && id === 'from' && isForFrom(prev)) { - tag = 'FORFROM'; - this.seenFor = false; - } - if (tag === 'IDENTIFIER' && indexOf.call(RESERVED, id) >= 0) { - this.error("reserved word '" + id + "'", { - length: id.length - }); - } - if (tag !== 'PROPERTY') { - if (indexOf.call(COFFEE_ALIASES, id) >= 0) { - alias = id; - id = COFFEE_ALIAS_MAP[id]; - } - tag = (function() { - switch (id) { - case '!': - return 'UNARY'; - case '==': - case '!=': - return 'COMPARE'; - case 'true': - case 'false': - return 'BOOL'; - case 'break': - case 'continue': - case 'debugger': - return 'STATEMENT'; - case '&&': - case '||': - return id; - default: - return tag; - } - })(); - } - tagToken = this.token(tag, id, 0, idLength); - if (alias) { - tagToken.origin = [tag, alias, tagToken[2]]; - } - if (poppedToken) { - ref9 = [poppedToken[2].first_line, poppedToken[2].first_column], tagToken[2].first_line = ref9[0], tagToken[2].first_column = ref9[1]; - } - if (colon) { - colonOffset = input.lastIndexOf(':'); - this.token(':', ':', colonOffset, colon.length); - } - return input.length; - }; - - Lexer.prototype.numberToken = function() { - var base, lexedLength, match, number, numberValue, ref2, tag; - if (!(match = NUMBER.exec(this.chunk))) { - return 0; - } - number = match[0]; - lexedLength = number.length; - switch (false) { - case !/^0[BOX]/.test(number): - this.error("radix prefix in '" + number + "' must be lowercase", { - offset: 1 - }); - break; - case !/^(?!0x).*E/.test(number): - this.error("exponential notation in '" + number + "' must be indicated with a lowercase 'e'", { - offset: number.indexOf('E') - }); - break; - case !/^0\d*[89]/.test(number): - this.error("decimal literal '" + number + "' must not be prefixed with '0'", { - length: lexedLength - }); - break; - case !/^0\d+/.test(number): - this.error("octal literal '" + number + "' must be prefixed with '0o'", { - length: lexedLength - }); - } - base = (function() { - switch (number.charAt(1)) { - case 'b': - return 2; - case 'o': - return 8; - case 'x': - return 16; - default: - return null; - } - })(); - numberValue = base != null ? parseInt(number.slice(2), base) : parseFloat(number); - if ((ref2 = number.charAt(1)) === 'b' || ref2 === 'o') { - number = "0x" + (numberValue.toString(16)); - } - tag = numberValue === 2e308 ? 'INFINITY' : 'NUMBER'; - this.token(tag, number, 0, lexedLength); - return lexedLength; - }; - - Lexer.prototype.stringToken = function() { - var $, attempt, delimiter, doc, end, heredoc, i, indent, indentRegex, match, quote, ref2, ref3, regex, token, tokens; - quote = (STRING_START.exec(this.chunk) || [])[0]; - if (!quote) { - return 0; - } - if (this.tokens.length && this.value() === 'from' && (this.seenImport || this.seenExport)) { - this.tokens[this.tokens.length - 1][0] = 'FROM'; - } - regex = (function() { - switch (quote) { - case "'": - return STRING_SINGLE; - case '"': - return STRING_DOUBLE; - case "'''": - return HEREDOC_SINGLE; - case '"""': - return HEREDOC_DOUBLE; - } - })(); - heredoc = quote.length === 3; - ref2 = this.matchWithInterpolations(regex, quote), tokens = ref2.tokens, end = ref2.index; - $ = tokens.length - 1; - delimiter = quote.charAt(0); - if (heredoc) { - indent = null; - doc = ((function() { - var j, len, results; - results = []; - for (i = j = 0, len = tokens.length; j < len; i = ++j) { - token = tokens[i]; - if (token[0] === 'NEOSTRING') { - results.push(token[1]); - } - } - return results; - })()).join('#{}'); - while (match = HEREDOC_INDENT.exec(doc)) { - attempt = match[1]; - if (indent === null || (0 < (ref3 = attempt.length) && ref3 < indent.length)) { - indent = attempt; - } - } - if (indent) { - indentRegex = RegExp("\\n" + indent, "g"); - } - this.mergeInterpolationTokens(tokens, { - delimiter: delimiter - }, (function(_this) { - return function(value, i) { - value = _this.formatString(value, { - delimiter: quote - }); - if (indentRegex) { - value = value.replace(indentRegex, '\n'); - } - if (i === 0) { - value = value.replace(LEADING_BLANK_LINE, ''); - } - if (i === $) { - value = value.replace(TRAILING_BLANK_LINE, ''); - } - return value; - }; - })(this)); - } else { - this.mergeInterpolationTokens(tokens, { - delimiter: delimiter - }, (function(_this) { - return function(value, i) { - value = _this.formatString(value, { - delimiter: quote - }); - value = value.replace(SIMPLE_STRING_OMIT, function(match, offset) { - if ((i === 0 && offset === 0) || (i === $ && offset + match.length === value.length)) { - return ''; - } else { - return ' '; - } - }); - return value; - }; - })(this)); - } - return end; - }; - - Lexer.prototype.commentToken = function() { - var comment, here, match; - if (!(match = this.chunk.match(COMMENT))) { - return 0; - } - comment = match[0], here = match[1]; - if (here) { - if (match = HERECOMMENT_ILLEGAL.exec(comment)) { - this.error("block comments cannot contain " + match[0], { - offset: match.index, - length: match[0].length - }); - } - if (here.indexOf('\n') >= 0) { - here = here.replace(RegExp("\\n" + (repeat(' ', this.indent)), "g"), '\n'); - } - this.token('HERECOMMENT', here, 0, comment.length); - } - return comment.length; - }; - - Lexer.prototype.jsToken = function() { - var match, script; - if (!(this.chunk.charAt(0) === '`' && (match = HERE_JSTOKEN.exec(this.chunk) || JSTOKEN.exec(this.chunk)))) { - return 0; - } - script = match[1].replace(/\\+(`|$)/g, function(string) { - return string.slice(-Math.ceil(string.length / 2)); - }); - this.token('JS', script, 0, match[0].length); - return match[0].length; - }; - - Lexer.prototype.regexToken = function() { - var body, closed, end, flags, index, match, origin, prev, ref2, ref3, ref4, regex, tokens; - switch (false) { - case !(match = REGEX_ILLEGAL.exec(this.chunk)): - this.error("regular expressions cannot begin with " + match[2], { - offset: match.index + match[1].length - }); - break; - case !(match = this.matchWithInterpolations(HEREGEX, '///')): - tokens = match.tokens, index = match.index; - break; - case !(match = REGEX.exec(this.chunk)): - regex = match[0], body = match[1], closed = match[2]; - this.validateEscapes(body, { - isRegex: true, - offsetInChunk: 1 - }); - body = this.formatRegex(body, { - delimiter: '/' - }); - index = regex.length; - ref2 = this.tokens, prev = ref2[ref2.length - 1]; - if (prev) { - if (prev.spaced && (ref3 = prev[0], indexOf.call(CALLABLE, ref3) >= 0)) { - if (!closed || POSSIBLY_DIVISION.test(regex)) { - return 0; - } - } else if (ref4 = prev[0], indexOf.call(NOT_REGEX, ref4) >= 0) { - return 0; - } - } - if (!closed) { - this.error('missing / (unclosed regex)'); - } - break; - default: - return 0; - } - flags = REGEX_FLAGS.exec(this.chunk.slice(index))[0]; - end = index + flags.length; - origin = this.makeToken('REGEX', null, 0, end); - switch (false) { - case !!VALID_FLAGS.test(flags): - this.error("invalid regular expression flags " + flags, { - offset: index, - length: flags.length - }); - break; - case !(regex || tokens.length === 1): - if (body == null) { - body = this.formatHeregex(tokens[0][1]); - } - this.token('REGEX', "" + (this.makeDelimitedLiteral(body, { - delimiter: '/' - })) + flags, 0, end, origin); - break; - default: - this.token('REGEX_START', '(', 0, 0, origin); - this.token('IDENTIFIER', 'RegExp', 0, 0); - this.token('CALL_START', '(', 0, 0); - this.mergeInterpolationTokens(tokens, { - delimiter: '"', - double: true - }, this.formatHeregex); - if (flags) { - this.token(',', ',', index - 1, 0); - this.token('STRING', '"' + flags + '"', index - 1, flags.length); - } - this.token(')', ')', end - 1, 0); - this.token('REGEX_END', ')', end - 1, 0); - } - return end; - }; - - Lexer.prototype.lineToken = function() { - var diff, indent, match, noNewlines, size; - if (!(match = MULTI_DENT.exec(this.chunk))) { - return 0; - } - indent = match[0]; - this.seenFor = false; - if (!this.importSpecifierList) { - this.seenImport = false; - } - if (!this.exportSpecifierList) { - this.seenExport = false; - } - size = indent.length - 1 - indent.lastIndexOf('\n'); - noNewlines = this.unfinished(); - if (size - this.indebt === this.indent) { - if (noNewlines) { - this.suppressNewlines(); - } else { - this.newlineToken(0); - } - return indent.length; - } - if (size > this.indent) { - if (noNewlines) { - this.indebt = size - this.indent; - this.suppressNewlines(); - return indent.length; - } - if (!this.tokens.length) { - this.baseIndent = this.indent = size; - return indent.length; - } - diff = size - this.indent + this.outdebt; - this.token('INDENT', diff, indent.length - size, size); - this.indents.push(diff); - this.ends.push({ - tag: 'OUTDENT' - }); - this.outdebt = this.indebt = 0; - this.indent = size; - } else if (size < this.baseIndent) { - this.error('missing indentation', { - offset: indent.length - }); - } else { - this.indebt = 0; - this.outdentToken(this.indent - size, noNewlines, indent.length); - } - return indent.length; - }; - - Lexer.prototype.outdentToken = function(moveOut, noNewlines, outdentLength) { - var decreasedIndent, dent, lastIndent, ref2; - decreasedIndent = this.indent - moveOut; - while (moveOut > 0) { - lastIndent = this.indents[this.indents.length - 1]; - if (!lastIndent) { - moveOut = 0; - } else if (lastIndent === this.outdebt) { - moveOut -= this.outdebt; - this.outdebt = 0; - } else if (lastIndent < this.outdebt) { - this.outdebt -= lastIndent; - moveOut -= lastIndent; - } else { - dent = this.indents.pop() + this.outdebt; - if (outdentLength && (ref2 = this.chunk[outdentLength], indexOf.call(INDENTABLE_CLOSERS, ref2) >= 0)) { - decreasedIndent -= dent - moveOut; - moveOut = dent; - } - this.outdebt = 0; - this.pair('OUTDENT'); - this.token('OUTDENT', moveOut, 0, outdentLength); - moveOut -= dent; - } - } - if (dent) { - this.outdebt -= moveOut; - } - while (this.value() === ';') { - this.tokens.pop(); - } - if (!(this.tag() === 'TERMINATOR' || noNewlines)) { - this.token('TERMINATOR', '\n', outdentLength, 0); - } - this.indent = decreasedIndent; - return this; - }; - - Lexer.prototype.whitespaceToken = function() { - var match, nline, prev, ref2; - if (!((match = WHITESPACE.exec(this.chunk)) || (nline = this.chunk.charAt(0) === '\n'))) { - return 0; - } - ref2 = this.tokens, prev = ref2[ref2.length - 1]; - if (prev) { - prev[match ? 'spaced' : 'newLine'] = true; - } - if (match) { - return match[0].length; - } else { - return 0; - } - }; - - Lexer.prototype.newlineToken = function(offset) { - while (this.value() === ';') { - this.tokens.pop(); - } - if (this.tag() !== 'TERMINATOR') { - this.token('TERMINATOR', '\n', offset, 0); - } - return this; - }; - - Lexer.prototype.suppressNewlines = function() { - if (this.value() === '\\') { - this.tokens.pop(); - } - return this; - }; - - Lexer.prototype.literalToken = function() { - var match, message, origin, prev, ref2, ref3, ref4, ref5, ref6, skipToken, tag, token, value; - if (match = OPERATOR.exec(this.chunk)) { - value = match[0]; - if (CODE.test(value)) { - this.tagParameters(); - } - } else { - value = this.chunk.charAt(0); - } - tag = value; - ref2 = this.tokens, prev = ref2[ref2.length - 1]; - if (prev && indexOf.call(['='].concat(slice.call(COMPOUND_ASSIGN)), value) >= 0) { - skipToken = false; - if (value === '=' && ((ref3 = prev[1]) === '||' || ref3 === '&&') && !prev.spaced) { - prev[0] = 'COMPOUND_ASSIGN'; - prev[1] += '='; - prev = this.tokens[this.tokens.length - 2]; - skipToken = true; - } - if (prev && prev[0] !== 'PROPERTY') { - origin = (ref4 = prev.origin) != null ? ref4 : prev; - message = isUnassignable(prev[1], origin[1]); - if (message) { - this.error(message, origin[2]); - } - } - if (skipToken) { - return value.length; - } - } - if (value === '{' && this.seenImport) { - this.importSpecifierList = true; - } else if (this.importSpecifierList && value === '}') { - this.importSpecifierList = false; - } else if (value === '{' && (prev != null ? prev[0] : void 0) === 'EXPORT') { - this.exportSpecifierList = true; - } else if (this.exportSpecifierList && value === '}') { - this.exportSpecifierList = false; - } - if (value === ';') { - this.seenFor = this.seenImport = this.seenExport = false; - tag = 'TERMINATOR'; - } else if (value === '*' && prev[0] === 'EXPORT') { - tag = 'EXPORT_ALL'; - } else if (indexOf.call(MATH, value) >= 0) { - tag = 'MATH'; - } else if (indexOf.call(COMPARE, value) >= 0) { - tag = 'COMPARE'; - } else if (indexOf.call(COMPOUND_ASSIGN, value) >= 0) { - tag = 'COMPOUND_ASSIGN'; - } else if (indexOf.call(UNARY, value) >= 0) { - tag = 'UNARY'; - } else if (indexOf.call(UNARY_MATH, value) >= 0) { - tag = 'UNARY_MATH'; - } else if (indexOf.call(SHIFT, value) >= 0) { - tag = 'SHIFT'; - } else if (value === '?' && (prev != null ? prev.spaced : void 0)) { - tag = 'BIN?'; - } else if (prev && !prev.spaced) { - if (value === '(' && (ref5 = prev[0], indexOf.call(CALLABLE, ref5) >= 0)) { - if (prev[0] === '?') { - prev[0] = 'FUNC_EXIST'; - } - tag = 'CALL_START'; - } else if (value === '[' && (ref6 = prev[0], indexOf.call(INDEXABLE, ref6) >= 0)) { - tag = 'INDEX_START'; - switch (prev[0]) { - case '?': - prev[0] = 'INDEX_SOAK'; - } - } - } - token = this.makeToken(tag, value); - switch (value) { - case '(': - case '{': - case '[': - this.ends.push({ - tag: INVERSES[value], - origin: token - }); - break; - case ')': - case '}': - case ']': - this.pair(value); - } - this.tokens.push(token); - return value.length; - }; - - Lexer.prototype.tagParameters = function() { - var i, stack, tok, tokens; - if (this.tag() !== ')') { - return this; - } - stack = []; - tokens = this.tokens; - i = tokens.length; - tokens[--i][0] = 'PARAM_END'; - while (tok = tokens[--i]) { - switch (tok[0]) { - case ')': - stack.push(tok); - break; - case '(': - case 'CALL_START': - if (stack.length) { - stack.pop(); - } else if (tok[0] === '(') { - tok[0] = 'PARAM_START'; - return this; - } else { - return this; - } - } - } - return this; - }; - - Lexer.prototype.closeIndentation = function() { - return this.outdentToken(this.indent); - }; - - Lexer.prototype.matchWithInterpolations = function(regex, delimiter) { - var close, column, firstToken, index, lastToken, line, nested, offsetInChunk, open, ref2, ref3, ref4, str, strPart, tokens; - tokens = []; - offsetInChunk = delimiter.length; - if (this.chunk.slice(0, offsetInChunk) !== delimiter) { - return null; - } - str = this.chunk.slice(offsetInChunk); - while (true) { - strPart = regex.exec(str)[0]; - this.validateEscapes(strPart, { - isRegex: delimiter.charAt(0) === '/', - offsetInChunk: offsetInChunk - }); - tokens.push(this.makeToken('NEOSTRING', strPart, offsetInChunk)); - str = str.slice(strPart.length); - offsetInChunk += strPart.length; - if (str.slice(0, 2) !== '#{') { - break; - } - ref2 = this.getLineAndColumnFromChunk(offsetInChunk + 1), line = ref2[0], column = ref2[1]; - ref3 = new Lexer().tokenize(str.slice(1), { - line: line, - column: column, - untilBalanced: true - }), nested = ref3.tokens, index = ref3.index; - index += 1; - open = nested[0], close = nested[nested.length - 1]; - open[0] = open[1] = '('; - close[0] = close[1] = ')'; - close.origin = ['', 'end of interpolation', close[2]]; - if (((ref4 = nested[1]) != null ? ref4[0] : void 0) === 'TERMINATOR') { - nested.splice(1, 1); - } - tokens.push(['TOKENS', nested]); - str = str.slice(index); - offsetInChunk += index; - } - if (str.slice(0, delimiter.length) !== delimiter) { - this.error("missing " + delimiter, { - length: delimiter.length - }); - } - firstToken = tokens[0], lastToken = tokens[tokens.length - 1]; - firstToken[2].first_column -= delimiter.length; - if (lastToken[1].substr(-1) === '\n') { - lastToken[2].last_line += 1; - lastToken[2].last_column = delimiter.length - 1; - } else { - lastToken[2].last_column += delimiter.length; - } - if (lastToken[1].length === 0) { - lastToken[2].last_column -= 1; - } - return { - tokens: tokens, - index: offsetInChunk + delimiter.length - }; - }; - - Lexer.prototype.mergeInterpolationTokens = function(tokens, options, fn) { - var converted, firstEmptyStringIndex, firstIndex, i, j, lastToken, len, locationToken, lparen, plusToken, ref2, rparen, tag, token, tokensToPush, value; - if (tokens.length > 1) { - lparen = this.token('STRING_START', '(', 0, 0); - } - firstIndex = this.tokens.length; - for (i = j = 0, len = tokens.length; j < len; i = ++j) { - token = tokens[i]; - tag = token[0], value = token[1]; - switch (tag) { - case 'TOKENS': - if (value.length === 2) { - continue; - } - locationToken = value[0]; - tokensToPush = value; - break; - case 'NEOSTRING': - converted = fn.call(this, token[1], i); - if (converted.length === 0) { - if (i === 0) { - firstEmptyStringIndex = this.tokens.length; - } else { - continue; - } - } - if (i === 2 && (firstEmptyStringIndex != null)) { - this.tokens.splice(firstEmptyStringIndex, 2); - } - token[0] = 'STRING'; - token[1] = this.makeDelimitedLiteral(converted, options); - locationToken = token; - tokensToPush = [token]; - } - if (this.tokens.length > firstIndex) { - plusToken = this.token('+', '+'); - plusToken[2] = { - first_line: locationToken[2].first_line, - first_column: locationToken[2].first_column, - last_line: locationToken[2].first_line, - last_column: locationToken[2].first_column - }; - } - (ref2 = this.tokens).push.apply(ref2, tokensToPush); - } - if (lparen) { - lastToken = tokens[tokens.length - 1]; - lparen.origin = [ - 'STRING', null, { - first_line: lparen[2].first_line, - first_column: lparen[2].first_column, - last_line: lastToken[2].last_line, - last_column: lastToken[2].last_column - } - ]; - rparen = this.token('STRING_END', ')'); - return rparen[2] = { - first_line: lastToken[2].last_line, - first_column: lastToken[2].last_column, - last_line: lastToken[2].last_line, - last_column: lastToken[2].last_column - }; - } - }; - - Lexer.prototype.pair = function(tag) { - var lastIndent, prev, ref2, ref3, wanted; - ref2 = this.ends, prev = ref2[ref2.length - 1]; - if (tag !== (wanted = prev != null ? prev.tag : void 0)) { - if ('OUTDENT' !== wanted) { - this.error("unmatched " + tag); - } - ref3 = this.indents, lastIndent = ref3[ref3.length - 1]; - this.outdentToken(lastIndent, true); - return this.pair(tag); - } - return this.ends.pop(); - }; - - Lexer.prototype.getLineAndColumnFromChunk = function(offset) { - var column, lastLine, lineCount, ref2, string; - if (offset === 0) { - return [this.chunkLine, this.chunkColumn]; - } - if (offset >= this.chunk.length) { - string = this.chunk; - } else { - string = this.chunk.slice(0, +(offset - 1) + 1 || 9e9); - } - lineCount = count(string, '\n'); - column = this.chunkColumn; - if (lineCount > 0) { - ref2 = string.split('\n'), lastLine = ref2[ref2.length - 1]; - column = lastLine.length; - } else { - column += string.length; - } - return [this.chunkLine + lineCount, column]; - }; - - Lexer.prototype.makeToken = function(tag, value, offsetInChunk, length) { - var lastCharacter, locationData, ref2, ref3, token; - if (offsetInChunk == null) { - offsetInChunk = 0; - } - if (length == null) { - length = value.length; - } - locationData = {}; - ref2 = this.getLineAndColumnFromChunk(offsetInChunk), locationData.first_line = ref2[0], locationData.first_column = ref2[1]; - lastCharacter = length > 0 ? length - 1 : 0; - ref3 = this.getLineAndColumnFromChunk(offsetInChunk + lastCharacter), locationData.last_line = ref3[0], locationData.last_column = ref3[1]; - token = [tag, value, locationData]; - return token; - }; - - Lexer.prototype.token = function(tag, value, offsetInChunk, length, origin) { - var token; - token = this.makeToken(tag, value, offsetInChunk, length); - if (origin) { - token.origin = origin; - } - this.tokens.push(token); - return token; - }; - - Lexer.prototype.tag = function() { - var ref2, token; - ref2 = this.tokens, token = ref2[ref2.length - 1]; - return token != null ? token[0] : void 0; - }; - - Lexer.prototype.value = function() { - var ref2, token; - ref2 = this.tokens, token = ref2[ref2.length - 1]; - return token != null ? token[1] : void 0; - }; - - Lexer.prototype.unfinished = function() { - var ref2; - return LINE_CONTINUER.test(this.chunk) || (ref2 = this.tag(), indexOf.call(UNFINISHED, ref2) >= 0); - }; - - Lexer.prototype.formatString = function(str, options) { - return this.replaceUnicodeCodePointEscapes(str.replace(STRING_OMIT, '$1'), options); - }; - - Lexer.prototype.formatHeregex = function(str) { - return this.formatRegex(str.replace(HEREGEX_OMIT, '$1$2'), { - delimiter: '///' - }); - }; - - Lexer.prototype.formatRegex = function(str, options) { - return this.replaceUnicodeCodePointEscapes(str, options); - }; - - Lexer.prototype.unicodeCodePointToUnicodeEscapes = function(codePoint) { - var high, low, toUnicodeEscape; - toUnicodeEscape = function(val) { - var str; - str = val.toString(16); - return "\\u" + (repeat('0', 4 - str.length)) + str; - }; - if (codePoint < 0x10000) { - return toUnicodeEscape(codePoint); - } - high = Math.floor((codePoint - 0x10000) / 0x400) + 0xD800; - low = (codePoint - 0x10000) % 0x400 + 0xDC00; - return "" + (toUnicodeEscape(high)) + (toUnicodeEscape(low)); - }; - - Lexer.prototype.replaceUnicodeCodePointEscapes = function(str, options) { - return str.replace(UNICODE_CODE_POINT_ESCAPE, (function(_this) { - return function(match, escapedBackslash, codePointHex, offset) { - var codePointDecimal; - if (escapedBackslash) { - return escapedBackslash; - } - codePointDecimal = parseInt(codePointHex, 16); - if (codePointDecimal > 0x10ffff) { - _this.error("unicode code point escapes greater than \\u{10ffff} are not allowed", { - offset: offset + options.delimiter.length, - length: codePointHex.length + 4 - }); - } - return _this.unicodeCodePointToUnicodeEscapes(codePointDecimal); - }; - })(this)); - }; - - Lexer.prototype.validateEscapes = function(str, options) { - var before, hex, invalidEscape, invalidEscapeRegex, match, message, octal, ref2, unicode, unicodeCodePoint; - if (options == null) { - options = {}; - } - invalidEscapeRegex = options.isRegex ? REGEX_INVALID_ESCAPE : STRING_INVALID_ESCAPE; - match = invalidEscapeRegex.exec(str); - if (!match) { - return; - } - match[0], before = match[1], octal = match[2], hex = match[3], unicodeCodePoint = match[4], unicode = match[5]; - message = octal ? "octal escape sequences are not allowed" : "invalid escape sequence"; - invalidEscape = "\\" + (octal || hex || unicodeCodePoint || unicode); - return this.error(message + " " + invalidEscape, { - offset: ((ref2 = options.offsetInChunk) != null ? ref2 : 0) + match.index + before.length, - length: invalidEscape.length - }); - }; - - Lexer.prototype.makeDelimitedLiteral = function(body, options) { - var regex; - if (options == null) { - options = {}; - } - if (body === '' && options.delimiter === '/') { - body = '(?:)'; - } - regex = RegExp("(\\\\\\\\)|(\\\\0(?=[1-7]))|\\\\?(" + options.delimiter + ")|\\\\?(?:(\\n)|(\\r)|(\\u2028)|(\\u2029))|(\\\\.)", "g"); - body = body.replace(regex, function(match, backslash, nul, delimiter, lf, cr, ls, ps, other) { - switch (false) { - case !backslash: - if (options.double) { - return backslash + backslash; - } else { - return backslash; - } - case !nul: - return '\\x00'; - case !delimiter: - return "\\" + delimiter; - case !lf: - return '\\n'; - case !cr: - return '\\r'; - case !ls: - return '\\u2028'; - case !ps: - return '\\u2029'; - case !other: - if (options.double) { - return "\\" + other; - } else { - return other; - } - } - }); - return "" + options.delimiter + body + options.delimiter; - }; - - Lexer.prototype.error = function(message, options) { - var first_column, first_line, location, ref2, ref3, ref4; - if (options == null) { - options = {}; - } - location = 'first_line' in options ? options : ((ref3 = this.getLineAndColumnFromChunk((ref2 = options.offset) != null ? ref2 : 0), first_line = ref3[0], first_column = ref3[1], ref3), { - first_line: first_line, - first_column: first_column, - last_column: first_column + ((ref4 = options.length) != null ? ref4 : 1) - 1 - }); - return throwSyntaxError(message, location); - }; - - return Lexer; - - })(); - - isUnassignable = function(name, displayName) { - if (displayName == null) { - displayName = name; - } - switch (false) { - case indexOf.call(slice.call(JS_KEYWORDS).concat(slice.call(COFFEE_KEYWORDS)), name) < 0: - return "keyword '" + displayName + "' can't be assigned"; - case indexOf.call(STRICT_PROSCRIBED, name) < 0: - return "'" + displayName + "' can't be assigned"; - case indexOf.call(RESERVED, name) < 0: - return "reserved word '" + displayName + "' can't be assigned"; - default: - return false; - } - }; - - exports.isUnassignable = isUnassignable; - - isForFrom = function(prev) { - var ref2; - if (prev[0] === 'IDENTIFIER') { - if (prev[1] === 'from') { - prev[1][0] = 'IDENTIFIER'; - true; - } - return true; - } else if (prev[0] === 'FOR') { - return false; - } else if ((ref2 = prev[1]) === '{' || ref2 === '[' || ref2 === ',' || ref2 === ':') { - return false; - } else { - return true; - } - }; - - JS_KEYWORDS = ['true', 'false', 'null', 'this', 'new', 'delete', 'typeof', 'in', 'instanceof', 'return', 'throw', 'break', 'continue', 'debugger', 'yield', 'if', 'else', 'switch', 'for', 'while', 'do', 'try', 'catch', 'finally', 'class', 'extends', 'super', 'import', 'export', 'default']; - - COFFEE_KEYWORDS = ['undefined', 'Infinity', 'NaN', 'then', 'unless', 'until', 'loop', 'of', 'by', 'when']; - - COFFEE_ALIAS_MAP = { - and: '&&', - or: '||', - is: '==', - isnt: '!=', - not: '!', - yes: 'true', - no: 'false', - on: 'true', - off: 'false' - }; - - COFFEE_ALIASES = (function() { - var results; - results = []; - for (key in COFFEE_ALIAS_MAP) { - results.push(key); - } - return results; - })(); - - COFFEE_KEYWORDS = COFFEE_KEYWORDS.concat(COFFEE_ALIASES); - - RESERVED = ['case', 'function', 'var', 'void', 'with', 'const', 'let', 'enum', 'native', 'implements', 'interface', 'package', 'private', 'protected', 'public', 'static']; - - STRICT_PROSCRIBED = ['arguments', 'eval']; - - exports.JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED); - - BOM = 65279; - - IDENTIFIER = /^(?!\d)((?:(?!\s)[$\w\x7f-\uffff])+)([^\n\S]*:(?!:))?/; - - NUMBER = /^0b[01]+|^0o[0-7]+|^0x[\da-f]+|^\d*\.?\d+(?:e[+-]?\d+)?/i; - - OPERATOR = /^(?:[-=]>|[-+*\/%<>&|^!?=]=|>>>=?|([-+:])\1|([&|<>*\/%])\2=?|\?(\.|::)|\.{2,3})/; - - WHITESPACE = /^[^\n\S]+/; - - COMMENT = /^###([^#][\s\S]*?)(?:###[^\n\S]*|###$)|^(?:\s*#(?!##[^#]).*)+/; - - CODE = /^[-=]>/; - - MULTI_DENT = /^(?:\n[^\n\S]*)+/; - - JSTOKEN = /^`(?!``)((?:[^`\\]|\\[\s\S])*)`/; - - HERE_JSTOKEN = /^```((?:[^`\\]|\\[\s\S]|`(?!``))*)```/; - - STRING_START = /^(?:'''|"""|'|")/; - - STRING_SINGLE = /^(?:[^\\']|\\[\s\S])*/; - - STRING_DOUBLE = /^(?:[^\\"#]|\\[\s\S]|\#(?!\{))*/; - - HEREDOC_SINGLE = /^(?:[^\\']|\\[\s\S]|'(?!''))*/; - - HEREDOC_DOUBLE = /^(?:[^\\"#]|\\[\s\S]|"(?!"")|\#(?!\{))*/; - - STRING_OMIT = /((?:\\\\)+)|\\[^\S\n]*\n\s*/g; - - SIMPLE_STRING_OMIT = /\s*\n\s*/g; - - HEREDOC_INDENT = /\n+([^\n\S]*)(?=\S)/g; - - REGEX = /^\/(?!\/)((?:[^[\/\n\\]|\\[^\n]|\[(?:\\[^\n]|[^\]\n\\])*\])*)(\/)?/; - - REGEX_FLAGS = /^\w*/; - - VALID_FLAGS = /^(?!.*(.).*\1)[imguy]*$/; - - HEREGEX = /^(?:[^\\\/#]|\\[\s\S]|\/(?!\/\/)|\#(?!\{))*/; - - HEREGEX_OMIT = /((?:\\\\)+)|\\(\s)|\s+(?:#.*)?/g; - - REGEX_ILLEGAL = /^(\/|\/{3}\s*)(\*)/; - - POSSIBLY_DIVISION = /^\/=?\s/; - - HERECOMMENT_ILLEGAL = /\*\//; - - LINE_CONTINUER = /^\s*(?:,|\??\.(?![.\d])|::)/; - - STRING_INVALID_ESCAPE = /((?:^|[^\\])(?:\\\\)*)\\(?:(0[0-7]|[1-7])|(x(?![\da-fA-F]{2}).{0,2})|(u\{(?![\da-fA-F]{1,}\})[^}]*\}?)|(u(?!\{|[\da-fA-F]{4}).{0,4}))/; - - REGEX_INVALID_ESCAPE = /((?:^|[^\\])(?:\\\\)*)\\(?:(0[0-7])|(x(?![\da-fA-F]{2}).{0,2})|(u\{(?![\da-fA-F]{1,}\})[^}]*\}?)|(u(?!\{|[\da-fA-F]{4}).{0,4}))/; - - UNICODE_CODE_POINT_ESCAPE = /(\\\\)|\\u\{([\da-fA-F]+)\}/g; - - LEADING_BLANK_LINE = /^[^\n\S]*\n/; - - TRAILING_BLANK_LINE = /\n[^\n\S]*$/; - - TRAILING_SPACES = /\s+$/; - - COMPOUND_ASSIGN = ['-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|=', '**=', '//=', '%%=']; - - UNARY = ['NEW', 'TYPEOF', 'DELETE', 'DO']; - - UNARY_MATH = ['!', '~']; - - SHIFT = ['<<', '>>', '>>>']; - - COMPARE = ['==', '!=', '<', '>', '<=', '>=']; - - MATH = ['*', '/', '%', '//', '%%']; - - RELATION = ['IN', 'OF', 'INSTANCEOF']; - - BOOL = ['TRUE', 'FALSE']; - - CALLABLE = ['IDENTIFIER', 'PROPERTY', ')', ']', '?', '@', 'THIS', 'SUPER']; - - INDEXABLE = CALLABLE.concat(['NUMBER', 'INFINITY', 'NAN', 'STRING', 'STRING_END', 'REGEX', 'REGEX_END', 'BOOL', 'NULL', 'UNDEFINED', '}', '::']); - - NOT_REGEX = INDEXABLE.concat(['++', '--']); - - LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR']; - - INDENTABLE_CLOSERS = [')', '}', ']']; - - UNFINISHED = ['\\', '.', '?.', '?::', 'UNARY', 'MATH', 'UNARY_MATH', '+', '-', '**', 'SHIFT', 'RELATION', 'COMPARE', '&', '^', '|', '&&', '||', 'BIN?', 'THROW', 'EXTENDS', 'DEFAULT']; - -}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/nodes.js b/deploy/node_modules/coffee-script/lib/coffee-script/nodes.js deleted file mode 100644 index f4d6479..0000000 --- a/deploy/node_modules/coffee-script/lib/coffee-script/nodes.js +++ /dev/null @@ -1,3899 +0,0 @@ -// Generated by CoffeeScript 1.12.7 -(function() { - var Access, Arr, Assign, Base, Block, BooleanLiteral, Call, Class, Code, CodeFragment, Comment, Existence, Expansion, ExportAllDeclaration, ExportDeclaration, ExportDefaultDeclaration, ExportNamedDeclaration, ExportSpecifier, ExportSpecifierList, Extends, For, IdentifierLiteral, If, ImportClause, ImportDeclaration, ImportDefaultSpecifier, ImportNamespaceSpecifier, ImportSpecifier, ImportSpecifierList, In, Index, InfinityLiteral, JS_FORBIDDEN, LEVEL_ACCESS, LEVEL_COND, LEVEL_LIST, LEVEL_OP, LEVEL_PAREN, LEVEL_TOP, Literal, ModuleDeclaration, ModuleSpecifier, ModuleSpecifierList, NEGATE, NO, NaNLiteral, NullLiteral, NumberLiteral, Obj, Op, Param, Parens, PassthroughLiteral, PropertyName, Range, RegexLiteral, RegexWithInterpolations, Return, SIMPLENUM, Scope, Slice, Splat, StatementLiteral, StringLiteral, StringWithInterpolations, SuperCall, Switch, TAB, THIS, TaggedTemplateCall, ThisLiteral, Throw, Try, UTILITIES, UndefinedLiteral, Value, While, YES, YieldReturn, addLocationDataFn, compact, del, ends, extend, flatten, fragmentsToText, isComplexOrAssignable, isLiteralArguments, isLiteralThis, isUnassignable, locationDataToString, merge, multident, ref1, ref2, some, starts, throwSyntaxError, unfoldSoak, utility, - extend1 = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - hasProp = {}.hasOwnProperty, - indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, - slice = [].slice; - - Error.stackTraceLimit = 2e308; - - Scope = require('./scope').Scope; - - ref1 = require('./lexer'), isUnassignable = ref1.isUnassignable, JS_FORBIDDEN = ref1.JS_FORBIDDEN; - - ref2 = require('./helpers'), compact = ref2.compact, flatten = ref2.flatten, extend = ref2.extend, merge = ref2.merge, del = ref2.del, starts = ref2.starts, ends = ref2.ends, some = ref2.some, addLocationDataFn = ref2.addLocationDataFn, locationDataToString = ref2.locationDataToString, throwSyntaxError = ref2.throwSyntaxError; - - exports.extend = extend; - - exports.addLocationDataFn = addLocationDataFn; - - YES = function() { - return true; - }; - - NO = function() { - return false; - }; - - THIS = function() { - return this; - }; - - NEGATE = function() { - this.negated = !this.negated; - return this; - }; - - exports.CodeFragment = CodeFragment = (function() { - function CodeFragment(parent, code) { - var ref3; - this.code = "" + code; - this.locationData = parent != null ? parent.locationData : void 0; - this.type = (parent != null ? (ref3 = parent.constructor) != null ? ref3.name : void 0 : void 0) || 'unknown'; - } - - CodeFragment.prototype.toString = function() { - return "" + this.code + (this.locationData ? ": " + locationDataToString(this.locationData) : ''); - }; - - return CodeFragment; - - })(); - - fragmentsToText = function(fragments) { - var fragment; - return ((function() { - var j, len1, results; - results = []; - for (j = 0, len1 = fragments.length; j < len1; j++) { - fragment = fragments[j]; - results.push(fragment.code); - } - return results; - })()).join(''); - }; - - exports.Base = Base = (function() { - function Base() {} - - Base.prototype.compile = function(o, lvl) { - return fragmentsToText(this.compileToFragments(o, lvl)); - }; - - Base.prototype.compileToFragments = function(o, lvl) { - var node; - o = extend({}, o); - if (lvl) { - o.level = lvl; - } - node = this.unfoldSoak(o) || this; - node.tab = o.indent; - if (o.level === LEVEL_TOP || !node.isStatement(o)) { - return node.compileNode(o); - } else { - return node.compileClosure(o); - } - }; - - Base.prototype.compileClosure = function(o) { - var args, argumentsNode, func, jumpNode, meth, parts, ref3; - if (jumpNode = this.jumps()) { - jumpNode.error('cannot use a pure statement in an expression'); - } - o.sharedScope = true; - func = new Code([], Block.wrap([this])); - args = []; - if ((argumentsNode = this.contains(isLiteralArguments)) || this.contains(isLiteralThis)) { - args = [new ThisLiteral]; - if (argumentsNode) { - meth = 'apply'; - args.push(new IdentifierLiteral('arguments')); - } else { - meth = 'call'; - } - func = new Value(func, [new Access(new PropertyName(meth))]); - } - parts = (new Call(func, args)).compileNode(o); - if (func.isGenerator || ((ref3 = func.base) != null ? ref3.isGenerator : void 0)) { - parts.unshift(this.makeCode("(yield* ")); - parts.push(this.makeCode(")")); - } - return parts; - }; - - Base.prototype.cache = function(o, level, isComplex) { - var complex, ref, sub; - complex = isComplex != null ? isComplex(this) : this.isComplex(); - if (complex) { - ref = new IdentifierLiteral(o.scope.freeVariable('ref')); - sub = new Assign(ref, this); - if (level) { - return [sub.compileToFragments(o, level), [this.makeCode(ref.value)]]; - } else { - return [sub, ref]; - } - } else { - ref = level ? this.compileToFragments(o, level) : this; - return [ref, ref]; - } - }; - - Base.prototype.cacheToCodeFragments = function(cacheValues) { - return [fragmentsToText(cacheValues[0]), fragmentsToText(cacheValues[1])]; - }; - - Base.prototype.makeReturn = function(res) { - var me; - me = this.unwrapAll(); - if (res) { - return new Call(new Literal(res + ".push"), [me]); - } else { - return new Return(me); - } - }; - - Base.prototype.contains = function(pred) { - var node; - node = void 0; - this.traverseChildren(false, function(n) { - if (pred(n)) { - node = n; - return false; - } - }); - return node; - }; - - Base.prototype.lastNonComment = function(list) { - var i; - i = list.length; - while (i--) { - if (!(list[i] instanceof Comment)) { - return list[i]; - } - } - return null; - }; - - Base.prototype.toString = function(idt, name) { - var tree; - if (idt == null) { - idt = ''; - } - if (name == null) { - name = this.constructor.name; - } - tree = '\n' + idt + name; - if (this.soak) { - tree += '?'; - } - this.eachChild(function(node) { - return tree += node.toString(idt + TAB); - }); - return tree; - }; - - Base.prototype.eachChild = function(func) { - var attr, child, j, k, len1, len2, ref3, ref4; - if (!this.children) { - return this; - } - ref3 = this.children; - for (j = 0, len1 = ref3.length; j < len1; j++) { - attr = ref3[j]; - if (this[attr]) { - ref4 = flatten([this[attr]]); - for (k = 0, len2 = ref4.length; k < len2; k++) { - child = ref4[k]; - if (func(child) === false) { - return this; - } - } - } - } - return this; - }; - - Base.prototype.traverseChildren = function(crossScope, func) { - return this.eachChild(function(child) { - var recur; - recur = func(child); - if (recur !== false) { - return child.traverseChildren(crossScope, func); - } - }); - }; - - Base.prototype.invert = function() { - return new Op('!', this); - }; - - Base.prototype.unwrapAll = function() { - var node; - node = this; - while (node !== (node = node.unwrap())) { - continue; - } - return node; - }; - - Base.prototype.children = []; - - Base.prototype.isStatement = NO; - - Base.prototype.jumps = NO; - - Base.prototype.isComplex = YES; - - Base.prototype.isChainable = NO; - - Base.prototype.isAssignable = NO; - - Base.prototype.isNumber = NO; - - Base.prototype.unwrap = THIS; - - Base.prototype.unfoldSoak = NO; - - Base.prototype.assigns = NO; - - Base.prototype.updateLocationDataIfMissing = function(locationData) { - if (this.locationData) { - return this; - } - this.locationData = locationData; - return this.eachChild(function(child) { - return child.updateLocationDataIfMissing(locationData); - }); - }; - - Base.prototype.error = function(message) { - return throwSyntaxError(message, this.locationData); - }; - - Base.prototype.makeCode = function(code) { - return new CodeFragment(this, code); - }; - - Base.prototype.wrapInBraces = function(fragments) { - return [].concat(this.makeCode('('), fragments, this.makeCode(')')); - }; - - Base.prototype.joinFragmentArrays = function(fragmentsList, joinStr) { - var answer, fragments, i, j, len1; - answer = []; - for (i = j = 0, len1 = fragmentsList.length; j < len1; i = ++j) { - fragments = fragmentsList[i]; - if (i) { - answer.push(this.makeCode(joinStr)); - } - answer = answer.concat(fragments); - } - return answer; - }; - - return Base; - - })(); - - exports.Block = Block = (function(superClass1) { - extend1(Block, superClass1); - - function Block(nodes) { - this.expressions = compact(flatten(nodes || [])); - } - - Block.prototype.children = ['expressions']; - - Block.prototype.push = function(node) { - this.expressions.push(node); - return this; - }; - - Block.prototype.pop = function() { - return this.expressions.pop(); - }; - - Block.prototype.unshift = function(node) { - this.expressions.unshift(node); - return this; - }; - - Block.prototype.unwrap = function() { - if (this.expressions.length === 1) { - return this.expressions[0]; - } else { - return this; - } - }; - - Block.prototype.isEmpty = function() { - return !this.expressions.length; - }; - - Block.prototype.isStatement = function(o) { - var exp, j, len1, ref3; - ref3 = this.expressions; - for (j = 0, len1 = ref3.length; j < len1; j++) { - exp = ref3[j]; - if (exp.isStatement(o)) { - return true; - } - } - return false; - }; - - Block.prototype.jumps = function(o) { - var exp, j, jumpNode, len1, ref3; - ref3 = this.expressions; - for (j = 0, len1 = ref3.length; j < len1; j++) { - exp = ref3[j]; - if (jumpNode = exp.jumps(o)) { - return jumpNode; - } - } - }; - - Block.prototype.makeReturn = function(res) { - var expr, len; - len = this.expressions.length; - while (len--) { - expr = this.expressions[len]; - if (!(expr instanceof Comment)) { - this.expressions[len] = expr.makeReturn(res); - if (expr instanceof Return && !expr.expression) { - this.expressions.splice(len, 1); - } - break; - } - } - return this; - }; - - Block.prototype.compileToFragments = function(o, level) { - if (o == null) { - o = {}; - } - if (o.scope) { - return Block.__super__.compileToFragments.call(this, o, level); - } else { - return this.compileRoot(o); - } - }; - - Block.prototype.compileNode = function(o) { - var answer, compiledNodes, fragments, index, j, len1, node, ref3, top; - this.tab = o.indent; - top = o.level === LEVEL_TOP; - compiledNodes = []; - ref3 = this.expressions; - for (index = j = 0, len1 = ref3.length; j < len1; index = ++j) { - node = ref3[index]; - node = node.unwrapAll(); - node = node.unfoldSoak(o) || node; - if (node instanceof Block) { - compiledNodes.push(node.compileNode(o)); - } else if (top) { - node.front = true; - fragments = node.compileToFragments(o); - if (!node.isStatement(o)) { - fragments.unshift(this.makeCode("" + this.tab)); - fragments.push(this.makeCode(";")); - } - compiledNodes.push(fragments); - } else { - compiledNodes.push(node.compileToFragments(o, LEVEL_LIST)); - } - } - if (top) { - if (this.spaced) { - return [].concat(this.joinFragmentArrays(compiledNodes, '\n\n'), this.makeCode("\n")); - } else { - return this.joinFragmentArrays(compiledNodes, '\n'); - } - } - if (compiledNodes.length) { - answer = this.joinFragmentArrays(compiledNodes, ', '); - } else { - answer = [this.makeCode("void 0")]; - } - if (compiledNodes.length > 1 && o.level >= LEVEL_LIST) { - return this.wrapInBraces(answer); - } else { - return answer; - } - }; - - Block.prototype.compileRoot = function(o) { - var exp, fragments, i, j, len1, name, prelude, preludeExps, ref3, ref4, rest; - o.indent = o.bare ? '' : TAB; - o.level = LEVEL_TOP; - this.spaced = true; - o.scope = new Scope(null, this, null, (ref3 = o.referencedVars) != null ? ref3 : []); - ref4 = o.locals || []; - for (j = 0, len1 = ref4.length; j < len1; j++) { - name = ref4[j]; - o.scope.parameter(name); - } - prelude = []; - if (!o.bare) { - preludeExps = (function() { - var k, len2, ref5, results; - ref5 = this.expressions; - results = []; - for (i = k = 0, len2 = ref5.length; k < len2; i = ++k) { - exp = ref5[i]; - if (!(exp.unwrap() instanceof Comment)) { - break; - } - results.push(exp); - } - return results; - }).call(this); - rest = this.expressions.slice(preludeExps.length); - this.expressions = preludeExps; - if (preludeExps.length) { - prelude = this.compileNode(merge(o, { - indent: '' - })); - prelude.push(this.makeCode("\n")); - } - this.expressions = rest; - } - fragments = this.compileWithDeclarations(o); - if (o.bare) { - return fragments; - } - return [].concat(prelude, this.makeCode("(function() {\n"), fragments, this.makeCode("\n}).call(this);\n")); - }; - - Block.prototype.compileWithDeclarations = function(o) { - var assigns, declars, exp, fragments, i, j, len1, post, ref3, ref4, ref5, rest, scope, spaced; - fragments = []; - post = []; - ref3 = this.expressions; - for (i = j = 0, len1 = ref3.length; j < len1; i = ++j) { - exp = ref3[i]; - exp = exp.unwrap(); - if (!(exp instanceof Comment || exp instanceof Literal)) { - break; - } - } - o = merge(o, { - level: LEVEL_TOP - }); - if (i) { - rest = this.expressions.splice(i, 9e9); - ref4 = [this.spaced, false], spaced = ref4[0], this.spaced = ref4[1]; - ref5 = [this.compileNode(o), spaced], fragments = ref5[0], this.spaced = ref5[1]; - this.expressions = rest; - } - post = this.compileNode(o); - scope = o.scope; - if (scope.expressions === this) { - declars = o.scope.hasDeclarations(); - assigns = scope.hasAssignments; - if (declars || assigns) { - if (i) { - fragments.push(this.makeCode('\n')); - } - fragments.push(this.makeCode(this.tab + "var ")); - if (declars) { - fragments.push(this.makeCode(scope.declaredVariables().join(', '))); - } - if (assigns) { - if (declars) { - fragments.push(this.makeCode(",\n" + (this.tab + TAB))); - } - fragments.push(this.makeCode(scope.assignedVariables().join(",\n" + (this.tab + TAB)))); - } - fragments.push(this.makeCode(";\n" + (this.spaced ? '\n' : ''))); - } else if (fragments.length && post.length) { - fragments.push(this.makeCode("\n")); - } - } - return fragments.concat(post); - }; - - Block.wrap = function(nodes) { - if (nodes.length === 1 && nodes[0] instanceof Block) { - return nodes[0]; - } - return new Block(nodes); - }; - - return Block; - - })(Base); - - exports.Literal = Literal = (function(superClass1) { - extend1(Literal, superClass1); - - function Literal(value1) { - this.value = value1; - } - - Literal.prototype.isComplex = NO; - - Literal.prototype.assigns = function(name) { - return name === this.value; - }; - - Literal.prototype.compileNode = function(o) { - return [this.makeCode(this.value)]; - }; - - Literal.prototype.toString = function() { - return " " + (this.isStatement() ? Literal.__super__.toString.apply(this, arguments) : this.constructor.name) + ": " + this.value; - }; - - return Literal; - - })(Base); - - exports.NumberLiteral = NumberLiteral = (function(superClass1) { - extend1(NumberLiteral, superClass1); - - function NumberLiteral() { - return NumberLiteral.__super__.constructor.apply(this, arguments); - } - - return NumberLiteral; - - })(Literal); - - exports.InfinityLiteral = InfinityLiteral = (function(superClass1) { - extend1(InfinityLiteral, superClass1); - - function InfinityLiteral() { - return InfinityLiteral.__super__.constructor.apply(this, arguments); - } - - InfinityLiteral.prototype.compileNode = function() { - return [this.makeCode('2e308')]; - }; - - return InfinityLiteral; - - })(NumberLiteral); - - exports.NaNLiteral = NaNLiteral = (function(superClass1) { - extend1(NaNLiteral, superClass1); - - function NaNLiteral() { - NaNLiteral.__super__.constructor.call(this, 'NaN'); - } - - NaNLiteral.prototype.compileNode = function(o) { - var code; - code = [this.makeCode('0/0')]; - if (o.level >= LEVEL_OP) { - return this.wrapInBraces(code); - } else { - return code; - } - }; - - return NaNLiteral; - - })(NumberLiteral); - - exports.StringLiteral = StringLiteral = (function(superClass1) { - extend1(StringLiteral, superClass1); - - function StringLiteral() { - return StringLiteral.__super__.constructor.apply(this, arguments); - } - - return StringLiteral; - - })(Literal); - - exports.RegexLiteral = RegexLiteral = (function(superClass1) { - extend1(RegexLiteral, superClass1); - - function RegexLiteral() { - return RegexLiteral.__super__.constructor.apply(this, arguments); - } - - return RegexLiteral; - - })(Literal); - - exports.PassthroughLiteral = PassthroughLiteral = (function(superClass1) { - extend1(PassthroughLiteral, superClass1); - - function PassthroughLiteral() { - return PassthroughLiteral.__super__.constructor.apply(this, arguments); - } - - return PassthroughLiteral; - - })(Literal); - - exports.IdentifierLiteral = IdentifierLiteral = (function(superClass1) { - extend1(IdentifierLiteral, superClass1); - - function IdentifierLiteral() { - return IdentifierLiteral.__super__.constructor.apply(this, arguments); - } - - IdentifierLiteral.prototype.isAssignable = YES; - - return IdentifierLiteral; - - })(Literal); - - exports.PropertyName = PropertyName = (function(superClass1) { - extend1(PropertyName, superClass1); - - function PropertyName() { - return PropertyName.__super__.constructor.apply(this, arguments); - } - - PropertyName.prototype.isAssignable = YES; - - return PropertyName; - - })(Literal); - - exports.StatementLiteral = StatementLiteral = (function(superClass1) { - extend1(StatementLiteral, superClass1); - - function StatementLiteral() { - return StatementLiteral.__super__.constructor.apply(this, arguments); - } - - StatementLiteral.prototype.isStatement = YES; - - StatementLiteral.prototype.makeReturn = THIS; - - StatementLiteral.prototype.jumps = function(o) { - if (this.value === 'break' && !((o != null ? o.loop : void 0) || (o != null ? o.block : void 0))) { - return this; - } - if (this.value === 'continue' && !(o != null ? o.loop : void 0)) { - return this; - } - }; - - StatementLiteral.prototype.compileNode = function(o) { - return [this.makeCode("" + this.tab + this.value + ";")]; - }; - - return StatementLiteral; - - })(Literal); - - exports.ThisLiteral = ThisLiteral = (function(superClass1) { - extend1(ThisLiteral, superClass1); - - function ThisLiteral() { - ThisLiteral.__super__.constructor.call(this, 'this'); - } - - ThisLiteral.prototype.compileNode = function(o) { - var code, ref3; - code = ((ref3 = o.scope.method) != null ? ref3.bound : void 0) ? o.scope.method.context : this.value; - return [this.makeCode(code)]; - }; - - return ThisLiteral; - - })(Literal); - - exports.UndefinedLiteral = UndefinedLiteral = (function(superClass1) { - extend1(UndefinedLiteral, superClass1); - - function UndefinedLiteral() { - UndefinedLiteral.__super__.constructor.call(this, 'undefined'); - } - - UndefinedLiteral.prototype.compileNode = function(o) { - return [this.makeCode(o.level >= LEVEL_ACCESS ? '(void 0)' : 'void 0')]; - }; - - return UndefinedLiteral; - - })(Literal); - - exports.NullLiteral = NullLiteral = (function(superClass1) { - extend1(NullLiteral, superClass1); - - function NullLiteral() { - NullLiteral.__super__.constructor.call(this, 'null'); - } - - return NullLiteral; - - })(Literal); - - exports.BooleanLiteral = BooleanLiteral = (function(superClass1) { - extend1(BooleanLiteral, superClass1); - - function BooleanLiteral() { - return BooleanLiteral.__super__.constructor.apply(this, arguments); - } - - return BooleanLiteral; - - })(Literal); - - exports.Return = Return = (function(superClass1) { - extend1(Return, superClass1); - - function Return(expression) { - this.expression = expression; - } - - Return.prototype.children = ['expression']; - - Return.prototype.isStatement = YES; - - Return.prototype.makeReturn = THIS; - - Return.prototype.jumps = THIS; - - Return.prototype.compileToFragments = function(o, level) { - var expr, ref3; - expr = (ref3 = this.expression) != null ? ref3.makeReturn() : void 0; - if (expr && !(expr instanceof Return)) { - return expr.compileToFragments(o, level); - } else { - return Return.__super__.compileToFragments.call(this, o, level); - } - }; - - Return.prototype.compileNode = function(o) { - var answer; - answer = []; - answer.push(this.makeCode(this.tab + ("return" + (this.expression ? " " : "")))); - if (this.expression) { - answer = answer.concat(this.expression.compileToFragments(o, LEVEL_PAREN)); - } - answer.push(this.makeCode(";")); - return answer; - }; - - return Return; - - })(Base); - - exports.YieldReturn = YieldReturn = (function(superClass1) { - extend1(YieldReturn, superClass1); - - function YieldReturn() { - return YieldReturn.__super__.constructor.apply(this, arguments); - } - - YieldReturn.prototype.compileNode = function(o) { - if (o.scope.parent == null) { - this.error('yield can only occur inside functions'); - } - return YieldReturn.__super__.compileNode.apply(this, arguments); - }; - - return YieldReturn; - - })(Return); - - exports.Value = Value = (function(superClass1) { - extend1(Value, superClass1); - - function Value(base, props, tag) { - if (!props && base instanceof Value) { - return base; - } - this.base = base; - this.properties = props || []; - if (tag) { - this[tag] = true; - } - return this; - } - - Value.prototype.children = ['base', 'properties']; - - Value.prototype.add = function(props) { - this.properties = this.properties.concat(props); - return this; - }; - - Value.prototype.hasProperties = function() { - return !!this.properties.length; - }; - - Value.prototype.bareLiteral = function(type) { - return !this.properties.length && this.base instanceof type; - }; - - Value.prototype.isArray = function() { - return this.bareLiteral(Arr); - }; - - Value.prototype.isRange = function() { - return this.bareLiteral(Range); - }; - - Value.prototype.isComplex = function() { - return this.hasProperties() || this.base.isComplex(); - }; - - Value.prototype.isAssignable = function() { - return this.hasProperties() || this.base.isAssignable(); - }; - - Value.prototype.isNumber = function() { - return this.bareLiteral(NumberLiteral); - }; - - Value.prototype.isString = function() { - return this.bareLiteral(StringLiteral); - }; - - Value.prototype.isRegex = function() { - return this.bareLiteral(RegexLiteral); - }; - - Value.prototype.isUndefined = function() { - return this.bareLiteral(UndefinedLiteral); - }; - - Value.prototype.isNull = function() { - return this.bareLiteral(NullLiteral); - }; - - Value.prototype.isBoolean = function() { - return this.bareLiteral(BooleanLiteral); - }; - - Value.prototype.isAtomic = function() { - var j, len1, node, ref3; - ref3 = this.properties.concat(this.base); - for (j = 0, len1 = ref3.length; j < len1; j++) { - node = ref3[j]; - if (node.soak || node instanceof Call) { - return false; - } - } - return true; - }; - - Value.prototype.isNotCallable = function() { - return this.isNumber() || this.isString() || this.isRegex() || this.isArray() || this.isRange() || this.isSplice() || this.isObject() || this.isUndefined() || this.isNull() || this.isBoolean(); - }; - - Value.prototype.isStatement = function(o) { - return !this.properties.length && this.base.isStatement(o); - }; - - Value.prototype.assigns = function(name) { - return !this.properties.length && this.base.assigns(name); - }; - - Value.prototype.jumps = function(o) { - return !this.properties.length && this.base.jumps(o); - }; - - Value.prototype.isObject = function(onlyGenerated) { - if (this.properties.length) { - return false; - } - return (this.base instanceof Obj) && (!onlyGenerated || this.base.generated); - }; - - Value.prototype.isSplice = function() { - var lastProp, ref3; - ref3 = this.properties, lastProp = ref3[ref3.length - 1]; - return lastProp instanceof Slice; - }; - - Value.prototype.looksStatic = function(className) { - var ref3; - return this.base.value === className && this.properties.length === 1 && ((ref3 = this.properties[0].name) != null ? ref3.value : void 0) !== 'prototype'; - }; - - Value.prototype.unwrap = function() { - if (this.properties.length) { - return this; - } else { - return this.base; - } - }; - - Value.prototype.cacheReference = function(o) { - var base, bref, name, nref, ref3; - ref3 = this.properties, name = ref3[ref3.length - 1]; - if (this.properties.length < 2 && !this.base.isComplex() && !(name != null ? name.isComplex() : void 0)) { - return [this, this]; - } - base = new Value(this.base, this.properties.slice(0, -1)); - if (base.isComplex()) { - bref = new IdentifierLiteral(o.scope.freeVariable('base')); - base = new Value(new Parens(new Assign(bref, base))); - } - if (!name) { - return [base, bref]; - } - if (name.isComplex()) { - nref = new IdentifierLiteral(o.scope.freeVariable('name')); - name = new Index(new Assign(nref, name.index)); - nref = new Index(nref); - } - return [base.add(name), new Value(bref || base.base, [nref || name])]; - }; - - Value.prototype.compileNode = function(o) { - var fragments, j, len1, prop, props; - this.base.front = this.front; - props = this.properties; - fragments = this.base.compileToFragments(o, (props.length ? LEVEL_ACCESS : null)); - if (props.length && SIMPLENUM.test(fragmentsToText(fragments))) { - fragments.push(this.makeCode('.')); - } - for (j = 0, len1 = props.length; j < len1; j++) { - prop = props[j]; - fragments.push.apply(fragments, prop.compileToFragments(o)); - } - return fragments; - }; - - Value.prototype.unfoldSoak = function(o) { - return this.unfoldedSoak != null ? this.unfoldedSoak : this.unfoldedSoak = (function(_this) { - return function() { - var fst, i, ifn, j, len1, prop, ref, ref3, ref4, snd; - if (ifn = _this.base.unfoldSoak(o)) { - (ref3 = ifn.body.properties).push.apply(ref3, _this.properties); - return ifn; - } - ref4 = _this.properties; - for (i = j = 0, len1 = ref4.length; j < len1; i = ++j) { - prop = ref4[i]; - if (!prop.soak) { - continue; - } - prop.soak = false; - fst = new Value(_this.base, _this.properties.slice(0, i)); - snd = new Value(_this.base, _this.properties.slice(i)); - if (fst.isComplex()) { - ref = new IdentifierLiteral(o.scope.freeVariable('ref')); - fst = new Parens(new Assign(ref, fst)); - snd.base = ref; - } - return new If(new Existence(fst), snd, { - soak: true - }); - } - return false; - }; - })(this)(); - }; - - return Value; - - })(Base); - - exports.Comment = Comment = (function(superClass1) { - extend1(Comment, superClass1); - - function Comment(comment1) { - this.comment = comment1; - } - - Comment.prototype.isStatement = YES; - - Comment.prototype.makeReturn = THIS; - - Comment.prototype.compileNode = function(o, level) { - var code, comment; - comment = this.comment.replace(/^(\s*)#(?=\s)/gm, "$1 *"); - code = "/*" + (multident(comment, this.tab)) + (indexOf.call(comment, '\n') >= 0 ? "\n" + this.tab : '') + " */"; - if ((level || o.level) === LEVEL_TOP) { - code = o.indent + code; - } - return [this.makeCode("\n"), this.makeCode(code)]; - }; - - return Comment; - - })(Base); - - exports.Call = Call = (function(superClass1) { - extend1(Call, superClass1); - - function Call(variable1, args1, soak1) { - this.variable = variable1; - this.args = args1 != null ? args1 : []; - this.soak = soak1; - this.isNew = false; - if (this.variable instanceof Value && this.variable.isNotCallable()) { - this.variable.error("literal is not a function"); - } - } - - Call.prototype.children = ['variable', 'args']; - - Call.prototype.updateLocationDataIfMissing = function(locationData) { - var base, ref3; - if (this.locationData && this.needsUpdatedStartLocation) { - this.locationData.first_line = locationData.first_line; - this.locationData.first_column = locationData.first_column; - base = ((ref3 = this.variable) != null ? ref3.base : void 0) || this.variable; - if (base.needsUpdatedStartLocation) { - this.variable.locationData.first_line = locationData.first_line; - this.variable.locationData.first_column = locationData.first_column; - base.updateLocationDataIfMissing(locationData); - } - delete this.needsUpdatedStartLocation; - } - return Call.__super__.updateLocationDataIfMissing.apply(this, arguments); - }; - - Call.prototype.newInstance = function() { - var base, ref3; - base = ((ref3 = this.variable) != null ? ref3.base : void 0) || this.variable; - if (base instanceof Call && !base.isNew) { - base.newInstance(); - } else { - this.isNew = true; - } - this.needsUpdatedStartLocation = true; - return this; - }; - - Call.prototype.unfoldSoak = function(o) { - var call, ifn, j, left, len1, list, ref3, ref4, rite; - if (this.soak) { - if (this instanceof SuperCall) { - left = new Literal(this.superReference(o)); - rite = new Value(left); - } else { - if (ifn = unfoldSoak(o, this, 'variable')) { - return ifn; - } - ref3 = new Value(this.variable).cacheReference(o), left = ref3[0], rite = ref3[1]; - } - rite = new Call(rite, this.args); - rite.isNew = this.isNew; - left = new Literal("typeof " + (left.compile(o)) + " === \"function\""); - return new If(left, new Value(rite), { - soak: true - }); - } - call = this; - list = []; - while (true) { - if (call.variable instanceof Call) { - list.push(call); - call = call.variable; - continue; - } - if (!(call.variable instanceof Value)) { - break; - } - list.push(call); - if (!((call = call.variable.base) instanceof Call)) { - break; - } - } - ref4 = list.reverse(); - for (j = 0, len1 = ref4.length; j < len1; j++) { - call = ref4[j]; - if (ifn) { - if (call.variable instanceof Call) { - call.variable = ifn; - } else { - call.variable.base = ifn; - } - } - ifn = unfoldSoak(o, call, 'variable'); - } - return ifn; - }; - - Call.prototype.compileNode = function(o) { - var arg, argIndex, compiledArgs, compiledArray, fragments, j, len1, preface, ref3, ref4; - if ((ref3 = this.variable) != null) { - ref3.front = this.front; - } - compiledArray = Splat.compileSplattedArray(o, this.args, true); - if (compiledArray.length) { - return this.compileSplat(o, compiledArray); - } - compiledArgs = []; - ref4 = this.args; - for (argIndex = j = 0, len1 = ref4.length; j < len1; argIndex = ++j) { - arg = ref4[argIndex]; - if (argIndex) { - compiledArgs.push(this.makeCode(", ")); - } - compiledArgs.push.apply(compiledArgs, arg.compileToFragments(o, LEVEL_LIST)); - } - fragments = []; - if (this instanceof SuperCall) { - preface = this.superReference(o) + (".call(" + (this.superThis(o))); - if (compiledArgs.length) { - preface += ", "; - } - fragments.push(this.makeCode(preface)); - } else { - if (this.isNew) { - fragments.push(this.makeCode('new ')); - } - fragments.push.apply(fragments, this.variable.compileToFragments(o, LEVEL_ACCESS)); - fragments.push(this.makeCode("(")); - } - fragments.push.apply(fragments, compiledArgs); - fragments.push(this.makeCode(")")); - return fragments; - }; - - Call.prototype.compileSplat = function(o, splatArgs) { - var answer, base, fun, idt, name, ref; - if (this instanceof SuperCall) { - return [].concat(this.makeCode((this.superReference(o)) + ".apply(" + (this.superThis(o)) + ", "), splatArgs, this.makeCode(")")); - } - if (this.isNew) { - idt = this.tab + TAB; - return [].concat(this.makeCode("(function(func, args, ctor) {\n" + idt + "ctor.prototype = func.prototype;\n" + idt + "var child = new ctor, result = func.apply(child, args);\n" + idt + "return Object(result) === result ? result : child;\n" + this.tab + "})("), this.variable.compileToFragments(o, LEVEL_LIST), this.makeCode(", "), splatArgs, this.makeCode(", function(){})")); - } - answer = []; - base = new Value(this.variable); - if ((name = base.properties.pop()) && base.isComplex()) { - ref = o.scope.freeVariable('ref'); - answer = answer.concat(this.makeCode("(" + ref + " = "), base.compileToFragments(o, LEVEL_LIST), this.makeCode(")"), name.compileToFragments(o)); - } else { - fun = base.compileToFragments(o, LEVEL_ACCESS); - if (SIMPLENUM.test(fragmentsToText(fun))) { - fun = this.wrapInBraces(fun); - } - if (name) { - ref = fragmentsToText(fun); - fun.push.apply(fun, name.compileToFragments(o)); - } else { - ref = 'null'; - } - answer = answer.concat(fun); - } - return answer = answer.concat(this.makeCode(".apply(" + ref + ", "), splatArgs, this.makeCode(")")); - }; - - return Call; - - })(Base); - - exports.SuperCall = SuperCall = (function(superClass1) { - extend1(SuperCall, superClass1); - - function SuperCall(args) { - SuperCall.__super__.constructor.call(this, null, args != null ? args : [new Splat(new IdentifierLiteral('arguments'))]); - this.isBare = args != null; - } - - SuperCall.prototype.superReference = function(o) { - var accesses, base, bref, klass, method, name, nref, variable; - method = o.scope.namedMethod(); - if (method != null ? method.klass : void 0) { - klass = method.klass, name = method.name, variable = method.variable; - if (klass.isComplex()) { - bref = new IdentifierLiteral(o.scope.parent.freeVariable('base')); - base = new Value(new Parens(new Assign(bref, klass))); - variable.base = base; - variable.properties.splice(0, klass.properties.length); - } - if (name.isComplex() || (name instanceof Index && name.index.isAssignable())) { - nref = new IdentifierLiteral(o.scope.parent.freeVariable('name')); - name = new Index(new Assign(nref, name.index)); - variable.properties.pop(); - variable.properties.push(name); - } - accesses = [new Access(new PropertyName('__super__'))]; - if (method["static"]) { - accesses.push(new Access(new PropertyName('constructor'))); - } - accesses.push(nref != null ? new Index(nref) : name); - return (new Value(bref != null ? bref : klass, accesses)).compile(o); - } else if (method != null ? method.ctor : void 0) { - return method.name + ".__super__.constructor"; - } else { - return this.error('cannot call super outside of an instance method.'); - } - }; - - SuperCall.prototype.superThis = function(o) { - var method; - method = o.scope.method; - return (method && !method.klass && method.context) || "this"; - }; - - return SuperCall; - - })(Call); - - exports.RegexWithInterpolations = RegexWithInterpolations = (function(superClass1) { - extend1(RegexWithInterpolations, superClass1); - - function RegexWithInterpolations(args) { - if (args == null) { - args = []; - } - RegexWithInterpolations.__super__.constructor.call(this, new Value(new IdentifierLiteral('RegExp')), args, false); - } - - return RegexWithInterpolations; - - })(Call); - - exports.TaggedTemplateCall = TaggedTemplateCall = (function(superClass1) { - extend1(TaggedTemplateCall, superClass1); - - function TaggedTemplateCall(variable, arg, soak) { - if (arg instanceof StringLiteral) { - arg = new StringWithInterpolations(Block.wrap([new Value(arg)])); - } - TaggedTemplateCall.__super__.constructor.call(this, variable, [arg], soak); - } - - TaggedTemplateCall.prototype.compileNode = function(o) { - o.inTaggedTemplateCall = true; - return this.variable.compileToFragments(o, LEVEL_ACCESS).concat(this.args[0].compileToFragments(o, LEVEL_LIST)); - }; - - return TaggedTemplateCall; - - })(Call); - - exports.Extends = Extends = (function(superClass1) { - extend1(Extends, superClass1); - - function Extends(child1, parent1) { - this.child = child1; - this.parent = parent1; - } - - Extends.prototype.children = ['child', 'parent']; - - Extends.prototype.compileToFragments = function(o) { - return new Call(new Value(new Literal(utility('extend', o))), [this.child, this.parent]).compileToFragments(o); - }; - - return Extends; - - })(Base); - - exports.Access = Access = (function(superClass1) { - extend1(Access, superClass1); - - function Access(name1, tag) { - this.name = name1; - this.soak = tag === 'soak'; - } - - Access.prototype.children = ['name']; - - Access.prototype.compileToFragments = function(o) { - var name, node, ref3; - name = this.name.compileToFragments(o); - node = this.name.unwrap(); - if (node instanceof PropertyName) { - if (ref3 = node.value, indexOf.call(JS_FORBIDDEN, ref3) >= 0) { - return [this.makeCode('["')].concat(slice.call(name), [this.makeCode('"]')]); - } else { - return [this.makeCode('.')].concat(slice.call(name)); - } - } else { - return [this.makeCode('[')].concat(slice.call(name), [this.makeCode(']')]); - } - }; - - Access.prototype.isComplex = NO; - - return Access; - - })(Base); - - exports.Index = Index = (function(superClass1) { - extend1(Index, superClass1); - - function Index(index1) { - this.index = index1; - } - - Index.prototype.children = ['index']; - - Index.prototype.compileToFragments = function(o) { - return [].concat(this.makeCode("["), this.index.compileToFragments(o, LEVEL_PAREN), this.makeCode("]")); - }; - - Index.prototype.isComplex = function() { - return this.index.isComplex(); - }; - - return Index; - - })(Base); - - exports.Range = Range = (function(superClass1) { - extend1(Range, superClass1); - - Range.prototype.children = ['from', 'to']; - - function Range(from1, to1, tag) { - this.from = from1; - this.to = to1; - this.exclusive = tag === 'exclusive'; - this.equals = this.exclusive ? '' : '='; - } - - Range.prototype.compileVariables = function(o) { - var isComplex, ref3, ref4, ref5, step; - o = merge(o, { - top: true - }); - isComplex = del(o, 'isComplex'); - ref3 = this.cacheToCodeFragments(this.from.cache(o, LEVEL_LIST, isComplex)), this.fromC = ref3[0], this.fromVar = ref3[1]; - ref4 = this.cacheToCodeFragments(this.to.cache(o, LEVEL_LIST, isComplex)), this.toC = ref4[0], this.toVar = ref4[1]; - if (step = del(o, 'step')) { - ref5 = this.cacheToCodeFragments(step.cache(o, LEVEL_LIST, isComplex)), this.step = ref5[0], this.stepVar = ref5[1]; - } - this.fromNum = this.from.isNumber() ? Number(this.fromVar) : null; - this.toNum = this.to.isNumber() ? Number(this.toVar) : null; - return this.stepNum = (step != null ? step.isNumber() : void 0) ? Number(this.stepVar) : null; - }; - - Range.prototype.compileNode = function(o) { - var cond, condPart, from, gt, idx, idxName, known, lt, namedIndex, ref3, ref4, stepPart, to, varPart; - if (!this.fromVar) { - this.compileVariables(o); - } - if (!o.index) { - return this.compileArray(o); - } - known = (this.fromNum != null) && (this.toNum != null); - idx = del(o, 'index'); - idxName = del(o, 'name'); - namedIndex = idxName && idxName !== idx; - varPart = idx + " = " + this.fromC; - if (this.toC !== this.toVar) { - varPart += ", " + this.toC; - } - if (this.step !== this.stepVar) { - varPart += ", " + this.step; - } - ref3 = [idx + " <" + this.equals, idx + " >" + this.equals], lt = ref3[0], gt = ref3[1]; - condPart = this.stepNum != null ? this.stepNum > 0 ? lt + " " + this.toVar : gt + " " + this.toVar : known ? ((ref4 = [this.fromNum, this.toNum], from = ref4[0], to = ref4[1], ref4), from <= to ? lt + " " + to : gt + " " + to) : (cond = this.stepVar ? this.stepVar + " > 0" : this.fromVar + " <= " + this.toVar, cond + " ? " + lt + " " + this.toVar + " : " + gt + " " + this.toVar); - stepPart = this.stepVar ? idx + " += " + this.stepVar : known ? namedIndex ? from <= to ? "++" + idx : "--" + idx : from <= to ? idx + "++" : idx + "--" : namedIndex ? cond + " ? ++" + idx + " : --" + idx : cond + " ? " + idx + "++ : " + idx + "--"; - if (namedIndex) { - varPart = idxName + " = " + varPart; - } - if (namedIndex) { - stepPart = idxName + " = " + stepPart; - } - return [this.makeCode(varPart + "; " + condPart + "; " + stepPart)]; - }; - - Range.prototype.compileArray = function(o) { - var args, body, cond, hasArgs, i, idt, j, known, post, pre, range, ref3, ref4, result, results, vars; - known = (this.fromNum != null) && (this.toNum != null); - if (known && Math.abs(this.fromNum - this.toNum) <= 20) { - range = (function() { - results = []; - for (var j = ref3 = this.fromNum, ref4 = this.toNum; ref3 <= ref4 ? j <= ref4 : j >= ref4; ref3 <= ref4 ? j++ : j--){ results.push(j); } - return results; - }).apply(this); - if (this.exclusive) { - range.pop(); - } - return [this.makeCode("[" + (range.join(', ')) + "]")]; - } - idt = this.tab + TAB; - i = o.scope.freeVariable('i', { - single: true - }); - result = o.scope.freeVariable('results'); - pre = "\n" + idt + result + " = [];"; - if (known) { - o.index = i; - body = fragmentsToText(this.compileNode(o)); - } else { - vars = (i + " = " + this.fromC) + (this.toC !== this.toVar ? ", " + this.toC : ''); - cond = this.fromVar + " <= " + this.toVar; - body = "var " + vars + "; " + cond + " ? " + i + " <" + this.equals + " " + this.toVar + " : " + i + " >" + this.equals + " " + this.toVar + "; " + cond + " ? " + i + "++ : " + i + "--"; - } - post = "{ " + result + ".push(" + i + "); }\n" + idt + "return " + result + ";\n" + o.indent; - hasArgs = function(node) { - return node != null ? node.contains(isLiteralArguments) : void 0; - }; - if (hasArgs(this.from) || hasArgs(this.to)) { - args = ', arguments'; - } - return [this.makeCode("(function() {" + pre + "\n" + idt + "for (" + body + ")" + post + "}).apply(this" + (args != null ? args : '') + ")")]; - }; - - return Range; - - })(Base); - - exports.Slice = Slice = (function(superClass1) { - extend1(Slice, superClass1); - - Slice.prototype.children = ['range']; - - function Slice(range1) { - this.range = range1; - Slice.__super__.constructor.call(this); - } - - Slice.prototype.compileNode = function(o) { - var compiled, compiledText, from, fromCompiled, ref3, to, toStr; - ref3 = this.range, to = ref3.to, from = ref3.from; - fromCompiled = from && from.compileToFragments(o, LEVEL_PAREN) || [this.makeCode('0')]; - if (to) { - compiled = to.compileToFragments(o, LEVEL_PAREN); - compiledText = fragmentsToText(compiled); - if (!(!this.range.exclusive && +compiledText === -1)) { - toStr = ', ' + (this.range.exclusive ? compiledText : to.isNumber() ? "" + (+compiledText + 1) : (compiled = to.compileToFragments(o, LEVEL_ACCESS), "+" + (fragmentsToText(compiled)) + " + 1 || 9e9")); - } - } - return [this.makeCode(".slice(" + (fragmentsToText(fromCompiled)) + (toStr || '') + ")")]; - }; - - return Slice; - - })(Base); - - exports.Obj = Obj = (function(superClass1) { - extend1(Obj, superClass1); - - function Obj(props, generated) { - this.generated = generated != null ? generated : false; - this.objects = this.properties = props || []; - } - - Obj.prototype.children = ['properties']; - - Obj.prototype.compileNode = function(o) { - var answer, dynamicIndex, hasDynamic, i, idt, indent, j, join, k, key, l, lastNoncom, len1, len2, len3, node, oref, prop, props, ref3, value; - props = this.properties; - if (this.generated) { - for (j = 0, len1 = props.length; j < len1; j++) { - node = props[j]; - if (node instanceof Value) { - node.error('cannot have an implicit value in an implicit object'); - } - } - } - for (dynamicIndex = k = 0, len2 = props.length; k < len2; dynamicIndex = ++k) { - prop = props[dynamicIndex]; - if ((prop.variable || prop).base instanceof Parens) { - break; - } - } - hasDynamic = dynamicIndex < props.length; - idt = o.indent += TAB; - lastNoncom = this.lastNonComment(this.properties); - answer = []; - if (hasDynamic) { - oref = o.scope.freeVariable('obj'); - answer.push(this.makeCode("(\n" + idt + oref + " = ")); - } - answer.push(this.makeCode("{" + (props.length === 0 || dynamicIndex === 0 ? '}' : '\n'))); - for (i = l = 0, len3 = props.length; l < len3; i = ++l) { - prop = props[i]; - if (i === dynamicIndex) { - if (i !== 0) { - answer.push(this.makeCode("\n" + idt + "}")); - } - answer.push(this.makeCode(',\n')); - } - join = i === props.length - 1 || i === dynamicIndex - 1 ? '' : prop === lastNoncom || prop instanceof Comment ? '\n' : ',\n'; - indent = prop instanceof Comment ? '' : idt; - if (hasDynamic && i < dynamicIndex) { - indent += TAB; - } - if (prop instanceof Assign) { - if (prop.context !== 'object') { - prop.operatorToken.error("unexpected " + prop.operatorToken.value); - } - if (prop.variable instanceof Value && prop.variable.hasProperties()) { - prop.variable.error('invalid object key'); - } - } - if (prop instanceof Value && prop["this"]) { - prop = new Assign(prop.properties[0].name, prop, 'object'); - } - if (!(prop instanceof Comment)) { - if (i < dynamicIndex) { - if (!(prop instanceof Assign)) { - prop = new Assign(prop, prop, 'object'); - } - } else { - if (prop instanceof Assign) { - key = prop.variable; - value = prop.value; - } else { - ref3 = prop.base.cache(o), key = ref3[0], value = ref3[1]; - if (key instanceof IdentifierLiteral) { - key = new PropertyName(key.value); - } - } - prop = new Assign(new Value(new IdentifierLiteral(oref), [new Access(key)]), value); - } - } - if (indent) { - answer.push(this.makeCode(indent)); - } - answer.push.apply(answer, prop.compileToFragments(o, LEVEL_TOP)); - if (join) { - answer.push(this.makeCode(join)); - } - } - if (hasDynamic) { - answer.push(this.makeCode(",\n" + idt + oref + "\n" + this.tab + ")")); - } else { - if (props.length !== 0) { - answer.push(this.makeCode("\n" + this.tab + "}")); - } - } - if (this.front && !hasDynamic) { - return this.wrapInBraces(answer); - } else { - return answer; - } - }; - - Obj.prototype.assigns = function(name) { - var j, len1, prop, ref3; - ref3 = this.properties; - for (j = 0, len1 = ref3.length; j < len1; j++) { - prop = ref3[j]; - if (prop.assigns(name)) { - return true; - } - } - return false; - }; - - return Obj; - - })(Base); - - exports.Arr = Arr = (function(superClass1) { - extend1(Arr, superClass1); - - function Arr(objs) { - this.objects = objs || []; - } - - Arr.prototype.children = ['objects']; - - Arr.prototype.compileNode = function(o) { - var answer, compiledObjs, fragments, index, j, len1, obj; - if (!this.objects.length) { - return [this.makeCode('[]')]; - } - o.indent += TAB; - answer = Splat.compileSplattedArray(o, this.objects); - if (answer.length) { - return answer; - } - answer = []; - compiledObjs = (function() { - var j, len1, ref3, results; - ref3 = this.objects; - results = []; - for (j = 0, len1 = ref3.length; j < len1; j++) { - obj = ref3[j]; - results.push(obj.compileToFragments(o, LEVEL_LIST)); - } - return results; - }).call(this); - for (index = j = 0, len1 = compiledObjs.length; j < len1; index = ++j) { - fragments = compiledObjs[index]; - if (index) { - answer.push(this.makeCode(", ")); - } - answer.push.apply(answer, fragments); - } - if (fragmentsToText(answer).indexOf('\n') >= 0) { - answer.unshift(this.makeCode("[\n" + o.indent)); - answer.push(this.makeCode("\n" + this.tab + "]")); - } else { - answer.unshift(this.makeCode("[")); - answer.push(this.makeCode("]")); - } - return answer; - }; - - Arr.prototype.assigns = function(name) { - var j, len1, obj, ref3; - ref3 = this.objects; - for (j = 0, len1 = ref3.length; j < len1; j++) { - obj = ref3[j]; - if (obj.assigns(name)) { - return true; - } - } - return false; - }; - - return Arr; - - })(Base); - - exports.Class = Class = (function(superClass1) { - extend1(Class, superClass1); - - function Class(variable1, parent1, body1) { - this.variable = variable1; - this.parent = parent1; - this.body = body1 != null ? body1 : new Block; - this.boundFuncs = []; - this.body.classBody = true; - } - - Class.prototype.children = ['variable', 'parent', 'body']; - - Class.prototype.defaultClassVariableName = '_Class'; - - Class.prototype.determineName = function() { - var message, name, node, ref3, tail; - if (!this.variable) { - return this.defaultClassVariableName; - } - ref3 = this.variable.properties, tail = ref3[ref3.length - 1]; - node = tail ? tail instanceof Access && tail.name : this.variable.base; - if (!(node instanceof IdentifierLiteral || node instanceof PropertyName)) { - return this.defaultClassVariableName; - } - name = node.value; - if (!tail) { - message = isUnassignable(name); - if (message) { - this.variable.error(message); - } - } - if (indexOf.call(JS_FORBIDDEN, name) >= 0) { - return "_" + name; - } else { - return name; - } - }; - - Class.prototype.setContext = function(name) { - return this.body.traverseChildren(false, function(node) { - if (node.classBody) { - return false; - } - if (node instanceof ThisLiteral) { - return node.value = name; - } else if (node instanceof Code) { - if (node.bound) { - return node.context = name; - } - } - }); - }; - - Class.prototype.addBoundFunctions = function(o) { - var bvar, j, len1, lhs, ref3; - ref3 = this.boundFuncs; - for (j = 0, len1 = ref3.length; j < len1; j++) { - bvar = ref3[j]; - lhs = (new Value(new ThisLiteral, [new Access(bvar)])).compile(o); - this.ctor.body.unshift(new Literal(lhs + " = " + (utility('bind', o)) + "(" + lhs + ", this)")); - } - }; - - Class.prototype.addProperties = function(node, name, o) { - var acc, assign, base, exprs, func, props; - props = node.base.properties.slice(0); - exprs = (function() { - var results; - results = []; - while (assign = props.shift()) { - if (assign instanceof Assign) { - base = assign.variable.base; - delete assign.context; - func = assign.value; - if (base.value === 'constructor') { - if (this.ctor) { - assign.error('cannot define more than one constructor in a class'); - } - if (func.bound) { - assign.error('cannot define a constructor as a bound function'); - } - if (func instanceof Code) { - assign = this.ctor = func; - } else { - this.externalCtor = o.classScope.freeVariable('ctor'); - assign = new Assign(new IdentifierLiteral(this.externalCtor), func); - } - } else { - if (assign.variable["this"]) { - func["static"] = true; - } else { - acc = base.isComplex() ? new Index(base) : new Access(base); - assign.variable = new Value(new IdentifierLiteral(name), [new Access(new PropertyName('prototype')), acc]); - if (func instanceof Code && func.bound) { - this.boundFuncs.push(base); - func.bound = false; - } - } - } - } - results.push(assign); - } - return results; - }).call(this); - return compact(exprs); - }; - - Class.prototype.walkBody = function(name, o) { - return this.traverseChildren(false, (function(_this) { - return function(child) { - var cont, exps, i, j, len1, node, ref3; - cont = true; - if (child instanceof Class) { - return false; - } - if (child instanceof Block) { - ref3 = exps = child.expressions; - for (i = j = 0, len1 = ref3.length; j < len1; i = ++j) { - node = ref3[i]; - if (node instanceof Assign && node.variable.looksStatic(name)) { - node.value["static"] = true; - } else if (node instanceof Value && node.isObject(true)) { - cont = false; - exps[i] = _this.addProperties(node, name, o); - } - } - child.expressions = exps = flatten(exps); - } - return cont && !(child instanceof Class); - }; - })(this)); - }; - - Class.prototype.hoistDirectivePrologue = function() { - var expressions, index, node; - index = 0; - expressions = this.body.expressions; - while ((node = expressions[index]) && node instanceof Comment || node instanceof Value && node.isString()) { - ++index; - } - return this.directives = expressions.splice(0, index); - }; - - Class.prototype.ensureConstructor = function(name) { - if (!this.ctor) { - this.ctor = new Code; - if (this.externalCtor) { - this.ctor.body.push(new Literal(this.externalCtor + ".apply(this, arguments)")); - } else if (this.parent) { - this.ctor.body.push(new Literal(name + ".__super__.constructor.apply(this, arguments)")); - } - this.ctor.body.makeReturn(); - this.body.expressions.unshift(this.ctor); - } - this.ctor.ctor = this.ctor.name = name; - this.ctor.klass = null; - return this.ctor.noReturn = true; - }; - - Class.prototype.compileNode = function(o) { - var args, argumentsNode, func, jumpNode, klass, lname, name, ref3, superClass; - if (jumpNode = this.body.jumps()) { - jumpNode.error('Class bodies cannot contain pure statements'); - } - if (argumentsNode = this.body.contains(isLiteralArguments)) { - argumentsNode.error("Class bodies shouldn't reference arguments"); - } - name = this.determineName(); - lname = new IdentifierLiteral(name); - func = new Code([], Block.wrap([this.body])); - args = []; - o.classScope = func.makeScope(o.scope); - this.hoistDirectivePrologue(); - this.setContext(name); - this.walkBody(name, o); - this.ensureConstructor(name); - this.addBoundFunctions(o); - this.body.spaced = true; - this.body.expressions.push(lname); - if (this.parent) { - superClass = new IdentifierLiteral(o.classScope.freeVariable('superClass', { - reserve: false - })); - this.body.expressions.unshift(new Extends(lname, superClass)); - func.params.push(new Param(superClass)); - args.push(this.parent); - } - (ref3 = this.body.expressions).unshift.apply(ref3, this.directives); - klass = new Parens(new Call(func, args)); - if (this.variable) { - klass = new Assign(this.variable, klass, null, { - moduleDeclaration: this.moduleDeclaration - }); - } - return klass.compileToFragments(o); - }; - - return Class; - - })(Base); - - exports.ModuleDeclaration = ModuleDeclaration = (function(superClass1) { - extend1(ModuleDeclaration, superClass1); - - function ModuleDeclaration(clause, source1) { - this.clause = clause; - this.source = source1; - this.checkSource(); - } - - ModuleDeclaration.prototype.children = ['clause', 'source']; - - ModuleDeclaration.prototype.isStatement = YES; - - ModuleDeclaration.prototype.jumps = THIS; - - ModuleDeclaration.prototype.makeReturn = THIS; - - ModuleDeclaration.prototype.checkSource = function() { - if ((this.source != null) && this.source instanceof StringWithInterpolations) { - return this.source.error('the name of the module to be imported from must be an uninterpolated string'); - } - }; - - ModuleDeclaration.prototype.checkScope = function(o, moduleDeclarationType) { - if (o.indent.length !== 0) { - return this.error(moduleDeclarationType + " statements must be at top-level scope"); - } - }; - - return ModuleDeclaration; - - })(Base); - - exports.ImportDeclaration = ImportDeclaration = (function(superClass1) { - extend1(ImportDeclaration, superClass1); - - function ImportDeclaration() { - return ImportDeclaration.__super__.constructor.apply(this, arguments); - } - - ImportDeclaration.prototype.compileNode = function(o) { - var code, ref3; - this.checkScope(o, 'import'); - o.importedSymbols = []; - code = []; - code.push(this.makeCode(this.tab + "import ")); - if (this.clause != null) { - code.push.apply(code, this.clause.compileNode(o)); - } - if (((ref3 = this.source) != null ? ref3.value : void 0) != null) { - if (this.clause !== null) { - code.push(this.makeCode(' from ')); - } - code.push(this.makeCode(this.source.value)); - } - code.push(this.makeCode(';')); - return code; - }; - - return ImportDeclaration; - - })(ModuleDeclaration); - - exports.ImportClause = ImportClause = (function(superClass1) { - extend1(ImportClause, superClass1); - - function ImportClause(defaultBinding, namedImports) { - this.defaultBinding = defaultBinding; - this.namedImports = namedImports; - } - - ImportClause.prototype.children = ['defaultBinding', 'namedImports']; - - ImportClause.prototype.compileNode = function(o) { - var code; - code = []; - if (this.defaultBinding != null) { - code.push.apply(code, this.defaultBinding.compileNode(o)); - if (this.namedImports != null) { - code.push(this.makeCode(', ')); - } - } - if (this.namedImports != null) { - code.push.apply(code, this.namedImports.compileNode(o)); - } - return code; - }; - - return ImportClause; - - })(Base); - - exports.ExportDeclaration = ExportDeclaration = (function(superClass1) { - extend1(ExportDeclaration, superClass1); - - function ExportDeclaration() { - return ExportDeclaration.__super__.constructor.apply(this, arguments); - } - - ExportDeclaration.prototype.compileNode = function(o) { - var code, ref3; - this.checkScope(o, 'export'); - code = []; - code.push(this.makeCode(this.tab + "export ")); - if (this instanceof ExportDefaultDeclaration) { - code.push(this.makeCode('default ')); - } - if (!(this instanceof ExportDefaultDeclaration) && (this.clause instanceof Assign || this.clause instanceof Class)) { - if (this.clause instanceof Class && !this.clause.variable) { - this.clause.error('anonymous classes cannot be exported'); - } - code.push(this.makeCode('var ')); - this.clause.moduleDeclaration = 'export'; - } - if ((this.clause.body != null) && this.clause.body instanceof Block) { - code = code.concat(this.clause.compileToFragments(o, LEVEL_TOP)); - } else { - code = code.concat(this.clause.compileNode(o)); - } - if (((ref3 = this.source) != null ? ref3.value : void 0) != null) { - code.push(this.makeCode(" from " + this.source.value)); - } - code.push(this.makeCode(';')); - return code; - }; - - return ExportDeclaration; - - })(ModuleDeclaration); - - exports.ExportNamedDeclaration = ExportNamedDeclaration = (function(superClass1) { - extend1(ExportNamedDeclaration, superClass1); - - function ExportNamedDeclaration() { - return ExportNamedDeclaration.__super__.constructor.apply(this, arguments); - } - - return ExportNamedDeclaration; - - })(ExportDeclaration); - - exports.ExportDefaultDeclaration = ExportDefaultDeclaration = (function(superClass1) { - extend1(ExportDefaultDeclaration, superClass1); - - function ExportDefaultDeclaration() { - return ExportDefaultDeclaration.__super__.constructor.apply(this, arguments); - } - - return ExportDefaultDeclaration; - - })(ExportDeclaration); - - exports.ExportAllDeclaration = ExportAllDeclaration = (function(superClass1) { - extend1(ExportAllDeclaration, superClass1); - - function ExportAllDeclaration() { - return ExportAllDeclaration.__super__.constructor.apply(this, arguments); - } - - return ExportAllDeclaration; - - })(ExportDeclaration); - - exports.ModuleSpecifierList = ModuleSpecifierList = (function(superClass1) { - extend1(ModuleSpecifierList, superClass1); - - function ModuleSpecifierList(specifiers) { - this.specifiers = specifiers; - } - - ModuleSpecifierList.prototype.children = ['specifiers']; - - ModuleSpecifierList.prototype.compileNode = function(o) { - var code, compiledList, fragments, index, j, len1, specifier; - code = []; - o.indent += TAB; - compiledList = (function() { - var j, len1, ref3, results; - ref3 = this.specifiers; - results = []; - for (j = 0, len1 = ref3.length; j < len1; j++) { - specifier = ref3[j]; - results.push(specifier.compileToFragments(o, LEVEL_LIST)); - } - return results; - }).call(this); - if (this.specifiers.length !== 0) { - code.push(this.makeCode("{\n" + o.indent)); - for (index = j = 0, len1 = compiledList.length; j < len1; index = ++j) { - fragments = compiledList[index]; - if (index) { - code.push(this.makeCode(",\n" + o.indent)); - } - code.push.apply(code, fragments); - } - code.push(this.makeCode("\n}")); - } else { - code.push(this.makeCode('{}')); - } - return code; - }; - - return ModuleSpecifierList; - - })(Base); - - exports.ImportSpecifierList = ImportSpecifierList = (function(superClass1) { - extend1(ImportSpecifierList, superClass1); - - function ImportSpecifierList() { - return ImportSpecifierList.__super__.constructor.apply(this, arguments); - } - - return ImportSpecifierList; - - })(ModuleSpecifierList); - - exports.ExportSpecifierList = ExportSpecifierList = (function(superClass1) { - extend1(ExportSpecifierList, superClass1); - - function ExportSpecifierList() { - return ExportSpecifierList.__super__.constructor.apply(this, arguments); - } - - return ExportSpecifierList; - - })(ModuleSpecifierList); - - exports.ModuleSpecifier = ModuleSpecifier = (function(superClass1) { - extend1(ModuleSpecifier, superClass1); - - function ModuleSpecifier(original, alias, moduleDeclarationType1) { - this.original = original; - this.alias = alias; - this.moduleDeclarationType = moduleDeclarationType1; - this.identifier = this.alias != null ? this.alias.value : this.original.value; - } - - ModuleSpecifier.prototype.children = ['original', 'alias']; - - ModuleSpecifier.prototype.compileNode = function(o) { - var code; - o.scope.find(this.identifier, this.moduleDeclarationType); - code = []; - code.push(this.makeCode(this.original.value)); - if (this.alias != null) { - code.push(this.makeCode(" as " + this.alias.value)); - } - return code; - }; - - return ModuleSpecifier; - - })(Base); - - exports.ImportSpecifier = ImportSpecifier = (function(superClass1) { - extend1(ImportSpecifier, superClass1); - - function ImportSpecifier(imported, local) { - ImportSpecifier.__super__.constructor.call(this, imported, local, 'import'); - } - - ImportSpecifier.prototype.compileNode = function(o) { - var ref3; - if ((ref3 = this.identifier, indexOf.call(o.importedSymbols, ref3) >= 0) || o.scope.check(this.identifier)) { - this.error("'" + this.identifier + "' has already been declared"); - } else { - o.importedSymbols.push(this.identifier); - } - return ImportSpecifier.__super__.compileNode.call(this, o); - }; - - return ImportSpecifier; - - })(ModuleSpecifier); - - exports.ImportDefaultSpecifier = ImportDefaultSpecifier = (function(superClass1) { - extend1(ImportDefaultSpecifier, superClass1); - - function ImportDefaultSpecifier() { - return ImportDefaultSpecifier.__super__.constructor.apply(this, arguments); - } - - return ImportDefaultSpecifier; - - })(ImportSpecifier); - - exports.ImportNamespaceSpecifier = ImportNamespaceSpecifier = (function(superClass1) { - extend1(ImportNamespaceSpecifier, superClass1); - - function ImportNamespaceSpecifier() { - return ImportNamespaceSpecifier.__super__.constructor.apply(this, arguments); - } - - return ImportNamespaceSpecifier; - - })(ImportSpecifier); - - exports.ExportSpecifier = ExportSpecifier = (function(superClass1) { - extend1(ExportSpecifier, superClass1); - - function ExportSpecifier(local, exported) { - ExportSpecifier.__super__.constructor.call(this, local, exported, 'export'); - } - - return ExportSpecifier; - - })(ModuleSpecifier); - - exports.Assign = Assign = (function(superClass1) { - extend1(Assign, superClass1); - - function Assign(variable1, value1, context, options) { - this.variable = variable1; - this.value = value1; - this.context = context; - if (options == null) { - options = {}; - } - this.param = options.param, this.subpattern = options.subpattern, this.operatorToken = options.operatorToken, this.moduleDeclaration = options.moduleDeclaration; - } - - Assign.prototype.children = ['variable', 'value']; - - Assign.prototype.isStatement = function(o) { - return (o != null ? o.level : void 0) === LEVEL_TOP && (this.context != null) && (this.moduleDeclaration || indexOf.call(this.context, "?") >= 0); - }; - - Assign.prototype.checkAssignability = function(o, varBase) { - if (Object.prototype.hasOwnProperty.call(o.scope.positions, varBase.value) && o.scope.variables[o.scope.positions[varBase.value]].type === 'import') { - return varBase.error("'" + varBase.value + "' is read-only"); - } - }; - - Assign.prototype.assigns = function(name) { - return this[this.context === 'object' ? 'value' : 'variable'].assigns(name); - }; - - Assign.prototype.unfoldSoak = function(o) { - return unfoldSoak(o, this, 'variable'); - }; - - Assign.prototype.compileNode = function(o) { - var answer, compiledName, isValue, j, name, properties, prototype, ref3, ref4, ref5, ref6, ref7, ref8, val, varBase; - if (isValue = this.variable instanceof Value) { - if (this.variable.isArray() || this.variable.isObject()) { - return this.compilePatternMatch(o); - } - if (this.variable.isSplice()) { - return this.compileSplice(o); - } - if ((ref3 = this.context) === '||=' || ref3 === '&&=' || ref3 === '?=') { - return this.compileConditional(o); - } - if ((ref4 = this.context) === '**=' || ref4 === '//=' || ref4 === '%%=') { - return this.compileSpecialMath(o); - } - } - if (this.value instanceof Code) { - if (this.value["static"]) { - this.value.klass = this.variable.base; - this.value.name = this.variable.properties[0]; - this.value.variable = this.variable; - } else if (((ref5 = this.variable.properties) != null ? ref5.length : void 0) >= 2) { - ref6 = this.variable.properties, properties = 3 <= ref6.length ? slice.call(ref6, 0, j = ref6.length - 2) : (j = 0, []), prototype = ref6[j++], name = ref6[j++]; - if (((ref7 = prototype.name) != null ? ref7.value : void 0) === 'prototype') { - this.value.klass = new Value(this.variable.base, properties); - this.value.name = name; - this.value.variable = this.variable; - } - } - } - if (!this.context) { - varBase = this.variable.unwrapAll(); - if (!varBase.isAssignable()) { - this.variable.error("'" + (this.variable.compile(o)) + "' can't be assigned"); - } - if (!(typeof varBase.hasProperties === "function" ? varBase.hasProperties() : void 0)) { - if (this.moduleDeclaration) { - this.checkAssignability(o, varBase); - o.scope.add(varBase.value, this.moduleDeclaration); - } else if (this.param) { - o.scope.add(varBase.value, 'var'); - } else { - this.checkAssignability(o, varBase); - o.scope.find(varBase.value); - } - } - } - val = this.value.compileToFragments(o, LEVEL_LIST); - if (isValue && this.variable.base instanceof Obj) { - this.variable.front = true; - } - compiledName = this.variable.compileToFragments(o, LEVEL_LIST); - if (this.context === 'object') { - if (ref8 = fragmentsToText(compiledName), indexOf.call(JS_FORBIDDEN, ref8) >= 0) { - compiledName.unshift(this.makeCode('"')); - compiledName.push(this.makeCode('"')); - } - return compiledName.concat(this.makeCode(": "), val); - } - answer = compiledName.concat(this.makeCode(" " + (this.context || '=') + " "), val); - if (o.level <= LEVEL_LIST) { - return answer; - } else { - return this.wrapInBraces(answer); - } - }; - - Assign.prototype.compilePatternMatch = function(o) { - var acc, assigns, code, defaultValue, expandedIdx, fragments, i, idx, isObject, ivar, j, len1, message, name, obj, objects, olen, ref, ref3, ref4, ref5, ref6, rest, top, val, value, vvar, vvarText; - top = o.level === LEVEL_TOP; - value = this.value; - objects = this.variable.base.objects; - if (!(olen = objects.length)) { - code = value.compileToFragments(o); - if (o.level >= LEVEL_OP) { - return this.wrapInBraces(code); - } else { - return code; - } - } - obj = objects[0]; - if (olen === 1 && obj instanceof Expansion) { - obj.error('Destructuring assignment has no target'); - } - isObject = this.variable.isObject(); - if (top && olen === 1 && !(obj instanceof Splat)) { - defaultValue = null; - if (obj instanceof Assign && obj.context === 'object') { - ref3 = obj, (ref4 = ref3.variable, idx = ref4.base), obj = ref3.value; - if (obj instanceof Assign) { - defaultValue = obj.value; - obj = obj.variable; - } - } else { - if (obj instanceof Assign) { - defaultValue = obj.value; - obj = obj.variable; - } - idx = isObject ? obj["this"] ? obj.properties[0].name : new PropertyName(obj.unwrap().value) : new NumberLiteral(0); - } - acc = idx.unwrap() instanceof PropertyName; - value = new Value(value); - value.properties.push(new (acc ? Access : Index)(idx)); - message = isUnassignable(obj.unwrap().value); - if (message) { - obj.error(message); - } - if (defaultValue) { - value = new Op('?', value, defaultValue); - } - return new Assign(obj, value, null, { - param: this.param - }).compileToFragments(o, LEVEL_TOP); - } - vvar = value.compileToFragments(o, LEVEL_LIST); - vvarText = fragmentsToText(vvar); - assigns = []; - expandedIdx = false; - if (!(value.unwrap() instanceof IdentifierLiteral) || this.variable.assigns(vvarText)) { - assigns.push([this.makeCode((ref = o.scope.freeVariable('ref')) + " = ")].concat(slice.call(vvar))); - vvar = [this.makeCode(ref)]; - vvarText = ref; - } - for (i = j = 0, len1 = objects.length; j < len1; i = ++j) { - obj = objects[i]; - idx = i; - if (!expandedIdx && obj instanceof Splat) { - name = obj.name.unwrap().value; - obj = obj.unwrap(); - val = olen + " <= " + vvarText + ".length ? " + (utility('slice', o)) + ".call(" + vvarText + ", " + i; - if (rest = olen - i - 1) { - ivar = o.scope.freeVariable('i', { - single: true - }); - val += ", " + ivar + " = " + vvarText + ".length - " + rest + ") : (" + ivar + " = " + i + ", [])"; - } else { - val += ") : []"; - } - val = new Literal(val); - expandedIdx = ivar + "++"; - } else if (!expandedIdx && obj instanceof Expansion) { - if (rest = olen - i - 1) { - if (rest === 1) { - expandedIdx = vvarText + ".length - 1"; - } else { - ivar = o.scope.freeVariable('i', { - single: true - }); - val = new Literal(ivar + " = " + vvarText + ".length - " + rest); - expandedIdx = ivar + "++"; - assigns.push(val.compileToFragments(o, LEVEL_LIST)); - } - } - continue; - } else { - if (obj instanceof Splat || obj instanceof Expansion) { - obj.error("multiple splats/expansions are disallowed in an assignment"); - } - defaultValue = null; - if (obj instanceof Assign && obj.context === 'object') { - ref5 = obj, (ref6 = ref5.variable, idx = ref6.base), obj = ref5.value; - if (obj instanceof Assign) { - defaultValue = obj.value; - obj = obj.variable; - } - } else { - if (obj instanceof Assign) { - defaultValue = obj.value; - obj = obj.variable; - } - idx = isObject ? obj["this"] ? obj.properties[0].name : new PropertyName(obj.unwrap().value) : new Literal(expandedIdx || idx); - } - name = obj.unwrap().value; - acc = idx.unwrap() instanceof PropertyName; - val = new Value(new Literal(vvarText), [new (acc ? Access : Index)(idx)]); - if (defaultValue) { - val = new Op('?', val, defaultValue); - } - } - if (name != null) { - message = isUnassignable(name); - if (message) { - obj.error(message); - } - } - assigns.push(new Assign(obj, val, null, { - param: this.param, - subpattern: true - }).compileToFragments(o, LEVEL_LIST)); - } - if (!(top || this.subpattern)) { - assigns.push(vvar); - } - fragments = this.joinFragmentArrays(assigns, ', '); - if (o.level < LEVEL_LIST) { - return fragments; - } else { - return this.wrapInBraces(fragments); - } - }; - - Assign.prototype.compileConditional = function(o) { - var fragments, left, ref3, right; - ref3 = this.variable.cacheReference(o), left = ref3[0], right = ref3[1]; - if (!left.properties.length && left.base instanceof Literal && !(left.base instanceof ThisLiteral) && !o.scope.check(left.base.value)) { - this.variable.error("the variable \"" + left.base.value + "\" can't be assigned with " + this.context + " because it has not been declared before"); - } - if (indexOf.call(this.context, "?") >= 0) { - o.isExistentialEquals = true; - return new If(new Existence(left), right, { - type: 'if' - }).addElse(new Assign(right, this.value, '=')).compileToFragments(o); - } else { - fragments = new Op(this.context.slice(0, -1), left, new Assign(right, this.value, '=')).compileToFragments(o); - if (o.level <= LEVEL_LIST) { - return fragments; - } else { - return this.wrapInBraces(fragments); - } - } - }; - - Assign.prototype.compileSpecialMath = function(o) { - var left, ref3, right; - ref3 = this.variable.cacheReference(o), left = ref3[0], right = ref3[1]; - return new Assign(left, new Op(this.context.slice(0, -1), right, this.value)).compileToFragments(o); - }; - - Assign.prototype.compileSplice = function(o) { - var answer, exclusive, from, fromDecl, fromRef, name, ref3, ref4, ref5, to, valDef, valRef; - ref3 = this.variable.properties.pop().range, from = ref3.from, to = ref3.to, exclusive = ref3.exclusive; - name = this.variable.compile(o); - if (from) { - ref4 = this.cacheToCodeFragments(from.cache(o, LEVEL_OP)), fromDecl = ref4[0], fromRef = ref4[1]; - } else { - fromDecl = fromRef = '0'; - } - if (to) { - if ((from != null ? from.isNumber() : void 0) && to.isNumber()) { - to = to.compile(o) - fromRef; - if (!exclusive) { - to += 1; - } - } else { - to = to.compile(o, LEVEL_ACCESS) + ' - ' + fromRef; - if (!exclusive) { - to += ' + 1'; - } - } - } else { - to = "9e9"; - } - ref5 = this.value.cache(o, LEVEL_LIST), valDef = ref5[0], valRef = ref5[1]; - answer = [].concat(this.makeCode("[].splice.apply(" + name + ", [" + fromDecl + ", " + to + "].concat("), valDef, this.makeCode(")), "), valRef); - if (o.level > LEVEL_TOP) { - return this.wrapInBraces(answer); - } else { - return answer; - } - }; - - return Assign; - - })(Base); - - exports.Code = Code = (function(superClass1) { - extend1(Code, superClass1); - - function Code(params, body, tag) { - this.params = params || []; - this.body = body || new Block; - this.bound = tag === 'boundfunc'; - this.isGenerator = !!this.body.contains(function(node) { - return (node instanceof Op && node.isYield()) || node instanceof YieldReturn; - }); - } - - Code.prototype.children = ['params', 'body']; - - Code.prototype.isStatement = function() { - return !!this.ctor; - }; - - Code.prototype.jumps = NO; - - Code.prototype.makeScope = function(parentScope) { - return new Scope(parentScope, this.body, this); - }; - - Code.prototype.compileNode = function(o) { - var answer, boundfunc, code, exprs, i, j, k, l, len1, len2, len3, len4, len5, len6, lit, m, p, param, params, q, r, ref, ref3, ref4, ref5, ref6, ref7, ref8, splats, uniqs, val, wasEmpty, wrapper; - if (this.bound && ((ref3 = o.scope.method) != null ? ref3.bound : void 0)) { - this.context = o.scope.method.context; - } - if (this.bound && !this.context) { - this.context = '_this'; - wrapper = new Code([new Param(new IdentifierLiteral(this.context))], new Block([this])); - boundfunc = new Call(wrapper, [new ThisLiteral]); - boundfunc.updateLocationDataIfMissing(this.locationData); - return boundfunc.compileNode(o); - } - o.scope = del(o, 'classScope') || this.makeScope(o.scope); - o.scope.shared = del(o, 'sharedScope'); - o.indent += TAB; - delete o.bare; - delete o.isExistentialEquals; - params = []; - exprs = []; - ref4 = this.params; - for (j = 0, len1 = ref4.length; j < len1; j++) { - param = ref4[j]; - if (!(param instanceof Expansion)) { - o.scope.parameter(param.asReference(o)); - } - } - ref5 = this.params; - for (k = 0, len2 = ref5.length; k < len2; k++) { - param = ref5[k]; - if (!(param.splat || param instanceof Expansion)) { - continue; - } - ref6 = this.params; - for (l = 0, len3 = ref6.length; l < len3; l++) { - p = ref6[l]; - if (!(p instanceof Expansion) && p.name.value) { - o.scope.add(p.name.value, 'var', true); - } - } - splats = new Assign(new Value(new Arr((function() { - var len4, m, ref7, results; - ref7 = this.params; - results = []; - for (m = 0, len4 = ref7.length; m < len4; m++) { - p = ref7[m]; - results.push(p.asReference(o)); - } - return results; - }).call(this))), new Value(new IdentifierLiteral('arguments'))); - break; - } - ref7 = this.params; - for (m = 0, len4 = ref7.length; m < len4; m++) { - param = ref7[m]; - if (param.isComplex()) { - val = ref = param.asReference(o); - if (param.value) { - val = new Op('?', ref, param.value); - } - exprs.push(new Assign(new Value(param.name), val, '=', { - param: true - })); - } else { - ref = param; - if (param.value) { - lit = new Literal(ref.name.value + ' == null'); - val = new Assign(new Value(param.name), param.value, '='); - exprs.push(new If(lit, val)); - } - } - if (!splats) { - params.push(ref); - } - } - wasEmpty = this.body.isEmpty(); - if (splats) { - exprs.unshift(splats); - } - if (exprs.length) { - (ref8 = this.body.expressions).unshift.apply(ref8, exprs); - } - for (i = q = 0, len5 = params.length; q < len5; i = ++q) { - p = params[i]; - params[i] = p.compileToFragments(o); - o.scope.parameter(fragmentsToText(params[i])); - } - uniqs = []; - this.eachParamName(function(name, node) { - if (indexOf.call(uniqs, name) >= 0) { - node.error("multiple parameters named " + name); - } - return uniqs.push(name); - }); - if (!(wasEmpty || this.noReturn)) { - this.body.makeReturn(); - } - code = 'function'; - if (this.isGenerator) { - code += '*'; - } - if (this.ctor) { - code += ' ' + this.name; - } - code += '('; - answer = [this.makeCode(code)]; - for (i = r = 0, len6 = params.length; r < len6; i = ++r) { - p = params[i]; - if (i) { - answer.push(this.makeCode(", ")); - } - answer.push.apply(answer, p); - } - answer.push(this.makeCode(') {')); - if (!this.body.isEmpty()) { - answer = answer.concat(this.makeCode("\n"), this.body.compileWithDeclarations(o), this.makeCode("\n" + this.tab)); - } - answer.push(this.makeCode('}')); - if (this.ctor) { - return [this.makeCode(this.tab)].concat(slice.call(answer)); - } - if (this.front || (o.level >= LEVEL_ACCESS)) { - return this.wrapInBraces(answer); - } else { - return answer; - } - }; - - Code.prototype.eachParamName = function(iterator) { - var j, len1, param, ref3, results; - ref3 = this.params; - results = []; - for (j = 0, len1 = ref3.length; j < len1; j++) { - param = ref3[j]; - results.push(param.eachName(iterator)); - } - return results; - }; - - Code.prototype.traverseChildren = function(crossScope, func) { - if (crossScope) { - return Code.__super__.traverseChildren.call(this, crossScope, func); - } - }; - - return Code; - - })(Base); - - exports.Param = Param = (function(superClass1) { - extend1(Param, superClass1); - - function Param(name1, value1, splat) { - var message, token; - this.name = name1; - this.value = value1; - this.splat = splat; - message = isUnassignable(this.name.unwrapAll().value); - if (message) { - this.name.error(message); - } - if (this.name instanceof Obj && this.name.generated) { - token = this.name.objects[0].operatorToken; - token.error("unexpected " + token.value); - } - } - - Param.prototype.children = ['name', 'value']; - - Param.prototype.compileToFragments = function(o) { - return this.name.compileToFragments(o, LEVEL_LIST); - }; - - Param.prototype.asReference = function(o) { - var name, node; - if (this.reference) { - return this.reference; - } - node = this.name; - if (node["this"]) { - name = node.properties[0].name.value; - if (indexOf.call(JS_FORBIDDEN, name) >= 0) { - name = "_" + name; - } - node = new IdentifierLiteral(o.scope.freeVariable(name)); - } else if (node.isComplex()) { - node = new IdentifierLiteral(o.scope.freeVariable('arg')); - } - node = new Value(node); - if (this.splat) { - node = new Splat(node); - } - node.updateLocationDataIfMissing(this.locationData); - return this.reference = node; - }; - - Param.prototype.isComplex = function() { - return this.name.isComplex(); - }; - - Param.prototype.eachName = function(iterator, name) { - var atParam, j, len1, node, obj, ref3, ref4; - if (name == null) { - name = this.name; - } - atParam = function(obj) { - return iterator("@" + obj.properties[0].name.value, obj); - }; - if (name instanceof Literal) { - return iterator(name.value, name); - } - if (name instanceof Value) { - return atParam(name); - } - ref4 = (ref3 = name.objects) != null ? ref3 : []; - for (j = 0, len1 = ref4.length; j < len1; j++) { - obj = ref4[j]; - if (obj instanceof Assign && (obj.context == null)) { - obj = obj.variable; - } - if (obj instanceof Assign) { - if (obj.value instanceof Assign) { - obj = obj.value; - } - this.eachName(iterator, obj.value.unwrap()); - } else if (obj instanceof Splat) { - node = obj.name.unwrap(); - iterator(node.value, node); - } else if (obj instanceof Value) { - if (obj.isArray() || obj.isObject()) { - this.eachName(iterator, obj.base); - } else if (obj["this"]) { - atParam(obj); - } else { - iterator(obj.base.value, obj.base); - } - } else if (!(obj instanceof Expansion)) { - obj.error("illegal parameter " + (obj.compile())); - } - } - }; - - return Param; - - })(Base); - - exports.Splat = Splat = (function(superClass1) { - extend1(Splat, superClass1); - - Splat.prototype.children = ['name']; - - Splat.prototype.isAssignable = YES; - - function Splat(name) { - this.name = name.compile ? name : new Literal(name); - } - - Splat.prototype.assigns = function(name) { - return this.name.assigns(name); - }; - - Splat.prototype.compileToFragments = function(o) { - return this.name.compileToFragments(o); - }; - - Splat.prototype.unwrap = function() { - return this.name; - }; - - Splat.compileSplattedArray = function(o, list, apply) { - var args, base, compiledNode, concatPart, fragments, i, index, j, last, len1, node; - index = -1; - while ((node = list[++index]) && !(node instanceof Splat)) { - continue; - } - if (index >= list.length) { - return []; - } - if (list.length === 1) { - node = list[0]; - fragments = node.compileToFragments(o, LEVEL_LIST); - if (apply) { - return fragments; - } - return [].concat(node.makeCode((utility('slice', o)) + ".call("), fragments, node.makeCode(")")); - } - args = list.slice(index); - for (i = j = 0, len1 = args.length; j < len1; i = ++j) { - node = args[i]; - compiledNode = node.compileToFragments(o, LEVEL_LIST); - args[i] = node instanceof Splat ? [].concat(node.makeCode((utility('slice', o)) + ".call("), compiledNode, node.makeCode(")")) : [].concat(node.makeCode("["), compiledNode, node.makeCode("]")); - } - if (index === 0) { - node = list[0]; - concatPart = node.joinFragmentArrays(args.slice(1), ', '); - return args[0].concat(node.makeCode(".concat("), concatPart, node.makeCode(")")); - } - base = (function() { - var k, len2, ref3, results; - ref3 = list.slice(0, index); - results = []; - for (k = 0, len2 = ref3.length; k < len2; k++) { - node = ref3[k]; - results.push(node.compileToFragments(o, LEVEL_LIST)); - } - return results; - })(); - base = list[0].joinFragmentArrays(base, ', '); - concatPart = list[index].joinFragmentArrays(args, ', '); - last = list[list.length - 1]; - return [].concat(list[0].makeCode("["), base, list[index].makeCode("].concat("), concatPart, last.makeCode(")")); - }; - - return Splat; - - })(Base); - - exports.Expansion = Expansion = (function(superClass1) { - extend1(Expansion, superClass1); - - function Expansion() { - return Expansion.__super__.constructor.apply(this, arguments); - } - - Expansion.prototype.isComplex = NO; - - Expansion.prototype.compileNode = function(o) { - return this.error('Expansion must be used inside a destructuring assignment or parameter list'); - }; - - Expansion.prototype.asReference = function(o) { - return this; - }; - - Expansion.prototype.eachName = function(iterator) {}; - - return Expansion; - - })(Base); - - exports.While = While = (function(superClass1) { - extend1(While, superClass1); - - function While(condition, options) { - this.condition = (options != null ? options.invert : void 0) ? condition.invert() : condition; - this.guard = options != null ? options.guard : void 0; - } - - While.prototype.children = ['condition', 'guard', 'body']; - - While.prototype.isStatement = YES; - - While.prototype.makeReturn = function(res) { - if (res) { - return While.__super__.makeReturn.apply(this, arguments); - } else { - this.returns = !this.jumps({ - loop: true - }); - return this; - } - }; - - While.prototype.addBody = function(body1) { - this.body = body1; - return this; - }; - - While.prototype.jumps = function() { - var expressions, j, jumpNode, len1, node; - expressions = this.body.expressions; - if (!expressions.length) { - return false; - } - for (j = 0, len1 = expressions.length; j < len1; j++) { - node = expressions[j]; - if (jumpNode = node.jumps({ - loop: true - })) { - return jumpNode; - } - } - return false; - }; - - While.prototype.compileNode = function(o) { - var answer, body, rvar, set; - o.indent += TAB; - set = ''; - body = this.body; - if (body.isEmpty()) { - body = this.makeCode(''); - } else { - if (this.returns) { - body.makeReturn(rvar = o.scope.freeVariable('results')); - set = "" + this.tab + rvar + " = [];\n"; - } - if (this.guard) { - if (body.expressions.length > 1) { - body.expressions.unshift(new If((new Parens(this.guard)).invert(), new StatementLiteral("continue"))); - } else { - if (this.guard) { - body = Block.wrap([new If(this.guard, body)]); - } - } - } - body = [].concat(this.makeCode("\n"), body.compileToFragments(o, LEVEL_TOP), this.makeCode("\n" + this.tab)); - } - answer = [].concat(this.makeCode(set + this.tab + "while ("), this.condition.compileToFragments(o, LEVEL_PAREN), this.makeCode(") {"), body, this.makeCode("}")); - if (this.returns) { - answer.push(this.makeCode("\n" + this.tab + "return " + rvar + ";")); - } - return answer; - }; - - return While; - - })(Base); - - exports.Op = Op = (function(superClass1) { - var CONVERSIONS, INVERSIONS; - - extend1(Op, superClass1); - - function Op(op, first, second, flip) { - if (op === 'in') { - return new In(first, second); - } - if (op === 'do') { - return this.generateDo(first); - } - if (op === 'new') { - if (first instanceof Call && !first["do"] && !first.isNew) { - return first.newInstance(); - } - if (first instanceof Code && first.bound || first["do"]) { - first = new Parens(first); - } - } - this.operator = CONVERSIONS[op] || op; - this.first = first; - this.second = second; - this.flip = !!flip; - return this; - } - - CONVERSIONS = { - '==': '===', - '!=': '!==', - 'of': 'in', - 'yieldfrom': 'yield*' - }; - - INVERSIONS = { - '!==': '===', - '===': '!==' - }; - - Op.prototype.children = ['first', 'second']; - - Op.prototype.isNumber = function() { - var ref3; - return this.isUnary() && ((ref3 = this.operator) === '+' || ref3 === '-') && this.first instanceof Value && this.first.isNumber(); - }; - - Op.prototype.isYield = function() { - var ref3; - return (ref3 = this.operator) === 'yield' || ref3 === 'yield*'; - }; - - Op.prototype.isUnary = function() { - return !this.second; - }; - - Op.prototype.isComplex = function() { - return !this.isNumber(); - }; - - Op.prototype.isChainable = function() { - var ref3; - return (ref3 = this.operator) === '<' || ref3 === '>' || ref3 === '>=' || ref3 === '<=' || ref3 === '===' || ref3 === '!=='; - }; - - Op.prototype.invert = function() { - var allInvertable, curr, fst, op, ref3; - if (this.isChainable() && this.first.isChainable()) { - allInvertable = true; - curr = this; - while (curr && curr.operator) { - allInvertable && (allInvertable = curr.operator in INVERSIONS); - curr = curr.first; - } - if (!allInvertable) { - return new Parens(this).invert(); - } - curr = this; - while (curr && curr.operator) { - curr.invert = !curr.invert; - curr.operator = INVERSIONS[curr.operator]; - curr = curr.first; - } - return this; - } else if (op = INVERSIONS[this.operator]) { - this.operator = op; - if (this.first.unwrap() instanceof Op) { - this.first.invert(); - } - return this; - } else if (this.second) { - return new Parens(this).invert(); - } else if (this.operator === '!' && (fst = this.first.unwrap()) instanceof Op && ((ref3 = fst.operator) === '!' || ref3 === 'in' || ref3 === 'instanceof')) { - return fst; - } else { - return new Op('!', this); - } - }; - - Op.prototype.unfoldSoak = function(o) { - var ref3; - return ((ref3 = this.operator) === '++' || ref3 === '--' || ref3 === 'delete') && unfoldSoak(o, this, 'first'); - }; - - Op.prototype.generateDo = function(exp) { - var call, func, j, len1, param, passedParams, ref, ref3; - passedParams = []; - func = exp instanceof Assign && (ref = exp.value.unwrap()) instanceof Code ? ref : exp; - ref3 = func.params || []; - for (j = 0, len1 = ref3.length; j < len1; j++) { - param = ref3[j]; - if (param.value) { - passedParams.push(param.value); - delete param.value; - } else { - passedParams.push(param); - } - } - call = new Call(exp, passedParams); - call["do"] = true; - return call; - }; - - Op.prototype.compileNode = function(o) { - var answer, isChain, lhs, message, ref3, rhs; - isChain = this.isChainable() && this.first.isChainable(); - if (!isChain) { - this.first.front = this.front; - } - if (this.operator === 'delete' && o.scope.check(this.first.unwrapAll().value)) { - this.error('delete operand may not be argument or var'); - } - if ((ref3 = this.operator) === '--' || ref3 === '++') { - message = isUnassignable(this.first.unwrapAll().value); - if (message) { - this.first.error(message); - } - } - if (this.isYield()) { - return this.compileYield(o); - } - if (this.isUnary()) { - return this.compileUnary(o); - } - if (isChain) { - return this.compileChain(o); - } - switch (this.operator) { - case '?': - return this.compileExistence(o); - case '**': - return this.compilePower(o); - case '//': - return this.compileFloorDivision(o); - case '%%': - return this.compileModulo(o); - default: - lhs = this.first.compileToFragments(o, LEVEL_OP); - rhs = this.second.compileToFragments(o, LEVEL_OP); - answer = [].concat(lhs, this.makeCode(" " + this.operator + " "), rhs); - if (o.level <= LEVEL_OP) { - return answer; - } else { - return this.wrapInBraces(answer); - } - } - }; - - Op.prototype.compileChain = function(o) { - var fragments, fst, ref3, shared; - ref3 = this.first.second.cache(o), this.first.second = ref3[0], shared = ref3[1]; - fst = this.first.compileToFragments(o, LEVEL_OP); - fragments = fst.concat(this.makeCode(" " + (this.invert ? '&&' : '||') + " "), shared.compileToFragments(o), this.makeCode(" " + this.operator + " "), this.second.compileToFragments(o, LEVEL_OP)); - return this.wrapInBraces(fragments); - }; - - Op.prototype.compileExistence = function(o) { - var fst, ref; - if (this.first.isComplex()) { - ref = new IdentifierLiteral(o.scope.freeVariable('ref')); - fst = new Parens(new Assign(ref, this.first)); - } else { - fst = this.first; - ref = fst; - } - return new If(new Existence(fst), ref, { - type: 'if' - }).addElse(this.second).compileToFragments(o); - }; - - Op.prototype.compileUnary = function(o) { - var op, parts, plusMinus; - parts = []; - op = this.operator; - parts.push([this.makeCode(op)]); - if (op === '!' && this.first instanceof Existence) { - this.first.negated = !this.first.negated; - return this.first.compileToFragments(o); - } - if (o.level >= LEVEL_ACCESS) { - return (new Parens(this)).compileToFragments(o); - } - plusMinus = op === '+' || op === '-'; - if ((op === 'new' || op === 'typeof' || op === 'delete') || plusMinus && this.first instanceof Op && this.first.operator === op) { - parts.push([this.makeCode(' ')]); - } - if ((plusMinus && this.first instanceof Op) || (op === 'new' && this.first.isStatement(o))) { - this.first = new Parens(this.first); - } - parts.push(this.first.compileToFragments(o, LEVEL_OP)); - if (this.flip) { - parts.reverse(); - } - return this.joinFragmentArrays(parts, ''); - }; - - Op.prototype.compileYield = function(o) { - var op, parts, ref3; - parts = []; - op = this.operator; - if (o.scope.parent == null) { - this.error('yield can only occur inside functions'); - } - if (indexOf.call(Object.keys(this.first), 'expression') >= 0 && !(this.first instanceof Throw)) { - if (this.first.expression != null) { - parts.push(this.first.expression.compileToFragments(o, LEVEL_OP)); - } - } else { - if (o.level >= LEVEL_PAREN) { - parts.push([this.makeCode("(")]); - } - parts.push([this.makeCode(op)]); - if (((ref3 = this.first.base) != null ? ref3.value : void 0) !== '') { - parts.push([this.makeCode(" ")]); - } - parts.push(this.first.compileToFragments(o, LEVEL_OP)); - if (o.level >= LEVEL_PAREN) { - parts.push([this.makeCode(")")]); - } - } - return this.joinFragmentArrays(parts, ''); - }; - - Op.prototype.compilePower = function(o) { - var pow; - pow = new Value(new IdentifierLiteral('Math'), [new Access(new PropertyName('pow'))]); - return new Call(pow, [this.first, this.second]).compileToFragments(o); - }; - - Op.prototype.compileFloorDivision = function(o) { - var div, floor, second; - floor = new Value(new IdentifierLiteral('Math'), [new Access(new PropertyName('floor'))]); - second = this.second.isComplex() ? new Parens(this.second) : this.second; - div = new Op('/', this.first, second); - return new Call(floor, [div]).compileToFragments(o); - }; - - Op.prototype.compileModulo = function(o) { - var mod; - mod = new Value(new Literal(utility('modulo', o))); - return new Call(mod, [this.first, this.second]).compileToFragments(o); - }; - - Op.prototype.toString = function(idt) { - return Op.__super__.toString.call(this, idt, this.constructor.name + ' ' + this.operator); - }; - - return Op; - - })(Base); - - exports.In = In = (function(superClass1) { - extend1(In, superClass1); - - function In(object, array) { - this.object = object; - this.array = array; - } - - In.prototype.children = ['object', 'array']; - - In.prototype.invert = NEGATE; - - In.prototype.compileNode = function(o) { - var hasSplat, j, len1, obj, ref3; - if (this.array instanceof Value && this.array.isArray() && this.array.base.objects.length) { - ref3 = this.array.base.objects; - for (j = 0, len1 = ref3.length; j < len1; j++) { - obj = ref3[j]; - if (!(obj instanceof Splat)) { - continue; - } - hasSplat = true; - break; - } - if (!hasSplat) { - return this.compileOrTest(o); - } - } - return this.compileLoopTest(o); - }; - - In.prototype.compileOrTest = function(o) { - var cmp, cnj, i, item, j, len1, ref, ref3, ref4, ref5, sub, tests; - ref3 = this.object.cache(o, LEVEL_OP), sub = ref3[0], ref = ref3[1]; - ref4 = this.negated ? [' !== ', ' && '] : [' === ', ' || '], cmp = ref4[0], cnj = ref4[1]; - tests = []; - ref5 = this.array.base.objects; - for (i = j = 0, len1 = ref5.length; j < len1; i = ++j) { - item = ref5[i]; - if (i) { - tests.push(this.makeCode(cnj)); - } - tests = tests.concat((i ? ref : sub), this.makeCode(cmp), item.compileToFragments(o, LEVEL_ACCESS)); - } - if (o.level < LEVEL_OP) { - return tests; - } else { - return this.wrapInBraces(tests); - } - }; - - In.prototype.compileLoopTest = function(o) { - var fragments, ref, ref3, sub; - ref3 = this.object.cache(o, LEVEL_LIST), sub = ref3[0], ref = ref3[1]; - fragments = [].concat(this.makeCode(utility('indexOf', o) + ".call("), this.array.compileToFragments(o, LEVEL_LIST), this.makeCode(", "), ref, this.makeCode(") " + (this.negated ? '< 0' : '>= 0'))); - if (fragmentsToText(sub) === fragmentsToText(ref)) { - return fragments; - } - fragments = sub.concat(this.makeCode(', '), fragments); - if (o.level < LEVEL_LIST) { - return fragments; - } else { - return this.wrapInBraces(fragments); - } - }; - - In.prototype.toString = function(idt) { - return In.__super__.toString.call(this, idt, this.constructor.name + (this.negated ? '!' : '')); - }; - - return In; - - })(Base); - - exports.Try = Try = (function(superClass1) { - extend1(Try, superClass1); - - function Try(attempt, errorVariable, recovery, ensure) { - this.attempt = attempt; - this.errorVariable = errorVariable; - this.recovery = recovery; - this.ensure = ensure; - } - - Try.prototype.children = ['attempt', 'recovery', 'ensure']; - - Try.prototype.isStatement = YES; - - Try.prototype.jumps = function(o) { - var ref3; - return this.attempt.jumps(o) || ((ref3 = this.recovery) != null ? ref3.jumps(o) : void 0); - }; - - Try.prototype.makeReturn = function(res) { - if (this.attempt) { - this.attempt = this.attempt.makeReturn(res); - } - if (this.recovery) { - this.recovery = this.recovery.makeReturn(res); - } - return this; - }; - - Try.prototype.compileNode = function(o) { - var catchPart, ensurePart, generatedErrorVariableName, message, placeholder, tryPart; - o.indent += TAB; - tryPart = this.attempt.compileToFragments(o, LEVEL_TOP); - catchPart = this.recovery ? (generatedErrorVariableName = o.scope.freeVariable('error', { - reserve: false - }), placeholder = new IdentifierLiteral(generatedErrorVariableName), this.errorVariable ? (message = isUnassignable(this.errorVariable.unwrapAll().value), message ? this.errorVariable.error(message) : void 0, this.recovery.unshift(new Assign(this.errorVariable, placeholder))) : void 0, [].concat(this.makeCode(" catch ("), placeholder.compileToFragments(o), this.makeCode(") {\n"), this.recovery.compileToFragments(o, LEVEL_TOP), this.makeCode("\n" + this.tab + "}"))) : !(this.ensure || this.recovery) ? (generatedErrorVariableName = o.scope.freeVariable('error', { - reserve: false - }), [this.makeCode(" catch (" + generatedErrorVariableName + ") {}")]) : []; - ensurePart = this.ensure ? [].concat(this.makeCode(" finally {\n"), this.ensure.compileToFragments(o, LEVEL_TOP), this.makeCode("\n" + this.tab + "}")) : []; - return [].concat(this.makeCode(this.tab + "try {\n"), tryPart, this.makeCode("\n" + this.tab + "}"), catchPart, ensurePart); - }; - - return Try; - - })(Base); - - exports.Throw = Throw = (function(superClass1) { - extend1(Throw, superClass1); - - function Throw(expression) { - this.expression = expression; - } - - Throw.prototype.children = ['expression']; - - Throw.prototype.isStatement = YES; - - Throw.prototype.jumps = NO; - - Throw.prototype.makeReturn = THIS; - - Throw.prototype.compileNode = function(o) { - return [].concat(this.makeCode(this.tab + "throw "), this.expression.compileToFragments(o), this.makeCode(";")); - }; - - return Throw; - - })(Base); - - exports.Existence = Existence = (function(superClass1) { - extend1(Existence, superClass1); - - function Existence(expression) { - this.expression = expression; - } - - Existence.prototype.children = ['expression']; - - Existence.prototype.invert = NEGATE; - - Existence.prototype.compileNode = function(o) { - var cmp, cnj, code, ref3; - this.expression.front = this.front; - code = this.expression.compile(o, LEVEL_OP); - if (this.expression.unwrap() instanceof IdentifierLiteral && !o.scope.check(code)) { - ref3 = this.negated ? ['===', '||'] : ['!==', '&&'], cmp = ref3[0], cnj = ref3[1]; - code = "typeof " + code + " " + cmp + " \"undefined\" " + cnj + " " + code + " " + cmp + " null"; - } else { - code = code + " " + (this.negated ? '==' : '!=') + " null"; - } - return [this.makeCode(o.level <= LEVEL_COND ? code : "(" + code + ")")]; - }; - - return Existence; - - })(Base); - - exports.Parens = Parens = (function(superClass1) { - extend1(Parens, superClass1); - - function Parens(body1) { - this.body = body1; - } - - Parens.prototype.children = ['body']; - - Parens.prototype.unwrap = function() { - return this.body; - }; - - Parens.prototype.isComplex = function() { - return this.body.isComplex(); - }; - - Parens.prototype.compileNode = function(o) { - var bare, expr, fragments; - expr = this.body.unwrap(); - if (expr instanceof Value && expr.isAtomic()) { - expr.front = this.front; - return expr.compileToFragments(o); - } - fragments = expr.compileToFragments(o, LEVEL_PAREN); - bare = o.level < LEVEL_OP && (expr instanceof Op || expr instanceof Call || (expr instanceof For && expr.returns)) && (o.level < LEVEL_COND || fragments.length <= 3); - if (bare) { - return fragments; - } else { - return this.wrapInBraces(fragments); - } - }; - - return Parens; - - })(Base); - - exports.StringWithInterpolations = StringWithInterpolations = (function(superClass1) { - extend1(StringWithInterpolations, superClass1); - - function StringWithInterpolations() { - return StringWithInterpolations.__super__.constructor.apply(this, arguments); - } - - StringWithInterpolations.prototype.compileNode = function(o) { - var element, elements, expr, fragments, j, len1, value; - if (!o.inTaggedTemplateCall) { - return StringWithInterpolations.__super__.compileNode.apply(this, arguments); - } - expr = this.body.unwrap(); - elements = []; - expr.traverseChildren(false, function(node) { - if (node instanceof StringLiteral) { - elements.push(node); - return true; - } else if (node instanceof Parens) { - elements.push(node); - return false; - } - return true; - }); - fragments = []; - fragments.push(this.makeCode('`')); - for (j = 0, len1 = elements.length; j < len1; j++) { - element = elements[j]; - if (element instanceof StringLiteral) { - value = element.value.slice(1, -1); - value = value.replace(/(\\*)(`|\$\{)/g, function(match, backslashes, toBeEscaped) { - if (backslashes.length % 2 === 0) { - return backslashes + "\\" + toBeEscaped; - } else { - return match; - } - }); - fragments.push(this.makeCode(value)); - } else { - fragments.push(this.makeCode('${')); - fragments.push.apply(fragments, element.compileToFragments(o, LEVEL_PAREN)); - fragments.push(this.makeCode('}')); - } - } - fragments.push(this.makeCode('`')); - return fragments; - }; - - return StringWithInterpolations; - - })(Parens); - - exports.For = For = (function(superClass1) { - extend1(For, superClass1); - - function For(body, source) { - var ref3; - this.source = source.source, this.guard = source.guard, this.step = source.step, this.name = source.name, this.index = source.index; - this.body = Block.wrap([body]); - this.own = !!source.own; - this.object = !!source.object; - this.from = !!source.from; - if (this.from && this.index) { - this.index.error('cannot use index with for-from'); - } - if (this.own && !this.object) { - source.ownTag.error("cannot use own with for-" + (this.from ? 'from' : 'in')); - } - if (this.object) { - ref3 = [this.index, this.name], this.name = ref3[0], this.index = ref3[1]; - } - if (this.index instanceof Value && !this.index.isAssignable()) { - this.index.error('index cannot be a pattern matching expression'); - } - this.range = this.source instanceof Value && this.source.base instanceof Range && !this.source.properties.length && !this.from; - this.pattern = this.name instanceof Value; - if (this.range && this.index) { - this.index.error('indexes do not apply to range loops'); - } - if (this.range && this.pattern) { - this.name.error('cannot pattern match over range loops'); - } - this.returns = false; - } - - For.prototype.children = ['body', 'source', 'guard', 'step']; - - For.prototype.compileNode = function(o) { - var body, bodyFragments, compare, compareDown, declare, declareDown, defPart, defPartFragments, down, forPartFragments, guardPart, idt1, increment, index, ivar, kvar, kvarAssign, last, lvar, name, namePart, ref, ref3, ref4, resultPart, returnResult, rvar, scope, source, step, stepNum, stepVar, svar, varPart; - body = Block.wrap([this.body]); - ref3 = body.expressions, last = ref3[ref3.length - 1]; - if ((last != null ? last.jumps() : void 0) instanceof Return) { - this.returns = false; - } - source = this.range ? this.source.base : this.source; - scope = o.scope; - if (!this.pattern) { - name = this.name && (this.name.compile(o, LEVEL_LIST)); - } - index = this.index && (this.index.compile(o, LEVEL_LIST)); - if (name && !this.pattern) { - scope.find(name); - } - if (index && !(this.index instanceof Value)) { - scope.find(index); - } - if (this.returns) { - rvar = scope.freeVariable('results'); - } - if (this.from) { - if (this.pattern) { - ivar = scope.freeVariable('x', { - single: true - }); - } - } else { - ivar = (this.object && index) || scope.freeVariable('i', { - single: true - }); - } - kvar = ((this.range || this.from) && name) || index || ivar; - kvarAssign = kvar !== ivar ? kvar + " = " : ""; - if (this.step && !this.range) { - ref4 = this.cacheToCodeFragments(this.step.cache(o, LEVEL_LIST, isComplexOrAssignable)), step = ref4[0], stepVar = ref4[1]; - if (this.step.isNumber()) { - stepNum = Number(stepVar); - } - } - if (this.pattern) { - name = ivar; - } - varPart = ''; - guardPart = ''; - defPart = ''; - idt1 = this.tab + TAB; - if (this.range) { - forPartFragments = source.compileToFragments(merge(o, { - index: ivar, - name: name, - step: this.step, - isComplex: isComplexOrAssignable - })); - } else { - svar = this.source.compile(o, LEVEL_LIST); - if ((name || this.own) && !(this.source.unwrap() instanceof IdentifierLiteral)) { - defPart += "" + this.tab + (ref = scope.freeVariable('ref')) + " = " + svar + ";\n"; - svar = ref; - } - if (name && !this.pattern && !this.from) { - namePart = name + " = " + svar + "[" + kvar + "]"; - } - if (!this.object && !this.from) { - if (step !== stepVar) { - defPart += "" + this.tab + step + ";\n"; - } - down = stepNum < 0; - if (!(this.step && (stepNum != null) && down)) { - lvar = scope.freeVariable('len'); - } - declare = "" + kvarAssign + ivar + " = 0, " + lvar + " = " + svar + ".length"; - declareDown = "" + kvarAssign + ivar + " = " + svar + ".length - 1"; - compare = ivar + " < " + lvar; - compareDown = ivar + " >= 0"; - if (this.step) { - if (stepNum != null) { - if (down) { - compare = compareDown; - declare = declareDown; - } - } else { - compare = stepVar + " > 0 ? " + compare + " : " + compareDown; - declare = "(" + stepVar + " > 0 ? (" + declare + ") : " + declareDown + ")"; - } - increment = ivar + " += " + stepVar; - } else { - increment = "" + (kvar !== ivar ? "++" + ivar : ivar + "++"); - } - forPartFragments = [this.makeCode(declare + "; " + compare + "; " + kvarAssign + increment)]; - } - } - if (this.returns) { - resultPart = "" + this.tab + rvar + " = [];\n"; - returnResult = "\n" + this.tab + "return " + rvar + ";"; - body.makeReturn(rvar); - } - if (this.guard) { - if (body.expressions.length > 1) { - body.expressions.unshift(new If((new Parens(this.guard)).invert(), new StatementLiteral("continue"))); - } else { - if (this.guard) { - body = Block.wrap([new If(this.guard, body)]); - } - } - } - if (this.pattern) { - body.expressions.unshift(new Assign(this.name, this.from ? new IdentifierLiteral(kvar) : new Literal(svar + "[" + kvar + "]"))); - } - defPartFragments = [].concat(this.makeCode(defPart), this.pluckDirectCall(o, body)); - if (namePart) { - varPart = "\n" + idt1 + namePart + ";"; - } - if (this.object) { - forPartFragments = [this.makeCode(kvar + " in " + svar)]; - if (this.own) { - guardPart = "\n" + idt1 + "if (!" + (utility('hasProp', o)) + ".call(" + svar + ", " + kvar + ")) continue;"; - } - } else if (this.from) { - forPartFragments = [this.makeCode(kvar + " of " + svar)]; - } - bodyFragments = body.compileToFragments(merge(o, { - indent: idt1 - }), LEVEL_TOP); - if (bodyFragments && bodyFragments.length > 0) { - bodyFragments = [].concat(this.makeCode("\n"), bodyFragments, this.makeCode("\n")); - } - return [].concat(defPartFragments, this.makeCode("" + (resultPart || '') + this.tab + "for ("), forPartFragments, this.makeCode(") {" + guardPart + varPart), bodyFragments, this.makeCode(this.tab + "}" + (returnResult || ''))); - }; - - For.prototype.pluckDirectCall = function(o, body) { - var base, defs, expr, fn, idx, j, len1, ref, ref3, ref4, ref5, ref6, ref7, ref8, ref9, val; - defs = []; - ref3 = body.expressions; - for (idx = j = 0, len1 = ref3.length; j < len1; idx = ++j) { - expr = ref3[idx]; - expr = expr.unwrapAll(); - if (!(expr instanceof Call)) { - continue; - } - val = (ref4 = expr.variable) != null ? ref4.unwrapAll() : void 0; - if (!((val instanceof Code) || (val instanceof Value && ((ref5 = val.base) != null ? ref5.unwrapAll() : void 0) instanceof Code && val.properties.length === 1 && ((ref6 = (ref7 = val.properties[0].name) != null ? ref7.value : void 0) === 'call' || ref6 === 'apply')))) { - continue; - } - fn = ((ref8 = val.base) != null ? ref8.unwrapAll() : void 0) || val; - ref = new IdentifierLiteral(o.scope.freeVariable('fn')); - base = new Value(ref); - if (val.base) { - ref9 = [base, val], val.base = ref9[0], base = ref9[1]; - } - body.expressions[idx] = new Call(base, expr.args); - defs = defs.concat(this.makeCode(this.tab), new Assign(ref, fn).compileToFragments(o, LEVEL_TOP), this.makeCode(';\n')); - } - return defs; - }; - - return For; - - })(While); - - exports.Switch = Switch = (function(superClass1) { - extend1(Switch, superClass1); - - function Switch(subject, cases, otherwise) { - this.subject = subject; - this.cases = cases; - this.otherwise = otherwise; - } - - Switch.prototype.children = ['subject', 'cases', 'otherwise']; - - Switch.prototype.isStatement = YES; - - Switch.prototype.jumps = function(o) { - var block, conds, j, jumpNode, len1, ref3, ref4, ref5; - if (o == null) { - o = { - block: true - }; - } - ref3 = this.cases; - for (j = 0, len1 = ref3.length; j < len1; j++) { - ref4 = ref3[j], conds = ref4[0], block = ref4[1]; - if (jumpNode = block.jumps(o)) { - return jumpNode; - } - } - return (ref5 = this.otherwise) != null ? ref5.jumps(o) : void 0; - }; - - Switch.prototype.makeReturn = function(res) { - var j, len1, pair, ref3, ref4; - ref3 = this.cases; - for (j = 0, len1 = ref3.length; j < len1; j++) { - pair = ref3[j]; - pair[1].makeReturn(res); - } - if (res) { - this.otherwise || (this.otherwise = new Block([new Literal('void 0')])); - } - if ((ref4 = this.otherwise) != null) { - ref4.makeReturn(res); - } - return this; - }; - - Switch.prototype.compileNode = function(o) { - var block, body, cond, conditions, expr, fragments, i, idt1, idt2, j, k, len1, len2, ref3, ref4, ref5; - idt1 = o.indent + TAB; - idt2 = o.indent = idt1 + TAB; - fragments = [].concat(this.makeCode(this.tab + "switch ("), (this.subject ? this.subject.compileToFragments(o, LEVEL_PAREN) : this.makeCode("false")), this.makeCode(") {\n")); - ref3 = this.cases; - for (i = j = 0, len1 = ref3.length; j < len1; i = ++j) { - ref4 = ref3[i], conditions = ref4[0], block = ref4[1]; - ref5 = flatten([conditions]); - for (k = 0, len2 = ref5.length; k < len2; k++) { - cond = ref5[k]; - if (!this.subject) { - cond = cond.invert(); - } - fragments = fragments.concat(this.makeCode(idt1 + "case "), cond.compileToFragments(o, LEVEL_PAREN), this.makeCode(":\n")); - } - if ((body = block.compileToFragments(o, LEVEL_TOP)).length > 0) { - fragments = fragments.concat(body, this.makeCode('\n')); - } - if (i === this.cases.length - 1 && !this.otherwise) { - break; - } - expr = this.lastNonComment(block.expressions); - if (expr instanceof Return || (expr instanceof Literal && expr.jumps() && expr.value !== 'debugger')) { - continue; - } - fragments.push(cond.makeCode(idt2 + 'break;\n')); - } - if (this.otherwise && this.otherwise.expressions.length) { - fragments.push.apply(fragments, [this.makeCode(idt1 + "default:\n")].concat(slice.call(this.otherwise.compileToFragments(o, LEVEL_TOP)), [this.makeCode("\n")])); - } - fragments.push(this.makeCode(this.tab + '}')); - return fragments; - }; - - return Switch; - - })(Base); - - exports.If = If = (function(superClass1) { - extend1(If, superClass1); - - function If(condition, body1, options) { - this.body = body1; - if (options == null) { - options = {}; - } - this.condition = options.type === 'unless' ? condition.invert() : condition; - this.elseBody = null; - this.isChain = false; - this.soak = options.soak; - } - - If.prototype.children = ['condition', 'body', 'elseBody']; - - If.prototype.bodyNode = function() { - var ref3; - return (ref3 = this.body) != null ? ref3.unwrap() : void 0; - }; - - If.prototype.elseBodyNode = function() { - var ref3; - return (ref3 = this.elseBody) != null ? ref3.unwrap() : void 0; - }; - - If.prototype.addElse = function(elseBody) { - if (this.isChain) { - this.elseBodyNode().addElse(elseBody); - } else { - this.isChain = elseBody instanceof If; - this.elseBody = this.ensureBlock(elseBody); - this.elseBody.updateLocationDataIfMissing(elseBody.locationData); - } - return this; - }; - - If.prototype.isStatement = function(o) { - var ref3; - return (o != null ? o.level : void 0) === LEVEL_TOP || this.bodyNode().isStatement(o) || ((ref3 = this.elseBodyNode()) != null ? ref3.isStatement(o) : void 0); - }; - - If.prototype.jumps = function(o) { - var ref3; - return this.body.jumps(o) || ((ref3 = this.elseBody) != null ? ref3.jumps(o) : void 0); - }; - - If.prototype.compileNode = function(o) { - if (this.isStatement(o)) { - return this.compileStatement(o); - } else { - return this.compileExpression(o); - } - }; - - If.prototype.makeReturn = function(res) { - if (res) { - this.elseBody || (this.elseBody = new Block([new Literal('void 0')])); - } - this.body && (this.body = new Block([this.body.makeReturn(res)])); - this.elseBody && (this.elseBody = new Block([this.elseBody.makeReturn(res)])); - return this; - }; - - If.prototype.ensureBlock = function(node) { - if (node instanceof Block) { - return node; - } else { - return new Block([node]); - } - }; - - If.prototype.compileStatement = function(o) { - var answer, body, child, cond, exeq, ifPart, indent; - child = del(o, 'chainChild'); - exeq = del(o, 'isExistentialEquals'); - if (exeq) { - return new If(this.condition.invert(), this.elseBodyNode(), { - type: 'if' - }).compileToFragments(o); - } - indent = o.indent + TAB; - cond = this.condition.compileToFragments(o, LEVEL_PAREN); - body = this.ensureBlock(this.body).compileToFragments(merge(o, { - indent: indent - })); - ifPart = [].concat(this.makeCode("if ("), cond, this.makeCode(") {\n"), body, this.makeCode("\n" + this.tab + "}")); - if (!child) { - ifPart.unshift(this.makeCode(this.tab)); - } - if (!this.elseBody) { - return ifPart; - } - answer = ifPart.concat(this.makeCode(' else ')); - if (this.isChain) { - o.chainChild = true; - answer = answer.concat(this.elseBody.unwrap().compileToFragments(o, LEVEL_TOP)); - } else { - answer = answer.concat(this.makeCode("{\n"), this.elseBody.compileToFragments(merge(o, { - indent: indent - }), LEVEL_TOP), this.makeCode("\n" + this.tab + "}")); - } - return answer; - }; - - If.prototype.compileExpression = function(o) { - var alt, body, cond, fragments; - cond = this.condition.compileToFragments(o, LEVEL_COND); - body = this.bodyNode().compileToFragments(o, LEVEL_LIST); - alt = this.elseBodyNode() ? this.elseBodyNode().compileToFragments(o, LEVEL_LIST) : [this.makeCode('void 0')]; - fragments = cond.concat(this.makeCode(" ? "), body, this.makeCode(" : "), alt); - if (o.level >= LEVEL_COND) { - return this.wrapInBraces(fragments); - } else { - return fragments; - } - }; - - If.prototype.unfoldSoak = function() { - return this.soak && this; - }; - - return If; - - })(Base); - - UTILITIES = { - extend: function(o) { - return "function(child, parent) { for (var key in parent) { if (" + (utility('hasProp', o)) + ".call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }"; - }, - bind: function() { - return 'function(fn, me){ return function(){ return fn.apply(me, arguments); }; }'; - }, - indexOf: function() { - return "[].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }"; - }, - modulo: function() { - return "function(a, b) { return (+a % (b = +b) + b) % b; }"; - }, - hasProp: function() { - return '{}.hasOwnProperty'; - }, - slice: function() { - return '[].slice'; - } - }; - - LEVEL_TOP = 1; - - LEVEL_PAREN = 2; - - LEVEL_LIST = 3; - - LEVEL_COND = 4; - - LEVEL_OP = 5; - - LEVEL_ACCESS = 6; - - TAB = ' '; - - SIMPLENUM = /^[+-]?\d+$/; - - utility = function(name, o) { - var ref, root; - root = o.scope.root; - if (name in root.utilities) { - return root.utilities[name]; - } else { - ref = root.freeVariable(name); - root.assign(ref, UTILITIES[name](o)); - return root.utilities[name] = ref; - } - }; - - multident = function(code, tab) { - code = code.replace(/\n/g, '$&' + tab); - return code.replace(/\s+$/, ''); - }; - - isLiteralArguments = function(node) { - return node instanceof IdentifierLiteral && node.value === 'arguments'; - }; - - isLiteralThis = function(node) { - return node instanceof ThisLiteral || (node instanceof Code && node.bound) || node instanceof SuperCall; - }; - - isComplexOrAssignable = function(node) { - return node.isComplex() || (typeof node.isAssignable === "function" ? node.isAssignable() : void 0); - }; - - unfoldSoak = function(o, parent, name) { - var ifn; - if (!(ifn = parent[name].unfoldSoak(o))) { - return; - } - parent[name] = ifn.body; - ifn.body = new Value(parent); - return ifn; - }; - -}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/optparse.js b/deploy/node_modules/coffee-script/lib/coffee-script/optparse.js deleted file mode 100644 index 4c5624f..0000000 --- a/deploy/node_modules/coffee-script/lib/coffee-script/optparse.js +++ /dev/null @@ -1,139 +0,0 @@ -// Generated by CoffeeScript 1.12.7 -(function() { - var LONG_FLAG, MULTI_FLAG, OPTIONAL, OptionParser, SHORT_FLAG, buildRule, buildRules, normalizeArguments, repeat; - - repeat = require('./helpers').repeat; - - exports.OptionParser = OptionParser = (function() { - function OptionParser(rules, banner) { - this.banner = banner; - this.rules = buildRules(rules); - } - - OptionParser.prototype.parse = function(args) { - var arg, i, isOption, j, k, len, len1, matchedRule, options, originalArgs, pos, ref, rule, seenNonOptionArg, skippingArgument, value; - options = { - "arguments": [] - }; - skippingArgument = false; - originalArgs = args; - args = normalizeArguments(args); - for (i = j = 0, len = args.length; j < len; i = ++j) { - arg = args[i]; - if (skippingArgument) { - skippingArgument = false; - continue; - } - if (arg === '--') { - pos = originalArgs.indexOf('--'); - options["arguments"] = options["arguments"].concat(originalArgs.slice(pos + 1)); - break; - } - isOption = !!(arg.match(LONG_FLAG) || arg.match(SHORT_FLAG)); - seenNonOptionArg = options["arguments"].length > 0; - if (!seenNonOptionArg) { - matchedRule = false; - ref = this.rules; - for (k = 0, len1 = ref.length; k < len1; k++) { - rule = ref[k]; - if (rule.shortFlag === arg || rule.longFlag === arg) { - value = true; - if (rule.hasArgument) { - skippingArgument = true; - value = args[i + 1]; - } - options[rule.name] = rule.isList ? (options[rule.name] || []).concat(value) : value; - matchedRule = true; - break; - } - } - if (isOption && !matchedRule) { - throw new Error("unrecognized option: " + arg); - } - } - if (seenNonOptionArg || !isOption) { - options["arguments"].push(arg); - } - } - return options; - }; - - OptionParser.prototype.help = function() { - var j, len, letPart, lines, ref, rule, spaces; - lines = []; - if (this.banner) { - lines.unshift(this.banner + "\n"); - } - ref = this.rules; - for (j = 0, len = ref.length; j < len; j++) { - rule = ref[j]; - spaces = 15 - rule.longFlag.length; - spaces = spaces > 0 ? repeat(' ', spaces) : ''; - letPart = rule.shortFlag ? rule.shortFlag + ', ' : ' '; - lines.push(' ' + letPart + rule.longFlag + spaces + rule.description); - } - return "\n" + (lines.join('\n')) + "\n"; - }; - - return OptionParser; - - })(); - - LONG_FLAG = /^(--\w[\w\-]*)/; - - SHORT_FLAG = /^(-\w)$/; - - MULTI_FLAG = /^-(\w{2,})/; - - OPTIONAL = /\[(\w+(\*?))\]/; - - buildRules = function(rules) { - var j, len, results, tuple; - results = []; - for (j = 0, len = rules.length; j < len; j++) { - tuple = rules[j]; - if (tuple.length < 3) { - tuple.unshift(null); - } - results.push(buildRule.apply(null, tuple)); - } - return results; - }; - - buildRule = function(shortFlag, longFlag, description, options) { - var match; - if (options == null) { - options = {}; - } - match = longFlag.match(OPTIONAL); - longFlag = longFlag.match(LONG_FLAG)[1]; - return { - name: longFlag.substr(2), - shortFlag: shortFlag, - longFlag: longFlag, - description: description, - hasArgument: !!(match && match[1]), - isList: !!(match && match[2]) - }; - }; - - normalizeArguments = function(args) { - var arg, j, k, l, len, len1, match, ref, result; - args = args.slice(0); - result = []; - for (j = 0, len = args.length; j < len; j++) { - arg = args[j]; - if (match = arg.match(MULTI_FLAG)) { - ref = match[1].split(''); - for (k = 0, len1 = ref.length; k < len1; k++) { - l = ref[k]; - result.push('-' + l); - } - } else { - result.push(arg); - } - } - return result; - }; - -}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/parser.js b/deploy/node_modules/coffee-script/lib/coffee-script/parser.js deleted file mode 100755 index e8c11b5..0000000 --- a/deploy/node_modules/coffee-script/lib/coffee-script/parser.js +++ /dev/null @@ -1,891 +0,0 @@ -/* parser generated by jison 0.4.17 */ -/* - Returns a Parser object of the following structure: - - Parser: { - yy: {} - } - - Parser.prototype: { - yy: {}, - trace: function(), - symbols_: {associative list: name ==> number}, - terminals_: {associative list: number ==> name}, - productions_: [...], - performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), - table: [...], - defaultActions: {...}, - parseError: function(str, hash), - parse: function(input), - - lexer: { - EOF: 1, - parseError: function(str, hash), - setInput: function(input), - input: function(), - unput: function(str), - more: function(), - less: function(n), - pastInput: function(), - upcomingInput: function(), - showPosition: function(), - test_match: function(regex_match_array, rule_index), - next: function(), - lex: function(), - begin: function(condition), - popState: function(), - _currentRules: function(), - topState: function(), - pushState: function(condition), - - options: { - ranges: boolean (optional: true ==> token location info will include a .range[] member) - flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) - backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) - }, - - performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), - rules: [...], - conditions: {associative list: name ==> set}, - } - } - - - token location info (@$, _$, etc.): { - first_line: n, - last_line: n, - first_column: n, - last_column: n, - range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) - } - - - the parseError function receives a 'hash' object with these members for lexer and parser errors: { - text: (matched text) - token: (the produced terminal token, if any) - line: (yylineno) - } - while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { - loc: (yylloc) - expected: (string describing the set of expected tokens) - recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) - } -*/ -var parser = (function(){ -var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,22],$V1=[1,25],$V2=[1,83],$V3=[1,79],$V4=[1,84],$V5=[1,85],$V6=[1,81],$V7=[1,82],$V8=[1,56],$V9=[1,58],$Va=[1,59],$Vb=[1,60],$Vc=[1,61],$Vd=[1,62],$Ve=[1,49],$Vf=[1,50],$Vg=[1,32],$Vh=[1,68],$Vi=[1,69],$Vj=[1,78],$Vk=[1,47],$Vl=[1,51],$Vm=[1,52],$Vn=[1,67],$Vo=[1,65],$Vp=[1,66],$Vq=[1,64],$Vr=[1,42],$Vs=[1,48],$Vt=[1,63],$Vu=[1,73],$Vv=[1,74],$Vw=[1,75],$Vx=[1,76],$Vy=[1,46],$Vz=[1,72],$VA=[1,34],$VB=[1,35],$VC=[1,36],$VD=[1,37],$VE=[1,38],$VF=[1,39],$VG=[1,86],$VH=[1,6,32,42,131],$VI=[1,101],$VJ=[1,89],$VK=[1,88],$VL=[1,87],$VM=[1,90],$VN=[1,91],$VO=[1,92],$VP=[1,93],$VQ=[1,94],$VR=[1,95],$VS=[1,96],$VT=[1,97],$VU=[1,98],$VV=[1,99],$VW=[1,100],$VX=[1,104],$VY=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$VZ=[2,167],$V_=[1,110],$V$=[1,111],$V01=[1,112],$V11=[1,113],$V21=[1,115],$V31=[1,116],$V41=[1,109],$V51=[1,6,32,42,131,133,135,139,156],$V61=[2,27],$V71=[1,123],$V81=[1,121],$V91=[1,6,31,32,40,41,42,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$Va1=[2,95],$Vb1=[1,6,31,32,42,46,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$Vc1=[2,74],$Vd1=[1,128],$Ve1=[1,133],$Vf1=[1,134],$Vg1=[1,136],$Vh1=[1,6,31,32,40,41,42,55,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$Vi1=[2,92],$Vj1=[1,6,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$Vk1=[2,64],$Vl1=[1,161],$Vm1=[1,167],$Vn1=[1,179],$Vo1=[1,181],$Vp1=[1,176],$Vq1=[1,183],$Vr1=[1,185],$Vs1=[1,6,31,32,40,41,42,55,66,71,74,82,83,84,85,87,89,90,94,96,113,114,115,120,122,131,133,134,135,139,140,156,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175],$Vt1=[2,111],$Vu1=[1,6,31,32,40,41,42,58,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$Vv1=[1,6,31,32,40,41,42,46,58,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$Vw1=[40,41,114],$Vx1=[1,242],$Vy1=[1,241],$Vz1=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156],$VA1=[2,72],$VB1=[1,251],$VC1=[6,31,32,66,71],$VD1=[6,31,32,55,66,71,74],$VE1=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,159,160,164,166,167,168,169,170,171,172,173,174],$VF1=[40,41,82,83,84,85,87,90,113,114],$VG1=[1,270],$VH1=[2,62],$VI1=[1,281],$VJ1=[1,283],$VK1=[1,288],$VL1=[1,290],$VM1=[2,188],$VN1=[1,6,31,32,40,41,42,55,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,146,147,148,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$VO1=[1,299],$VP1=[6,31,32,71,115,120],$VQ1=[1,6,31,32,40,41,42,55,58,66,71,74,82,83,84,85,87,89,90,94,96,113,114,115,120,122,131,133,134,135,139,140,146,147,148,156,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175],$VR1=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,140,156],$VS1=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,134,140,156],$VT1=[146,147,148],$VU1=[71,146,147,148],$VV1=[6,31,94],$VW1=[1,313],$VX1=[6,31,32,71,94],$VY1=[6,31,32,58,71,94],$VZ1=[6,31,32,55,58,71,94],$V_1=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,159,160,166,167,168,169,170,171,172,173,174],$V$1=[12,28,34,38,40,41,44,45,48,49,50,51,52,53,61,63,64,68,69,89,92,95,97,105,112,117,118,119,125,129,130,133,135,137,139,149,155,157,158,159,160,161,162],$V02=[2,177],$V12=[6,31,32],$V22=[2,73],$V32=[1,325],$V42=[1,326],$V52=[1,6,31,32,42,66,71,74,89,94,115,120,122,127,128,131,133,134,135,139,140,151,153,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$V62=[32,151,153],$V72=[1,6,32,42,66,71,74,89,94,115,120,122,131,134,140,156],$V82=[1,353],$V92=[1,359],$Va2=[1,6,32,42,131,156],$Vb2=[2,87],$Vc2=[1,370],$Vd2=[1,371],$Ve2=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,151,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$Vf2=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,135,139,140,156],$Vg2=[1,384],$Vh2=[1,385],$Vi2=[6,31,32,94],$Vj2=[6,31,32,71],$Vk2=[1,6,31,32,42,66,71,74,89,94,115,120,122,127,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],$Vl2=[31,71],$Vm2=[1,411],$Vn2=[1,412],$Vo2=[1,418],$Vp2=[1,419]; -var parser = {trace: function trace() { }, -yy: {}, -symbols_: {"error":2,"Root":3,"Body":4,"Line":5,"TERMINATOR":6,"Expression":7,"Statement":8,"YieldReturn":9,"Return":10,"Comment":11,"STATEMENT":12,"Import":13,"Export":14,"Value":15,"Invocation":16,"Code":17,"Operation":18,"Assign":19,"If":20,"Try":21,"While":22,"For":23,"Switch":24,"Class":25,"Throw":26,"Yield":27,"YIELD":28,"FROM":29,"Block":30,"INDENT":31,"OUTDENT":32,"Identifier":33,"IDENTIFIER":34,"Property":35,"PROPERTY":36,"AlphaNumeric":37,"NUMBER":38,"String":39,"STRING":40,"STRING_START":41,"STRING_END":42,"Regex":43,"REGEX":44,"REGEX_START":45,"REGEX_END":46,"Literal":47,"JS":48,"UNDEFINED":49,"NULL":50,"BOOL":51,"INFINITY":52,"NAN":53,"Assignable":54,"=":55,"AssignObj":56,"ObjAssignable":57,":":58,"SimpleObjAssignable":59,"ThisProperty":60,"RETURN":61,"Object":62,"HERECOMMENT":63,"PARAM_START":64,"ParamList":65,"PARAM_END":66,"FuncGlyph":67,"->":68,"=>":69,"OptComma":70,",":71,"Param":72,"ParamVar":73,"...":74,"Array":75,"Splat":76,"SimpleAssignable":77,"Accessor":78,"Parenthetical":79,"Range":80,"This":81,".":82,"?.":83,"::":84,"?::":85,"Index":86,"INDEX_START":87,"IndexValue":88,"INDEX_END":89,"INDEX_SOAK":90,"Slice":91,"{":92,"AssignList":93,"}":94,"CLASS":95,"EXTENDS":96,"IMPORT":97,"ImportDefaultSpecifier":98,"ImportNamespaceSpecifier":99,"ImportSpecifierList":100,"ImportSpecifier":101,"AS":102,"DEFAULT":103,"IMPORT_ALL":104,"EXPORT":105,"ExportSpecifierList":106,"EXPORT_ALL":107,"ExportSpecifier":108,"OptFuncExist":109,"Arguments":110,"Super":111,"SUPER":112,"FUNC_EXIST":113,"CALL_START":114,"CALL_END":115,"ArgList":116,"THIS":117,"@":118,"[":119,"]":120,"RangeDots":121,"..":122,"Arg":123,"SimpleArgs":124,"TRY":125,"Catch":126,"FINALLY":127,"CATCH":128,"THROW":129,"(":130,")":131,"WhileSource":132,"WHILE":133,"WHEN":134,"UNTIL":135,"Loop":136,"LOOP":137,"ForBody":138,"FOR":139,"BY":140,"ForStart":141,"ForSource":142,"ForVariables":143,"OWN":144,"ForValue":145,"FORIN":146,"FOROF":147,"FORFROM":148,"SWITCH":149,"Whens":150,"ELSE":151,"When":152,"LEADING_WHEN":153,"IfBlock":154,"IF":155,"POST_IF":156,"UNARY":157,"UNARY_MATH":158,"-":159,"+":160,"--":161,"++":162,"?":163,"MATH":164,"**":165,"SHIFT":166,"COMPARE":167,"&":168,"^":169,"|":170,"&&":171,"||":172,"BIN?":173,"RELATION":174,"COMPOUND_ASSIGN":175,"$accept":0,"$end":1}, -terminals_: {2:"error",6:"TERMINATOR",12:"STATEMENT",28:"YIELD",29:"FROM",31:"INDENT",32:"OUTDENT",34:"IDENTIFIER",36:"PROPERTY",38:"NUMBER",40:"STRING",41:"STRING_START",42:"STRING_END",44:"REGEX",45:"REGEX_START",46:"REGEX_END",48:"JS",49:"UNDEFINED",50:"NULL",51:"BOOL",52:"INFINITY",53:"NAN",55:"=",58:":",61:"RETURN",63:"HERECOMMENT",64:"PARAM_START",66:"PARAM_END",68:"->",69:"=>",71:",",74:"...",82:".",83:"?.",84:"::",85:"?::",87:"INDEX_START",89:"INDEX_END",90:"INDEX_SOAK",92:"{",94:"}",95:"CLASS",96:"EXTENDS",97:"IMPORT",102:"AS",103:"DEFAULT",104:"IMPORT_ALL",105:"EXPORT",107:"EXPORT_ALL",112:"SUPER",113:"FUNC_EXIST",114:"CALL_START",115:"CALL_END",117:"THIS",118:"@",119:"[",120:"]",122:"..",125:"TRY",127:"FINALLY",128:"CATCH",129:"THROW",130:"(",131:")",133:"WHILE",134:"WHEN",135:"UNTIL",137:"LOOP",139:"FOR",140:"BY",144:"OWN",146:"FORIN",147:"FOROF",148:"FORFROM",149:"SWITCH",151:"ELSE",153:"LEADING_WHEN",155:"IF",156:"POST_IF",157:"UNARY",158:"UNARY_MATH",159:"-",160:"+",161:"--",162:"++",163:"?",164:"MATH",165:"**",166:"SHIFT",167:"COMPARE",168:"&",169:"^",170:"|",171:"&&",172:"||",173:"BIN?",174:"RELATION",175:"COMPOUND_ASSIGN"}, -productions_: [0,[3,0],[3,1],[4,1],[4,3],[4,2],[5,1],[5,1],[5,1],[8,1],[8,1],[8,1],[8,1],[8,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[27,1],[27,2],[27,3],[30,2],[30,3],[33,1],[35,1],[37,1],[37,1],[39,1],[39,3],[43,1],[43,3],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[19,3],[19,4],[19,5],[56,1],[56,3],[56,5],[56,3],[56,5],[56,1],[59,1],[59,1],[59,1],[57,1],[57,1],[10,2],[10,4],[10,1],[9,3],[9,2],[11,1],[17,5],[17,2],[67,1],[67,1],[70,0],[70,1],[65,0],[65,1],[65,3],[65,4],[65,6],[72,1],[72,2],[72,3],[72,1],[73,1],[73,1],[73,1],[73,1],[76,2],[77,1],[77,2],[77,2],[77,1],[54,1],[54,1],[54,1],[15,1],[15,1],[15,1],[15,1],[15,1],[78,2],[78,2],[78,2],[78,2],[78,1],[78,1],[86,3],[86,2],[88,1],[88,1],[62,4],[93,0],[93,1],[93,3],[93,4],[93,6],[25,1],[25,2],[25,3],[25,4],[25,2],[25,3],[25,4],[25,5],[13,2],[13,4],[13,4],[13,5],[13,7],[13,6],[13,9],[100,1],[100,3],[100,4],[100,4],[100,6],[101,1],[101,3],[101,1],[101,3],[98,1],[99,3],[14,3],[14,5],[14,2],[14,4],[14,5],[14,6],[14,3],[14,4],[14,7],[106,1],[106,3],[106,4],[106,4],[106,6],[108,1],[108,3],[108,3],[108,1],[108,3],[16,3],[16,3],[16,3],[16,1],[111,1],[111,2],[109,0],[109,1],[110,2],[110,4],[81,1],[81,1],[60,2],[75,2],[75,4],[121,1],[121,1],[80,5],[91,3],[91,2],[91,2],[91,1],[116,1],[116,3],[116,4],[116,4],[116,6],[123,1],[123,1],[123,1],[124,1],[124,3],[21,2],[21,3],[21,4],[21,5],[126,3],[126,3],[126,2],[26,2],[79,3],[79,5],[132,2],[132,4],[132,2],[132,4],[22,2],[22,2],[22,2],[22,1],[136,2],[136,2],[23,2],[23,2],[23,2],[138,2],[138,4],[138,2],[141,2],[141,3],[145,1],[145,1],[145,1],[145,1],[143,1],[143,3],[142,2],[142,2],[142,4],[142,4],[142,4],[142,6],[142,6],[142,2],[142,4],[24,5],[24,7],[24,4],[24,6],[150,1],[150,2],[152,3],[152,4],[154,3],[154,5],[20,1],[20,3],[20,3],[20,3],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,5],[18,4],[18,3]], -performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { -/* this == yyval */ - -var $0 = $$.length - 1; -switch (yystate) { -case 1: -return this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Block); -break; -case 2: -return this.$ = $$[$0]; -break; -case 3: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(yy.Block.wrap([$$[$0]])); -break; -case 4: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].push($$[$0])); -break; -case 5: -this.$ = $$[$0-1]; -break; -case 6: case 7: case 8: case 9: case 10: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 35: case 40: case 42: case 56: case 57: case 58: case 59: case 60: case 61: case 72: case 73: case 83: case 84: case 85: case 86: case 91: case 92: case 95: case 99: case 105: case 164: case 188: case 189: case 191: case 221: case 222: case 240: case 246: -this.$ = $$[$0]; -break; -case 11: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.StatementLiteral($$[$0])); -break; -case 27: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Op($$[$0], new yy.Value(new yy.Literal('')))); -break; -case 28: case 250: case 251: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op($$[$0-1], $$[$0])); -break; -case 29: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-2].concat($$[$0-1]), $$[$0])); -break; -case 30: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Block); -break; -case 31: case 106: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-1]); -break; -case 32: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.IdentifierLiteral($$[$0])); -break; -case 33: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.PropertyName($$[$0])); -break; -case 34: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.NumberLiteral($$[$0])); -break; -case 36: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.StringLiteral($$[$0])); -break; -case 37: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.StringWithInterpolations($$[$0-1])); -break; -case 38: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.RegexLiteral($$[$0])); -break; -case 39: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.RegexWithInterpolations($$[$0-1].args)); -break; -case 41: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.PassthroughLiteral($$[$0])); -break; -case 43: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.UndefinedLiteral); -break; -case 44: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.NullLiteral); -break; -case 45: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.BooleanLiteral($$[$0])); -break; -case 46: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.InfinityLiteral($$[$0])); -break; -case 47: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.NaNLiteral); -break; -case 48: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign($$[$0-2], $$[$0])); -break; -case 49: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Assign($$[$0-3], $$[$0])); -break; -case 50: -this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign($$[$0-4], $$[$0-1])); -break; -case 51: case 88: case 93: case 94: case 96: case 97: case 98: case 223: case 224: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0])); -break; -case 52: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-2])(new yy.Value($$[$0-2])), $$[$0], 'object', { - operatorToken: yy.addLocationDataFn(_$[$0-1])(new yy.Literal($$[$0-1])) - })); -break; -case 53: -this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-4])(new yy.Value($$[$0-4])), $$[$0-1], 'object', { - operatorToken: yy.addLocationDataFn(_$[$0-3])(new yy.Literal($$[$0-3])) - })); -break; -case 54: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-2])(new yy.Value($$[$0-2])), $$[$0], null, { - operatorToken: yy.addLocationDataFn(_$[$0-1])(new yy.Literal($$[$0-1])) - })); -break; -case 55: -this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-4])(new yy.Value($$[$0-4])), $$[$0-1], null, { - operatorToken: yy.addLocationDataFn(_$[$0-3])(new yy.Literal($$[$0-3])) - })); -break; -case 62: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Return($$[$0])); -break; -case 63: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Return(new yy.Value($$[$0-1]))); -break; -case 64: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Return); -break; -case 65: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.YieldReturn($$[$0])); -break; -case 66: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.YieldReturn); -break; -case 67: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Comment($$[$0])); -break; -case 68: -this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Code($$[$0-3], $$[$0], $$[$0-1])); -break; -case 69: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Code([], $$[$0], $$[$0-1])); -break; -case 70: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])('func'); -break; -case 71: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])('boundfunc'); -break; -case 74: case 111: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([]); -break; -case 75: case 112: case 131: case 151: case 183: case 225: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]); -break; -case 76: case 113: case 132: case 152: case 184: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].concat($$[$0])); -break; -case 77: case 114: case 133: case 153: case 185: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-3].concat($$[$0])); -break; -case 78: case 115: case 135: case 155: case 187: -this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])($$[$0-5].concat($$[$0-2])); -break; -case 79: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Param($$[$0])); -break; -case 80: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Param($$[$0-1], null, true)); -break; -case 81: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Param($$[$0-2], $$[$0])); -break; -case 82: case 190: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Expansion); -break; -case 87: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Splat($$[$0-1])); -break; -case 89: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].add($$[$0])); -break; -case 90: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Value($$[$0-1], [].concat($$[$0]))); -break; -case 100: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Access($$[$0])); -break; -case 101: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Access($$[$0], 'soak')); -break; -case 102: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Access(new yy.PropertyName('prototype'))), yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))]); -break; -case 103: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Access(new yy.PropertyName('prototype'), 'soak')), yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))]); -break; -case 104: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Access(new yy.PropertyName('prototype'))); -break; -case 107: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(yy.extend($$[$0], { - soak: true - })); -break; -case 108: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Index($$[$0])); -break; -case 109: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Slice($$[$0])); -break; -case 110: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Obj($$[$0-2], $$[$0-3].generated)); -break; -case 116: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Class); -break; -case 117: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Class(null, null, $$[$0])); -break; -case 118: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Class(null, $$[$0])); -break; -case 119: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Class(null, $$[$0-1], $$[$0])); -break; -case 120: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Class($$[$0])); -break; -case 121: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Class($$[$0-1], null, $$[$0])); -break; -case 122: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Class($$[$0-2], $$[$0])); -break; -case 123: -this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Class($$[$0-3], $$[$0-1], $$[$0])); -break; -case 124: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.ImportDeclaration(null, $$[$0])); -break; -case 125: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause($$[$0-2], null), $$[$0])); -break; -case 126: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause(null, $$[$0-2]), $$[$0])); -break; -case 127: -this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause(null, new yy.ImportSpecifierList([])), $$[$0])); -break; -case 128: -this.$ = yy.addLocationDataFn(_$[$0-6], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause(null, new yy.ImportSpecifierList($$[$0-4])), $$[$0])); -break; -case 129: -this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause($$[$0-4], $$[$0-2]), $$[$0])); -break; -case 130: -this.$ = yy.addLocationDataFn(_$[$0-8], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause($$[$0-7], new yy.ImportSpecifierList($$[$0-4])), $$[$0])); -break; -case 134: case 154: case 170: case 186: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-2]); -break; -case 136: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.ImportSpecifier($$[$0])); -break; -case 137: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ImportSpecifier($$[$0-2], $$[$0])); -break; -case 138: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.ImportSpecifier(new yy.Literal($$[$0]))); -break; -case 139: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ImportSpecifier(new yy.Literal($$[$0-2]), $$[$0])); -break; -case 140: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.ImportDefaultSpecifier($$[$0])); -break; -case 141: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ImportNamespaceSpecifier(new yy.Literal($$[$0-2]), $$[$0])); -break; -case 142: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([]))); -break; -case 143: -this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-2]))); -break; -case 144: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.ExportNamedDeclaration($$[$0])); -break; -case 145: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.ExportNamedDeclaration(new yy.Assign($$[$0-2], $$[$0], null, { - moduleDeclaration: 'export' - }))); -break; -case 146: -this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.ExportNamedDeclaration(new yy.Assign($$[$0-3], $$[$0], null, { - moduleDeclaration: 'export' - }))); -break; -case 147: -this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])(new yy.ExportNamedDeclaration(new yy.Assign($$[$0-4], $$[$0-1], null, { - moduleDeclaration: 'export' - }))); -break; -case 148: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ExportDefaultDeclaration($$[$0])); -break; -case 149: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.ExportAllDeclaration(new yy.Literal($$[$0-2]), $$[$0])); -break; -case 150: -this.$ = yy.addLocationDataFn(_$[$0-6], _$[$0])(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-4]), $$[$0])); -break; -case 156: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.ExportSpecifier($$[$0])); -break; -case 157: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ExportSpecifier($$[$0-2], $$[$0])); -break; -case 158: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ExportSpecifier($$[$0-2], new yy.Literal($$[$0]))); -break; -case 159: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.ExportSpecifier(new yy.Literal($$[$0]))); -break; -case 160: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ExportSpecifier(new yy.Literal($$[$0-2]), $$[$0])); -break; -case 161: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.TaggedTemplateCall($$[$0-2], $$[$0], $$[$0-1])); -break; -case 162: case 163: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Call($$[$0-2], $$[$0], $$[$0-1])); -break; -case 165: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.SuperCall); -break; -case 166: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.SuperCall($$[$0])); -break; -case 167: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(false); -break; -case 168: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(true); -break; -case 169: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([]); -break; -case 171: case 172: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value(new yy.ThisLiteral)); -break; -case 173: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Value(yy.addLocationDataFn(_$[$0-1])(new yy.ThisLiteral), [yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))], 'this')); -break; -case 174: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Arr([])); -break; -case 175: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Arr($$[$0-2])); -break; -case 176: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])('inclusive'); -break; -case 177: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])('exclusive'); -break; -case 178: -this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Range($$[$0-3], $$[$0-1], $$[$0-2])); -break; -case 179: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Range($$[$0-2], $$[$0], $$[$0-1])); -break; -case 180: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Range($$[$0-1], null, $$[$0])); -break; -case 181: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Range(null, $$[$0], $$[$0-1])); -break; -case 182: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Range(null, null, $$[$0])); -break; -case 192: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([].concat($$[$0-2], $$[$0])); -break; -case 193: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Try($$[$0])); -break; -case 194: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Try($$[$0-1], $$[$0][0], $$[$0][1])); -break; -case 195: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Try($$[$0-2], null, null, $$[$0])); -break; -case 196: -this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Try($$[$0-3], $$[$0-2][0], $$[$0-2][1], $$[$0])); -break; -case 197: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([$$[$0-1], $$[$0]]); -break; -case 198: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Value($$[$0-1])), $$[$0]]); -break; -case 199: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([null, $$[$0]]); -break; -case 200: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Throw($$[$0])); -break; -case 201: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Parens($$[$0-1])); -break; -case 202: -this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Parens($$[$0-2])); -break; -case 203: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While($$[$0])); -break; -case 204: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.While($$[$0-2], { - guard: $$[$0] - })); -break; -case 205: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While($$[$0], { - invert: true - })); -break; -case 206: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.While($$[$0-2], { - invert: true, - guard: $$[$0] - })); -break; -case 207: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].addBody($$[$0])); -break; -case 208: case 209: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0].addBody(yy.addLocationDataFn(_$[$0-1])(yy.Block.wrap([$$[$0-1]])))); -break; -case 210: -this.$ = yy.addLocationDataFn(_$[$0], _$[$0])($$[$0]); -break; -case 211: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While(yy.addLocationDataFn(_$[$0-1])(new yy.BooleanLiteral('true'))).addBody($$[$0])); -break; -case 212: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While(yy.addLocationDataFn(_$[$0-1])(new yy.BooleanLiteral('true'))).addBody(yy.addLocationDataFn(_$[$0])(yy.Block.wrap([$$[$0]])))); -break; -case 213: case 214: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0-1], $$[$0])); -break; -case 215: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0], $$[$0-1])); -break; -case 216: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({ - source: yy.addLocationDataFn(_$[$0])(new yy.Value($$[$0])) - }); -break; -case 217: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({ - source: yy.addLocationDataFn(_$[$0-2])(new yy.Value($$[$0-2])), - step: $$[$0] - }); -break; -case 218: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])((function () { - $$[$0].own = $$[$0-1].own; - $$[$0].ownTag = $$[$0-1].ownTag; - $$[$0].name = $$[$0-1][0]; - $$[$0].index = $$[$0-1][1]; - return $$[$0]; - }())); -break; -case 219: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0]); -break; -case 220: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () { - $$[$0].own = true; - $$[$0].ownTag = yy.addLocationDataFn(_$[$0-1])(new yy.Literal($$[$0-1])); - return $$[$0]; - }())); -break; -case 226: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([$$[$0-2], $$[$0]]); -break; -case 227: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({ - source: $$[$0] - }); -break; -case 228: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({ - source: $$[$0], - object: true - }); -break; -case 229: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({ - source: $$[$0-2], - guard: $$[$0] - }); -break; -case 230: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({ - source: $$[$0-2], - guard: $$[$0], - object: true - }); -break; -case 231: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({ - source: $$[$0-2], - step: $$[$0] - }); -break; -case 232: -this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])({ - source: $$[$0-4], - guard: $$[$0-2], - step: $$[$0] - }); -break; -case 233: -this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])({ - source: $$[$0-4], - step: $$[$0-2], - guard: $$[$0] - }); -break; -case 234: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({ - source: $$[$0], - from: true - }); -break; -case 235: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({ - source: $$[$0-2], - guard: $$[$0], - from: true - }); -break; -case 236: -this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Switch($$[$0-3], $$[$0-1])); -break; -case 237: -this.$ = yy.addLocationDataFn(_$[$0-6], _$[$0])(new yy.Switch($$[$0-5], $$[$0-3], $$[$0-1])); -break; -case 238: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Switch(null, $$[$0-1])); -break; -case 239: -this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])(new yy.Switch(null, $$[$0-3], $$[$0-1])); -break; -case 241: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].concat($$[$0])); -break; -case 242: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([[$$[$0-1], $$[$0]]]); -break; -case 243: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])([[$$[$0-2], $$[$0-1]]]); -break; -case 244: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0-1], $$[$0], { - type: $$[$0-2] - })); -break; -case 245: -this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])($$[$0-4].addElse(yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0-1], $$[$0], { - type: $$[$0-2] - })))); -break; -case 247: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].addElse($$[$0])); -break; -case 248: case 249: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0], yy.addLocationDataFn(_$[$0-2])(yy.Block.wrap([$$[$0-2]])), { - type: $$[$0-1], - statement: true - })); -break; -case 252: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('-', $$[$0])); -break; -case 253: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('+', $$[$0])); -break; -case 254: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('--', $$[$0])); -break; -case 255: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('++', $$[$0])); -break; -case 256: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('--', $$[$0-1], null, true)); -break; -case 257: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('++', $$[$0-1], null, true)); -break; -case 258: -this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Existence($$[$0-1])); -break; -case 259: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op('+', $$[$0-2], $$[$0])); -break; -case 260: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op('-', $$[$0-2], $$[$0])); -break; -case 261: case 262: case 263: case 264: case 265: case 266: case 267: case 268: case 269: case 270: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-1], $$[$0-2], $$[$0])); -break; -case 271: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () { - if ($$[$0-1].charAt(0) === '!') { - return new yy.Op($$[$0-1].slice(1), $$[$0-2], $$[$0]).invert(); - } else { - return new yy.Op($$[$0-1], $$[$0-2], $$[$0]); - } - }())); -break; -case 272: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign($$[$0-2], $$[$0], $$[$0-1])); -break; -case 273: -this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign($$[$0-4], $$[$0-1], $$[$0-3])); -break; -case 274: -this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Assign($$[$0-3], $$[$0], $$[$0-2])); -break; -case 275: -this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Extends($$[$0-2], $$[$0])); -break; -} -}, -table: [{1:[2,1],3:1,4:2,5:3,7:4,8:5,9:6,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{1:[3]},{1:[2,2],6:$VG},o($VH,[2,3]),o($VH,[2,6],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VH,[2,7],{141:77,132:105,138:106,133:$Vu,135:$Vv,139:$Vx,156:$VX}),o($VH,[2,8]),o($VY,[2,14],{109:107,78:108,86:114,40:$VZ,41:$VZ,114:$VZ,82:$V_,83:$V$,84:$V01,85:$V11,87:$V21,90:$V31,113:$V41}),o($VY,[2,15],{86:114,109:117,78:118,82:$V_,83:$V$,84:$V01,85:$V11,87:$V21,90:$V31,113:$V41,114:$VZ}),o($VY,[2,16]),o($VY,[2,17]),o($VY,[2,18]),o($VY,[2,19]),o($VY,[2,20]),o($VY,[2,21]),o($VY,[2,22]),o($VY,[2,23]),o($VY,[2,24]),o($VY,[2,25]),o($VY,[2,26]),o($V51,[2,9]),o($V51,[2,10]),o($V51,[2,11]),o($V51,[2,12]),o($V51,[2,13]),o([1,6,32,42,131,133,135,139,156,163,164,165,166,167,168,169,170,171,172,173,174],$V61,{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,7:120,8:122,12:$V0,28:$V71,29:$V81,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:[1,119],63:$Vf,64:$Vg,68:$Vh,69:$Vi,92:$Vj,95:$Vk,97:$Vl,105:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,137:$Vw,149:$Vy,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF}),o($V91,$Va1,{55:[1,124]}),o($V91,[2,96]),o($V91,[2,97]),o($V91,[2,98]),o($V91,[2,99]),o($Vb1,[2,164]),o([6,31,66,71],$Vc1,{65:125,72:126,73:127,33:129,60:130,75:131,62:132,34:$V2,74:$Vd1,92:$Vj,118:$Ve1,119:$Vf1}),{30:135,31:$Vg1},{7:137,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:138,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:139,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:140,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{15:142,16:143,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:144,60:71,62:54,75:53,77:141,79:28,80:29,81:30,92:$Vj,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,130:$Vt},{15:142,16:143,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:144,60:71,62:54,75:53,77:145,79:28,80:29,81:30,92:$Vj,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,130:$Vt},o($Vh1,$Vi1,{96:[1,149],161:[1,146],162:[1,147],175:[1,148]}),o($VY,[2,246],{151:[1,150]}),{30:151,31:$Vg1},{30:152,31:$Vg1},o($VY,[2,210]),{30:153,31:$Vg1},{7:154,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:[1,155],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($Vj1,[2,116],{47:27,79:28,80:29,81:30,111:31,75:53,62:54,37:55,43:57,33:70,60:71,39:80,15:142,16:143,54:144,30:156,77:158,31:$Vg1,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,92:$Vj,96:[1,157],112:$Vn,117:$Vo,118:$Vp,119:$Vq,130:$Vt}),{7:159,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($V51,$Vk1,{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,8:122,7:160,12:$V0,28:$V71,31:$Vl1,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:$Ve,63:$Vf,64:$Vg,68:$Vh,69:$Vi,92:$Vj,95:$Vk,97:$Vl,105:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,137:$Vw,149:$Vy,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF}),o([1,6,31,32,42,71,94,131,133,135,139,156],[2,67]),{33:166,34:$V2,39:162,40:$V4,41:$V5,92:[1,165],98:163,99:164,104:$Vm1},{25:169,33:170,34:$V2,92:[1,168],95:$Vk,103:[1,171],107:[1,172]},o($Vh1,[2,93]),o($Vh1,[2,94]),o($V91,[2,40]),o($V91,[2,41]),o($V91,[2,42]),o($V91,[2,43]),o($V91,[2,44]),o($V91,[2,45]),o($V91,[2,46]),o($V91,[2,47]),{4:173,5:3,7:4,8:5,9:6,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V1,31:[1,174],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:175,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:$Vn1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,74:$Vo1,75:53,76:180,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,116:177,117:$Vo,118:$Vp,119:$Vq,120:$Vp1,123:178,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($V91,[2,171]),o($V91,[2,172],{35:182,36:$Vq1}),o([1,6,31,32,42,46,66,71,74,82,83,84,85,87,89,90,94,113,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],[2,165],{110:184,114:$Vr1}),{31:[2,70]},{31:[2,71]},o($Vs1,[2,88]),o($Vs1,[2,91]),{7:186,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:187,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:188,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:190,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,30:189,31:$Vg1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{33:195,34:$V2,60:196,62:198,75:197,80:191,92:$Vj,118:$Ve1,119:$Vq,143:192,144:[1,193],145:194},{142:199,146:[1,200],147:[1,201],148:[1,202]},o([6,31,71,94],$Vt1,{39:80,93:203,56:204,57:205,59:206,11:207,37:208,33:209,35:210,60:211,34:$V2,36:$Vq1,38:$V3,40:$V4,41:$V5,63:$Vf,118:$Ve1}),o($Vu1,[2,34]),o($Vu1,[2,35]),o($V91,[2,38]),{15:142,16:212,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:144,60:71,62:54,75:53,77:213,79:28,80:29,81:30,92:$Vj,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,130:$Vt},o([1,6,29,31,32,40,41,42,55,58,66,71,74,82,83,84,85,87,89,90,94,96,102,113,114,115,120,122,131,133,134,135,139,140,146,147,148,156,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175],[2,32]),o($Vv1,[2,36]),{4:214,5:3,7:4,8:5,9:6,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VH,[2,5],{7:4,8:5,9:6,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,5:215,12:$V0,28:$V1,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:$Ve,63:$Vf,64:$Vg,68:$Vh,69:$Vi,92:$Vj,95:$Vk,97:$Vl,105:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,133:$Vu,135:$Vv,137:$Vw,139:$Vx,149:$Vy,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF}),o($VY,[2,258]),{7:216,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:217,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:218,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:219,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:220,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:221,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:222,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:223,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:224,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:225,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:226,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:227,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:228,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:229,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VY,[2,209]),o($VY,[2,214]),{7:230,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VY,[2,208]),o($VY,[2,213]),{39:231,40:$V4,41:$V5,110:232,114:$Vr1},o($Vs1,[2,89]),o($Vw1,[2,168]),{35:233,36:$Vq1},{35:234,36:$Vq1},o($Vs1,[2,104],{35:235,36:$Vq1}),{35:236,36:$Vq1},o($Vs1,[2,105]),{7:238,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,74:$Vx1,75:53,77:40,79:28,80:29,81:30,88:237,91:239,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,121:240,122:$Vy1,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{86:243,87:$V21,90:$V31},{110:244,114:$Vr1},o($Vs1,[2,90]),o($VH,[2,66],{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,8:122,7:245,12:$V0,28:$V71,31:$Vl1,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:$Ve,63:$Vf,64:$Vg,68:$Vh,69:$Vi,92:$Vj,95:$Vk,97:$Vl,105:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,133:$Vk1,135:$Vk1,139:$Vk1,156:$Vk1,137:$Vw,149:$Vy,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF}),o($Vz1,[2,28],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{7:246,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{132:105,133:$Vu,135:$Vv,138:106,139:$Vx,141:77,156:$VX},o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,163,164,165,166,167,168,169,170,171,172,173,174],$V61,{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,7:120,8:122,12:$V0,28:$V71,29:$V81,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:$Ve,63:$Vf,64:$Vg,68:$Vh,69:$Vi,92:$Vj,95:$Vk,97:$Vl,105:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,137:$Vw,149:$Vy,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF}),{6:[1,248],7:247,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:[1,249],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o([6,31],$VA1,{70:252,66:[1,250],71:$VB1}),o($VC1,[2,75]),o($VC1,[2,79],{55:[1,254],74:[1,253]}),o($VC1,[2,82]),o($VD1,[2,83]),o($VD1,[2,84]),o($VD1,[2,85]),o($VD1,[2,86]),{35:182,36:$Vq1},{7:255,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:$Vn1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,74:$Vo1,75:53,76:180,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,116:177,117:$Vo,118:$Vp,119:$Vq,120:$Vp1,123:178,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VY,[2,69]),{4:257,5:3,7:4,8:5,9:6,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V1,32:[1,256],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,159,160,164,165,166,167,168,169,170,171,172,173,174],[2,250],{141:77,132:102,138:103,163:$VL}),o($VE1,[2,251],{141:77,132:102,138:103,163:$VL,165:$VN}),o($VE1,[2,252],{141:77,132:102,138:103,163:$VL,165:$VN}),o($VE1,[2,253],{141:77,132:102,138:103,163:$VL,165:$VN}),o($VY,[2,254],{40:$Vi1,41:$Vi1,82:$Vi1,83:$Vi1,84:$Vi1,85:$Vi1,87:$Vi1,90:$Vi1,113:$Vi1,114:$Vi1}),o($Vw1,$VZ,{109:107,78:108,86:114,82:$V_,83:$V$,84:$V01,85:$V11,87:$V21,90:$V31,113:$V41}),{78:118,82:$V_,83:$V$,84:$V01,85:$V11,86:114,87:$V21,90:$V31,109:117,113:$V41,114:$VZ},o($VF1,$Va1),o($VY,[2,255],{40:$Vi1,41:$Vi1,82:$Vi1,83:$Vi1,84:$Vi1,85:$Vi1,87:$Vi1,90:$Vi1,113:$Vi1,114:$Vi1}),o($VY,[2,256]),o($VY,[2,257]),{6:[1,260],7:258,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:[1,259],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:261,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{30:262,31:$Vg1,155:[1,263]},o($VY,[2,193],{126:264,127:[1,265],128:[1,266]}),o($VY,[2,207]),o($VY,[2,215]),{31:[1,267],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},{150:268,152:269,153:$VG1},o($VY,[2,117]),{7:271,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($Vj1,[2,120],{30:272,31:$Vg1,40:$Vi1,41:$Vi1,82:$Vi1,83:$Vi1,84:$Vi1,85:$Vi1,87:$Vi1,90:$Vi1,113:$Vi1,114:$Vi1,96:[1,273]}),o($Vz1,[2,200],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($V51,$VH1,{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{62:274,92:$Vj},o($V51,[2,124]),{29:[1,275],71:[1,276]},{29:[1,277]},{31:$VI1,33:282,34:$V2,94:[1,278],100:279,101:280,103:$VJ1},o([29,71],[2,140]),{102:[1,284]},{31:$VK1,33:289,34:$V2,94:[1,285],103:$VL1,106:286,108:287},o($V51,[2,144]),{55:[1,291]},{7:292,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{29:[1,293]},{6:$VG,131:[1,294]},{4:295,5:3,7:4,8:5,9:6,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o([6,31,71,120],$VM1,{141:77,132:102,138:103,121:296,74:[1,297],122:$Vy1,133:$Vu,135:$Vv,139:$Vx,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VN1,[2,174]),o([6,31,120],$VA1,{70:298,71:$VO1}),o($VP1,[2,183]),{7:255,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:$Vn1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,74:$Vo1,75:53,76:180,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,116:300,117:$Vo,118:$Vp,119:$Vq,123:178,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VP1,[2,189]),o($VP1,[2,190]),o($VQ1,[2,173]),o($VQ1,[2,33]),o($Vb1,[2,166]),{7:255,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:$Vn1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,74:$Vo1,75:53,76:180,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,115:[1,301],116:302,117:$Vo,118:$Vp,119:$Vq,123:178,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{30:303,31:$Vg1,132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},o($VR1,[2,203],{141:77,132:102,138:103,133:$Vu,134:[1,304],135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VR1,[2,205],{141:77,132:102,138:103,133:$Vu,134:[1,305],135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VY,[2,211]),o($VS1,[2,212],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],[2,216],{140:[1,306]}),o($VT1,[2,219]),{33:195,34:$V2,60:196,62:198,75:197,92:$Vj,118:$Ve1,119:$Vf1,143:307,145:194},o($VT1,[2,225],{71:[1,308]}),o($VU1,[2,221]),o($VU1,[2,222]),o($VU1,[2,223]),o($VU1,[2,224]),o($VY,[2,218]),{7:309,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:310,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:311,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VV1,$VA1,{70:312,71:$VW1}),o($VX1,[2,112]),o($VX1,[2,51],{58:[1,314]}),o($VY1,[2,60],{55:[1,315]}),o($VX1,[2,56]),o($VY1,[2,61]),o($VZ1,[2,57]),o($VZ1,[2,58]),o($VZ1,[2,59]),{46:[1,316],78:118,82:$V_,83:$V$,84:$V01,85:$V11,86:114,87:$V21,90:$V31,109:117,113:$V41,114:$VZ},o($VF1,$Vi1),{6:$VG,42:[1,317]},o($VH,[2,4]),o($V_1,[2,259],{141:77,132:102,138:103,163:$VL,164:$VM,165:$VN}),o($V_1,[2,260],{141:77,132:102,138:103,163:$VL,164:$VM,165:$VN}),o($VE1,[2,261],{141:77,132:102,138:103,163:$VL,165:$VN}),o($VE1,[2,262],{141:77,132:102,138:103,163:$VL,165:$VN}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,166,167,168,169,170,171,172,173,174],[2,263],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,167,168,169,170,171,172,173],[2,264],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,174:$VW}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,168,169,170,171,172,173],[2,265],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,174:$VW}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,169,170,171,172,173],[2,266],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,174:$VW}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,170,171,172,173],[2,267],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,174:$VW}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,171,172,173],[2,268],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,174:$VW}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,172,173],[2,269],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,174:$VW}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,173],[2,270],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,174:$VW}),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,167,168,169,170,171,172,173,174],[2,271],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO}),o($VS1,[2,249],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VS1,[2,248],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vb1,[2,161]),o($Vb1,[2,162]),o($Vs1,[2,100]),o($Vs1,[2,101]),o($Vs1,[2,102]),o($Vs1,[2,103]),{89:[1,318]},{74:$Vx1,89:[2,108],121:319,122:$Vy1,132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},{89:[2,109]},{7:320,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,89:[2,182],92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($V$1,[2,176]),o($V$1,$V02),o($Vs1,[2,107]),o($Vb1,[2,163]),o($VH,[2,65],{141:77,132:102,138:103,133:$VH1,135:$VH1,139:$VH1,156:$VH1,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vz1,[2,29],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vz1,[2,48],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{7:321,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:322,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{67:323,68:$Vh,69:$Vi},o($V12,$V22,{73:127,33:129,60:130,75:131,62:132,72:324,34:$V2,74:$Vd1,92:$Vj,118:$Ve1,119:$Vf1}),{6:$V32,31:$V42},o($VC1,[2,80]),{7:327,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VP1,$VM1,{141:77,132:102,138:103,74:[1,328],133:$Vu,135:$Vv,139:$Vx,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($V52,[2,30]),{6:$VG,32:[1,329]},o($Vz1,[2,272],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{7:330,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:331,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($Vz1,[2,275],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VY,[2,247]),{7:332,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VY,[2,194],{127:[1,333]}),{30:334,31:$Vg1},{30:337,31:$Vg1,33:335,34:$V2,62:336,92:$Vj},{150:338,152:269,153:$VG1},{32:[1,339],151:[1,340],152:341,153:$VG1},o($V62,[2,240]),{7:343,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,124:342,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($V72,[2,118],{141:77,132:102,138:103,30:344,31:$Vg1,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VY,[2,121]),{7:345,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{32:[1,346]},{39:347,40:$V4,41:$V5},{92:[1,349],99:348,104:$Vm1},{39:350,40:$V4,41:$V5},{29:[1,351]},o($VV1,$VA1,{70:352,71:$V82}),o($VX1,[2,131]),{31:$VI1,33:282,34:$V2,100:354,101:280,103:$VJ1},o($VX1,[2,136],{102:[1,355]}),o($VX1,[2,138],{102:[1,356]}),{33:357,34:$V2},o($V51,[2,142]),o($VV1,$VA1,{70:358,71:$V92}),o($VX1,[2,151]),{31:$VK1,33:289,34:$V2,103:$VL1,106:360,108:287},o($VX1,[2,156],{102:[1,361]}),o($VX1,[2,159],{102:[1,362]}),{6:[1,364],7:363,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:[1,365],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($Va2,[2,148],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{39:366,40:$V4,41:$V5},o($V91,[2,201]),{6:$VG,32:[1,367]},{7:368,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o([12,28,34,38,40,41,44,45,48,49,50,51,52,53,61,63,64,68,69,92,95,97,105,112,117,118,119,125,129,130,133,135,137,139,149,155,157,158,159,160,161,162],$V02,{6:$Vb2,31:$Vb2,71:$Vb2,120:$Vb2}),{6:$Vc2,31:$Vd2,120:[1,369]},o([6,31,32,115,120],$V22,{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,8:122,76:180,7:255,123:372,12:$V0,28:$V71,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:$Ve,63:$Vf,64:$Vg,68:$Vh,69:$Vi,74:$Vo1,92:$Vj,95:$Vk,97:$Vl,105:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,133:$Vu,135:$Vv,137:$Vw,139:$Vx,149:$Vy,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF}),o($V12,$VA1,{70:373,71:$VO1}),o($Vb1,[2,169]),o([6,31,115],$VA1,{70:374,71:$VO1}),o($Ve2,[2,244]),{7:375,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:376,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:377,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VT1,[2,220]),{33:195,34:$V2,60:196,62:198,75:197,92:$Vj,118:$Ve1,119:$Vf1,145:378},o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,135,139,156],[2,227],{141:77,132:102,138:103,134:[1,379],140:[1,380],159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vf2,[2,228],{141:77,132:102,138:103,134:[1,381],159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vf2,[2,234],{141:77,132:102,138:103,134:[1,382],159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{6:$Vg2,31:$Vh2,94:[1,383]},o($Vi2,$V22,{39:80,57:205,59:206,11:207,37:208,33:209,35:210,60:211,56:386,34:$V2,36:$Vq1,38:$V3,40:$V4,41:$V5,63:$Vf,118:$Ve1}),{7:387,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:[1,388],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:389,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:[1,390],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($V91,[2,39]),o($Vv1,[2,37]),o($Vs1,[2,106]),{7:391,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,89:[2,180],92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{89:[2,181],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},o($Vz1,[2,49],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{32:[1,392],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},{30:393,31:$Vg1},o($VC1,[2,76]),{33:129,34:$V2,60:130,62:132,72:394,73:127,74:$Vd1,75:131,92:$Vj,118:$Ve1,119:$Vf1},o($Vj2,$Vc1,{72:126,73:127,33:129,60:130,75:131,62:132,65:395,34:$V2,74:$Vd1,92:$Vj,118:$Ve1,119:$Vf1}),o($VC1,[2,81],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VP1,$Vb2),o($V52,[2,31]),{32:[1,396],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},o($Vz1,[2,274],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{30:397,31:$Vg1,132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},{30:398,31:$Vg1},o($VY,[2,195]),{30:399,31:$Vg1},{30:400,31:$Vg1},o($Vk2,[2,199]),{32:[1,401],151:[1,402],152:341,153:$VG1},o($VY,[2,238]),{30:403,31:$Vg1},o($V62,[2,241]),{30:404,31:$Vg1,71:[1,405]},o($Vl2,[2,191],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VY,[2,119]),o($V72,[2,122],{141:77,132:102,138:103,30:406,31:$Vg1,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($V51,[2,63]),o($V51,[2,125]),{29:[1,407]},{31:$VI1,33:282,34:$V2,100:408,101:280,103:$VJ1},o($V51,[2,126]),{39:409,40:$V4,41:$V5},{6:$Vm2,31:$Vn2,94:[1,410]},o($Vi2,$V22,{33:282,101:413,34:$V2,103:$VJ1}),o($V12,$VA1,{70:414,71:$V82}),{33:415,34:$V2},{33:416,34:$V2},{29:[2,141]},{6:$Vo2,31:$Vp2,94:[1,417]},o($Vi2,$V22,{33:289,108:420,34:$V2,103:$VL1}),o($V12,$VA1,{70:421,71:$V92}),{33:422,34:$V2,103:[1,423]},{33:424,34:$V2},o($Va2,[2,145],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{7:425,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:426,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($V51,[2,149]),{131:[1,427]},{120:[1,428],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},o($VN1,[2,175]),{7:255,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,74:$Vo1,75:53,76:180,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,123:429,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:255,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,31:$Vn1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,74:$Vo1,75:53,76:180,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,116:430,117:$Vo,118:$Vp,119:$Vq,123:178,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VP1,[2,184]),{6:$Vc2,31:$Vd2,32:[1,431]},{6:$Vc2,31:$Vd2,115:[1,432]},o($VS1,[2,204],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VS1,[2,206],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VS1,[2,217],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VT1,[2,226]),{7:433,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:434,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:435,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:436,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VN1,[2,110]),{11:207,33:209,34:$V2,35:210,36:$Vq1,37:208,38:$V3,39:80,40:$V4,41:$V5,56:437,57:205,59:206,60:211,63:$Vf,118:$Ve1},o($Vj2,$Vt1,{39:80,56:204,57:205,59:206,11:207,37:208,33:209,35:210,60:211,93:438,34:$V2,36:$Vq1,38:$V3,40:$V4,41:$V5,63:$Vf,118:$Ve1}),o($VX1,[2,113]),o($VX1,[2,52],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{7:439,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VX1,[2,54],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{7:440,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{89:[2,179],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},o($VY,[2,50]),o($VY,[2,68]),o($VC1,[2,77]),o($V12,$VA1,{70:441,71:$VB1}),o($VY,[2,273]),o($Ve2,[2,245]),o($VY,[2,196]),o($Vk2,[2,197]),o($Vk2,[2,198]),o($VY,[2,236]),{30:442,31:$Vg1},{32:[1,443]},o($V62,[2,242],{6:[1,444]}),{7:445,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},o($VY,[2,123]),{39:446,40:$V4,41:$V5},o($VV1,$VA1,{70:447,71:$V82}),o($V51,[2,127]),{29:[1,448]},{33:282,34:$V2,101:449,103:$VJ1},{31:$VI1,33:282,34:$V2,100:450,101:280,103:$VJ1},o($VX1,[2,132]),{6:$Vm2,31:$Vn2,32:[1,451]},o($VX1,[2,137]),o($VX1,[2,139]),o($V51,[2,143],{29:[1,452]}),{33:289,34:$V2,103:$VL1,108:453},{31:$VK1,33:289,34:$V2,103:$VL1,106:454,108:287},o($VX1,[2,152]),{6:$Vo2,31:$Vp2,32:[1,455]},o($VX1,[2,157]),o($VX1,[2,158]),o($VX1,[2,160]),o($Va2,[2,146],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),{32:[1,456],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},o($V91,[2,202]),o($V91,[2,178]),o($VP1,[2,185]),o($V12,$VA1,{70:457,71:$VO1}),o($VP1,[2,186]),o($Vb1,[2,170]),o([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,156],[2,229],{141:77,132:102,138:103,140:[1,458],159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vf2,[2,231],{141:77,132:102,138:103,134:[1,459],159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vz1,[2,230],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vz1,[2,235],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VX1,[2,114]),o($V12,$VA1,{70:460,71:$VW1}),{32:[1,461],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},{32:[1,462],132:102,133:$Vu,135:$Vv,138:103,139:$Vx,141:77,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW},{6:$V32,31:$V42,32:[1,463]},{32:[1,464]},o($VY,[2,239]),o($V62,[2,243]),o($Vl2,[2,192],{141:77,132:102,138:103,133:$Vu,135:$Vv,139:$Vx,156:$VI,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($V51,[2,129]),{6:$Vm2,31:$Vn2,94:[1,465]},{39:466,40:$V4,41:$V5},o($VX1,[2,133]),o($V12,$VA1,{70:467,71:$V82}),o($VX1,[2,134]),{39:468,40:$V4,41:$V5},o($VX1,[2,153]),o($V12,$VA1,{70:469,71:$V92}),o($VX1,[2,154]),o($V51,[2,147]),{6:$Vc2,31:$Vd2,32:[1,470]},{7:471,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{7:472,8:122,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V71,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:54,63:$Vf,64:$Vg,67:33,68:$Vh,69:$Vi,75:53,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,105:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,149:$Vy,154:41,155:$Vz,157:$VA,158:$VB,159:$VC,160:$VD,161:$VE,162:$VF},{6:$Vg2,31:$Vh2,32:[1,473]},o($VX1,[2,53]),o($VX1,[2,55]),o($VC1,[2,78]),o($VY,[2,237]),{29:[1,474]},o($V51,[2,128]),{6:$Vm2,31:$Vn2,32:[1,475]},o($V51,[2,150]),{6:$Vo2,31:$Vp2,32:[1,476]},o($VP1,[2,187]),o($Vz1,[2,232],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($Vz1,[2,233],{141:77,132:102,138:103,159:$VJ,160:$VK,163:$VL,164:$VM,165:$VN,166:$VO,167:$VP,168:$VQ,169:$VR,170:$VS,171:$VT,172:$VU,173:$VV,174:$VW}),o($VX1,[2,115]),{39:477,40:$V4,41:$V5},o($VX1,[2,135]),o($VX1,[2,155]),o($V51,[2,130])], -defaultActions: {68:[2,70],69:[2,71],239:[2,109],357:[2,141]}, -parseError: function parseError(str, hash) { - if (hash.recoverable) { - this.trace(str); - } else { - function _parseError (msg, hash) { - this.message = msg; - this.hash = hash; - } - _parseError.prototype = Error; - - throw new _parseError(str, hash); - } -}, -parse: function parse(input) { - var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; - var args = lstack.slice.call(arguments, 1); - var lexer = Object.create(this.lexer); - var sharedState = { yy: {} }; - for (var k in this.yy) { - if (Object.prototype.hasOwnProperty.call(this.yy, k)) { - sharedState.yy[k] = this.yy[k]; - } - } - lexer.setInput(input, sharedState.yy); - sharedState.yy.lexer = lexer; - sharedState.yy.parser = this; - if (typeof lexer.yylloc == 'undefined') { - lexer.yylloc = {}; - } - var yyloc = lexer.yylloc; - lstack.push(yyloc); - var ranges = lexer.options && lexer.options.ranges; - if (typeof sharedState.yy.parseError === 'function') { - this.parseError = sharedState.yy.parseError; - } else { - this.parseError = Object.getPrototypeOf(this).parseError; - } - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - _token_stack: - var lex = function () { - var token; - token = lexer.lex() || EOF; - if (typeof token !== 'number') { - token = self.symbols_[token] || token; - } - return token; - }; - var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol === null || typeof symbol == 'undefined') { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === 'undefined' || !action.length || !action[0]) { - var errStr = ''; - expected = []; - for (p in table[state]) { - if (this.terminals_[p] && p > TERROR) { - expected.push('\'' + this.terminals_[p] + '\''); - } - } - if (lexer.showPosition) { - errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; - } else { - errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); - } - this.parseError(errStr, { - text: lexer.match, - token: this.terminals_[symbol] || symbol, - line: lexer.yylineno, - loc: yyloc, - expected: expected - }); - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(lexer.yytext); - lstack.push(lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = lexer.yyleng; - yytext = lexer.yytext; - yylineno = lexer.yylineno; - yyloc = lexer.yylloc; - if (recovering > 0) { - recovering--; - } - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = { - first_line: lstack[lstack.length - (len || 1)].first_line, - last_line: lstack[lstack.length - 1].last_line, - first_column: lstack[lstack.length - (len || 1)].first_column, - last_column: lstack[lstack.length - 1].last_column - }; - if (ranges) { - yyval._$.range = [ - lstack[lstack.length - (len || 1)].range[0], - lstack[lstack.length - 1].range[1] - ]; - } - r = this.performAction.apply(yyval, [ - yytext, - yyleng, - yylineno, - sharedState.yy, - action[1], - vstack, - lstack - ].concat(args)); - if (typeof r !== 'undefined') { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; -}}; - -function Parser () { - this.yy = {}; -} -Parser.prototype = parser;parser.Parser = Parser; -return new Parser; -})(); - - -if (typeof require !== 'undefined' && typeof exports !== 'undefined') { -exports.parser = parser; -exports.Parser = parser.Parser; -exports.parse = function () { return parser.parse.apply(parser, arguments); }; -exports.main = function commonjsMain(args) { - if (!args[1]) { - console.log('Usage: '+args[0]+' FILE'); - process.exit(1); - } - var source = ''; - var fs = require('fs'); - if (typeof fs !== 'undefined' && fs !== null) - source = fs.readFileSync(require('path').normalize(args[1]), "utf8"); - return exports.parser.parse(source); -}; -if (typeof module !== 'undefined' && require.main === module) { - exports.main(process.argv.slice(1)); -} -} \ No newline at end of file diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/register.js b/deploy/node_modules/coffee-script/lib/coffee-script/register.js deleted file mode 100644 index 7d36ffc..0000000 --- a/deploy/node_modules/coffee-script/lib/coffee-script/register.js +++ /dev/null @@ -1,66 +0,0 @@ -// Generated by CoffeeScript 1.12.7 -(function() { - var CoffeeScript, Module, binary, child_process, ext, findExtension, fork, helpers, i, len, loadFile, path, ref; - - CoffeeScript = require('./coffee-script'); - - child_process = require('child_process'); - - helpers = require('./helpers'); - - path = require('path'); - - loadFile = function(module, filename) { - var answer; - answer = CoffeeScript._compileFile(filename, false, true); - return module._compile(answer, filename); - }; - - if (require.extensions) { - ref = CoffeeScript.FILE_EXTENSIONS; - for (i = 0, len = ref.length; i < len; i++) { - ext = ref[i]; - require.extensions[ext] = loadFile; - } - Module = require('module'); - findExtension = function(filename) { - var curExtension, extensions; - extensions = path.basename(filename).split('.'); - if (extensions[0] === '') { - extensions.shift(); - } - while (extensions.shift()) { - curExtension = '.' + extensions.join('.'); - if (Module._extensions[curExtension]) { - return curExtension; - } - } - return '.js'; - }; - Module.prototype.load = function(filename) { - var extension; - this.filename = filename; - this.paths = Module._nodeModulePaths(path.dirname(filename)); - extension = findExtension(filename); - Module._extensions[extension](this, filename); - return this.loaded = true; - }; - } - - if (child_process) { - fork = child_process.fork; - binary = require.resolve('../../bin/coffee'); - child_process.fork = function(path, args, options) { - if (helpers.isCoffee(path)) { - if (!Array.isArray(args)) { - options = args || {}; - args = []; - } - args = [path].concat(args); - path = binary; - } - return fork(path, args, options); - }; - } - -}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/repl.js b/deploy/node_modules/coffee-script/lib/coffee-script/repl.js deleted file mode 100644 index e74fe5e..0000000 --- a/deploy/node_modules/coffee-script/lib/coffee-script/repl.js +++ /dev/null @@ -1,203 +0,0 @@ -// Generated by CoffeeScript 1.12.7 -(function() { - var CoffeeScript, addHistory, addMultilineHandler, fs, getCommandId, merge, nodeREPL, path, ref, replDefaults, runInContext, updateSyntaxError, vm; - - fs = require('fs'); - - path = require('path'); - - vm = require('vm'); - - nodeREPL = require('repl'); - - CoffeeScript = require('./coffee-script'); - - ref = require('./helpers'), merge = ref.merge, updateSyntaxError = ref.updateSyntaxError; - - replDefaults = { - prompt: 'coffee> ', - historyFile: process.env.HOME ? path.join(process.env.HOME, '.coffee_history') : void 0, - historyMaxInputSize: 10240, - "eval": function(input, context, filename, cb) { - var Assign, Block, Literal, Value, ast, err, js, ref1, referencedVars, token, tokens; - input = input.replace(/\uFF00/g, '\n'); - input = input.replace(/^\(([\s\S]*)\n\)$/m, '$1'); - input = input.replace(/^\s*try\s*{([\s\S]*)}\s*catch.*$/m, '$1'); - ref1 = require('./nodes'), Block = ref1.Block, Assign = ref1.Assign, Value = ref1.Value, Literal = ref1.Literal; - try { - tokens = CoffeeScript.tokens(input); - referencedVars = (function() { - var i, len, results; - results = []; - for (i = 0, len = tokens.length; i < len; i++) { - token = tokens[i]; - if (token[0] === 'IDENTIFIER') { - results.push(token[1]); - } - } - return results; - })(); - ast = CoffeeScript.nodes(tokens); - ast = new Block([new Assign(new Value(new Literal('__')), ast, '=')]); - js = ast.compile({ - bare: true, - locals: Object.keys(context), - referencedVars: referencedVars - }); - return cb(null, runInContext(js, context, filename)); - } catch (error) { - err = error; - updateSyntaxError(err, input); - return cb(err); - } - } - }; - - runInContext = function(js, context, filename) { - if (context === global) { - return vm.runInThisContext(js, filename); - } else { - return vm.runInContext(js, context, filename); - } - }; - - addMultilineHandler = function(repl) { - var inputStream, multiline, nodeLineListener, origPrompt, outputStream, ref1, rli; - rli = repl.rli, inputStream = repl.inputStream, outputStream = repl.outputStream; - origPrompt = (ref1 = repl._prompt) != null ? ref1 : repl.prompt; - multiline = { - enabled: false, - initialPrompt: origPrompt.replace(/^[^> ]*/, function(x) { - return x.replace(/./g, '-'); - }), - prompt: origPrompt.replace(/^[^> ]*>?/, function(x) { - return x.replace(/./g, '.'); - }), - buffer: '' - }; - nodeLineListener = rli.listeners('line')[0]; - rli.removeListener('line', nodeLineListener); - rli.on('line', function(cmd) { - if (multiline.enabled) { - multiline.buffer += cmd + "\n"; - rli.setPrompt(multiline.prompt); - rli.prompt(true); - } else { - rli.setPrompt(origPrompt); - nodeLineListener(cmd); - } - }); - return inputStream.on('keypress', function(char, key) { - if (!(key && key.ctrl && !key.meta && !key.shift && key.name === 'v')) { - return; - } - if (multiline.enabled) { - if (!multiline.buffer.match(/\n/)) { - multiline.enabled = !multiline.enabled; - rli.setPrompt(origPrompt); - rli.prompt(true); - return; - } - if ((rli.line != null) && !rli.line.match(/^\s*$/)) { - return; - } - multiline.enabled = !multiline.enabled; - rli.line = ''; - rli.cursor = 0; - rli.output.cursorTo(0); - rli.output.clearLine(1); - multiline.buffer = multiline.buffer.replace(/\n/g, '\uFF00'); - rli.emit('line', multiline.buffer); - multiline.buffer = ''; - } else { - multiline.enabled = !multiline.enabled; - rli.setPrompt(multiline.initialPrompt); - rli.prompt(true); - } - }); - }; - - addHistory = function(repl, filename, maxSize) { - var buffer, fd, lastLine, readFd, size, stat; - lastLine = null; - try { - stat = fs.statSync(filename); - size = Math.min(maxSize, stat.size); - readFd = fs.openSync(filename, 'r'); - buffer = new Buffer(size); - fs.readSync(readFd, buffer, 0, size, stat.size - size); - fs.closeSync(readFd); - repl.rli.history = buffer.toString().split('\n').reverse(); - if (stat.size > maxSize) { - repl.rli.history.pop(); - } - if (repl.rli.history[0] === '') { - repl.rli.history.shift(); - } - repl.rli.historyIndex = -1; - lastLine = repl.rli.history[0]; - } catch (error) {} - fd = fs.openSync(filename, 'a'); - repl.rli.addListener('line', function(code) { - if (code && code.length && code !== '.history' && code !== '.exit' && lastLine !== code) { - fs.writeSync(fd, code + "\n"); - return lastLine = code; - } - }); - repl.on('exit', function() { - return fs.closeSync(fd); - }); - return repl.commands[getCommandId(repl, 'history')] = { - help: 'Show command history', - action: function() { - repl.outputStream.write((repl.rli.history.slice(0).reverse().join('\n')) + "\n"); - return repl.displayPrompt(); - } - }; - }; - - getCommandId = function(repl, commandName) { - var commandsHaveLeadingDot; - commandsHaveLeadingDot = repl.commands['.help'] != null; - if (commandsHaveLeadingDot) { - return "." + commandName; - } else { - return commandName; - } - }; - - module.exports = { - start: function(opts) { - var build, major, minor, ref1, repl; - if (opts == null) { - opts = {}; - } - ref1 = process.versions.node.split('.').map(function(n) { - return parseInt(n, 10); - }), major = ref1[0], minor = ref1[1], build = ref1[2]; - if (major === 0 && minor < 8) { - console.warn("Node 0.8.0+ required for CoffeeScript REPL"); - process.exit(1); - } - CoffeeScript.register(); - process.argv = ['coffee'].concat(process.argv.slice(2)); - opts = merge(replDefaults, opts); - repl = nodeREPL.start(opts); - if (opts.prelude) { - runInContext(opts.prelude, repl.context, 'prelude'); - } - repl.on('exit', function() { - if (!repl.rli.closed) { - return repl.outputStream.write('\n'); - } - }); - addMultilineHandler(repl); - if (opts.historyFile) { - addHistory(repl, opts.historyFile, opts.historyMaxInputSize); - } - repl.commands[getCommandId(repl, 'load')].help = 'Load code from a file into this REPL session'; - return repl; - } - }; - -}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/rewriter.js b/deploy/node_modules/coffee-script/lib/coffee-script/rewriter.js deleted file mode 100644 index b0e25e1..0000000 --- a/deploy/node_modules/coffee-script/lib/coffee-script/rewriter.js +++ /dev/null @@ -1,537 +0,0 @@ -// Generated by CoffeeScript 1.12.7 -(function() { - var BALANCED_PAIRS, CALL_CLOSERS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, Rewriter, SINGLE_CLOSERS, SINGLE_LINERS, generate, k, left, len, ref, rite, - indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, - slice = [].slice; - - generate = function(tag, value, origin) { - var tok; - tok = [tag, value]; - tok.generated = true; - if (origin) { - tok.origin = origin; - } - return tok; - }; - - exports.Rewriter = Rewriter = (function() { - function Rewriter() {} - - Rewriter.prototype.rewrite = function(tokens1) { - this.tokens = tokens1; - this.removeLeadingNewlines(); - this.closeOpenCalls(); - this.closeOpenIndexes(); - this.normalizeLines(); - this.tagPostfixConditionals(); - this.addImplicitBracesAndParens(); - this.addLocationDataToGeneratedTokens(); - this.fixOutdentLocationData(); - return this.tokens; - }; - - Rewriter.prototype.scanTokens = function(block) { - var i, token, tokens; - tokens = this.tokens; - i = 0; - while (token = tokens[i]) { - i += block.call(this, token, i, tokens); - } - return true; - }; - - Rewriter.prototype.detectEnd = function(i, condition, action) { - var levels, ref, ref1, token, tokens; - tokens = this.tokens; - levels = 0; - while (token = tokens[i]) { - if (levels === 0 && condition.call(this, token, i)) { - return action.call(this, token, i); - } - if (!token || levels < 0) { - return action.call(this, token, i - 1); - } - if (ref = token[0], indexOf.call(EXPRESSION_START, ref) >= 0) { - levels += 1; - } else if (ref1 = token[0], indexOf.call(EXPRESSION_END, ref1) >= 0) { - levels -= 1; - } - i += 1; - } - return i - 1; - }; - - Rewriter.prototype.removeLeadingNewlines = function() { - var i, k, len, ref, tag; - ref = this.tokens; - for (i = k = 0, len = ref.length; k < len; i = ++k) { - tag = ref[i][0]; - if (tag !== 'TERMINATOR') { - break; - } - } - if (i) { - return this.tokens.splice(0, i); - } - }; - - Rewriter.prototype.closeOpenCalls = function() { - var action, condition; - condition = function(token, i) { - var ref; - return ((ref = token[0]) === ')' || ref === 'CALL_END') || token[0] === 'OUTDENT' && this.tag(i - 1) === ')'; - }; - action = function(token, i) { - return this.tokens[token[0] === 'OUTDENT' ? i - 1 : i][0] = 'CALL_END'; - }; - return this.scanTokens(function(token, i) { - if (token[0] === 'CALL_START') { - this.detectEnd(i + 1, condition, action); - } - return 1; - }); - }; - - Rewriter.prototype.closeOpenIndexes = function() { - var action, condition; - condition = function(token, i) { - var ref; - return (ref = token[0]) === ']' || ref === 'INDEX_END'; - }; - action = function(token, i) { - return token[0] = 'INDEX_END'; - }; - return this.scanTokens(function(token, i) { - if (token[0] === 'INDEX_START') { - this.detectEnd(i + 1, condition, action); - } - return 1; - }); - }; - - Rewriter.prototype.indexOfTag = function() { - var fuzz, i, j, k, pattern, ref, ref1; - i = arguments[0], pattern = 2 <= arguments.length ? slice.call(arguments, 1) : []; - fuzz = 0; - for (j = k = 0, ref = pattern.length; 0 <= ref ? k < ref : k > ref; j = 0 <= ref ? ++k : --k) { - while (this.tag(i + j + fuzz) === 'HERECOMMENT') { - fuzz += 2; - } - if (pattern[j] == null) { - continue; - } - if (typeof pattern[j] === 'string') { - pattern[j] = [pattern[j]]; - } - if (ref1 = this.tag(i + j + fuzz), indexOf.call(pattern[j], ref1) < 0) { - return -1; - } - } - return i + j + fuzz - 1; - }; - - Rewriter.prototype.looksObjectish = function(j) { - var end, index; - if (this.indexOfTag(j, '@', null, ':') > -1 || this.indexOfTag(j, null, ':') > -1) { - return true; - } - index = this.indexOfTag(j, EXPRESSION_START); - if (index > -1) { - end = null; - this.detectEnd(index + 1, (function(token) { - var ref; - return ref = token[0], indexOf.call(EXPRESSION_END, ref) >= 0; - }), (function(token, i) { - return end = i; - })); - if (this.tag(end + 1) === ':') { - return true; - } - } - return false; - }; - - Rewriter.prototype.findTagsBackwards = function(i, tags) { - var backStack, ref, ref1, ref2, ref3, ref4, ref5; - backStack = []; - while (i >= 0 && (backStack.length || (ref2 = this.tag(i), indexOf.call(tags, ref2) < 0) && ((ref3 = this.tag(i), indexOf.call(EXPRESSION_START, ref3) < 0) || this.tokens[i].generated) && (ref4 = this.tag(i), indexOf.call(LINEBREAKS, ref4) < 0))) { - if (ref = this.tag(i), indexOf.call(EXPRESSION_END, ref) >= 0) { - backStack.push(this.tag(i)); - } - if ((ref1 = this.tag(i), indexOf.call(EXPRESSION_START, ref1) >= 0) && backStack.length) { - backStack.pop(); - } - i -= 1; - } - return ref5 = this.tag(i), indexOf.call(tags, ref5) >= 0; - }; - - Rewriter.prototype.addImplicitBracesAndParens = function() { - var stack, start; - stack = []; - start = null; - return this.scanTokens(function(token, i, tokens) { - var endImplicitCall, endImplicitObject, forward, inImplicit, inImplicitCall, inImplicitControl, inImplicitObject, isImplicit, isImplicitCall, isImplicitObject, k, newLine, nextTag, offset, prevTag, prevToken, ref, ref1, ref2, ref3, ref4, ref5, s, sameLine, stackIdx, stackItem, stackTag, stackTop, startIdx, startImplicitCall, startImplicitObject, startsLine, tag; - tag = token[0]; - prevTag = (prevToken = i > 0 ? tokens[i - 1] : [])[0]; - nextTag = (i < tokens.length - 1 ? tokens[i + 1] : [])[0]; - stackTop = function() { - return stack[stack.length - 1]; - }; - startIdx = i; - forward = function(n) { - return i - startIdx + n; - }; - isImplicit = function(stackItem) { - var ref; - return stackItem != null ? (ref = stackItem[2]) != null ? ref.ours : void 0 : void 0; - }; - isImplicitObject = function(stackItem) { - return isImplicit(stackItem) && (stackItem != null ? stackItem[0] : void 0) === '{'; - }; - isImplicitCall = function(stackItem) { - return isImplicit(stackItem) && (stackItem != null ? stackItem[0] : void 0) === '('; - }; - inImplicit = function() { - return isImplicit(stackTop()); - }; - inImplicitCall = function() { - return isImplicitCall(stackTop()); - }; - inImplicitObject = function() { - return isImplicitObject(stackTop()); - }; - inImplicitControl = function() { - var ref; - return inImplicit && ((ref = stackTop()) != null ? ref[0] : void 0) === 'CONTROL'; - }; - startImplicitCall = function(j) { - var idx; - idx = j != null ? j : i; - stack.push([ - '(', idx, { - ours: true - } - ]); - tokens.splice(idx, 0, generate('CALL_START', '(', ['', 'implicit function call', token[2]])); - if (j == null) { - return i += 1; - } - }; - endImplicitCall = function() { - stack.pop(); - tokens.splice(i, 0, generate('CALL_END', ')', ['', 'end of input', token[2]])); - return i += 1; - }; - startImplicitObject = function(j, startsLine) { - var idx, val; - if (startsLine == null) { - startsLine = true; - } - idx = j != null ? j : i; - stack.push([ - '{', idx, { - sameLine: true, - startsLine: startsLine, - ours: true - } - ]); - val = new String('{'); - val.generated = true; - tokens.splice(idx, 0, generate('{', val, token)); - if (j == null) { - return i += 1; - } - }; - endImplicitObject = function(j) { - j = j != null ? j : i; - stack.pop(); - tokens.splice(j, 0, generate('}', '}', token)); - return i += 1; - }; - if (inImplicitCall() && (tag === 'IF' || tag === 'TRY' || tag === 'FINALLY' || tag === 'CATCH' || tag === 'CLASS' || tag === 'SWITCH')) { - stack.push([ - 'CONTROL', i, { - ours: true - } - ]); - return forward(1); - } - if (tag === 'INDENT' && inImplicit()) { - if (prevTag !== '=>' && prevTag !== '->' && prevTag !== '[' && prevTag !== '(' && prevTag !== ',' && prevTag !== '{' && prevTag !== 'TRY' && prevTag !== 'ELSE' && prevTag !== '=') { - while (inImplicitCall()) { - endImplicitCall(); - } - } - if (inImplicitControl()) { - stack.pop(); - } - stack.push([tag, i]); - return forward(1); - } - if (indexOf.call(EXPRESSION_START, tag) >= 0) { - stack.push([tag, i]); - return forward(1); - } - if (indexOf.call(EXPRESSION_END, tag) >= 0) { - while (inImplicit()) { - if (inImplicitCall()) { - endImplicitCall(); - } else if (inImplicitObject()) { - endImplicitObject(); - } else { - stack.pop(); - } - } - start = stack.pop(); - } - if ((indexOf.call(IMPLICIT_FUNC, tag) >= 0 && token.spaced || tag === '?' && i > 0 && !tokens[i - 1].spaced) && (indexOf.call(IMPLICIT_CALL, nextTag) >= 0 || indexOf.call(IMPLICIT_UNSPACED_CALL, nextTag) >= 0 && !((ref = tokens[i + 1]) != null ? ref.spaced : void 0) && !((ref1 = tokens[i + 1]) != null ? ref1.newLine : void 0))) { - if (tag === '?') { - tag = token[0] = 'FUNC_EXIST'; - } - startImplicitCall(i + 1); - return forward(2); - } - if (indexOf.call(IMPLICIT_FUNC, tag) >= 0 && this.indexOfTag(i + 1, 'INDENT') > -1 && this.looksObjectish(i + 2) && !this.findTagsBackwards(i, ['CLASS', 'EXTENDS', 'IF', 'CATCH', 'SWITCH', 'LEADING_WHEN', 'FOR', 'WHILE', 'UNTIL'])) { - startImplicitCall(i + 1); - stack.push(['INDENT', i + 2]); - return forward(3); - } - if (tag === ':') { - s = (function() { - var ref2; - switch (false) { - case ref2 = this.tag(i - 1), indexOf.call(EXPRESSION_END, ref2) < 0: - return start[1]; - case this.tag(i - 2) !== '@': - return i - 2; - default: - return i - 1; - } - }).call(this); - while (this.tag(s - 2) === 'HERECOMMENT') { - s -= 2; - } - this.insideForDeclaration = nextTag === 'FOR'; - startsLine = s === 0 || (ref2 = this.tag(s - 1), indexOf.call(LINEBREAKS, ref2) >= 0) || tokens[s - 1].newLine; - if (stackTop()) { - ref3 = stackTop(), stackTag = ref3[0], stackIdx = ref3[1]; - if ((stackTag === '{' || stackTag === 'INDENT' && this.tag(stackIdx - 1) === '{') && (startsLine || this.tag(s - 1) === ',' || this.tag(s - 1) === '{')) { - return forward(1); - } - } - startImplicitObject(s, !!startsLine); - return forward(2); - } - if (indexOf.call(LINEBREAKS, tag) >= 0) { - for (k = stack.length - 1; k >= 0; k += -1) { - stackItem = stack[k]; - if (!isImplicit(stackItem)) { - break; - } - if (isImplicitObject(stackItem)) { - stackItem[2].sameLine = false; - } - } - } - newLine = prevTag === 'OUTDENT' || prevToken.newLine; - if (indexOf.call(IMPLICIT_END, tag) >= 0 || indexOf.call(CALL_CLOSERS, tag) >= 0 && newLine) { - while (inImplicit()) { - ref4 = stackTop(), stackTag = ref4[0], stackIdx = ref4[1], (ref5 = ref4[2], sameLine = ref5.sameLine, startsLine = ref5.startsLine); - if (inImplicitCall() && prevTag !== ',') { - endImplicitCall(); - } else if (inImplicitObject() && !this.insideForDeclaration && sameLine && tag !== 'TERMINATOR' && prevTag !== ':') { - endImplicitObject(); - } else if (inImplicitObject() && tag === 'TERMINATOR' && prevTag !== ',' && !(startsLine && this.looksObjectish(i + 1))) { - if (nextTag === 'HERECOMMENT') { - return forward(1); - } - endImplicitObject(); - } else { - break; - } - } - } - if (tag === ',' && !this.looksObjectish(i + 1) && inImplicitObject() && !this.insideForDeclaration && (nextTag !== 'TERMINATOR' || !this.looksObjectish(i + 2))) { - offset = nextTag === 'OUTDENT' ? 1 : 0; - while (inImplicitObject()) { - endImplicitObject(i + offset); - } - } - return forward(1); - }); - }; - - Rewriter.prototype.addLocationDataToGeneratedTokens = function() { - return this.scanTokens(function(token, i, tokens) { - var column, line, nextLocation, prevLocation, ref, ref1; - if (token[2]) { - return 1; - } - if (!(token.generated || token.explicit)) { - return 1; - } - if (token[0] === '{' && (nextLocation = (ref = tokens[i + 1]) != null ? ref[2] : void 0)) { - line = nextLocation.first_line, column = nextLocation.first_column; - } else if (prevLocation = (ref1 = tokens[i - 1]) != null ? ref1[2] : void 0) { - line = prevLocation.last_line, column = prevLocation.last_column; - } else { - line = column = 0; - } - token[2] = { - first_line: line, - first_column: column, - last_line: line, - last_column: column - }; - return 1; - }); - }; - - Rewriter.prototype.fixOutdentLocationData = function() { - return this.scanTokens(function(token, i, tokens) { - var prevLocationData; - if (!(token[0] === 'OUTDENT' || (token.generated && token[0] === 'CALL_END') || (token.generated && token[0] === '}'))) { - return 1; - } - prevLocationData = tokens[i - 1][2]; - token[2] = { - first_line: prevLocationData.last_line, - first_column: prevLocationData.last_column, - last_line: prevLocationData.last_line, - last_column: prevLocationData.last_column - }; - return 1; - }); - }; - - Rewriter.prototype.normalizeLines = function() { - var action, condition, indent, outdent, starter; - starter = indent = outdent = null; - condition = function(token, i) { - var ref, ref1, ref2, ref3; - return token[1] !== ';' && (ref = token[0], indexOf.call(SINGLE_CLOSERS, ref) >= 0) && !(token[0] === 'TERMINATOR' && (ref1 = this.tag(i + 1), indexOf.call(EXPRESSION_CLOSE, ref1) >= 0)) && !(token[0] === 'ELSE' && starter !== 'THEN') && !(((ref2 = token[0]) === 'CATCH' || ref2 === 'FINALLY') && (starter === '->' || starter === '=>')) || (ref3 = token[0], indexOf.call(CALL_CLOSERS, ref3) >= 0) && (this.tokens[i - 1].newLine || this.tokens[i - 1][0] === 'OUTDENT'); - }; - action = function(token, i) { - return this.tokens.splice((this.tag(i - 1) === ',' ? i - 1 : i), 0, outdent); - }; - return this.scanTokens(function(token, i, tokens) { - var j, k, ref, ref1, ref2, tag; - tag = token[0]; - if (tag === 'TERMINATOR') { - if (this.tag(i + 1) === 'ELSE' && this.tag(i - 1) !== 'OUTDENT') { - tokens.splice.apply(tokens, [i, 1].concat(slice.call(this.indentation()))); - return 1; - } - if (ref = this.tag(i + 1), indexOf.call(EXPRESSION_CLOSE, ref) >= 0) { - tokens.splice(i, 1); - return 0; - } - } - if (tag === 'CATCH') { - for (j = k = 1; k <= 2; j = ++k) { - if (!((ref1 = this.tag(i + j)) === 'OUTDENT' || ref1 === 'TERMINATOR' || ref1 === 'FINALLY')) { - continue; - } - tokens.splice.apply(tokens, [i + j, 0].concat(slice.call(this.indentation()))); - return 2 + j; - } - } - if (indexOf.call(SINGLE_LINERS, tag) >= 0 && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF')) { - starter = tag; - ref2 = this.indentation(tokens[i]), indent = ref2[0], outdent = ref2[1]; - if (starter === 'THEN') { - indent.fromThen = true; - } - tokens.splice(i + 1, 0, indent); - this.detectEnd(i + 2, condition, action); - if (tag === 'THEN') { - tokens.splice(i, 1); - } - return 1; - } - return 1; - }); - }; - - Rewriter.prototype.tagPostfixConditionals = function() { - var action, condition, original; - original = null; - condition = function(token, i) { - var prevTag, tag; - tag = token[0]; - prevTag = this.tokens[i - 1][0]; - return tag === 'TERMINATOR' || (tag === 'INDENT' && indexOf.call(SINGLE_LINERS, prevTag) < 0); - }; - action = function(token, i) { - if (token[0] !== 'INDENT' || (token.generated && !token.fromThen)) { - return original[0] = 'POST_' + original[0]; - } - }; - return this.scanTokens(function(token, i) { - if (token[0] !== 'IF') { - return 1; - } - original = token; - this.detectEnd(i + 1, condition, action); - return 1; - }); - }; - - Rewriter.prototype.indentation = function(origin) { - var indent, outdent; - indent = ['INDENT', 2]; - outdent = ['OUTDENT', 2]; - if (origin) { - indent.generated = outdent.generated = true; - indent.origin = outdent.origin = origin; - } else { - indent.explicit = outdent.explicit = true; - } - return [indent, outdent]; - }; - - Rewriter.prototype.generate = generate; - - Rewriter.prototype.tag = function(i) { - var ref; - return (ref = this.tokens[i]) != null ? ref[0] : void 0; - }; - - return Rewriter; - - })(); - - BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'], ['CALL_START', 'CALL_END'], ['PARAM_START', 'PARAM_END'], ['INDEX_START', 'INDEX_END'], ['STRING_START', 'STRING_END'], ['REGEX_START', 'REGEX_END']]; - - exports.INVERSES = INVERSES = {}; - - EXPRESSION_START = []; - - EXPRESSION_END = []; - - for (k = 0, len = BALANCED_PAIRS.length; k < len; k++) { - ref = BALANCED_PAIRS[k], left = ref[0], rite = ref[1]; - EXPRESSION_START.push(INVERSES[rite] = left); - EXPRESSION_END.push(INVERSES[left] = rite); - } - - EXPRESSION_CLOSE = ['CATCH', 'THEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_END); - - IMPLICIT_FUNC = ['IDENTIFIER', 'PROPERTY', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS']; - - IMPLICIT_CALL = ['IDENTIFIER', 'PROPERTY', 'NUMBER', 'INFINITY', 'NAN', 'STRING', 'STRING_START', 'REGEX', 'REGEX_START', 'JS', 'NEW', 'PARAM_START', 'CLASS', 'IF', 'TRY', 'SWITCH', 'THIS', 'UNDEFINED', 'NULL', 'BOOL', 'UNARY', 'YIELD', 'UNARY_MATH', 'SUPER', 'THROW', '@', '->', '=>', '[', '(', '{', '--', '++']; - - IMPLICIT_UNSPACED_CALL = ['+', '-']; - - IMPLICIT_END = ['POST_IF', 'FOR', 'WHILE', 'UNTIL', 'WHEN', 'BY', 'LOOP', 'TERMINATOR']; - - SINGLE_LINERS = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN']; - - SINGLE_CLOSERS = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN']; - - LINEBREAKS = ['TERMINATOR', 'INDENT', 'OUTDENT']; - - CALL_CLOSERS = ['.', '?.', '::', '?::']; - -}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/scope.js b/deploy/node_modules/coffee-script/lib/coffee-script/scope.js deleted file mode 100644 index cd24739..0000000 --- a/deploy/node_modules/coffee-script/lib/coffee-script/scope.js +++ /dev/null @@ -1,165 +0,0 @@ -// Generated by CoffeeScript 1.12.7 -(function() { - var Scope, - indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - exports.Scope = Scope = (function() { - function Scope(parent, expressions, method, referencedVars) { - var ref, ref1; - this.parent = parent; - this.expressions = expressions; - this.method = method; - this.referencedVars = referencedVars; - this.variables = [ - { - name: 'arguments', - type: 'arguments' - } - ]; - this.positions = {}; - if (!this.parent) { - this.utilities = {}; - } - this.root = (ref = (ref1 = this.parent) != null ? ref1.root : void 0) != null ? ref : this; - } - - Scope.prototype.add = function(name, type, immediate) { - if (this.shared && !immediate) { - return this.parent.add(name, type, immediate); - } - if (Object.prototype.hasOwnProperty.call(this.positions, name)) { - return this.variables[this.positions[name]].type = type; - } else { - return this.positions[name] = this.variables.push({ - name: name, - type: type - }) - 1; - } - }; - - Scope.prototype.namedMethod = function() { - var ref; - if (((ref = this.method) != null ? ref.name : void 0) || !this.parent) { - return this.method; - } - return this.parent.namedMethod(); - }; - - Scope.prototype.find = function(name, type) { - if (type == null) { - type = 'var'; - } - if (this.check(name)) { - return true; - } - this.add(name, type); - return false; - }; - - Scope.prototype.parameter = function(name) { - if (this.shared && this.parent.check(name, true)) { - return; - } - return this.add(name, 'param'); - }; - - Scope.prototype.check = function(name) { - var ref; - return !!(this.type(name) || ((ref = this.parent) != null ? ref.check(name) : void 0)); - }; - - Scope.prototype.temporary = function(name, index, single) { - var diff, endCode, letter, newCode, num, startCode; - if (single == null) { - single = false; - } - if (single) { - startCode = name.charCodeAt(0); - endCode = 'z'.charCodeAt(0); - diff = endCode - startCode; - newCode = startCode + index % (diff + 1); - letter = String.fromCharCode(newCode); - num = Math.floor(index / (diff + 1)); - return "" + letter + (num || ''); - } else { - return "" + name + (index || ''); - } - }; - - Scope.prototype.type = function(name) { - var i, len, ref, v; - ref = this.variables; - for (i = 0, len = ref.length; i < len; i++) { - v = ref[i]; - if (v.name === name) { - return v.type; - } - } - return null; - }; - - Scope.prototype.freeVariable = function(name, options) { - var index, ref, temp; - if (options == null) { - options = {}; - } - index = 0; - while (true) { - temp = this.temporary(name, index, options.single); - if (!(this.check(temp) || indexOf.call(this.root.referencedVars, temp) >= 0)) { - break; - } - index++; - } - if ((ref = options.reserve) != null ? ref : true) { - this.add(temp, 'var', true); - } - return temp; - }; - - Scope.prototype.assign = function(name, value) { - this.add(name, { - value: value, - assigned: true - }, true); - return this.hasAssignments = true; - }; - - Scope.prototype.hasDeclarations = function() { - return !!this.declaredVariables().length; - }; - - Scope.prototype.declaredVariables = function() { - var v; - return ((function() { - var i, len, ref, results; - ref = this.variables; - results = []; - for (i = 0, len = ref.length; i < len; i++) { - v = ref[i]; - if (v.type === 'var') { - results.push(v.name); - } - } - return results; - }).call(this)).sort(); - }; - - Scope.prototype.assignedVariables = function() { - var i, len, ref, results, v; - ref = this.variables; - results = []; - for (i = 0, len = ref.length; i < len; i++) { - v = ref[i]; - if (v.type.assigned) { - results.push(v.name + " = " + v.type.value); - } - } - return results; - }; - - return Scope; - - })(); - -}).call(this); diff --git a/deploy/node_modules/coffee-script/lib/coffee-script/sourcemap.js b/deploy/node_modules/coffee-script/lib/coffee-script/sourcemap.js deleted file mode 100644 index 56b86a8..0000000 --- a/deploy/node_modules/coffee-script/lib/coffee-script/sourcemap.js +++ /dev/null @@ -1,161 +0,0 @@ -// Generated by CoffeeScript 1.12.7 -(function() { - var LineMap, SourceMap; - - LineMap = (function() { - function LineMap(line1) { - this.line = line1; - this.columns = []; - } - - LineMap.prototype.add = function(column, arg, options) { - var sourceColumn, sourceLine; - sourceLine = arg[0], sourceColumn = arg[1]; - if (options == null) { - options = {}; - } - if (this.columns[column] && options.noReplace) { - return; - } - return this.columns[column] = { - line: this.line, - column: column, - sourceLine: sourceLine, - sourceColumn: sourceColumn - }; - }; - - LineMap.prototype.sourceLocation = function(column) { - var mapping; - while (!((mapping = this.columns[column]) || (column <= 0))) { - column--; - } - return mapping && [mapping.sourceLine, mapping.sourceColumn]; - }; - - return LineMap; - - })(); - - SourceMap = (function() { - var BASE64_CHARS, VLQ_CONTINUATION_BIT, VLQ_SHIFT, VLQ_VALUE_MASK; - - function SourceMap() { - this.lines = []; - } - - SourceMap.prototype.add = function(sourceLocation, generatedLocation, options) { - var base, column, line, lineMap; - if (options == null) { - options = {}; - } - line = generatedLocation[0], column = generatedLocation[1]; - lineMap = ((base = this.lines)[line] || (base[line] = new LineMap(line))); - return lineMap.add(column, sourceLocation, options); - }; - - SourceMap.prototype.sourceLocation = function(arg) { - var column, line, lineMap; - line = arg[0], column = arg[1]; - while (!((lineMap = this.lines[line]) || (line <= 0))) { - line--; - } - return lineMap && lineMap.sourceLocation(column); - }; - - SourceMap.prototype.generate = function(options, code) { - var buffer, i, j, lastColumn, lastSourceColumn, lastSourceLine, len, len1, lineMap, lineNumber, mapping, needComma, ref, ref1, v3, writingline; - if (options == null) { - options = {}; - } - if (code == null) { - code = null; - } - writingline = 0; - lastColumn = 0; - lastSourceLine = 0; - lastSourceColumn = 0; - needComma = false; - buffer = ""; - ref = this.lines; - for (lineNumber = i = 0, len = ref.length; i < len; lineNumber = ++i) { - lineMap = ref[lineNumber]; - if (lineMap) { - ref1 = lineMap.columns; - for (j = 0, len1 = ref1.length; j < len1; j++) { - mapping = ref1[j]; - if (!(mapping)) { - continue; - } - while (writingline < mapping.line) { - lastColumn = 0; - needComma = false; - buffer += ";"; - writingline++; - } - if (needComma) { - buffer += ","; - needComma = false; - } - buffer += this.encodeVlq(mapping.column - lastColumn); - lastColumn = mapping.column; - buffer += this.encodeVlq(0); - buffer += this.encodeVlq(mapping.sourceLine - lastSourceLine); - lastSourceLine = mapping.sourceLine; - buffer += this.encodeVlq(mapping.sourceColumn - lastSourceColumn); - lastSourceColumn = mapping.sourceColumn; - needComma = true; - } - } - } - v3 = { - version: 3, - file: options.generatedFile || '', - sourceRoot: options.sourceRoot || '', - sources: options.sourceFiles || [''], - names: [], - mappings: buffer - }; - if (options.inlineMap) { - v3.sourcesContent = [code]; - } - return v3; - }; - - VLQ_SHIFT = 5; - - VLQ_CONTINUATION_BIT = 1 << VLQ_SHIFT; - - VLQ_VALUE_MASK = VLQ_CONTINUATION_BIT - 1; - - SourceMap.prototype.encodeVlq = function(value) { - var answer, nextChunk, signBit, valueToEncode; - answer = ''; - signBit = value < 0 ? 1 : 0; - valueToEncode = (Math.abs(value) << 1) + signBit; - while (valueToEncode || !answer) { - nextChunk = valueToEncode & VLQ_VALUE_MASK; - valueToEncode = valueToEncode >> VLQ_SHIFT; - if (valueToEncode) { - nextChunk |= VLQ_CONTINUATION_BIT; - } - answer += this.encodeBase64(nextChunk); - } - return answer; - }; - - BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - - SourceMap.prototype.encodeBase64 = function(value) { - return BASE64_CHARS[value] || (function() { - throw new Error("Cannot Base64 encode value: " + value); - })(); - }; - - return SourceMap; - - })(); - - module.exports = SourceMap; - -}).call(this); diff --git a/deploy/node_modules/coffee-script/package.json b/deploy/node_modules/coffee-script/package.json deleted file mode 100644 index fddab8e..0000000 --- a/deploy/node_modules/coffee-script/package.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "_from": "coffee-script@~1", - "_id": "coffee-script@1.12.7", - "_inBundle": false, - "_integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", - "_location": "/coffee-script", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "coffee-script@~1", - "name": "coffee-script", - "escapedName": "coffee-script", - "rawSpec": "~1", - "saveSpec": null, - "fetchSpec": "~1" - }, - "_requiredBy": [ - "/" - ], - "_resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", - "_shasum": "c05dae0cb79591d05b3070a8433a98c9a89ccc53", - "_spec": "coffee-script@~1", - "_where": "/Users/prophesi/Projects/websocket-kinect/deploy", - "author": { - "name": "Jeremy Ashkenas" - }, - "bin": { - "coffee": "./bin/coffee", - "cake": "./bin/cake" - }, - "bugs": { - "url": "https://github.com/jashkenas/coffeescript/issues" - }, - "bundleDependencies": false, - "deprecated": false, - "description": "Unfancy JavaScript", - "devDependencies": { - "docco": "~0.7.0", - "google-closure-compiler-js": "^20170626.0.0", - "highlight.js": "~9.12.0", - "jison": ">=0.4.17", - "markdown-it": "^8.3.1", - "underscore": "~1.8.3" - }, - "directories": { - "lib": "./lib/coffee-script" - }, - "engines": { - "node": ">=0.8.0" - }, - "files": [ - "bin", - "lib", - "register.js", - "repl.js" - ], - "homepage": "http://coffeescript.org", - "keywords": [ - "javascript", - "language", - "coffeescript", - "compiler" - ], - "license": "MIT", - "main": "./lib/coffee-script/coffee-script", - "name": "coffee-script", - "repository": { - "type": "git", - "url": "git://github.com/jashkenas/coffeescript.git" - }, - "scripts": { - "test": "node ./bin/cake test", - "test-harmony": "node --harmony ./bin/cake test" - }, - "version": "1.12.7" -} diff --git a/deploy/node_modules/coffee-script/register.js b/deploy/node_modules/coffee-script/register.js deleted file mode 100644 index 97b33d7..0000000 --- a/deploy/node_modules/coffee-script/register.js +++ /dev/null @@ -1 +0,0 @@ -require('./lib/coffee-script/register'); diff --git a/deploy/node_modules/coffee-script/repl.js b/deploy/node_modules/coffee-script/repl.js deleted file mode 100644 index d2706a7..0000000 --- a/deploy/node_modules/coffee-script/repl.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/coffee-script/repl'); diff --git a/deploy/node_modules/debug/.coveralls.yml b/deploy/node_modules/debug/.coveralls.yml deleted file mode 100644 index 20a7068..0000000 --- a/deploy/node_modules/debug/.coveralls.yml +++ /dev/null @@ -1 +0,0 @@ -repo_token: SIAeZjKYlHK74rbcFvNHMUzjRiMpflxve diff --git a/deploy/node_modules/debug/.eslintrc b/deploy/node_modules/debug/.eslintrc deleted file mode 100644 index 8a37ae2..0000000 --- a/deploy/node_modules/debug/.eslintrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "env": { - "browser": true, - "node": true - }, - "rules": { - "no-console": 0, - "no-empty": [1, { "allowEmptyCatch": true }] - }, - "extends": "eslint:recommended" -} diff --git a/deploy/node_modules/debug/.npmignore b/deploy/node_modules/debug/.npmignore deleted file mode 100644 index 5f60eec..0000000 --- a/deploy/node_modules/debug/.npmignore +++ /dev/null @@ -1,9 +0,0 @@ -support -test -examples -example -*.sock -dist -yarn.lock -coverage -bower.json diff --git a/deploy/node_modules/debug/.travis.yml b/deploy/node_modules/debug/.travis.yml deleted file mode 100644 index 6c6090c..0000000 --- a/deploy/node_modules/debug/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ - -language: node_js -node_js: - - "6" - - "5" - - "4" - -install: - - make node_modules - -script: - - make lint - - make test - - make coveralls diff --git a/deploy/node_modules/debug/CHANGELOG.md b/deploy/node_modules/debug/CHANGELOG.md deleted file mode 100644 index a1a270c..0000000 --- a/deploy/node_modules/debug/CHANGELOG.md +++ /dev/null @@ -1,357 +0,0 @@ - -2.6.8 / 2017-05-18 -================== - - * Fix: Check for undefined on browser globals (#462, @marbemac) - -2.6.7 / 2017-05-16 -================== - - * Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom) - * Fix: Inline extend function in node implementation (#452, @dougwilson) - * Docs: Fix typo (#455, @msasad) - -2.6.5 / 2017-04-27 -================== - - * Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek) - * Misc: clean up browser reference checks (#447, @thebigredgeek) - * Misc: add npm-debug.log to .gitignore (@thebigredgeek) - - -2.6.4 / 2017-04-20 -================== - - * Fix: bug that would occure if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo) - * Chore: ignore bower.json in npm installations. (#437, @joaovieira) - * Misc: update "ms" to v0.7.3 (@tootallnate) - -2.6.3 / 2017-03-13 -================== - - * Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts) - * Docs: Changelog fix (@thebigredgeek) - -2.6.2 / 2017-03-10 -================== - - * Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin) - * Docs: Add backers and sponsors from Open Collective (#422, @piamancini) - * Docs: Add Slackin invite badge (@tootallnate) - -2.6.1 / 2017-02-10 -================== - - * Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error - * Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0) - * Fix: IE8 "Expected identifier" error (#414, @vgoma) - * Fix: Namespaces would not disable once enabled (#409, @musikov) - -2.6.0 / 2016-12-28 -================== - - * Fix: added better null pointer checks for browser useColors (@thebigredgeek) - * Improvement: removed explicit `window.debug` export (#404, @tootallnate) - * Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate) - -2.5.2 / 2016-12-25 -================== - - * Fix: reference error on window within webworkers (#393, @KlausTrainer) - * Docs: fixed README typo (#391, @lurch) - * Docs: added notice about v3 api discussion (@thebigredgeek) - -2.5.1 / 2016-12-20 -================== - - * Fix: babel-core compatibility - -2.5.0 / 2016-12-20 -================== - - * Fix: wrong reference in bower file (@thebigredgeek) - * Fix: webworker compatibility (@thebigredgeek) - * Fix: output formatting issue (#388, @kribblo) - * Fix: babel-loader compatibility (#383, @escwald) - * Misc: removed built asset from repo and publications (@thebigredgeek) - * Misc: moved source files to /src (#378, @yamikuronue) - * Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue) - * Test: coveralls integration (#378, @yamikuronue) - * Docs: simplified language in the opening paragraph (#373, @yamikuronue) - -2.4.5 / 2016-12-17 -================== - - * Fix: `navigator` undefined in Rhino (#376, @jochenberger) - * Fix: custom log function (#379, @hsiliev) - * Improvement: bit of cleanup + linting fixes (@thebigredgeek) - * Improvement: rm non-maintainted `dist/` dir (#375, @freewil) - * Docs: simplified language in the opening paragraph. (#373, @yamikuronue) - -2.4.4 / 2016-12-14 -================== - - * Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts) - -2.4.3 / 2016-12-14 -================== - - * Fix: navigation.userAgent error for react native (#364, @escwald) - -2.4.2 / 2016-12-14 -================== - - * Fix: browser colors (#367, @tootallnate) - * Misc: travis ci integration (@thebigredgeek) - * Misc: added linting and testing boilerplate with sanity check (@thebigredgeek) - -2.4.1 / 2016-12-13 -================== - - * Fix: typo that broke the package (#356) - -2.4.0 / 2016-12-13 -================== - - * Fix: bower.json references unbuilt src entry point (#342, @justmatt) - * Fix: revert "handle regex special characters" (@tootallnate) - * Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate) - * Feature: %O`(big O) pretty-prints objects (#322, @tootallnate) - * Improvement: allow colors in workers (#335, @botverse) - * Improvement: use same color for same namespace. (#338, @lchenay) - -2.3.3 / 2016-11-09 -================== - - * Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne) - * Fix: Returning `localStorage` saved values (#331, Levi Thomason) - * Improvement: Don't create an empty object when no `process` (Nathan Rajlich) - -2.3.2 / 2016-11-09 -================== - - * Fix: be super-safe in index.js as well (@TooTallNate) - * Fix: should check whether process exists (Tom Newby) - -2.3.1 / 2016-11-09 -================== - - * Fix: Added electron compatibility (#324, @paulcbetts) - * Improvement: Added performance optimizations (@tootallnate) - * Readme: Corrected PowerShell environment variable example (#252, @gimre) - * Misc: Removed yarn lock file from source control (#321, @fengmk2) - -2.3.0 / 2016-11-07 -================== - - * Fix: Consistent placement of ms diff at end of output (#215, @gorangajic) - * Fix: Escaping of regex special characters in namespace strings (#250, @zacronos) - * Fix: Fixed bug causing crash on react-native (#282, @vkarpov15) - * Feature: Enabled ES6+ compatible import via default export (#212 @bucaran) - * Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom) - * Package: Update "ms" to 0.7.2 (#315, @DevSide) - * Package: removed superfluous version property from bower.json (#207 @kkirsche) - * Readme: fix USE_COLORS to DEBUG_COLORS - * Readme: Doc fixes for format string sugar (#269, @mlucool) - * Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0) - * Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable) - * Readme: better docs for browser support (#224, @matthewmueller) - * Tooling: Added yarn integration for development (#317, @thebigredgeek) - * Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek) - * Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman) - * Misc: Updated contributors (@thebigredgeek) - -2.2.0 / 2015-05-09 -================== - - * package: update "ms" to v0.7.1 (#202, @dougwilson) - * README: add logging to file example (#193, @DanielOchoa) - * README: fixed a typo (#191, @amir-s) - * browser: expose `storage` (#190, @stephenmathieson) - * Makefile: add a `distclean` target (#189, @stephenmathieson) - -2.1.3 / 2015-03-13 -================== - - * Updated stdout/stderr example (#186) - * Updated example/stdout.js to match debug current behaviour - * Renamed example/stderr.js to stdout.js - * Update Readme.md (#184) - * replace high intensity foreground color for bold (#182, #183) - -2.1.2 / 2015-03-01 -================== - - * dist: recompile - * update "ms" to v0.7.0 - * package: update "browserify" to v9.0.3 - * component: fix "ms.js" repo location - * changed bower package name - * updated documentation about using debug in a browser - * fix: security error on safari (#167, #168, @yields) - -2.1.1 / 2014-12-29 -================== - - * browser: use `typeof` to check for `console` existence - * browser: check for `console.log` truthiness (fix IE 8/9) - * browser: add support for Chrome apps - * Readme: added Windows usage remarks - * Add `bower.json` to properly support bower install - -2.1.0 / 2014-10-15 -================== - - * node: implement `DEBUG_FD` env variable support - * package: update "browserify" to v6.1.0 - * package: add "license" field to package.json (#135, @panuhorsmalahti) - -2.0.0 / 2014-09-01 -================== - - * package: update "browserify" to v5.11.0 - * node: use stderr rather than stdout for logging (#29, @stephenmathieson) - -1.0.4 / 2014-07-15 -================== - - * dist: recompile - * example: remove `console.info()` log usage - * example: add "Content-Type" UTF-8 header to browser example - * browser: place %c marker after the space character - * browser: reset the "content" color via `color: inherit` - * browser: add colors support for Firefox >= v31 - * debug: prefer an instance `log()` function over the global one (#119) - * Readme: update documentation about styled console logs for FF v31 (#116, @wryk) - -1.0.3 / 2014-07-09 -================== - - * Add support for multiple wildcards in namespaces (#122, @seegno) - * browser: fix lint - -1.0.2 / 2014-06-10 -================== - - * browser: update color palette (#113, @gscottolson) - * common: make console logging function configurable (#108, @timoxley) - * node: fix %o colors on old node <= 0.8.x - * Makefile: find node path using shell/which (#109, @timoxley) - -1.0.1 / 2014-06-06 -================== - - * browser: use `removeItem()` to clear localStorage - * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777) - * package: add "contributors" section - * node: fix comment typo - * README: list authors - -1.0.0 / 2014-06-04 -================== - - * make ms diff be global, not be scope - * debug: ignore empty strings in enable() - * node: make DEBUG_COLORS able to disable coloring - * *: export the `colors` array - * npmignore: don't publish the `dist` dir - * Makefile: refactor to use browserify - * package: add "browserify" as a dev dependency - * Readme: add Web Inspector Colors section - * node: reset terminal color for the debug content - * node: map "%o" to `util.inspect()` - * browser: map "%j" to `JSON.stringify()` - * debug: add custom "formatters" - * debug: use "ms" module for humanizing the diff - * Readme: add "bash" syntax highlighting - * browser: add Firebug color support - * browser: add colors for WebKit browsers - * node: apply log to `console` - * rewrite: abstract common logic for Node & browsers - * add .jshintrc file - -0.8.1 / 2014-04-14 -================== - - * package: re-add the "component" section - -0.8.0 / 2014-03-30 -================== - - * add `enable()` method for nodejs. Closes #27 - * change from stderr to stdout - * remove unnecessary index.js file - -0.7.4 / 2013-11-13 -================== - - * remove "browserify" key from package.json (fixes something in browserify) - -0.7.3 / 2013-10-30 -================== - - * fix: catch localStorage security error when cookies are blocked (Chrome) - * add debug(err) support. Closes #46 - * add .browser prop to package.json. Closes #42 - -0.7.2 / 2013-02-06 -================== - - * fix package.json - * fix: Mobile Safari (private mode) is broken with debug - * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript - -0.7.1 / 2013-02-05 -================== - - * add repository URL to package.json - * add DEBUG_COLORED to force colored output - * add browserify support - * fix component. Closes #24 - -0.7.0 / 2012-05-04 -================== - - * Added .component to package.json - * Added debug.component.js build - -0.6.0 / 2012-03-16 -================== - - * Added support for "-" prefix in DEBUG [Vinay Pulim] - * Added `.enabled` flag to the node version [TooTallNate] - -0.5.0 / 2012-02-02 -================== - - * Added: humanize diffs. Closes #8 - * Added `debug.disable()` to the CS variant - * Removed padding. Closes #10 - * Fixed: persist client-side variant again. Closes #9 - -0.4.0 / 2012-02-01 -================== - - * Added browser variant support for older browsers [TooTallNate] - * Added `debug.enable('project:*')` to browser variant [TooTallNate] - * Added padding to diff (moved it to the right) - -0.3.0 / 2012-01-26 -================== - - * Added millisecond diff when isatty, otherwise UTC string - -0.2.0 / 2012-01-22 -================== - - * Added wildcard support - -0.1.0 / 2011-12-02 -================== - - * Added: remove colors unless stderr isatty [TooTallNate] - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/deploy/node_modules/debug/LICENSE b/deploy/node_modules/debug/LICENSE deleted file mode 100644 index 658c933..0000000 --- a/deploy/node_modules/debug/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 TJ Holowaychuk - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software -and associated documentation files (the 'Software'), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/deploy/node_modules/debug/Makefile b/deploy/node_modules/debug/Makefile deleted file mode 100644 index 584da8b..0000000 --- a/deploy/node_modules/debug/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -# get Makefile directory name: http://stackoverflow.com/a/5982798/376773 -THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) -THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) - -# BIN directory -BIN := $(THIS_DIR)/node_modules/.bin - -# Path -PATH := node_modules/.bin:$(PATH) -SHELL := /bin/bash - -# applications -NODE ?= $(shell which node) -YARN ?= $(shell which yarn) -PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm)) -BROWSERIFY ?= $(NODE) $(BIN)/browserify - -.FORCE: - -install: node_modules - -node_modules: package.json - @NODE_ENV= $(PKG) install - @touch node_modules - -lint: .FORCE - eslint browser.js debug.js index.js node.js - -test-node: .FORCE - istanbul cover node_modules/mocha/bin/_mocha -- test/**.js - -test-browser: .FORCE - mkdir -p dist - - @$(BROWSERIFY) \ - --standalone debug \ - . > dist/debug.js - - karma start --single-run - rimraf dist - -test: .FORCE - concurrently \ - "make test-node" \ - "make test-browser" - -coveralls: - cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js - -.PHONY: all install clean distclean diff --git a/deploy/node_modules/debug/README.md b/deploy/node_modules/debug/README.md deleted file mode 100644 index f67be6b..0000000 --- a/deploy/node_modules/debug/README.md +++ /dev/null @@ -1,312 +0,0 @@ -# debug -[![Build Status](https://travis-ci.org/visionmedia/debug.svg?branch=master)](https://travis-ci.org/visionmedia/debug) [![Coverage Status](https://coveralls.io/repos/github/visionmedia/debug/badge.svg?branch=master)](https://coveralls.io/github/visionmedia/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers) -[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors) - - - -A tiny node.js debugging utility modelled after node core's debugging technique. - -**Discussion around the V3 API is under way [here](https://github.com/visionmedia/debug/issues/370)** - -## Installation - -```bash -$ npm install debug -``` - -## Usage - -`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole. - -Example _app.js_: - -```js -var debug = require('debug')('http') - , http = require('http') - , name = 'My App'; - -// fake app - -debug('booting %s', name); - -http.createServer(function(req, res){ - debug(req.method + ' ' + req.url); - res.end('hello\n'); -}).listen(3000, function(){ - debug('listening'); -}); - -// fake worker of some kind - -require('./worker'); -``` - -Example _worker.js_: - -```js -var debug = require('debug')('worker'); - -setInterval(function(){ - debug('doing some work'); -}, 1000); -``` - - The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: - - ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) - - ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png) - -#### Windows note - - On Windows the environment variable is set using the `set` command. - - ```cmd - set DEBUG=*,-not_this - ``` - - Note that PowerShell uses different syntax to set environment variables. - - ```cmd - $env:DEBUG = "*,-not_this" - ``` - -Then, run the program to be debugged as usual. - -## Millisecond diff - - When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. - - ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) - - When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: - - ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png) - -## Conventions - - If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". - -## Wildcards - - The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. - - You can also exclude specific debuggers by prefixing them with a "-" character. For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:". - -## Environment Variables - - When running through Node.js, you can set a few environment variables that will - change the behavior of the debug logging: - -| Name | Purpose | -|-----------|-------------------------------------------------| -| `DEBUG` | Enables/disables specific debugging namespaces. | -| `DEBUG_COLORS`| Whether or not to use colors in the debug output. | -| `DEBUG_DEPTH` | Object inspection depth. | -| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. | - - - __Note:__ The environment variables beginning with `DEBUG_` end up being - converted into an Options object that gets used with `%o`/`%O` formatters. - See the Node.js documentation for - [`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options) - for the complete list. - -## Formatters - - - Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. Below are the officially supported formatters: - -| Formatter | Representation | -|-----------|----------------| -| `%O` | Pretty-print an Object on multiple lines. | -| `%o` | Pretty-print an Object all on a single line. | -| `%s` | String. | -| `%d` | Number (both integer and float). | -| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. | -| `%%` | Single percent sign ('%'). This does not consume an argument. | - -### Custom formatters - - You can add custom formatters by extending the `debug.formatters` object. For example, if you wanted to add support for rendering a Buffer as hex with `%h`, you could do something like: - -```js -const createDebug = require('debug') -createDebug.formatters.h = (v) => { - return v.toString('hex') -} - -// …elsewhere -const debug = createDebug('foo') -debug('this is hex: %h', new Buffer('hello world')) -// foo this is hex: 68656c6c6f20776f726c6421 +0ms -``` - -## Browser support - You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify), - or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest), - if you don't want to build it yourself. - - Debug's enable state is currently persisted by `localStorage`. - Consider the situation shown below where you have `worker:a` and `worker:b`, - and wish to debug both. You can enable this using `localStorage.debug`: - -```js -localStorage.debug = 'worker:*' -``` - -And then refresh the page. - -```js -a = debug('worker:a'); -b = debug('worker:b'); - -setInterval(function(){ - a('doing some work'); -}, 1000); - -setInterval(function(){ - b('doing some work'); -}, 1200); -``` - -#### Web Inspector Colors - - Colors are also enabled on "Web Inspectors" that understand the `%c` formatting - option. These are WebKit web inspectors, Firefox ([since version - 31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) - and the Firebug plugin for Firefox (any version). - - Colored output looks something like: - - ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png) - - -## Output streams - - By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method: - -Example _stdout.js_: - -```js -var debug = require('debug'); -var error = debug('app:error'); - -// by default stderr is used -error('goes to stderr!'); - -var log = debug('app:log'); -// set this namespace to log via console.log -log.log = console.log.bind(console); // don't forget to bind to console! -log('goes to stdout'); -error('still goes to stderr!'); - -// set all output to go via console.info -// overrides all per-namespace log settings -debug.log = console.info.bind(console); -error('now goes to stdout via console.info'); -log('still goes to stdout, but via console.info now'); -``` - - -## Authors - - - TJ Holowaychuk - - Nathan Rajlich - - Andrew Rhyne - -## Backers - -Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -## Sponsors - -Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -## License - -(The MIT License) - -Copyright (c) 2014-2016 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/deploy/node_modules/debug/component.json b/deploy/node_modules/debug/component.json deleted file mode 100644 index 94cd36d..0000000 --- a/deploy/node_modules/debug/component.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "debug", - "repo": "visionmedia/debug", - "description": "small debugging utility", - "version": "2.6.8", - "keywords": [ - "debug", - "log", - "debugger" - ], - "main": "src/browser.js", - "scripts": [ - "src/browser.js", - "src/debug.js" - ], - "dependencies": { - "rauchg/ms.js": "0.7.1" - } -} diff --git a/deploy/node_modules/debug/karma.conf.js b/deploy/node_modules/debug/karma.conf.js deleted file mode 100644 index 103a82d..0000000 --- a/deploy/node_modules/debug/karma.conf.js +++ /dev/null @@ -1,70 +0,0 @@ -// Karma configuration -// Generated on Fri Dec 16 2016 13:09:51 GMT+0000 (UTC) - -module.exports = function(config) { - config.set({ - - // base path that will be used to resolve all patterns (eg. files, exclude) - basePath: '', - - - // frameworks to use - // available frameworks: https://npmjs.org/browse/keyword/karma-adapter - frameworks: ['mocha', 'chai', 'sinon'], - - - // list of files / patterns to load in the browser - files: [ - 'dist/debug.js', - 'test/*spec.js' - ], - - - // list of files to exclude - exclude: [ - 'src/node.js' - ], - - - // preprocess matching files before serving them to the browser - // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor - preprocessors: { - }, - - // test results reporter to use - // possible values: 'dots', 'progress' - // available reporters: https://npmjs.org/browse/keyword/karma-reporter - reporters: ['progress'], - - - // web server port - port: 9876, - - - // enable / disable colors in the output (reporters and logs) - colors: true, - - - // level of logging - // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG - logLevel: config.LOG_INFO, - - - // enable / disable watching file and executing tests whenever any file changes - autoWatch: true, - - - // start these browsers - // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher - browsers: ['PhantomJS'], - - - // Continuous Integration mode - // if true, Karma captures browsers, runs the tests and exits - singleRun: false, - - // Concurrency level - // how many browser should be started simultaneous - concurrency: Infinity - }) -} diff --git a/deploy/node_modules/debug/node.js b/deploy/node_modules/debug/node.js deleted file mode 100644 index 7fc36fe..0000000 --- a/deploy/node_modules/debug/node.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./src/node'); diff --git a/deploy/node_modules/debug/package.json b/deploy/node_modules/debug/package.json deleted file mode 100644 index 07cac13..0000000 --- a/deploy/node_modules/debug/package.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "_from": "debug@^2.2.0", - "_id": "debug@2.6.8", - "_inBundle": false, - "_integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "_location": "/debug", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "debug@^2.2.0", - "name": "debug", - "escapedName": "debug", - "rawSpec": "^2.2.0", - "saveSpec": null, - "fetchSpec": "^2.2.0" - }, - "_requiredBy": [ - "/websocket" - ], - "_resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "_shasum": "e731531ca2ede27d188222427da17821d68ff4fc", - "_spec": "debug@^2.2.0", - "_where": "/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/websocket", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "browser": "./src/browser.js", - "bugs": { - "url": "https://github.com/visionmedia/debug/issues" - }, - "bundleDependencies": false, - "component": { - "scripts": { - "debug/index.js": "browser.js", - "debug/debug.js": "debug.js" - } - }, - "contributors": [ - { - "name": "Nathan Rajlich", - "email": "nathan@tootallnate.net", - "url": "http://n8.io" - }, - { - "name": "Andrew Rhyne", - "email": "rhyneandrew@gmail.com" - } - ], - "dependencies": { - "ms": "2.0.0" - }, - "deprecated": false, - "description": "small debugging utility", - "devDependencies": { - "browserify": "9.0.3", - "chai": "^3.5.0", - "concurrently": "^3.1.0", - "coveralls": "^2.11.15", - "eslint": "^3.12.1", - "istanbul": "^0.4.5", - "karma": "^1.3.0", - "karma-chai": "^0.1.0", - "karma-mocha": "^1.3.0", - "karma-phantomjs-launcher": "^1.0.2", - "karma-sinon": "^1.0.5", - "mocha": "^3.2.0", - "mocha-lcov-reporter": "^1.2.0", - "rimraf": "^2.5.4", - "sinon": "^1.17.6", - "sinon-chai": "^2.8.0" - }, - "homepage": "https://github.com/visionmedia/debug#readme", - "keywords": [ - "debug", - "log", - "debugger" - ], - "license": "MIT", - "main": "./src/index.js", - "name": "debug", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/debug.git" - }, - "version": "2.6.8" -} diff --git a/deploy/node_modules/debug/src/browser.js b/deploy/node_modules/debug/src/browser.js deleted file mode 100644 index 7106924..0000000 --- a/deploy/node_modules/debug/src/browser.js +++ /dev/null @@ -1,185 +0,0 @@ -/** - * This is the web browser implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; -exports.storage = 'undefined' != typeof chrome - && 'undefined' != typeof chrome.storage - ? chrome.storage.local - : localstorage(); - -/** - * Colors. - */ - -exports.colors = [ - 'lightseagreen', - 'forestgreen', - 'goldenrod', - 'dodgerblue', - 'darkorchid', - 'crimson' -]; - -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - -function useColors() { - // NB: In an Electron preload script, document will be defined but not fully - // initialized. Since we know we're in Chrome, we'll just detect this case - // explicitly - if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { - return true; - } - - // is webkit? http://stackoverflow.com/a/16459606/376773 - // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 - return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || - // is firebug? http://stackoverflow.com/a/398120/376773 - (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || - // is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || - // double check webkit in userAgent just in case we are in a worker - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); -} - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - -exports.formatters.j = function(v) { - try { - return JSON.stringify(v); - } catch (err) { - return '[UnexpectedJSONParseError]: ' + err.message; - } -}; - - -/** - * Colorize log arguments if enabled. - * - * @api public - */ - -function formatArgs(args) { - var useColors = this.useColors; - - args[0] = (useColors ? '%c' : '') - + this.namespace - + (useColors ? ' %c' : ' ') - + args[0] - + (useColors ? '%c ' : ' ') - + '+' + exports.humanize(this.diff); - - if (!useColors) return; - - var c = 'color: ' + this.color; - args.splice(1, 0, c, 'color: inherit') - - // the final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - var index = 0; - var lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, function(match) { - if ('%%' === match) return; - index++; - if ('%c' === match) { - // we only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - - args.splice(lastC, 0, c); -} - -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ - -function log() { - // this hackery is required for IE8/9, where - // the `console.log` function doesn't have 'apply' - return 'object' === typeof console - && console.log - && Function.prototype.apply.call(console.log, console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - try { - if (null == namespaces) { - exports.storage.removeItem('debug'); - } else { - exports.storage.debug = namespaces; - } - } catch(e) {} -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - var r; - try { - r = exports.storage.debug; - } catch(e) {} - - // If debug isn't set in LS, and we're in Electron, try to load $DEBUG - if (!r && typeof process !== 'undefined' && 'env' in process) { - r = process.env.DEBUG; - } - - return r; -} - -/** - * Enable namespaces listed in `localStorage.debug` initially. - */ - -exports.enable(load()); - -/** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ - -function localstorage() { - try { - return window.localStorage; - } catch (e) {} -} diff --git a/deploy/node_modules/debug/src/debug.js b/deploy/node_modules/debug/src/debug.js deleted file mode 100644 index 6a5e3fc..0000000 --- a/deploy/node_modules/debug/src/debug.js +++ /dev/null @@ -1,202 +0,0 @@ - -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; -exports.coerce = coerce; -exports.disable = disable; -exports.enable = enable; -exports.enabled = enabled; -exports.humanize = require('ms'); - -/** - * The currently active debug mode names, and names to skip. - */ - -exports.names = []; -exports.skips = []; - -/** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". - */ - -exports.formatters = {}; - -/** - * Previous log timestamp. - */ - -var prevTime; - -/** - * Select a color. - * @param {String} namespace - * @return {Number} - * @api private - */ - -function selectColor(namespace) { - var hash = 0, i; - - for (i in namespace) { - hash = ((hash << 5) - hash) + namespace.charCodeAt(i); - hash |= 0; // Convert to 32bit integer - } - - return exports.colors[Math.abs(hash) % exports.colors.length]; -} - -/** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - -function createDebug(namespace) { - - function debug() { - // disabled? - if (!debug.enabled) return; - - var self = debug; - - // set `diff` timestamp - var curr = +new Date(); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - - // turn the `arguments` into a proper Array - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; - } - - args[0] = exports.coerce(args[0]); - - if ('string' !== typeof args[0]) { - // anything else let's inspect with %O - args.unshift('%O'); - } - - // apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { - // if we encounter an escaped % then don't increase the array index - if (match === '%%') return match; - index++; - var formatter = exports.formatters[format]; - if ('function' === typeof formatter) { - var val = args[index]; - match = formatter.call(self, val); - - // now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); - - // apply env-specific formatting (colors, etc.) - exports.formatArgs.call(self, args); - - var logFn = debug.log || exports.log || console.log.bind(console); - logFn.apply(self, args); - } - - debug.namespace = namespace; - debug.enabled = exports.enabled(namespace); - debug.useColors = exports.useColors(); - debug.color = selectColor(namespace); - - // env-specific initialization logic for debug instances - if ('function' === typeof exports.init) { - exports.init(debug); - } - - return debug; -} - -/** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - -function enable(namespaces) { - exports.save(namespaces); - - exports.names = []; - exports.skips = []; - - var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); - var len = split.length; - - for (var i = 0; i < len; i++) { - if (!split[i]) continue; // ignore empty strings - namespaces = split[i].replace(/\*/g, '.*?'); - if (namespaces[0] === '-') { - exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - exports.names.push(new RegExp('^' + namespaces + '$')); - } - } -} - -/** - * Disable debug output. - * - * @api public - */ - -function disable() { - exports.enable(''); -} - -/** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - -function enabled(name) { - var i, len; - for (i = 0, len = exports.skips.length; i < len; i++) { - if (exports.skips[i].test(name)) { - return false; - } - } - for (i = 0, len = exports.names.length; i < len; i++) { - if (exports.names[i].test(name)) { - return true; - } - } - return false; -} - -/** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - -function coerce(val) { - if (val instanceof Error) return val.stack || val.message; - return val; -} diff --git a/deploy/node_modules/debug/src/index.js b/deploy/node_modules/debug/src/index.js deleted file mode 100644 index e12cf4d..0000000 --- a/deploy/node_modules/debug/src/index.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Detect Electron renderer process, which is node, but we should - * treat as a browser. - */ - -if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = require('./browser.js'); -} else { - module.exports = require('./node.js'); -} diff --git a/deploy/node_modules/debug/src/node.js b/deploy/node_modules/debug/src/node.js deleted file mode 100644 index af61297..0000000 --- a/deploy/node_modules/debug/src/node.js +++ /dev/null @@ -1,246 +0,0 @@ -/** - * Module dependencies. - */ - -var tty = require('tty'); -var util = require('util'); - -/** - * This is the Node.js implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.init = init; -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [6, 2, 3, 4, 5, 1]; - -/** - * Build up the default `inspectOpts` object from the environment variables. - * - * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js - */ - -exports.inspectOpts = Object.keys(process.env).filter(function (key) { - return /^debug_/i.test(key); -}).reduce(function (obj, key) { - // camel-case - var prop = key - .substring(6) - .toLowerCase() - .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); - - // coerce string value into JS value - var val = process.env[key]; - if (/^(yes|on|true|enabled)$/i.test(val)) val = true; - else if (/^(no|off|false|disabled)$/i.test(val)) val = false; - else if (val === 'null') val = null; - else val = Number(val); - - obj[prop] = val; - return obj; -}, {}); - -/** - * The file descriptor to write the `debug()` calls to. - * Set the `DEBUG_FD` env variable to override with another value. i.e.: - * - * $ DEBUG_FD=3 node script.js 3>debug.log - */ - -var fd = parseInt(process.env.DEBUG_FD, 10) || 2; - -if (1 !== fd && 2 !== fd) { - util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')() -} - -var stream = 1 === fd ? process.stdout : - 2 === fd ? process.stderr : - createWritableStdioStream(fd); - -/** - * Is stdout a TTY? Colored output is enabled when `true`. - */ - -function useColors() { - return 'colors' in exports.inspectOpts - ? Boolean(exports.inspectOpts.colors) - : tty.isatty(fd); -} - -/** - * Map %o to `util.inspect()`, all on a single line. - */ - -exports.formatters.o = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts) - .replace(/\s*\n\s*/g, ' '); -}; - -/** - * Map %o to `util.inspect()`, allowing multiple lines if needed. - */ - -exports.formatters.O = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts); -}; - -/** - * Adds ANSI color escape codes if enabled. - * - * @api public - */ - -function formatArgs(args) { - var name = this.namespace; - var useColors = this.useColors; - - if (useColors) { - var c = this.color; - var prefix = ' \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m'; - - args[0] = prefix + args[0].split('\n').join('\n' + prefix); - args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); - } else { - args[0] = new Date().toUTCString() - + ' ' + name + ' ' + args[0]; - } -} - -/** - * Invokes `util.format()` with the specified arguments and writes to `stream`. - */ - -function log() { - return stream.write(util.format.apply(util, arguments) + '\n'); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - if (null == namespaces) { - // If you set a process.env field to null or undefined, it gets cast to the - // string 'null' or 'undefined'. Just delete instead. - delete process.env.DEBUG; - } else { - process.env.DEBUG = namespaces; - } -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - return process.env.DEBUG; -} - -/** - * Copied from `node/src/node.js`. - * - * XXX: It's lame that node doesn't expose this API out-of-the-box. It also - * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame. - */ - -function createWritableStdioStream (fd) { - var stream; - var tty_wrap = process.binding('tty_wrap'); - - // Note stream._type is used for test-module-load-list.js - - switch (tty_wrap.guessHandleType(fd)) { - case 'TTY': - stream = new tty.WriteStream(fd); - stream._type = 'tty'; - - // Hack to have stream not keep the event loop alive. - // See https://github.com/joyent/node/issues/1726 - if (stream._handle && stream._handle.unref) { - stream._handle.unref(); - } - break; - - case 'FILE': - var fs = require('fs'); - stream = new fs.SyncWriteStream(fd, { autoClose: false }); - stream._type = 'fs'; - break; - - case 'PIPE': - case 'TCP': - var net = require('net'); - stream = new net.Socket({ - fd: fd, - readable: false, - writable: true - }); - - // FIXME Should probably have an option in net.Socket to create a - // stream from an existing fd which is writable only. But for now - // we'll just add this hack and set the `readable` member to false. - // Test: ./node test/fixtures/echo.js < /etc/passwd - stream.readable = false; - stream.read = null; - stream._type = 'pipe'; - - // FIXME Hack to have stream not keep the event loop alive. - // See https://github.com/joyent/node/issues/1726 - if (stream._handle && stream._handle.unref) { - stream._handle.unref(); - } - break; - - default: - // Probably an error on in uv_guess_handle() - throw new Error('Implement me. Unknown stream file type!'); - } - - // For supporting legacy API we put the FD here. - stream.fd = fd; - - stream._isStdio = true; - - return stream; -} - -/** - * Init logic for `debug` instances. - * - * Create a new `inspectOpts` object in case `useColors` is set - * differently for a particular `debug` instance. - */ - -function init (debug) { - debug.inspectOpts = {}; - - var keys = Object.keys(exports.inspectOpts); - for (var i = 0; i < keys.length; i++) { - debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; - } -} - -/** - * Enable namespaces listed in `process.env.DEBUG` initially. - */ - -exports.enable(load()); diff --git a/deploy/node_modules/inherits/LICENSE b/deploy/node_modules/inherits/LICENSE deleted file mode 100644 index dea3013..0000000 --- a/deploy/node_modules/inherits/LICENSE +++ /dev/null @@ -1,16 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - diff --git a/deploy/node_modules/inherits/README.md b/deploy/node_modules/inherits/README.md deleted file mode 100644 index b1c5665..0000000 --- a/deploy/node_modules/inherits/README.md +++ /dev/null @@ -1,42 +0,0 @@ -Browser-friendly inheritance fully compatible with standard node.js -[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). - -This package exports standard `inherits` from node.js `util` module in -node environment, but also provides alternative browser-friendly -implementation through [browser -field](https://gist.github.com/shtylman/4339901). Alternative -implementation is a literal copy of standard one located in standalone -module to avoid requiring of `util`. It also has a shim for old -browsers with no `Object.create` support. - -While keeping you sure you are using standard `inherits` -implementation in node.js environment, it allows bundlers such as -[browserify](https://github.com/substack/node-browserify) to not -include full `util` package to your client code if all you need is -just `inherits` function. It worth, because browser shim for `util` -package is large and `inherits` is often the single function you need -from it. - -It's recommended to use this package instead of -`require('util').inherits` for any code that has chances to be used -not only in node.js but in browser too. - -## usage - -```js -var inherits = require('inherits'); -// then use exactly as the standard one -``` - -## note on version ~1.0 - -Version ~1.0 had completely different motivation and is not compatible -neither with 2.0 nor with standard node.js `inherits`. - -If you are using version ~1.0 and planning to switch to ~2.0, be -careful: - -* new version uses `super_` instead of `super` for referencing - superclass -* new version overwrites current prototype while old one preserves any - existing fields on it diff --git a/deploy/node_modules/inherits/inherits.js b/deploy/node_modules/inherits/inherits.js deleted file mode 100644 index 29f5e24..0000000 --- a/deploy/node_modules/inherits/inherits.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('util').inherits diff --git a/deploy/node_modules/inherits/inherits_browser.js b/deploy/node_modules/inherits/inherits_browser.js deleted file mode 100644 index c1e78a7..0000000 --- a/deploy/node_modules/inherits/inherits_browser.js +++ /dev/null @@ -1,23 +0,0 @@ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} diff --git a/deploy/node_modules/inherits/package.json b/deploy/node_modules/inherits/package.json deleted file mode 100644 index 445bd3f..0000000 --- a/deploy/node_modules/inherits/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "_from": "inherits@2.0.1", - "_id": "inherits@2.0.1", - "_inBundle": false, - "_integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "_location": "/inherits", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "inherits@2.0.1", - "name": "inherits", - "escapedName": "inherits", - "rawSpec": "2.0.1", - "saveSpec": null, - "fetchSpec": "2.0.1" - }, - "_requiredBy": [ - "/util" - ], - "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", - "_spec": "inherits@2.0.1", - "_where": "/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/util", - "browser": "./inherits_browser.js", - "bugs": { - "url": "https://github.com/isaacs/inherits/issues" - }, - "bundleDependencies": false, - "deprecated": false, - "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", - "homepage": "https://github.com/isaacs/inherits#readme", - "keywords": [ - "inheritance", - "class", - "klass", - "oop", - "object-oriented", - "inherits", - "browser", - "browserify" - ], - "license": "ISC", - "main": "./inherits.js", - "name": "inherits", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/inherits.git" - }, - "scripts": { - "test": "node test" - }, - "version": "2.0.1" -} diff --git a/deploy/node_modules/inherits/test.js b/deploy/node_modules/inherits/test.js deleted file mode 100644 index fc53012..0000000 --- a/deploy/node_modules/inherits/test.js +++ /dev/null @@ -1,25 +0,0 @@ -var inherits = require('./inherits.js') -var assert = require('assert') - -function test(c) { - assert(c.constructor === Child) - assert(c.constructor.super_ === Parent) - assert(Object.getPrototypeOf(c) === Child.prototype) - assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) - assert(c instanceof Child) - assert(c instanceof Parent) -} - -function Child() { - Parent.call(this) - test(this) -} - -function Parent() {} - -inherits(Child, Parent) - -var c = new Child -test(c) - -console.log('ok') diff --git a/deploy/node_modules/is-typedarray/LICENSE.md b/deploy/node_modules/is-typedarray/LICENSE.md deleted file mode 100644 index ee27ba4..0000000 --- a/deploy/node_modules/is-typedarray/LICENSE.md +++ /dev/null @@ -1,18 +0,0 @@ -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/deploy/node_modules/is-typedarray/README.md b/deploy/node_modules/is-typedarray/README.md deleted file mode 100644 index 2752863..0000000 --- a/deploy/node_modules/is-typedarray/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# is-typedarray [![locked](http://badges.github.io/stability-badges/dist/locked.svg)](http://github.com/badges/stability-badges) - -Detect whether or not an object is a -[Typed Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays). - -## Usage - -[![NPM](https://nodei.co/npm/is-typedarray.png)](https://nodei.co/npm/is-typedarray/) - -### isTypedArray(array) - -Returns `true` when array is a Typed Array, and `false` when it is not. - -## License - -MIT. See [LICENSE.md](http://github.com/hughsk/is-typedarray/blob/master/LICENSE.md) for details. diff --git a/deploy/node_modules/is-typedarray/index.js b/deploy/node_modules/is-typedarray/index.js deleted file mode 100644 index 5859603..0000000 --- a/deploy/node_modules/is-typedarray/index.js +++ /dev/null @@ -1,41 +0,0 @@ -module.exports = isTypedArray -isTypedArray.strict = isStrictTypedArray -isTypedArray.loose = isLooseTypedArray - -var toString = Object.prototype.toString -var names = { - '[object Int8Array]': true - , '[object Int16Array]': true - , '[object Int32Array]': true - , '[object Uint8Array]': true - , '[object Uint8ClampedArray]': true - , '[object Uint16Array]': true - , '[object Uint32Array]': true - , '[object Float32Array]': true - , '[object Float64Array]': true -} - -function isTypedArray(arr) { - return ( - isStrictTypedArray(arr) - || isLooseTypedArray(arr) - ) -} - -function isStrictTypedArray(arr) { - return ( - arr instanceof Int8Array - || arr instanceof Int16Array - || arr instanceof Int32Array - || arr instanceof Uint8Array - || arr instanceof Uint8ClampedArray - || arr instanceof Uint16Array - || arr instanceof Uint32Array - || arr instanceof Float32Array - || arr instanceof Float64Array - ) -} - -function isLooseTypedArray(arr) { - return names[toString.call(arr)] -} diff --git a/deploy/node_modules/is-typedarray/package.json b/deploy/node_modules/is-typedarray/package.json deleted file mode 100644 index 50e6a85..0000000 --- a/deploy/node_modules/is-typedarray/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "_from": "is-typedarray@^1.0.0", - "_id": "is-typedarray@1.0.0", - "_inBundle": false, - "_integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "_location": "/is-typedarray", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "is-typedarray@^1.0.0", - "name": "is-typedarray", - "escapedName": "is-typedarray", - "rawSpec": "^1.0.0", - "saveSpec": null, - "fetchSpec": "^1.0.0" - }, - "_requiredBy": [ - "/typedarray-to-buffer" - ], - "_resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "_shasum": "e479c80858df0c1b11ddda6940f96011fcda4a9a", - "_spec": "is-typedarray@^1.0.0", - "_where": "/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/typedarray-to-buffer", - "author": { - "name": "Hugh Kennedy", - "email": "hughskennedy@gmail.com", - "url": "http://hughsk.io/" - }, - "bugs": { - "url": "https://github.com/hughsk/is-typedarray/issues" - }, - "bundleDependencies": false, - "dependencies": {}, - "deprecated": false, - "description": "Detect whether or not an object is a Typed Array", - "devDependencies": { - "tape": "^2.13.1" - }, - "homepage": "https://github.com/hughsk/is-typedarray", - "keywords": [ - "typed", - "array", - "detect", - "is", - "util" - ], - "license": "MIT", - "main": "index.js", - "name": "is-typedarray", - "repository": { - "type": "git", - "url": "git://github.com/hughsk/is-typedarray.git" - }, - "scripts": { - "test": "node test" - }, - "version": "1.0.0" -} diff --git a/deploy/node_modules/is-typedarray/test.js b/deploy/node_modules/is-typedarray/test.js deleted file mode 100644 index b0c176f..0000000 --- a/deploy/node_modules/is-typedarray/test.js +++ /dev/null @@ -1,34 +0,0 @@ -var test = require('tape') -var ista = require('./') - -test('strict', function(t) { - t.ok(ista.strict(new Int8Array), 'Int8Array') - t.ok(ista.strict(new Int16Array), 'Int16Array') - t.ok(ista.strict(new Int32Array), 'Int32Array') - t.ok(ista.strict(new Uint8Array), 'Uint8Array') - t.ok(ista.strict(new Uint16Array), 'Uint16Array') - t.ok(ista.strict(new Uint32Array), 'Uint32Array') - t.ok(ista.strict(new Float32Array), 'Float32Array') - t.ok(ista.strict(new Float64Array), 'Float64Array') - - t.ok(!ista.strict(new Array), 'Array') - t.ok(!ista.strict([]), '[]') - - t.end() -}) - -test('loose', function(t) { - t.ok(ista.loose(new Int8Array), 'Int8Array') - t.ok(ista.loose(new Int16Array), 'Int16Array') - t.ok(ista.loose(new Int32Array), 'Int32Array') - t.ok(ista.loose(new Uint8Array), 'Uint8Array') - t.ok(ista.loose(new Uint16Array), 'Uint16Array') - t.ok(ista.loose(new Uint32Array), 'Uint32Array') - t.ok(ista.loose(new Float32Array), 'Float32Array') - t.ok(ista.loose(new Float64Array), 'Float64Array') - - t.ok(!ista.loose(new Array), 'Array') - t.ok(!ista.loose([]), '[]') - - t.end() -}) diff --git a/deploy/node_modules/ms/index.js b/deploy/node_modules/ms/index.js deleted file mode 100644 index 6a522b1..0000000 --- a/deploy/node_modules/ms/index.js +++ /dev/null @@ -1,152 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} [options] - * @throws {Error} throw an error if val is not a non-empty string or a number - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options) { - options = options || {}; - var type = typeof val; - if (type === 'string' && val.length > 0) { - return parse(val); - } else if (type === 'number' && isNaN(val) === false) { - return options.long ? fmtLong(val) : fmtShort(val); - } - throw new Error( - 'val is not a non-empty string or a valid number. val=' + - JSON.stringify(val) - ); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - default: - return undefined; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtShort(ms) { - if (ms >= d) { - return Math.round(ms / d) + 'd'; - } - if (ms >= h) { - return Math.round(ms / h) + 'h'; - } - if (ms >= m) { - return Math.round(ms / m) + 'm'; - } - if (ms >= s) { - return Math.round(ms / s) + 's'; - } - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtLong(ms) { - return plural(ms, d, 'day') || - plural(ms, h, 'hour') || - plural(ms, m, 'minute') || - plural(ms, s, 'second') || - ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) { - return; - } - if (ms < n * 1.5) { - return Math.floor(ms / n) + ' ' + name; - } - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/deploy/node_modules/ms/license.md b/deploy/node_modules/ms/license.md deleted file mode 100644 index 69b6125..0000000 --- a/deploy/node_modules/ms/license.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Zeit, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/deploy/node_modules/ms/package.json b/deploy/node_modules/ms/package.json deleted file mode 100644 index 1885b66..0000000 --- a/deploy/node_modules/ms/package.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "_from": "ms@2.0.0", - "_id": "ms@2.0.0", - "_inBundle": false, - "_integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "_location": "/ms", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "ms@2.0.0", - "name": "ms", - "escapedName": "ms", - "rawSpec": "2.0.0", - "saveSpec": null, - "fetchSpec": "2.0.0" - }, - "_requiredBy": [ - "/debug" - ], - "_resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "_shasum": "5608aeadfc00be6c2901df5f9861788de0d597c8", - "_spec": "ms@2.0.0", - "_where": "/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/debug", - "bugs": { - "url": "https://github.com/zeit/ms/issues" - }, - "bundleDependencies": false, - "deprecated": false, - "description": "Tiny milisecond conversion utility", - "devDependencies": { - "eslint": "3.19.0", - "expect.js": "0.3.1", - "husky": "0.13.3", - "lint-staged": "3.4.1", - "mocha": "3.4.1" - }, - "eslintConfig": { - "extends": "eslint:recommended", - "env": { - "node": true, - "es6": true - } - }, - "files": [ - "index.js" - ], - "homepage": "https://github.com/zeit/ms#readme", - "license": "MIT", - "lint-staged": { - "*.js": [ - "npm run lint", - "prettier --single-quote --write", - "git add" - ] - }, - "main": "./index", - "name": "ms", - "repository": { - "type": "git", - "url": "git+https://github.com/zeit/ms.git" - }, - "scripts": { - "lint": "eslint lib/* bin/*", - "precommit": "lint-staged", - "test": "mocha tests.js" - }, - "version": "2.0.0" -} diff --git a/deploy/node_modules/ms/readme.md b/deploy/node_modules/ms/readme.md deleted file mode 100644 index 84a9974..0000000 --- a/deploy/node_modules/ms/readme.md +++ /dev/null @@ -1,51 +0,0 @@ -# ms - -[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms) -[![Slack Channel](http://zeit-slackin.now.sh/badge.svg)](https://zeit.chat/) - -Use this package to easily convert various time formats to milliseconds. - -## Examples - -```js -ms('2 days') // 172800000 -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2.5 hrs') // 9000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('1y') // 31557600000 -ms('100') // 100 -``` - -### Convert from milliseconds - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -### Time format written-out - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours'), { long: true }) // "10 hours" -``` - -## Features - -- Works both in [node](https://nodejs.org) and in the browser. -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of equivalent ms is returned. - -## Caught a bug? - -1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device -2. Link the package to the global module directory: `npm link` -3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, node will now use your clone of ms! - -As always, you can run the tests using: `npm test` diff --git a/deploy/node_modules/nan/CHANGELOG.md b/deploy/node_modules/nan/CHANGELOG.md deleted file mode 100644 index ea3b70f..0000000 --- a/deploy/node_modules/nan/CHANGELOG.md +++ /dev/null @@ -1,458 +0,0 @@ -# NAN ChangeLog - -**Version 2.7.0: current Node 8.4.0, Node 12: 0.12.18, Node 10: 0.10.48, iojs: 3.3.1** - -### 2.7.0 Aug 30 2017 - - - Feature: Add Nan::To() overload. b93280670c9f6da42ed4cf6cbf085ffdd87bd65b - - Bugfix: Fix ternary in Nan::MaybeLocal::FromMaybe(). 79a26f7d362e756a9524e672a82c3d603b542867 - -### 2.6.2 Apr 12 2017 - - - Bugfix: Fix v8::JSON::Parse() deprecation warning. 87f6a3c65815fa062296a994cc863e2fa124867d - -### 2.6.1 Apr 6 2017 - - - Bugfix: nan_json.h: fix build breakage in Node 6 ac8d47dc3c10bfbf3f15a6b951633120c0ee6d51 - -### 2.6.0 Apr 6 2017 - - - Feature: nan: add support for JSON::Parse & Stringify b533226c629cce70e1932a873bb6f849044a56c5 - -### 2.5.1 Jan 23 2017 - - - Bugfix: Fix disappearing handle for private value 6a80995694f162ef63dbc9948fbefd45d4485aa0 - - Bugfix: Add missing scopes a93b8bae6bc7d32a170db6e89228b7f60ee57112 - - Bugfix: Use string::data instead of string::front in NewOneByteString d5f920371e67e1f3b268295daee6e83af86b6e50 - -### 2.5.0 Dec 21 2016 - - - Feature: Support Private accessors a86255cb357e8ad8ccbf1f6a4a901c921e39a178 - - Bugfix: Abort in delete operators that shouldn't be called 0fe38215ff8581703967dfd26c12793feb960018 - -### 2.4.0 Jul 10 2016 - - - Feature: Rewrite Callback to add Callback::Reset c4cf44d61f8275cd5f7b0c911d7a806d4004f649 - - Feature: AsyncProgressWorker: add template types for .send 1242c9a11a7ed481c8f08ec06316385cacc513d0 - - Bugfix: Add constness to old Persistent comparison operators bd43cb9982c7639605d60fd073efe8cae165d9b2 - -### 2.3.5 May 31 2016 - - - Bugfix: Replace NAN_INLINE with 'inline' keyword. 71819d8725f822990f439479c9aba3b240804909 - -### 2.3.4 May 31 2016 - - - Bugfix: Remove V8 deprecation warnings 0592fb0a47f3a1c7763087ebea8e1138829f24f9 - - Bugfix: Fix new versions not to use WeakCallbackInfo::IsFirstPass 615c19d9e03d4be2049c10db0151edbc3b229246 - - Bugfix: Make ObjectWrap::handle() const d19af99595587fe7a26bd850af6595c2a7145afc - - Bugfix: Fix compilation errors related to 0592fb0a47f3a1c7763087ebea8e1138829f24f9 e9191c525b94f652718325e28610a1adcf90fed8 - -### 2.3.3 May 4 2016 - - - Bugfix: Refactor SetMethod() to deal with v8::Templates (#566) b9083cf6d5de6ebe6bcb49c7502fbb7c0d9ddda8 - -### 2.3.2 Apr 27 2016 - - - Bugfix: Fix compilation on outdated versions due to Handle removal f8b7c875d04d425a41dfd4f3f8345bc3a11e6c52 - -### 2.3.1 Apr 27 2016 - - - Bugfix: Don't use deprecated v8::Template::Set() in SetMethod a90951e9ea70fa1b3836af4b925322919159100e - -### 2.3.0 Apr 27 2016 - - - Feature: added Signal() for invoking async callbacks without sending data from AsyncProgressWorker d8adba45f20e077d00561b20199133620c990b38 - - Bugfix: Don't use deprecated v8::Template::Set() 00dacf0a4b86027415867fa7f1059acc499dcece - -### 2.2.1 Mar 29 2016 - - - Bugfix: Use NewFromUnsigned in ReturnValue::Set(uint32_t i) for pre_12 3a18f9bdce29826e0e4c217854bc476918241a58 - - Performance: Remove unneeeded nullptr checks b715ef44887931c94f0d1605b3b1a4156eebece9 - -### 2.2.0 Jan 9 2016 - - - Feature: Add Function::Call wrapper 4c157474dacf284d125c324177b45aa5dabc08c6 - - Feature: Rename GC*logueCallback to GCCallback for > 4.0 3603435109f981606d300eb88004ca101283acec - - Bugfix: Fix Global::Pass for old versions 367e82a60fbaa52716232cc89db1cc3f685d77d9 - - Bugfix: Remove weird MaybeLocal wrapping of what already is a MaybeLocal 23b4590db10c2ba66aee2338aebe9751c4cb190b - -### 2.1.0 Oct 8 2015 - - - Deprecation: Deprecate NanErrnoException in favor of ErrnoException 0af1ca4cf8b3f0f65ed31bc63a663ab3319da55c - - Feature: added helper class for accessing contents of typedarrays 17b51294c801e534479d5463697a73462d0ca555 - - Feature: [Maybe types] Add MakeMaybe(...) 48d7b53d9702b0c7a060e69ea10fea8fb48d814d - - Feature: new: allow utf16 string with length 66ac6e65c8ab9394ef588adfc59131b3b9d8347b - - Feature: Introduce SetCallHandler and SetCallAsFunctionHandler 7764a9a115d60ba10dc24d86feb0fbc9b4f75537 - - Bugfix: Enable creating Locals from Globals under Node 0.10. 9bf9b8b190821af889790fdc18ace57257e4f9ff - - Bugfix: Fix issue #462 where PropertyCallbackInfo data is not stored safely. 55f50adedd543098526c7b9f4fffd607d3f9861f - -### 2.0.9 Sep 8 2015 - - - Bugfix: EscapableHandleScope in Nan::NewBuffer for Node 0.8 and 0.10 b1654d7 - -### 2.0.8 Aug 28 2015 - - - Work around duplicate linking bug in clang 11902da - -### 2.0.7 Aug 26 2015 - - - Build: Repackage - -### 2.0.6 Aug 26 2015 - - - Bugfix: Properly handle null callback in FunctionTemplate factory 6e99cb1 - - Bugfix: Remove unused static std::map instances 525bddc - - Bugfix: Make better use of maybe versions of APIs bfba85b - - Bugfix: Fix shadowing issues with handle in ObjectWrap 0a9072d - -### 2.0.5 Aug 10 2015 - - - Bugfix: Reimplement weak callback in ObjectWrap 98d38c1 - - Bugfix: Make sure callback classes are not assignable, copyable or movable 81f9b1d - -### 2.0.4 Aug 6 2015 - - - Build: Repackage - -### 2.0.3 Aug 6 2015 - - - Bugfix: Don't use clang++ / g++ syntax extension. 231450e - -### 2.0.2 Aug 6 2015 - - - Build: Repackage - -### 2.0.1 Aug 6 2015 - - - Bugfix: Add workaround for missing REPLACE_INVALID_UTF8 60d6687 - - Bugfix: Reimplement ObjectWrap from scratch to prevent memory leaks 6484601 - - Bugfix: Fix Persistent leak in FunctionCallbackInfo and PropertyCallbackInfo 641ef5f - - Bugfix: Add missing overload for Nan::NewInstance that takes argc/argv 29450ed - -### 2.0.0 Jul 31 2015 - - - Change: Renamed identifiers with leading underscores b5932b4 - - Change: Replaced NanObjectWrapHandle with class NanObjectWrap 464f1e1 - - Change: Replace NanScope and NanEscpableScope macros with classes 47751c4 - - Change: Rename NanNewBufferHandle to NanNewBuffer 6745f99 - - Change: Rename NanBufferUse to NanNewBuffer 3e8b0a5 - - Change: Rename NanNewBuffer to NanCopyBuffer d6af78d - - Change: Remove Nan prefix from all names 72d1f67 - - Change: Update Buffer API for new upstream changes d5d3291 - - Change: Rename Scope and EscapableScope to HandleScope and EscapableHandleScope 21a7a6a - - Change: Get rid of Handles e6c0daf - - Feature: Support io.js 3 with V8 4.4 - - Feature: Introduce NanPersistent 7fed696 - - Feature: Introduce NanGlobal 4408da1 - - Feature: Added NanTryCatch 10f1ca4 - - Feature: Update for V8 v4.3 4b6404a - - Feature: Introduce NanNewOneByteString c543d32 - - Feature: Introduce namespace Nan 67ed1b1 - - Removal: Remove NanLocker and NanUnlocker dd6e401 - - Removal: Remove string converters, except NanUtf8String, which now follows the node implementation b5d00a9 - - Removal: Remove NanReturn* macros d90a25c - - Removal: Remove HasInstance e8f84fe - - -### 1.9.0 Jul 31 2015 - - - Feature: Added `NanFatalException` 81d4a2c - - Feature: Added more error types 4265f06 - - Feature: Added dereference and function call operators to NanCallback c4b2ed0 - - Feature: Added indexed GetFromPersistent and SaveToPersistent edd510c - - Feature: Added more overloads of SaveToPersistent and GetFromPersistent 8b1cef6 - - Feature: Added NanErrnoException dd87d9e - - Correctness: Prevent assign, copy, and move for classes that do not support it 1f55c59, 4b808cb, c96d9b2, fba4a29, 3357130 - - Deprecation: Deprecate `NanGetPointerSafe` and `NanSetPointerSafe` 81d4a2c - - Deprecation: Deprecate `NanBooleanOptionValue` and `NanUInt32OptionValue` 0ad254b - -### 1.8.4 Apr 26 2015 - - - Build: Repackage - -### 1.8.3 Apr 26 2015 - - - Bugfix: Include missing header 1af8648 - -### 1.8.2 Apr 23 2015 - - - Build: Repackage - -### 1.8.1 Apr 23 2015 - - - Bugfix: NanObjectWrapHandle should take a pointer 155f1d3 - -### 1.8.0 Apr 23 2015 - - - Feature: Allow primitives with NanReturnValue 2e4475e - - Feature: Added comparison operators to NanCallback 55b075e - - Feature: Backport thread local storage 15bb7fa - - Removal: Remove support for signatures with arguments 8a2069d - - Correcteness: Replaced NanObjectWrapHandle macro with function 0bc6d59 - -### 1.7.0 Feb 28 2015 - - - Feature: Made NanCallback::Call accept optional target 8d54da7 - - Feature: Support atom-shell 0.21 0b7f1bb - -### 1.6.2 Feb 6 2015 - - - Bugfix: NanEncode: fix argument type for node::Encode on io.js 2be8639 - -### 1.6.1 Jan 23 2015 - - - Build: version bump - -### 1.5.3 Jan 23 2015 - - - Build: repackage - -### 1.6.0 Jan 23 2015 - - - Deprecated `NanNewContextHandle` in favor of `NanNew` 49259af - - Support utility functions moved in newer v8 versions (Node 0.11.15, io.js 1.0) a0aa179 - - Added `NanEncode`, `NanDecodeBytes` and `NanDecodeWrite` 75e6fb9 - -### 1.5.2 Jan 23 2015 - - - Bugfix: Fix non-inline definition build error with clang++ 21d96a1, 60fadd4 - - Bugfix: Readded missing String constructors 18d828f - - Bugfix: Add overload handling NanNew(..) 5ef813b - - Bugfix: Fix uv_work_cb versioning 997e4ae - - Bugfix: Add function factory and test 4eca89c - - Bugfix: Add object template factory and test cdcb951 - - Correctness: Lifted an io.js related typedef c9490be - - Correctness: Make explicit downcasts of String lengths 00074e6 - - Windows: Limit the scope of disabled warning C4530 83d7deb - -### 1.5.1 Jan 15 2015 - - - Build: version bump - -### 1.4.3 Jan 15 2015 - - - Build: version bump - -### 1.4.2 Jan 15 2015 - - - Feature: Support io.js 0dbc5e8 - -### 1.5.0 Jan 14 2015 - - - Feature: Support io.js b003843 - - Correctness: Improved NanNew internals 9cd4f6a - - Feature: Implement progress to NanAsyncWorker 8d6a160 - -### 1.4.1 Nov 8 2014 - - - Bugfix: Handle DEBUG definition correctly - - Bugfix: Accept int as Boolean - -### 1.4.0 Nov 1 2014 - - - Feature: Added NAN_GC_CALLBACK 6a5c245 - - Performance: Removed unnecessary local handle creation 18a7243, 41fe2f8 - - Correctness: Added constness to references in NanHasInstance 02c61cd - - Warnings: Fixed spurious warnings from -Wundef and -Wshadow, 541b122, 99d8cb6 - - Windoze: Shut Visual Studio up when compiling 8d558c1 - - License: Switch to plain MIT from custom hacked MIT license 11de983 - - Build: Added test target to Makefile e232e46 - - Performance: Removed superfluous scope in NanAsyncWorker f4b7821 - - Sugar/Feature: Added NanReturnThis() and NanReturnHolder() shorthands 237a5ff, d697208 - - Feature: Added suitable overload of NanNew for v8::Integer::NewFromUnsigned b27b450 - -### 1.3.0 Aug 2 2014 - - - Added NanNew(std::string) - - Added NanNew(std::string&) - - Added NanAsciiString helper class - - Added NanUtf8String helper class - - Added NanUcs2String helper class - - Deprecated NanRawString() - - Deprecated NanCString() - - Added NanGetIsolateData(v8::Isolate *isolate) - - Added NanMakeCallback(v8::Handle target, v8::Handle func, int argc, v8::Handle* argv) - - Added NanMakeCallback(v8::Handle target, v8::Handle symbol, int argc, v8::Handle* argv) - - Added NanMakeCallback(v8::Handle target, const char* method, int argc, v8::Handle* argv) - - Added NanSetTemplate(v8::Handle templ, v8::Handle name , v8::Handle value, v8::PropertyAttribute attributes) - - Added NanSetPrototypeTemplate(v8::Local templ, v8::Handle name, v8::Handle value, v8::PropertyAttribute attributes) - - Added NanSetInstanceTemplate(v8::Local templ, const char *name, v8::Handle value) - - Added NanSetInstanceTemplate(v8::Local templ, v8::Handle name, v8::Handle value, v8::PropertyAttribute attributes) - -### 1.2.0 Jun 5 2014 - - - Add NanSetPrototypeTemplate - - Changed NAN_WEAK_CALLBACK internals, switched _NanWeakCallbackData to class, - introduced _NanWeakCallbackDispatcher - - Removed -Wno-unused-local-typedefs from test builds - - Made test builds Windows compatible ('Sleep()') - -### 1.1.2 May 28 2014 - - - Release to fix more stuff-ups in 1.1.1 - -### 1.1.1 May 28 2014 - - - Release to fix version mismatch in nan.h and lack of changelog entry for 1.1.0 - -### 1.1.0 May 25 2014 - - - Remove nan_isolate, use v8::Isolate::GetCurrent() internally instead - - Additional explicit overloads for NanNew(): (char*,int), (uint8_t*[,int]), - (uint16_t*[,int), double, int, unsigned int, bool, v8::String::ExternalStringResource*, - v8::String::ExternalAsciiStringResource* - - Deprecate NanSymbol() - - Added SetErrorMessage() and ErrorMessage() to NanAsyncWorker - -### 1.0.0 May 4 2014 - - - Heavy API changes for V8 3.25 / Node 0.11.13 - - Use cpplint.py - - Removed NanInitPersistent - - Removed NanPersistentToLocal - - Removed NanFromV8String - - Removed NanMakeWeak - - Removed NanNewLocal - - Removed NAN_WEAK_CALLBACK_OBJECT - - Removed NAN_WEAK_CALLBACK_DATA - - Introduce NanNew, replaces NanNewLocal, NanPersistentToLocal, adds many overloaded typed versions - - Introduce NanUndefined, NanNull, NanTrue and NanFalse - - Introduce NanEscapableScope and NanEscapeScope - - Introduce NanMakeWeakPersistent (requires a special callback to work on both old and new node) - - Introduce NanMakeCallback for node::MakeCallback - - Introduce NanSetTemplate - - Introduce NanGetCurrentContext - - Introduce NanCompileScript and NanRunScript - - Introduce NanAdjustExternalMemory - - Introduce NanAddGCEpilogueCallback, NanAddGCPrologueCallback, NanRemoveGCEpilogueCallback, NanRemoveGCPrologueCallback - - Introduce NanGetHeapStatistics - - Rename NanAsyncWorker#SavePersistent() to SaveToPersistent() - -### 0.8.0 Jan 9 2014 - - - NanDispose -> NanDisposePersistent, deprecate NanDispose - - Extract _NAN_*_RETURN_TYPE, pull up NAN_*() - -### 0.7.1 Jan 9 2014 - - - Fixes to work against debug builds of Node - - Safer NanPersistentToLocal (avoid reinterpret_cast) - - Speed up common NanRawString case by only extracting flattened string when necessary - -### 0.7.0 Dec 17 2013 - - - New no-arg form of NanCallback() constructor. - - NanCallback#Call takes Handle rather than Local - - Removed deprecated NanCallback#Run method, use NanCallback#Call instead - - Split off _NAN_*_ARGS_TYPE from _NAN_*_ARGS - - Restore (unofficial) Node 0.6 compatibility at NanCallback#Call() - - Introduce NanRawString() for char* (or appropriate void*) from v8::String - (replacement for NanFromV8String) - - Introduce NanCString() for null-terminated char* from v8::String - -### 0.6.0 Nov 21 2013 - - - Introduce NanNewLocal(v8::Handle value) for use in place of - v8::Local::New(...) since v8 started requiring isolate in Node 0.11.9 - -### 0.5.2 Nov 16 2013 - - - Convert SavePersistent and GetFromPersistent in NanAsyncWorker from protected and public - -### 0.5.1 Nov 12 2013 - - - Use node::MakeCallback() instead of direct v8::Function::Call() - -### 0.5.0 Nov 11 2013 - - - Added @TooTallNate as collaborator - - New, much simpler, "include_dirs" for binding.gyp - - Added full range of NAN_INDEX_* macros to match NAN_PROPERTY_* macros - -### 0.4.4 Nov 2 2013 - - - Isolate argument from v8::Persistent::MakeWeak removed for 0.11.8+ - -### 0.4.3 Nov 2 2013 - - - Include node_object_wrap.h, removed from node.h for Node 0.11.8. - -### 0.4.2 Nov 2 2013 - - - Handle deprecation of v8::Persistent::Dispose(v8::Isolate* isolate)) for - Node 0.11.8 release. - -### 0.4.1 Sep 16 2013 - - - Added explicit `#include ` as it was removed from node.h for v0.11.8 - -### 0.4.0 Sep 2 2013 - - - Added NAN_INLINE and NAN_DEPRECATED and made use of them - - Added NanError, NanTypeError and NanRangeError - - Cleaned up code - -### 0.3.2 Aug 30 2013 - - - Fix missing scope declaration in GetFromPersistent() and SaveToPersistent - in NanAsyncWorker - -### 0.3.1 Aug 20 2013 - - - fix "not all control paths return a value" compile warning on some platforms - -### 0.3.0 Aug 19 2013 - - - Made NAN work with NPM - - Lots of fixes to NanFromV8String, pulling in features from new Node core - - Changed node::encoding to Nan::Encoding in NanFromV8String to unify the API - - Added optional error number argument for NanThrowError() - - Added NanInitPersistent() - - Added NanReturnNull() and NanReturnEmptyString() - - Added NanLocker and NanUnlocker - - Added missing scopes - - Made sure to clear disposed Persistent handles - - Changed NanAsyncWorker to allocate error messages on the heap - - Changed NanThrowError(Local) to NanThrowError(Handle) - - Fixed leak in NanAsyncWorker when errmsg is used - -### 0.2.2 Aug 5 2013 - - - Fixed usage of undefined variable with node::BASE64 in NanFromV8String() - -### 0.2.1 Aug 5 2013 - - - Fixed 0.8 breakage, node::BUFFER encoding type not available in 0.8 for - NanFromV8String() - -### 0.2.0 Aug 5 2013 - - - Added NAN_PROPERTY_GETTER, NAN_PROPERTY_SETTER, NAN_PROPERTY_ENUMERATOR, - NAN_PROPERTY_DELETER, NAN_PROPERTY_QUERY - - Extracted _NAN_METHOD_ARGS, _NAN_GETTER_ARGS, _NAN_SETTER_ARGS, - _NAN_PROPERTY_GETTER_ARGS, _NAN_PROPERTY_SETTER_ARGS, - _NAN_PROPERTY_ENUMERATOR_ARGS, _NAN_PROPERTY_DELETER_ARGS, - _NAN_PROPERTY_QUERY_ARGS - - Added NanGetInternalFieldPointer, NanSetInternalFieldPointer - - Added NAN_WEAK_CALLBACK, NAN_WEAK_CALLBACK_OBJECT, - NAN_WEAK_CALLBACK_DATA, NanMakeWeak - - Renamed THROW_ERROR to _NAN_THROW_ERROR - - Added NanNewBufferHandle(char*, size_t, node::smalloc::FreeCallback, void*) - - Added NanBufferUse(char*, uint32_t) - - Added NanNewContextHandle(v8::ExtensionConfiguration*, - v8::Handle, v8::Handle) - - Fixed broken NanCallback#GetFunction() - - Added optional encoding and size arguments to NanFromV8String() - - Added NanGetPointerSafe() and NanSetPointerSafe() - - Added initial test suite (to be expanded) - - Allow NanUInt32OptionValue to convert any Number object - -### 0.1.0 Jul 21 2013 - - - Added `NAN_GETTER`, `NAN_SETTER` - - Added `NanThrowError` with single Local argument - - Added `NanNewBufferHandle` with single uint32_t argument - - Added `NanHasInstance(Persistent&, Handle)` - - Added `Local NanCallback#GetFunction()` - - Added `NanCallback#Call(int, Local[])` - - Deprecated `NanCallback#Run(int, Local[])` in favour of Call diff --git a/deploy/node_modules/nan/LICENSE.md b/deploy/node_modules/nan/LICENSE.md deleted file mode 100644 index d4d2da7..0000000 --- a/deploy/node_modules/nan/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -The MIT License (MIT) -===================== - -Copyright (c) 2017 NAN contributors ------------------------------------ - -*NAN contributors listed at * - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/deploy/node_modules/nan/README.md b/deploy/node_modules/nan/README.md deleted file mode 100644 index 2a9bea4..0000000 --- a/deploy/node_modules/nan/README.md +++ /dev/null @@ -1,424 +0,0 @@ -Native Abstractions for Node.js -=============================== - -**A header file filled with macro and utility goodness for making add-on development for Node.js easier across versions 0.8, 0.10, 0.12, 1, 2, 3, 4, 5, 6, 7 and 8.** - -***Current version: 2.7.0*** - -*(See [CHANGELOG.md](https://github.com/nodejs/nan/blob/master/CHANGELOG.md) for complete ChangeLog)* - -[![NPM](https://nodei.co/npm/nan.png?downloads=true&downloadRank=true)](https://nodei.co/npm/nan/) [![NPM](https://nodei.co/npm-dl/nan.png?months=6&height=3)](https://nodei.co/npm/nan/) - -[![Build Status](https://api.travis-ci.org/nodejs/nan.svg?branch=master)](http://travis-ci.org/nodejs/nan) -[![Build status](https://ci.appveyor.com/api/projects/status/kh73pbm9dsju7fgh)](https://ci.appveyor.com/project/RodVagg/nan) - -Thanks to the crazy changes in V8 (and some in Node core), keeping native addons compiling happily across versions, particularly 0.10 to 0.12 to 4.0, is a minor nightmare. The goal of this project is to store all logic necessary to develop native Node.js addons without having to inspect `NODE_MODULE_VERSION` and get yourself into a macro-tangle. - -This project also contains some helper utilities that make addon development a bit more pleasant. - - * **[News & Updates](#news)** - * **[Usage](#usage)** - * **[Example](#example)** - * **[API](#api)** - * **[Tests](#tests)** - * **[Governance & Contributing](#governance)** - - - -## News & Updates - - - -## Usage - -Simply add **NAN** as a dependency in the *package.json* of your Node addon: - -``` bash -$ npm install --save nan -``` - -Pull in the path to **NAN** in your *binding.gyp* so that you can use `#include ` in your *.cpp* files: - -``` python -"include_dirs" : [ - "` when compiling your addon. - - - -## Example - -Just getting started with Nan? Take a look at the **[Node Add-on Examples](https://github.com/nodejs/node-addon-examples)**. - -Refer to a [quick-start **Nan** Boilerplate](https://github.com/fcanas/node-native-boilerplate) for a ready-to-go project that utilizes basic Nan functionality. - -For a simpler example, see the **[async pi estimation example](https://github.com/nodejs/nan/tree/master/examples/async_pi_estimate)** in the examples directory for full code and an explanation of what this Monte Carlo Pi estimation example does. Below are just some parts of the full example that illustrate the use of **NAN**. - -Yet another example is **[nan-example-eol](https://github.com/CodeCharmLtd/nan-example-eol)**. It shows newline detection implemented as a native addon. - -Also take a look at our comprehensive **[C++ test suite](https://github.com/nodejs/nan/tree/master/test/cpp)** which has a plethora of code snippets for your pasting pleasure. - - - -## API - -Additional to the NAN documentation below, please consult: - -* [The V8 Getting Started * Guide](https://github.com/v8/v8/wiki/Getting%20Started%20with%20Embedding) -* [The V8 Embedders * Guide](https://github.com/v8/v8/wiki/Embedder%27s%20Guide) -* [V8 API Documentation](http://v8docs.nodesource.com/) -* [Node Add-on Documentation](https://nodejs.org/api/addons.html) - - - -### JavaScript-accessible methods - -A _template_ is a blueprint for JavaScript functions and objects in a context. You can use a template to wrap C++ functions and data structures within JavaScript objects so that they can be manipulated from JavaScript. See the V8 Embedders Guide section on [Templates](https://developers.google.com/v8/embed#templates) for further information. - -In order to expose functionality to JavaScript via a template, you must provide it to V8 in a form that it understands. Across the versions of V8 supported by NAN, JavaScript-accessible method signatures vary widely, NAN fully abstracts method declaration and provides you with an interface that is similar to the most recent V8 API but is backward-compatible with older versions that still use the now-deceased `v8::Argument` type. - -* **Method argument types** - - Nan::FunctionCallbackInfo - - Nan::PropertyCallbackInfo - - Nan::ReturnValue -* **Method declarations** - - Method declaration - - Getter declaration - - Setter declaration - - Property getter declaration - - Property setter declaration - - Property enumerator declaration - - Property deleter declaration - - Property query declaration - - Index getter declaration - - Index setter declaration - - Index enumerator declaration - - Index deleter declaration - - Index query declaration -* Method and template helpers - - Nan::SetMethod() - - Nan::SetPrototypeMethod() - - Nan::SetAccessor() - - Nan::SetNamedPropertyHandler() - - Nan::SetIndexedPropertyHandler() - - Nan::SetTemplate() - - Nan::SetPrototypeTemplate() - - Nan::SetInstanceTemplate() - - Nan::SetCallHandler() - - Nan::SetCallAsFunctionHandler() - -### Scopes - -A _local handle_ is a pointer to an object. All V8 objects are accessed using handles, they are necessary because of the way the V8 garbage collector works. - -A handle scope can be thought of as a container for any number of handles. When you've finished with your handles, instead of deleting each one individually you can simply delete their scope. - -The creation of `HandleScope` objects is different across the supported versions of V8. Therefore, NAN provides its own implementations that can be used safely across these. - - - Nan::HandleScope - - Nan::EscapableHandleScope - -Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://github.com/v8/v8/wiki/Embedder%27s%20Guide#handles-and-garbage-collection). - -### Persistent references - -An object reference that is independent of any `HandleScope` is a _persistent_ reference. Where a `Local` handle only lives as long as the `HandleScope` in which it was allocated, a `Persistent` handle remains valid until it is explicitly disposed. - -Due to the evolution of the V8 API, it is necessary for NAN to provide a wrapper implementation of the `Persistent` classes to supply compatibility across the V8 versions supported. - - - Nan::PersistentBase & v8::PersistentBase - - Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits - - Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits - - Nan::Persistent - - Nan::Global - - Nan::WeakCallbackInfo - - Nan::WeakCallbackType - -Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://developers.google.com/v8/embed#handles). - -### New - -NAN provides a `Nan::New()` helper for the creation of new JavaScript objects in a way that's compatible across the supported versions of V8. - - - Nan::New() - - Nan::Undefined() - - Nan::Null() - - Nan::True() - - Nan::False() - - Nan::EmptyString() - - -### Converters - -NAN contains functions that convert `v8::Value`s to other `v8::Value` types and native types. Since type conversion is not guaranteed to succeed, they return `Nan::Maybe` types. These converters can be used in place of `value->ToX()` and `value->XValue()` (where `X` is one of the types, e.g. `Boolean`) in a way that provides a consistent interface across V8 versions. Newer versions of V8 use the new `v8::Maybe` and `v8::MaybeLocal` types for these conversions, older versions don't have this functionality so it is provided by NAN. - - - Nan::To() - -### Maybe Types - -The `Nan::MaybeLocal` and `Nan::Maybe` types are monads that encapsulate `v8::Local` handles that _may be empty_. - -* **Maybe Types** - - Nan::MaybeLocal - - Nan::Maybe - - Nan::Nothing - - Nan::Just -* **Maybe Helpers** - - Nan::Call() - - Nan::ToDetailString() - - Nan::ToArrayIndex() - - Nan::Equals() - - Nan::NewInstance() - - Nan::GetFunction() - - Nan::Set() - - Nan::ForceSet() - - Nan::Get() - - Nan::GetPropertyAttributes() - - Nan::Has() - - Nan::Delete() - - Nan::GetPropertyNames() - - Nan::GetOwnPropertyNames() - - Nan::SetPrototype() - - Nan::ObjectProtoToString() - - Nan::HasOwnProperty() - - Nan::HasRealNamedProperty() - - Nan::HasRealIndexedProperty() - - Nan::HasRealNamedCallbackProperty() - - Nan::GetRealNamedPropertyInPrototypeChain() - - Nan::GetRealNamedProperty() - - Nan::CallAsFunction() - - Nan::CallAsConstructor() - - Nan::GetSourceLine() - - Nan::GetLineNumber() - - Nan::GetStartColumn() - - Nan::GetEndColumn() - - Nan::CloneElementAt() - - Nan::HasPrivate() - - Nan::GetPrivate() - - Nan::SetPrivate() - - Nan::DeletePrivate() - - Nan::MakeMaybe() - -### Script - -NAN provides a `v8::Script` helpers as the API has changed over the supported versions of V8. - - - Nan::CompileScript() - - Nan::RunScript() - - -### JSON - -The _JSON_ object provides the c++ versions of the methods offered by the `JSON` object in javascript. V8 exposes these methods via the `v8::JSON` object. - - - Nan::JSON.Parse - - Nan::JSON.Stringify - -Refer to the V8 JSON object in the [V8 documentation](https://v8docs.nodesource.com/node-7.4/da/d6f/classv8_1_1_j_s_o_n.html) for more information about these methods and their arguments. - -### Errors - -NAN includes helpers for creating, throwing and catching Errors as much of this functionality varies across the supported versions of V8 and must be abstracted. - -Note that an Error object is simply a specialized form of `v8::Value`. - -Also consult the V8 Embedders Guide section on [Exceptions](https://developers.google.com/v8/embed#exceptions) for more information. - - - Nan::Error() - - Nan::RangeError() - - Nan::ReferenceError() - - Nan::SyntaxError() - - Nan::TypeError() - - Nan::ThrowError() - - Nan::ThrowRangeError() - - Nan::ThrowReferenceError() - - Nan::ThrowSyntaxError() - - Nan::ThrowTypeError() - - Nan::FatalException() - - Nan::ErrnoException() - - Nan::TryCatch - - -### Buffers - -NAN's `node::Buffer` helpers exist as the API has changed across supported Node versions. Use these methods to ensure compatibility. - - - Nan::NewBuffer() - - Nan::CopyBuffer() - - Nan::FreeCallback() - -### Nan::Callback - -`Nan::Callback` makes it easier to use `v8::Function` handles as callbacks. A class that wraps a `v8::Function` handle, protecting it from garbage collection and making it particularly useful for storage and use across asynchronous execution. - - - Nan::Callback - -### Asynchronous work helpers - -`Nan::AsyncWorker` and `Nan::AsyncProgressWorker` are helper classes that make working with asynchronous code easier. - - - Nan::AsyncWorker - - Nan::AsyncProgressWorkerBase & Nan::AsyncProgressWorker - - Nan::AsyncQueueWorker - -### Strings & Bytes - -Miscellaneous string & byte encoding and decoding functionality provided for compatibility across supported versions of V8 and Node. Implemented by NAN to ensure that all encoding types are supported, even for older versions of Node where they are missing. - - - Nan::Encoding - - Nan::Encode() - - Nan::DecodeBytes() - - Nan::DecodeWrite() - - -### Object Wrappers - -The `ObjectWrap` class can be used to make wrapped C++ objects and a factory of wrapped objects. - - - Nan::ObjectWrap - - -### V8 internals - -The hooks to access V8 internals—including GC and statistics—are different across the supported versions of V8, therefore NAN provides its own hooks that call the appropriate V8 methods. - - - NAN_GC_CALLBACK() - - Nan::AddGCEpilogueCallback() - - Nan::RemoveGCEpilogueCallback() - - Nan::AddGCPrologueCallback() - - Nan::RemoveGCPrologueCallback() - - Nan::GetHeapStatistics() - - Nan::SetCounterFunction() - - Nan::SetCreateHistogramFunction() - - Nan::SetAddHistogramSampleFunction() - - Nan::IdleNotification() - - Nan::LowMemoryNotification() - - Nan::ContextDisposedNotification() - - Nan::GetInternalFieldPointer() - - Nan::SetInternalFieldPointer() - - Nan::AdjustExternalMemory() - - -### Miscellaneous V8 Helpers - - - Nan::Utf8String - - Nan::GetCurrentContext() - - Nan::SetIsolateData() - - Nan::GetIsolateData() - - Nan::TypedArrayContents - - -### Miscellaneous Node Helpers - - - Nan::MakeCallback() - - NAN_MODULE_INIT() - - Nan::Export() - - - - - - -### Tests - -To run the NAN tests do: - -``` sh -npm install -npm run-script rebuild-tests -npm test -``` - -Or just: - -``` sh -npm install -make test -``` - - - -## Governance & Contributing - -NAN is governed by the [Node.js Addon API Working Group](https://github.com/nodejs/CTC/blob/master/WORKING_GROUPS.md#addon-api) - -### Addon API Working Group (WG) - -The NAN project is jointly governed by a Working Group which is responsible for high-level guidance of the project. - -Members of the WG are also known as Collaborators, there is no distinction between the two, unlike other Node.js projects. - -The WG has final authority over this project including: - -* Technical direction -* Project governance and process (including this policy) -* Contribution policy -* GitHub repository hosting -* Maintaining the list of additional Collaborators - -For the current list of WG members, see the project [README.md](./README.md#collaborators). - -Individuals making significant and valuable contributions are made members of the WG and given commit-access to the project. These individuals are identified by the WG and their addition to the WG is discussed via GitHub and requires unanimous consensus amongst those WG members participating in the discussion with a quorum of 50% of WG members required for acceptance of the vote. - -_Note:_ If you make a significant contribution and are not considered for commit-access log an issue or contact a WG member directly. - -For the current list of WG members / Collaborators, see the project [README.md](./README.md#collaborators). - -### Consensus Seeking Process - -The WG follows a [Consensus Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) decision making model. - -Modifications of the contents of the NAN repository are made on a collaborative basis. Anybody with a GitHub account may propose a modification via pull request and it will be considered by the WG. All pull requests must be reviewed and accepted by a WG member with sufficient expertise who is able to take full responsibility for the change. In the case of pull requests proposed by an existing WG member, an additional WG member is required for sign-off. Consensus should be sought if additional WG members participate and there is disagreement around a particular modification. - -If a change proposal cannot reach a consensus, a WG member can call for a vote amongst the members of the WG. Simple majority wins. - - - -## Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -* (a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -* (b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -* (c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -* (d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. - - - -### WG Members / Collaborators - - - - - - - - - -
Rod VaggGitHub/rvaggTwitter/@rvagg
Benjamin ByholmGitHub/kkoopa-
Trevor NorrisGitHub/trevnorrisTwitter/@trevnorris
Nathan RajlichGitHub/TooTallNateTwitter/@TooTallNate
Brett LawsonGitHub/brett19Twitter/@brett19x
Ben NoordhuisGitHub/bnoordhuisTwitter/@bnoordhuis
David SiegelGitHub/agnatTwitter/@agnat
- -## Licence & copyright - -Copyright (c) 2017 NAN WG Members / Collaborators (listed above). - -Native Abstractions for Node.js is licensed under an MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/deploy/node_modules/nan/doc/asyncworker.md b/deploy/node_modules/nan/doc/asyncworker.md deleted file mode 100644 index 86a023f..0000000 --- a/deploy/node_modules/nan/doc/asyncworker.md +++ /dev/null @@ -1,104 +0,0 @@ -## Asynchronous work helpers - -`Nan::AsyncWorker` and `Nan::AsyncProgressWorker` are helper classes that make working with asynchronous code easier. - - - Nan::AsyncWorker - - Nan::AsyncProgressWorkerBase & Nan::AsyncProgressWorker - - Nan::AsyncQueueWorker - - -### Nan::AsyncWorker - -`Nan::AsyncWorker` is an _abstract_ class that you can subclass to have much of the annoying asynchronous queuing and handling taken care of for you. It can even store arbitrary V8 objects for you and have them persist while the asynchronous work is in progress. - -Definition: - -```c++ -class AsyncWorker { - public: - explicit AsyncWorker(Callback *callback_); - - virtual ~AsyncWorker(); - - virtual void WorkComplete(); - - void SaveToPersistent(const char *key, const v8::Local &value); - - void SaveToPersistent(const v8::Local &key, - const v8::Local &value); - - void SaveToPersistent(uint32_t index, - const v8::Local &value); - - v8::Local GetFromPersistent(const char *key) const; - - v8::Local GetFromPersistent(const v8::Local &key) const; - - v8::Local GetFromPersistent(uint32_t index) const; - - virtual void Execute() = 0; - - uv_work_t request; - - virtual void Destroy(); - - protected: - Persistent persistentHandle; - - Callback *callback; - - virtual void HandleOKCallback(); - - virtual void HandleErrorCallback(); - - void SetErrorMessage(const char *msg); - - const char* ErrorMessage(); -}; -``` - - -### Nan::AsyncProgressWorkerBase & Nan::AsyncProgressWorker - -`Nan::AsyncProgressWorkerBase` is an _abstract_ class template that extends `Nan::AsyncWorker` and adds additional progress reporting callbacks that can be used during the asynchronous work execution to provide progress data back to JavaScript. - -Previously the definiton of `Nan::AsyncProgressWorker` only allowed sending `const char` data. Now extending `Nan::AsyncProgressWorker` will yield an instance of the implicit `Nan::AsyncProgressWorkerBase` template with type `` for compatibility. - -Definition: - -```c++ -template -class AsyncProgressWorkerBase : public AsyncWorker { - public: - explicit AsyncProgressWorker(Callback *callback_); - - virtual ~AsyncProgressWorker(); - - void WorkProgress(); - - class ExecutionProgress { - public: - void Signal() const; - void Send(const T* data, size_t count) const; - }; - - virtual void Execute(const ExecutionProgress& progress) = 0; - - virtual void HandleProgressCallback(const T *data, size_t count) = 0; - - virtual void Destroy(); -}; - -typedef AsyncProgressWorkerBase AsyncProgressWorker; -``` - - -### Nan::AsyncQueueWorker - -`Nan::AsyncQueueWorker` will run a `Nan::AsyncWorker` asynchronously via libuv. Both the `execute` and `after_work` steps are taken care of for you. Most of the logic for this is embedded in `Nan::AsyncWorker`. - -Definition: - -```c++ -void AsyncQueueWorker(AsyncWorker *); -``` diff --git a/deploy/node_modules/nan/doc/buffers.md b/deploy/node_modules/nan/doc/buffers.md deleted file mode 100644 index 8d8d25c..0000000 --- a/deploy/node_modules/nan/doc/buffers.md +++ /dev/null @@ -1,54 +0,0 @@ -## Buffers - -NAN's `node::Buffer` helpers exist as the API has changed across supported Node versions. Use these methods to ensure compatibility. - - - Nan::NewBuffer() - - Nan::CopyBuffer() - - Nan::FreeCallback() - - -### Nan::NewBuffer() - -Allocate a new `node::Buffer` object with the specified size and optional data. Calls `node::Buffer::New()`. - -Note that when creating a `Buffer` using `Nan::NewBuffer()` and an existing `char*`, it is assumed that the ownership of the pointer is being transferred to the new `Buffer` for management. -When a `node::Buffer` instance is garbage collected and a `FreeCallback` has not been specified, `data` will be disposed of via a call to `free()`. -You _must not_ free the memory space manually once you have created a `Buffer` in this way. - -Signature: - -```c++ -Nan::MaybeLocal Nan::NewBuffer(uint32_t size) -Nan::MaybeLocal Nan::NewBuffer(char* data, uint32_t size) -Nan::MaybeLocal Nan::NewBuffer(char *data, - size_t length, - Nan::FreeCallback callback, - void *hint) -``` - - - -### Nan::CopyBuffer() - -Similar to [`Nan::NewBuffer()`](#api_nan_new_buffer) except that an implicit memcpy will occur within Node. Calls `node::Buffer::Copy()`. - -Management of the `char*` is left to the user, you should manually free the memory space if necessary as the new `Buffer` will have its own copy. - -Signature: - -```c++ -Nan::MaybeLocal Nan::CopyBuffer(const char *data, uint32_t size) -``` - - - -### Nan::FreeCallback() - -A free callback that can be provided to [`Nan::NewBuffer()`](#api_nan_new_buffer). -The supplied callback will be invoked when the `Buffer` undergoes garbage collection. - -Signature: - -```c++ -typedef void (*FreeCallback)(char *data, void *hint); -``` diff --git a/deploy/node_modules/nan/doc/callback.md b/deploy/node_modules/nan/doc/callback.md deleted file mode 100644 index 46de1d7..0000000 --- a/deploy/node_modules/nan/doc/callback.md +++ /dev/null @@ -1,56 +0,0 @@ -## Nan::Callback - -`Nan::Callback` makes it easier to use `v8::Function` handles as callbacks. A class that wraps a `v8::Function` handle, protecting it from garbage collection and making it particularly useful for storage and use across asynchronous execution. - - - Nan::Callback - - -### Nan::Callback - -```c++ -class Callback { - public: - Callback(); - - explicit Callback(const v8::Local &fn); - - ~Callback(); - - bool operator==(const Callback &other) const; - - bool operator!=(const Callback &other) const; - - v8::Local operator*() const; - - v8::Local operator()(v8::Local target, - int argc = 0, - v8::Local argv[] = 0) const; - - v8::Local operator()(int argc = 0, - v8::Local argv[] = 0) const; - - void SetFunction(const v8::Local &fn); - - v8::Local GetFunction() const; - - bool IsEmpty() const; - - void Reset(const v8::Local &fn); - - void Reset(); - - v8::Local Call(v8::Local target, - int argc, - v8::Local argv[]) const; - - v8::Local Call(int argc, v8::Local argv[]) const; -}; -``` - -Example usage: - -```c++ -v8::Local function; -Nan::Callback callback(function); -callback.Call(0, 0); -``` diff --git a/deploy/node_modules/nan/doc/converters.md b/deploy/node_modules/nan/doc/converters.md deleted file mode 100644 index d20861b..0000000 --- a/deploy/node_modules/nan/doc/converters.md +++ /dev/null @@ -1,41 +0,0 @@ -## Converters - -NAN contains functions that convert `v8::Value`s to other `v8::Value` types and native types. Since type conversion is not guaranteed to succeed, they return `Nan::Maybe` types. These converters can be used in place of `value->ToX()` and `value->XValue()` (where `X` is one of the types, e.g. `Boolean`) in a way that provides a consistent interface across V8 versions. Newer versions of V8 use the new `v8::Maybe` and `v8::MaybeLocal` types for these conversions, older versions don't have this functionality so it is provided by NAN. - - - Nan::To() - - -### Nan::To() - -Converts a `v8::Local` to a different subtype of `v8::Value` or to a native data type. Returns a `Nan::MaybeLocal<>` or a `Nan::Maybe<>` accordingly. - -See [maybe_types.md](./maybe_types.md) for more information on `Nan::Maybe` types. - -Signatures: - -```c++ -// V8 types -Nan::MaybeLocal Nan::To(v8::Local val); -Nan::MaybeLocal Nan::To(v8::Local val); -Nan::MaybeLocal Nan::To(v8::Local val); -Nan::MaybeLocal Nan::To(v8::Local val); -Nan::MaybeLocal Nan::To(v8::Local val); -Nan::MaybeLocal Nan::To(v8::Local val); -Nan::MaybeLocal Nan::To(v8::Local val); - -// Native types -Nan::Maybe Nan::To(v8::Local val); -Nan::Maybe Nan::To(v8::Local val); -Nan::Maybe Nan::To(v8::Local val); -Nan::Maybe Nan::To(v8::Local val); -Nan::Maybe Nan::To(v8::Local val); -``` - -### Example - -```c++ -v8::Local val; -Nan::MaybeLocal str = Nan::To(val); -Nan::Maybe d = Nan::To(val); -``` - diff --git a/deploy/node_modules/nan/doc/errors.md b/deploy/node_modules/nan/doc/errors.md deleted file mode 100644 index aac6e08..0000000 --- a/deploy/node_modules/nan/doc/errors.md +++ /dev/null @@ -1,226 +0,0 @@ -## Errors - -NAN includes helpers for creating, throwing and catching Errors as much of this functionality varies across the supported versions of V8 and must be abstracted. - -Note that an Error object is simply a specialized form of `v8::Value`. - -Also consult the V8 Embedders Guide section on [Exceptions](https://developers.google.com/v8/embed#exceptions) for more information. - - - Nan::Error() - - Nan::RangeError() - - Nan::ReferenceError() - - Nan::SyntaxError() - - Nan::TypeError() - - Nan::ThrowError() - - Nan::ThrowRangeError() - - Nan::ThrowReferenceError() - - Nan::ThrowSyntaxError() - - Nan::ThrowTypeError() - - Nan::FatalException() - - Nan::ErrnoException() - - Nan::TryCatch - - - -### Nan::Error() - -Create a new Error object using the [v8::Exception](https://v8docs.nodesource.com/io.js-3.0/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8. - -Note that an Error object is simply a specialized form of `v8::Value`. - -Signature: - -```c++ -v8::Local Nan::Error(const char *msg); -v8::Local Nan::Error(v8::Local msg); -``` - - - -### Nan::RangeError() - -Create a new RangeError object using the [v8::Exception](https://v8docs.nodesource.com/io.js-3.0/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8. - -Note that an RangeError object is simply a specialized form of `v8::Value`. - -Signature: - -```c++ -v8::Local Nan::RangeError(const char *msg); -v8::Local Nan::RangeError(v8::Local msg); -``` - - - -### Nan::ReferenceError() - -Create a new ReferenceError object using the [v8::Exception](https://v8docs.nodesource.com/io.js-3.0/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8. - -Note that an ReferenceError object is simply a specialized form of `v8::Value`. - -Signature: - -```c++ -v8::Local Nan::ReferenceError(const char *msg); -v8::Local Nan::ReferenceError(v8::Local msg); -``` - - - -### Nan::SyntaxError() - -Create a new SyntaxError object using the [v8::Exception](https://v8docs.nodesource.com/io.js-3.0/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8. - -Note that an SyntaxError object is simply a specialized form of `v8::Value`. - -Signature: - -```c++ -v8::Local Nan::SyntaxError(const char *msg); -v8::Local Nan::SyntaxError(v8::Local msg); -``` - - - -### Nan::TypeError() - -Create a new TypeError object using the [v8::Exception](https://v8docs.nodesource.com/io.js-3.0/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8. - -Note that an TypeError object is simply a specialized form of `v8::Value`. - -Signature: - -```c++ -v8::Local Nan::TypeError(const char *msg); -v8::Local Nan::TypeError(v8::Local msg); -``` - - - -### Nan::ThrowError() - -Throw an Error object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new Error object will be created. - -Signature: - -```c++ -void Nan::ThrowError(const char *msg); -void Nan::ThrowError(v8::Local msg); -void Nan::ThrowError(v8::Local error); -``` - - - -### Nan::ThrowRangeError() - -Throw an RangeError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new RangeError object will be created. - -Signature: - -```c++ -void Nan::ThrowRangeError(const char *msg); -void Nan::ThrowRangeError(v8::Local msg); -void Nan::ThrowRangeError(v8::Local error); -``` - - - -### Nan::ThrowReferenceError() - -Throw an ReferenceError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new ReferenceError object will be created. - -Signature: - -```c++ -void Nan::ThrowReferenceError(const char *msg); -void Nan::ThrowReferenceError(v8::Local msg); -void Nan::ThrowReferenceError(v8::Local error); -``` - - - -### Nan::ThrowSyntaxError() - -Throw an SyntaxError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new SyntaxError object will be created. - -Signature: - -```c++ -void Nan::ThrowSyntaxError(const char *msg); -void Nan::ThrowSyntaxError(v8::Local msg); -void Nan::ThrowSyntaxError(v8::Local error); -``` - - - -### Nan::ThrowTypeError() - -Throw an TypeError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new TypeError object will be created. - -Signature: - -```c++ -void Nan::ThrowTypeError(const char *msg); -void Nan::ThrowTypeError(v8::Local msg); -void Nan::ThrowTypeError(v8::Local error); -``` - - -### Nan::FatalException() - -Replaces `node::FatalException()` which has a different API across supported versions of Node. For use with [`Nan::TryCatch`](#api_nan_try_catch). - -Signature: - -```c++ -void Nan::FatalException(const Nan::TryCatch& try_catch); -``` - - -### Nan::ErrnoException() - -Replaces `node::ErrnoException()` which has a different API across supported versions of Node. - -Signature: - -```c++ -v8::Local Nan::ErrnoException(int errorno, - const char* syscall = NULL, - const char* message = NULL, - const char* path = NULL); -``` - - - -### Nan::TryCatch - -A simple wrapper around [`v8::TryCatch`](https://v8docs.nodesource.com/io.js-3.0/d4/dc6/classv8_1_1_try_catch.html) compatible with all supported versions of V8. Can be used as a direct replacement in most cases. See also [`Nan::FatalException()`](#api_nan_fatal_exception) for an internal use compatible with `node::FatalException`. - -Signature: - -```c++ -class Nan::TryCatch { - public: - Nan::TryCatch(); - - bool HasCaught() const; - - bool CanContinue() const; - - v8::Local ReThrow(); - - v8::Local Exception() const; - - // Nan::MaybeLocal for older versions of V8 - v8::MaybeLocal StackTrace() const; - - v8::Local Message() const; - - void Reset(); - - void SetVerbose(bool value); - - void SetCaptureMessage(bool value); -}; -``` - diff --git a/deploy/node_modules/nan/doc/json.md b/deploy/node_modules/nan/doc/json.md deleted file mode 100644 index c916c4d..0000000 --- a/deploy/node_modules/nan/doc/json.md +++ /dev/null @@ -1,62 +0,0 @@ -## JSON - -The _JSON_ object provides the c++ versions of the methods offered by the `JSON` object in javascript. V8 exposes these methods via the `v8::JSON` object. - - - Nan::JSON.Parse - - Nan::JSON.Stringify - -Refer to the V8 JSON object in the [V8 documentation](https://v8docs.nodesource.com/node-7.4/da/d6f/classv8_1_1_j_s_o_n.html) for more information about these methods and their arguments. - - - -### Nan::JSON.Parse - -A simple wrapper around [`v8::JSON::Parse`](https://v8docs.nodesource.com/node-7.4/da/d6f/classv8_1_1_j_s_o_n.html#a936310d2540fb630ed37d3ee3ffe4504). - -Definition: - -```c++ -Nan::MaybeLocal Nan::JSON::Parse(v8::Local json_string); -``` - -Use `JSON.Parse(json_string)` to parse a string into a `v8::Value`. - -Example: - -```c++ -v8::Local json_string = Nan::New("{ \"JSON\": \"object\" }").ToLocalChecked(); - -Nan::JSON NanJSON; -Nan::MaybeLocal result = NanJSON.Parse(json_string); -if (!result.IsEmpty()) { - v8::Local val = result.ToLocalChecked(); -} -``` - - - -### Nan::JSON.Stringify - -A simple wrapper around [`v8::JSON::Stringify`](https://v8docs.nodesource.com/node-7.4/da/d6f/classv8_1_1_j_s_o_n.html#a44b255c3531489ce43f6110209138860). - -Definition: - -```c++ -Nan::MaybeLocal Nan::JSON::Stringify(v8::Local json_object, v8::Local gap = v8::Local()); -``` - -Use `JSON.Stringify(value)` to stringify a `v8::Object`. - -Example: - -```c++ -// using `v8::Local val` from the `JSON::Parse` example -v8::Local obj = Nan::To(val).ToLocalChecked(); - -Nan::JSON NanJSON; -Nan::MaybeLocal result = NanJSON.Stringify(obj); -if (!result.IsEmpty()) { - v8::Local stringified = result.ToLocalChecked(); -} -``` - diff --git a/deploy/node_modules/nan/doc/maybe_types.md b/deploy/node_modules/nan/doc/maybe_types.md deleted file mode 100644 index 818861d..0000000 --- a/deploy/node_modules/nan/doc/maybe_types.md +++ /dev/null @@ -1,560 +0,0 @@ -## Maybe Types - -The `Nan::MaybeLocal` and `Nan::Maybe` types are monads that encapsulate `v8::Local` handles that _may be empty_. - -* **Maybe Types** - - Nan::MaybeLocal - - Nan::Maybe - - Nan::Nothing - - Nan::Just -* **Maybe Helpers** - - Nan::Call() - - Nan::ToDetailString() - - Nan::ToArrayIndex() - - Nan::Equals() - - Nan::NewInstance() - - Nan::GetFunction() - - Nan::Set() - - Nan::ForceSet() - - Nan::Get() - - Nan::GetPropertyAttributes() - - Nan::Has() - - Nan::Delete() - - Nan::GetPropertyNames() - - Nan::GetOwnPropertyNames() - - Nan::SetPrototype() - - Nan::ObjectProtoToString() - - Nan::HasOwnProperty() - - Nan::HasRealNamedProperty() - - Nan::HasRealIndexedProperty() - - Nan::HasRealNamedCallbackProperty() - - Nan::GetRealNamedPropertyInPrototypeChain() - - Nan::GetRealNamedProperty() - - Nan::CallAsFunction() - - Nan::CallAsConstructor() - - Nan::GetSourceLine() - - Nan::GetLineNumber() - - Nan::GetStartColumn() - - Nan::GetEndColumn() - - Nan::CloneElementAt() - - Nan::HasPrivate() - - Nan::GetPrivate() - - Nan::SetPrivate() - - Nan::DeletePrivate() - - Nan::MakeMaybe() - - -### Nan::MaybeLocal - -A `Nan::MaybeLocal` is a wrapper around [`v8::Local`](https://v8docs.nodesource.com/io.js-3.0/de/deb/classv8_1_1_local.html) that enforces a check that determines whether the `v8::Local` is empty before it can be used. - -If an API method returns a `Nan::MaybeLocal`, the API method can potentially fail either because an exception is thrown, or because an exception is pending, e.g. because a previous API call threw an exception that hasn't been caught yet, or because a `v8::TerminateExecution` exception was thrown. In that case, an empty `Nan::MaybeLocal` is returned. - -Definition: - -```c++ -template class Nan::MaybeLocal { - public: - MaybeLocal(); - - template MaybeLocal(v8::Local that); - - bool IsEmpty() const; - - template bool ToLocal(v8::Local *out); - - // Will crash if the MaybeLocal<> is empty. - v8::Local ToLocalChecked(); - - template v8::Local FromMaybe(v8::Local default_value) const; -}; -``` - -See the documentation for [`v8::MaybeLocal`](https://v8docs.nodesource.com/io.js-3.0/d8/d7d/classv8_1_1_maybe_local.html) for further details. - - -### Nan::Maybe - -A simple `Nan::Maybe` type, representing an object which may or may not have a value, see https://hackage.haskell.org/package/base/docs/Data-Maybe.html. - -If an API method returns a `Nan::Maybe<>`, the API method can potentially fail either because an exception is thrown, or because an exception is pending, e.g. because a previous API call threw an exception that hasn't been caught yet, or because a `v8::TerminateExecution` exception was thrown. In that case, a "Nothing" value is returned. - -Definition: - -```c++ -template class Nan::Maybe { - public: - bool IsNothing() const; - bool IsJust() const; - - // Will crash if the Maybe<> is nothing. - T FromJust(); - - T FromMaybe(const T& default_value); - - bool operator==(const Maybe &other); - - bool operator!=(const Maybe &other); -}; -``` - -See the documentation for [`v8::Maybe`](https://v8docs.nodesource.com/io.js-3.0/d9/d4b/classv8_1_1_maybe.html) for further details. - - -### Nan::Nothing - -Construct an empty `Nan::Maybe` type representing _nothing_. - -```c++ -template Nan::Maybe Nan::Nothing(); -``` - - -### Nan::Just - -Construct a `Nan::Maybe` type representing _just_ a value. - -```c++ -template Nan::Maybe Nan::Just(const T &t); -``` - - -### Nan::Call() - -A helper method for calling [`v8::Function#Call()`](https://v8docs.nodesource.com/io.js-3.0/d5/d54/classv8_1_1_function.html#a468a89f737af0612db10132799c827c0) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::Call(v8::Local fun, v8::Local recv, int argc, v8::Local argv[]); -``` - - - -### Nan::ToDetailString() - -A helper method for calling [`v8::Value#ToDetailString()`](https://v8docs.nodesource.com/io.js-3.0/dc/d0a/classv8_1_1_value.html#a2f9770296dc2c8d274bc8cc0dca243e5) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::ToDetailString(v8::Local val); -``` - - - -### Nan::ToArrayIndex() - -A helper method for calling [`v8::Value#ToArrayIndex()`](https://v8docs.nodesource.com/io.js-3.0/dc/d0a/classv8_1_1_value.html#acc5bbef3c805ec458470c0fcd6f13493) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::ToArrayIndex(v8::Local val); -``` - - - -### Nan::Equals() - -A helper method for calling [`v8::Value#Equals()`](https://v8docs.nodesource.com/io.js-3.0/dc/d0a/classv8_1_1_value.html#a0d9616ab2de899d4e3047c30a10c9285) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::Equals(v8::Local a, v8::Local(b)); -``` - - - -### Nan::NewInstance() - -A helper method for calling [`v8::Function#NewInstance()`](https://v8docs.nodesource.com/io.js-3.0/d5/d54/classv8_1_1_function.html#a691b13f7a553069732cbacf5ac8c62ec) and [`v8::ObjectTemplate#NewInstance()`](https://v8docs.nodesource.com/io.js-3.0/db/d5f/classv8_1_1_object_template.html#ad605a7543cfbc5dab54cdb0883d14ae4) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::NewInstance(v8::Local h); -Nan::MaybeLocal Nan::NewInstance(v8::Local h, int argc, v8::Local argv[]); -Nan::MaybeLocal Nan::NewInstance(v8::Local h); -``` - - - -### Nan::GetFunction() - -A helper method for calling [`v8::FunctionTemplate#GetFunction()`](https://v8docs.nodesource.com/io.js-3.0/d8/d83/classv8_1_1_function_template.html#a56d904662a86eca78da37d9bb0ed3705) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::GetFunction(v8::Local t); -``` - - - -### Nan::Set() - -A helper method for calling [`v8::Object#Set()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a67604ea3734f170c66026064ea808f20) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::Set(v8::Local obj, - v8::Local key, - v8::Local value) -Nan::Maybe Nan::Set(v8::Local obj, - uint32_t index, - v8::Local value); -``` - - - -### Nan::ForceSet() - -A helper method for calling [`v8::Object#ForceSet()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a796b7b682896fb64bf1872747734e836) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::ForceSet(v8::Local obj, - v8::Local key, - v8::Local value, - v8::PropertyAttribute attribs = v8::None); -``` - - - -### Nan::Get() - -A helper method for calling [`v8::Object#Get()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a2565f03e736694f6b1e1cf22a0b4eac2) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::Get(v8::Local obj, - v8::Local key); -Nan::MaybeLocal Nan::Get(v8::Local obj, uint32_t index); -``` - - - -### Nan::GetPropertyAttributes() - -A helper method for calling [`v8::Object#GetPropertyAttributes()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a9b898894da3d1db2714fd9325a54fe57) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::GetPropertyAttributes( - v8::Local obj, - v8::Local key); -``` - - - -### Nan::Has() - -A helper method for calling [`v8::Object#Has()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#ab3c3d89ea7c2f9afd08965bd7299a41d) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::Has(v8::Local obj, v8::Local key); -Nan::Maybe Nan::Has(v8::Local obj, uint32_t index); -``` - - - -### Nan::Delete() - -A helper method for calling [`v8::Object#Delete()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a2fa0f5a592582434ed1ceceff7d891ef) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::Delete(v8::Local obj, - v8::Local key); -Nan::Maybe Nan::Delete(v8::Local obj, uint32_t index); -``` - - - -### Nan::GetPropertyNames() - -A helper method for calling [`v8::Object#GetPropertyNames()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#aced885270cfd2c956367b5eedc7fbfe8) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::GetPropertyNames(v8::Local obj); -``` - - - -### Nan::GetOwnPropertyNames() - -A helper method for calling [`v8::Object#GetOwnPropertyNames()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a79a6e4d66049b9aa648ed4dfdb23e6eb) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::GetOwnPropertyNames(v8::Local obj); -``` - - - -### Nan::SetPrototype() - -A helper method for calling [`v8::Object#SetPrototype()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a442706b22fceda6e6d1f632122a9a9f4) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::SetPrototype(v8::Local obj, - v8::Local prototype); -``` - - - -### Nan::ObjectProtoToString() - -A helper method for calling [`v8::Object#ObjectProtoToString()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#ab7a92b4dcf822bef72f6c0ac6fea1f0b) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::ObjectProtoToString(v8::Local obj); -``` - - - -### Nan::HasOwnProperty() - -A helper method for calling [`v8::Object#HasOwnProperty()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#ab7b7245442ca6de1e1c145ea3fd653ff) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::HasOwnProperty(v8::Local obj, - v8::Local key); -``` - - - -### Nan::HasRealNamedProperty() - -A helper method for calling [`v8::Object#HasRealNamedProperty()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#ad8b80a59c9eb3c1e6c3cd6c84571f767) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::HasRealNamedProperty(v8::Local obj, - v8::Local key); -``` - - - -### Nan::HasRealIndexedProperty() - -A helper method for calling [`v8::Object#HasRealIndexedProperty()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#af94fc1135a5e74a2193fb72c3a1b9855) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::HasRealIndexedProperty(v8::Local obj, - uint32_t index); -``` - - - -### Nan::HasRealNamedCallbackProperty() - -A helper method for calling [`v8::Object#HasRealNamedCallbackProperty()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#af743b7ea132b89f84d34d164d0668811) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::HasRealNamedCallbackProperty( - v8::Local obj, - v8::Local key); -``` - - - -### Nan::GetRealNamedPropertyInPrototypeChain() - -A helper method for calling [`v8::Object#GetRealNamedPropertyInPrototypeChain()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a8700b1862e6b4783716964ba4d5e6172) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::GetRealNamedPropertyInPrototypeChain( - v8::Local obj, - v8::Local key); -``` - - - -### Nan::GetRealNamedProperty() - -A helper method for calling [`v8::Object#GetRealNamedProperty()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a84471a824576a5994fdd0ffcbf99ccc0) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::GetRealNamedProperty(v8::Local obj, - v8::Local key); -``` - - - -### Nan::CallAsFunction() - -A helper method for calling [`v8::Object#CallAsFunction()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a9ef18be634e79b4f0cdffa1667a29f58) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::CallAsFunction(v8::Local obj, - v8::Local recv, - int argc, - v8::Local argv[]); -``` - - - -### Nan::CallAsConstructor() - -A helper method for calling [`v8::Object#CallAsConstructor()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a50d571de50d0b0dfb28795619d07a01b) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::CallAsConstructor(v8::Local obj, - int argc, - v8::Local argv[]); -``` - - - -### Nan::GetSourceLine() - -A helper method for calling [`v8::Message#GetSourceLine()`](https://v8docs.nodesource.com/io.js-3.0/d9/d28/classv8_1_1_message.html#a849f7a6c41549d83d8159825efccd23a) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::GetSourceLine(v8::Local msg); -``` - - - -### Nan::GetLineNumber() - -A helper method for calling [`v8::Message#GetLineNumber()`](https://v8docs.nodesource.com/io.js-3.0/d9/d28/classv8_1_1_message.html#adbe46c10a88a6565f2732a2d2adf99b9) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::GetLineNumber(v8::Local msg); -``` - - - -### Nan::GetStartColumn() - -A helper method for calling [`v8::Message#GetStartColumn()`](https://v8docs.nodesource.com/io.js-3.0/d9/d28/classv8_1_1_message.html#a60ede616ba3822d712e44c7a74487ba6) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::GetStartColumn(v8::Local msg); -``` - - - -### Nan::GetEndColumn() - -A helper method for calling [`v8::Message#GetEndColumn()`](https://v8docs.nodesource.com/io.js-3.0/d9/d28/classv8_1_1_message.html#aaa004cf19e529da980bc19fcb76d93be) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::GetEndColumn(v8::Local msg); -``` - - - -### Nan::CloneElementAt() - -A helper method for calling [`v8::Array#CloneElementAt()`](https://v8docs.nodesource.com/io.js-3.0/d3/d32/classv8_1_1_array.html#a1d3a878d4c1c7cae974dd50a1639245e) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::CloneElementAt(v8::Local array, uint32_t index); -``` - - -### Nan::HasPrivate() - -A helper method for calling [`v8::Object#HasPrivate()`](https://v8docs.nodesource.com/node-7.2/db/d85/classv8_1_1_object.html#af68a0b98066cfdeb8f943e98a40ba08d) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::HasPrivate(v8::Local object, v8::Local key); -``` - - -### Nan::GetPrivate() - -A helper method for calling [`v8::Object#GetPrivate()`](https://v8docs.nodesource.com/node-7.2/db/d85/classv8_1_1_object.html#a169f2da506acbec34deadd9149a1925a) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::GetPrivate(v8::Local object, v8::Local key); -``` - - -### Nan::SetPrivate() - -A helper method for calling [`v8::Object#SetPrivate()`](https://v8docs.nodesource.com/node-7.2/db/d85/classv8_1_1_object.html#ace1769b0f3b86bfe9fda1010916360ee) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::SetPrivate(v8::Local object, v8::Local key, v8::Local value); -``` - - -### Nan::DeletePrivate() - -A helper method for calling [`v8::Object#DeletePrivate()`](https://v8docs.nodesource.com/node-7.2/db/d85/classv8_1_1_object.html#a138bb32a304f3982be02ad499693b8fd) in a way compatible across supported versions of V8. - -Signature: - -```c++ -Nan::Maybe Nan::DeletePrivate(v8::Local object, v8::Local key); -``` - - -### Nan::MakeMaybe() - -Wraps a `v8::Local<>` in a `Nan::MaybeLocal<>`. When called with a `Nan::MaybeLocal<>` it just returns its argument. This is useful in generic template code that builds on NAN. - -Synopsis: - -```c++ - MaybeLocal someNumber = MakeMaybe(New(3.141592654)); - MaybeLocal someString = MakeMaybe(New("probably")); -``` - -Signature: - -```c++ -template class MaybeMaybe> -Nan::MaybeLocal Nan::MakeMaybe(MaybeMaybe v); -``` diff --git a/deploy/node_modules/nan/doc/methods.md b/deploy/node_modules/nan/doc/methods.md deleted file mode 100644 index dbe512d..0000000 --- a/deploy/node_modules/nan/doc/methods.md +++ /dev/null @@ -1,659 +0,0 @@ -## JavaScript-accessible methods - -A _template_ is a blueprint for JavaScript functions and objects in a context. You can use a template to wrap C++ functions and data structures within JavaScript objects so that they can be manipulated from JavaScript. See the V8 Embedders Guide section on [Templates](https://developers.google.com/v8/embed#templates) for further information. - -In order to expose functionality to JavaScript via a template, you must provide it to V8 in a form that it understands. Across the versions of V8 supported by NAN, JavaScript-accessible method signatures vary widely, NAN fully abstracts method declaration and provides you with an interface that is similar to the most recent V8 API but is backward-compatible with older versions that still use the now-deceased `v8::Argument` type. - -* **Method argument types** - - Nan::FunctionCallbackInfo - - Nan::PropertyCallbackInfo - - Nan::ReturnValue -* **Method declarations** - - Method declaration - - Getter declaration - - Setter declaration - - Property getter declaration - - Property setter declaration - - Property enumerator declaration - - Property deleter declaration - - Property query declaration - - Index getter declaration - - Index setter declaration - - Index enumerator declaration - - Index deleter declaration - - Index query declaration -* Method and template helpers - - Nan::SetMethod() - - Nan::SetPrototypeMethod() - - Nan::SetAccessor() - - Nan::SetNamedPropertyHandler() - - Nan::SetIndexedPropertyHandler() - - Nan::SetTemplate() - - Nan::SetPrototypeTemplate() - - Nan::SetInstanceTemplate() - - Nan::SetCallHandler() - - Nan::SetCallAsFunctionHandler() - - -### Nan::FunctionCallbackInfo - -`Nan::FunctionCallbackInfo` should be used in place of [`v8::FunctionCallbackInfo`](https://v8docs.nodesource.com/node-8.0/dd/d0d/classv8_1_1_function_callback_info.html), even with older versions of Node where `v8::FunctionCallbackInfo` does not exist. - -Definition: - -```c++ -template class FunctionCallbackInfo { - public: - ReturnValue GetReturnValue() const; - v8::Local Callee(); - v8::Local Data(); - v8::Local Holder(); - bool IsConstructCall(); - int Length() const; - v8::Local operator[](int i) const; - v8::Local This() const; - v8::Isolate *GetIsolate() const; -}; -``` - -See the [`v8::FunctionCallbackInfo`](https://v8docs.nodesource.com/node-8.0/dd/d0d/classv8_1_1_function_callback_info.html) documentation for usage details on these. See [`Nan::ReturnValue`](#api_nan_return_value) for further information on how to set a return value from methods. - - -### Nan::PropertyCallbackInfo - -`Nan::PropertyCallbackInfo` should be used in place of [`v8::PropertyCallbackInfo`](https://v8docs.nodesource.com/node-8.0/d7/dc5/classv8_1_1_property_callback_info.html), even with older versions of Node where `v8::PropertyCallbackInfo` does not exist. - -Definition: - -```c++ -template class PropertyCallbackInfo : public PropertyCallbackInfoBase { - public: - ReturnValue GetReturnValue() const; - v8::Isolate* GetIsolate() const; - v8::Local Data() const; - v8::Local This() const; - v8::Local Holder() const; -}; -``` - -See the [`v8::PropertyCallbackInfo`](https://v8docs.nodesource.com/node-8.0/d7/dc5/classv8_1_1_property_callback_info.html) documentation for usage details on these. See [`Nan::ReturnValue`](#api_nan_return_value) for further information on how to set a return value from property accessor methods. - - -### Nan::ReturnValue - -`Nan::ReturnValue` is used in place of [`v8::ReturnValue`](https://v8docs.nodesource.com/node-8.0/da/da7/classv8_1_1_return_value.html) on both [`Nan::FunctionCallbackInfo`](#api_nan_function_callback_info) and [`Nan::PropertyCallbackInfo`](#api_nan_property_callback_info) as the return type of `GetReturnValue()`. - -Example usage: - -```c++ -void EmptyArray(const Nan::FunctionCallbackInfo& info) { - info.GetReturnValue().Set(Nan::New()); -} -``` - -Definition: - -```c++ -template class ReturnValue { - public: - // Handle setters - template void Set(const v8::Local &handle); - template void Set(const Nan::Global &handle); - - // Fast primitive setters - void Set(bool value); - void Set(double i); - void Set(int32_t i); - void Set(uint32_t i); - - // Fast JS primitive setters - void SetNull(); - void SetUndefined(); - void SetEmptyString(); - - // Convenience getter for isolate - v8::Isolate *GetIsolate() const; -}; -``` - -See the documentation on [`v8::ReturnValue`](https://v8docs.nodesource.com/node-8.0/da/da7/classv8_1_1_return_value.html) for further information on this. - - -### Method declaration - -JavaScript-accessible methods should be declared with the following signature to form a `Nan::FunctionCallback`: - -```c++ -typedef void(*FunctionCallback)(const FunctionCallbackInfo&); -``` - -Example: - -```c++ -void MethodName(const Nan::FunctionCallbackInfo& info) { - ... -} -``` - -You do not need to declare a new `HandleScope` within a method as one is implicitly created for you. - -**Example usage** - -```c++ -// .h: -class Foo : public Nan::ObjectWrap { - ... - - static void Bar(const Nan::FunctionCallbackInfo& info); - static void Baz(const Nan::FunctionCallbackInfo& info); -} - - -// .cc: -void Foo::Bar(const Nan::FunctionCallbackInfo& info) { - ... -} - -void Foo::Baz(const Nan::FunctionCallbackInfo& info) { - ... -} -``` - -A helper macro `NAN_METHOD(methodname)` exists, compatible with NAN v1 method declarations. - -**Example usage with `NAN_METHOD(methodname)`** - -```c++ -// .h: -class Foo : public Nan::ObjectWrap { - ... - - static NAN_METHOD(Bar); - static NAN_METHOD(Baz); -} - - -// .cc: -NAN_METHOD(Foo::Bar) { - ... -} - -NAN_METHOD(Foo::Baz) { - ... -} -``` - -Use [`Nan::SetPrototypeMethod`](#api_nan_set_prototype_method) to attach a method to a JavaScript function prototype or [`Nan::SetMethod`](#api_nan_set_method) to attach a method directly on a JavaScript object. - - -### Getter declaration - -JavaScript-accessible getters should be declared with the following signature to form a `Nan::GetterCallback`: - -```c++ -typedef void(*GetterCallback)(v8::Local, - const PropertyCallbackInfo&); -``` - -Example: - -```c++ -void GetterName(v8::Local property, - const Nan::PropertyCallbackInfo& info) { - ... -} -``` - -You do not need to declare a new `HandleScope` within a getter as one is implicitly created for you. - -A helper macro `NAN_GETTER(methodname)` exists, compatible with NAN v1 method declarations. - -Also see the V8 Embedders Guide documentation on [Accessors](https://developers.google.com/v8/embed#accesssors). - - -### Setter declaration - -JavaScript-accessible setters should be declared with the following signature to form a Nan::SetterCallback: - -```c++ -typedef void(*SetterCallback)(v8::Local, - v8::Local, - const PropertyCallbackInfo&); -``` - -Example: - -```c++ -void SetterName(v8::Local property, - v8::Local value, - const Nan::PropertyCallbackInfo& info) { - ... -} -``` - -You do not need to declare a new `HandleScope` within a setter as one is implicitly created for you. - -A helper macro `NAN_SETTER(methodname)` exists, compatible with NAN v1 method declarations. - -Also see the V8 Embedders Guide documentation on [Accessors](https://developers.google.com/v8/embed#accesssors). - - -### Property getter declaration - -JavaScript-accessible property getters should be declared with the following signature to form a Nan::PropertyGetterCallback: - -```c++ -typedef void(*PropertyGetterCallback)(v8::Local, - const PropertyCallbackInfo&); -``` - -Example: - -```c++ -void PropertyGetterName(v8::Local property, - const Nan::PropertyCallbackInfo& info) { - ... -} -``` - -You do not need to declare a new `HandleScope` within a property getter as one is implicitly created for you. - -A helper macro `NAN_PROPERTY_GETTER(methodname)` exists, compatible with NAN v1 method declarations. - -Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors). - - -### Property setter declaration - -JavaScript-accessible property setters should be declared with the following signature to form a Nan::PropertySetterCallback: - -```c++ -typedef void(*PropertySetterCallback)(v8::Local, - v8::Local, - const PropertyCallbackInfo&); -``` - -Example: - -```c++ -void PropertySetterName(v8::Local property, - v8::Local value, - const Nan::PropertyCallbackInfo& info); -``` - -You do not need to declare a new `HandleScope` within a property setter as one is implicitly created for you. - -A helper macro `NAN_PROPERTY_SETTER(methodname)` exists, compatible with NAN v1 method declarations. - -Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors). - - -### Property enumerator declaration - -JavaScript-accessible property enumerators should be declared with the following signature to form a Nan::PropertyEnumeratorCallback: - -```c++ -typedef void(*PropertyEnumeratorCallback)(const PropertyCallbackInfo&); -``` - -Example: - -```c++ -void PropertyEnumeratorName(const Nan::PropertyCallbackInfo& info); -``` - -You do not need to declare a new `HandleScope` within a property enumerator as one is implicitly created for you. - -A helper macro `NAN_PROPERTY_ENUMERATOR(methodname)` exists, compatible with NAN v1 method declarations. - -Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors). - - -### Property deleter declaration - -JavaScript-accessible property deleters should be declared with the following signature to form a Nan::PropertyDeleterCallback: - -```c++ -typedef void(*PropertyDeleterCallback)(v8::Local, - const PropertyCallbackInfo&); -``` - -Example: - -```c++ -void PropertyDeleterName(v8::Local property, - const Nan::PropertyCallbackInfo& info); -``` - -You do not need to declare a new `HandleScope` within a property deleter as one is implicitly created for you. - -A helper macro `NAN_PROPERTY_DELETER(methodname)` exists, compatible with NAN v1 method declarations. - -Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors). - - -### Property query declaration - -JavaScript-accessible property query methods should be declared with the following signature to form a Nan::PropertyQueryCallback: - -```c++ -typedef void(*PropertyQueryCallback)(v8::Local, - const PropertyCallbackInfo&); -``` - -Example: - -```c++ -void PropertyQueryName(v8::Local property, - const Nan::PropertyCallbackInfo& info); -``` - -You do not need to declare a new `HandleScope` within a property query method as one is implicitly created for you. - -A helper macro `NAN_PROPERTY_QUERY(methodname)` exists, compatible with NAN v1 method declarations. - -Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors). - - -### Index getter declaration - -JavaScript-accessible index getter methods should be declared with the following signature to form a Nan::IndexGetterCallback: - -```c++ -typedef void(*IndexGetterCallback)(uint32_t, - const PropertyCallbackInfo&); -``` - -Example: - -```c++ -void IndexGetterName(uint32_t index, const PropertyCallbackInfo& info); -``` - -You do not need to declare a new `HandleScope` within a index getter as one is implicitly created for you. - -A helper macro `NAN_INDEX_GETTER(methodname)` exists, compatible with NAN v1 method declarations. - -Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors). - - -### Index setter declaration - -JavaScript-accessible index setter methods should be declared with the following signature to form a Nan::IndexSetterCallback: - -```c++ -typedef void(*IndexSetterCallback)(uint32_t, - v8::Local, - const PropertyCallbackInfo&); -``` - -Example: - -```c++ -void IndexSetterName(uint32_t index, - v8::Local value, - const PropertyCallbackInfo& info); -``` - -You do not need to declare a new `HandleScope` within a index setter as one is implicitly created for you. - -A helper macro `NAN_INDEX_SETTER(methodname)` exists, compatible with NAN v1 method declarations. - -Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors). - - -### Index enumerator declaration - -JavaScript-accessible index enumerator methods should be declared with the following signature to form a Nan::IndexEnumeratorCallback: - -```c++ -typedef void(*IndexEnumeratorCallback)(const PropertyCallbackInfo&); -``` - -Example: - -```c++ -void IndexEnumeratorName(const PropertyCallbackInfo& info); -``` - -You do not need to declare a new `HandleScope` within a index enumerator as one is implicitly created for you. - -A helper macro `NAN_INDEX_ENUMERATOR(methodname)` exists, compatible with NAN v1 method declarations. - -Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors). - - -### Index deleter declaration - -JavaScript-accessible index deleter methods should be declared with the following signature to form a Nan::IndexDeleterCallback: - -```c++ -typedef void(*IndexDeleterCallback)(uint32_t, - const PropertyCallbackInfo&); -``` - -Example: - -```c++ -void IndexDeleterName(uint32_t index, const PropertyCallbackInfo& info); -``` - -You do not need to declare a new `HandleScope` within a index deleter as one is implicitly created for you. - -A helper macro `NAN_INDEX_DELETER(methodname)` exists, compatible with NAN v1 method declarations. - -Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors). - - -### Index query declaration - -JavaScript-accessible index query methods should be declared with the following signature to form a Nan::IndexQueryCallback: - -```c++ -typedef void(*IndexQueryCallback)(uint32_t, - const PropertyCallbackInfo&); -``` - -Example: - -```c++ -void IndexQueryName(uint32_t index, const PropertyCallbackInfo& info); -``` - -You do not need to declare a new `HandleScope` within a index query method as one is implicitly created for you. - -A helper macro `NAN_INDEX_QUERY(methodname)` exists, compatible with NAN v1 method declarations. - -Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors). - - -### Nan::SetMethod() - -Sets a method with a given name directly on a JavaScript object where the method has the `Nan::FunctionCallback` signature (see Method declaration). - -Signature: - -```c++ -void Nan::SetMethod(v8::Local recv, - const char *name, - Nan::FunctionCallback callback) -void Nan::SetMethod(v8::Local templ, - const char *name, - Nan::FunctionCallback callback) -``` - - -### Nan::SetPrototypeMethod() - -Sets a method with a given name on a `FunctionTemplate`'s prototype where the method has the `Nan::FunctionCallback` signature (see Method declaration). - -Signature: - -```c++ -void Nan::SetPrototypeMethod(v8::Local recv, - const char* name, - Nan::FunctionCallback callback) -``` - - -### Nan::SetAccessor() - -Sets getters and setters for a property with a given name on an `ObjectTemplate` or a plain `Object`. Accepts getters with the `Nan::GetterCallback` signature (see Getter declaration) and setters with the `Nan::SetterCallback` signature (see Setter declaration). - -Signature: - -```c++ -void SetAccessor(v8::Local tpl, - v8::Local name, - Nan::GetterCallback getter, - Nan::SetterCallback setter = 0, - v8::Local data = v8::Local(), - v8::AccessControl settings = v8::DEFAULT, - v8::PropertyAttribute attribute = v8::None, - imp::Sig signature = imp::Sig()); -bool SetAccessor(v8::Local obj, - v8::Local name, - Nan::GetterCallback getter, - Nan::SetterCallback setter = 0, - v8::Local data = v8::Local(), - v8::AccessControl settings = v8::DEFAULT, - v8::PropertyAttribute attribute = v8::None) -``` - -See the V8 [`ObjectTemplate#SetAccessor()`](https://v8docs.nodesource.com/node-8.0/db/d5f/classv8_1_1_object_template.html#aca0ed196f8a9adb1f68b1aadb6c9cd77) and [`Object#SetAccessor()`](https://v8docs.nodesource.com/node-8.0/db/d85/classv8_1_1_object.html#a3f9dee085f5ec346465f1dc924325043) for further information about how to use `Nan::SetAccessor()`. - - -### Nan::SetNamedPropertyHandler() - -Sets named property getters, setters, query, deleter and enumerator methods on an `ObjectTemplate`. Accepts: - -* Property getters with the `Nan::PropertyGetterCallback` signature (see Property getter declaration) -* Property setters with the `Nan::PropertySetterCallback` signature (see Property setter declaration) -* Property query methods with the `Nan::PropertyQueryCallback` signature (see Property query declaration) -* Property deleters with the `Nan::PropertyDeleterCallback` signature (see Property deleter declaration) -* Property enumerators with the `Nan::PropertyEnumeratorCallback` signature (see Property enumerator declaration) - -Signature: - -```c++ -void SetNamedPropertyHandler(v8::Local tpl, - Nan::PropertyGetterCallback getter, - Nan::PropertySetterCallback setter = 0, - Nan::PropertyQueryCallback query = 0, - Nan::PropertyDeleterCallback deleter = 0, - Nan::PropertyEnumeratorCallback enumerator = 0, - v8::Local data = v8::Local()) -``` - -See the V8 [`ObjectTemplate#SetNamedPropertyHandler()`](https://v8docs.nodesource.com/io.js-3.0/db/d5f/classv8_1_1_object_template.html#a34d1cc45b642cd131706663801aadd76) for further information about how to use `Nan::SetNamedPropertyHandler()`. - - -### Nan::SetIndexedPropertyHandler() - -Sets indexed property getters, setters, query, deleter and enumerator methods on an `ObjectTemplate`. Accepts: - -* Indexed property getters with the `Nan::IndexGetterCallback` signature (see Index getter declaration) -* Indexed property setters with the `Nan::IndexSetterCallback` signature (see Index setter declaration) -* Indexed property query methods with the `Nan::IndexQueryCallback` signature (see Index query declaration) -* Indexed property deleters with the `Nan::IndexDeleterCallback` signature (see Index deleter declaration) -* Indexed property enumerators with the `Nan::IndexEnumeratorCallback` signature (see Index enumerator declaration) - -Signature: - -```c++ -void SetIndexedPropertyHandler(v8::Local tpl, - Nan::IndexGetterCallback getter, - Nan::IndexSetterCallback setter = 0, - Nan::IndexQueryCallback query = 0, - Nan::IndexDeleterCallback deleter = 0, - Nan::IndexEnumeratorCallback enumerator = 0, - v8::Local data = v8::Local()) -``` - -See the V8 [`ObjectTemplate#SetIndexedPropertyHandler()`](https://v8docs.nodesource.com/node-8.0/db/d5f/classv8_1_1_object_template.html#ac89f06d634add0e890452033f7d17ff1) for further information about how to use `Nan::SetIndexedPropertyHandler()`. - - -### Nan::SetTemplate() - -Adds properties on an `Object`'s or `Function`'s template. - -Signature: - -```c++ -void Nan::SetTemplate(v8::Local templ, - const char *name, - v8::Local value); -void Nan::SetTemplate(v8::Local templ, - v8::Local name, - v8::Local value, - v8::PropertyAttribute attributes) -``` - -Calls the `Template`'s [`Set()`](https://v8docs.nodesource.com/node-8.0/db/df7/classv8_1_1_template.html#ae3fbaff137557aa6a0233bc7e52214ac). - - -### Nan::SetPrototypeTemplate() - -Adds properties on an `Object`'s or `Function`'s prototype template. - -Signature: - -```c++ -void Nan::SetPrototypeTemplate(v8::Local templ, - const char *name, - v8::Local value); -void Nan::SetPrototypeTemplate(v8::Local templ, - v8::Local name, - v8::Local value, - v8::PropertyAttribute attributes) -``` - -Calls the `FunctionTemplate`'s _PrototypeTemplate's_ [`Set()`](https://v8docs.nodesource.com/io.js-3.0/db/df7/classv8_1_1_template.html#a2db6a56597bf23c59659c0659e564ddf). - - -### Nan::SetInstanceTemplate() - -Use to add instance properties on `FunctionTemplate`'s. - -Signature: - -```c++ -void Nan::SetInstanceTemplate(v8::Local templ, - const char *name, - v8::Local value); -void Nan::SetInstanceTemplate(v8::Local templ, - v8::Local name, - v8::Local value, - v8::PropertyAttribute attributes) -``` - -Calls the `FunctionTemplate`'s _InstanceTemplate's_ [`Set()`](https://v8docs.nodesource.com/io.js-3.0/db/df7/classv8_1_1_template.html#a2db6a56597bf23c59659c0659e564ddf). - - -### Nan::SetCallHandler() - -Set the call-handler callback for a `v8::FunctionTemplate`. -This callback is called whenever the function created from this FunctionTemplate is called. - -Signature: - -```c++ -void Nan::SetCallHandler(v8::Local templ, Nan::FunctionCallback callback, v8::Local data = v8::Local()) -``` - -Calls the `FunctionTemplate`'s [`SetCallHandler()`](https://v8docs.nodesource.com/node-8.0/d8/d83/classv8_1_1_function_template.html#a2d3845db66392074c5a018a66efbfada). - - -### Nan::SetCallAsFunctionHandler() - -Sets the callback to be used when calling instances created from the `v8::ObjectTemplate` as a function. -If no callback is set, instances behave like normal JavaScript objects that cannot be called as a function. - -Signature: - -```c++ -void Nan::SetCallAsFunctionHandler(v8::Local templ, Nan::FunctionCallback callback, v8::Local data = v8::Local()) -``` - -Calls the `ObjectTemplate`'s [`SetCallAsFunctionHandler()`](https://v8docs.nodesource.com/node-8.0/db/d5f/classv8_1_1_object_template.html#a5e9612fc80bf6db8f2da199b9b0bd04e). - diff --git a/deploy/node_modules/nan/doc/new.md b/deploy/node_modules/nan/doc/new.md deleted file mode 100644 index c0734bd..0000000 --- a/deploy/node_modules/nan/doc/new.md +++ /dev/null @@ -1,147 +0,0 @@ -## New - -NAN provides a `Nan::New()` helper for the creation of new JavaScript objects in a way that's compatible across the supported versions of V8. - - - Nan::New() - - Nan::Undefined() - - Nan::Null() - - Nan::True() - - Nan::False() - - Nan::EmptyString() - - - -### Nan::New() - -`Nan::New()` should be used to instantiate new JavaScript objects. - -Refer to the specific V8 type in the [V8 documentation](https://v8docs.nodesource.com/io.js-3.0/d1/d83/classv8_1_1_data.html) for information on the types of arguments required for instantiation. - -Signatures: - -Return types are mostly omitted from the signatures for simplicity. In most cases the type will be contained within a `v8::Local`. The following types will be contained within a `Nan::MaybeLocal`: `v8::String`, `v8::Date`, `v8::RegExp`, `v8::Script`, `v8::UnboundScript`. - -Empty objects: - -```c++ -Nan::New(); -``` - -Generic single and multiple-argument: - -```c++ -Nan::New(A0 arg0); -Nan::New(A0 arg0, A1 arg1); -Nan::New(A0 arg0, A1 arg1, A2 arg2); -Nan::New(A0 arg0, A1 arg1, A2 arg2, A3 arg3); -``` - -For creating `v8::FunctionTemplate` and `v8::Function` objects: - -_The definition of `Nan::FunctionCallback` can be found in the [Method declaration](./methods.md#api_nan_method) documentation._ - -```c++ -Nan::New(Nan::FunctionCallback callback, - v8::Local data = v8::Local()); -Nan::New(Nan::FunctionCallback callback, - v8::Local data = v8::Local(), - A2 a2 = A2()); -``` - -Native number types: - -```c++ -v8::Local Nan::New(bool value); -v8::Local Nan::New(int32_t value); -v8::Local Nan::New(uint32_t value); -v8::Local Nan::New(double value); -``` - -String types: - -```c++ -Nan::MaybeLocal Nan::New(std::string const& value); -Nan::MaybeLocal Nan::New(const char * value, int length); -Nan::MaybeLocal Nan::New(const char * value); -Nan::MaybeLocal Nan::New(const uint16_t * value); -Nan::MaybeLocal Nan::New(const uint16_t * value, int length); -``` - -Specialized types: - -```c++ -v8::Local Nan::New(v8::String::ExternalStringResource * value); -v8::Local Nan::New(Nan::ExternalOneByteStringResource * value); -v8::Local Nan::New(v8::Local pattern, v8::RegExp::Flags flags); -``` - -Note that `Nan::ExternalOneByteStringResource` maps to [`v8::String::ExternalOneByteStringResource`](https://v8docs.nodesource.com/io.js-3.0/d9/db3/classv8_1_1_string_1_1_external_one_byte_string_resource.html), and `v8::String::ExternalAsciiStringResource` in older versions of V8. - - - -### Nan::Undefined() - -A helper method to reference the `v8::Undefined` object in a way that is compatible across all supported versions of V8. - -Signature: - -```c++ -v8::Local Nan::Undefined() -``` - - -### Nan::Null() - -A helper method to reference the `v8::Null` object in a way that is compatible across all supported versions of V8. - -Signature: - -```c++ -v8::Local Nan::Null() -``` - - -### Nan::True() - -A helper method to reference the `v8::Boolean` object representing the `true` value in a way that is compatible across all supported versions of V8. - -Signature: - -```c++ -v8::Local Nan::True() -``` - - -### Nan::False() - -A helper method to reference the `v8::Boolean` object representing the `false` value in a way that is compatible across all supported versions of V8. - -Signature: - -```c++ -v8::Local Nan::False() -``` - - -### Nan::EmptyString() - -Call [`v8::String::Empty`](https://v8docs.nodesource.com/io.js-3.0/d2/db3/classv8_1_1_string.html#a7c1bc8886115d7ee46f1d571dd6ebc6d) to reference the empty string in a way that is compatible across all supported versions of V8. - -Signature: - -```c++ -v8::Local Nan::EmptyString() -``` - - - -### Nan::NewOneByteString() - -An implementation of [`v8::String::NewFromOneByte()`](https://v8docs.nodesource.com/io.js-3.0/d2/db3/classv8_1_1_string.html#a5264d50b96d2c896ce525a734dc10f09) provided for consistent availability and API across supported versions of V8. Allocates a new string from Latin-1 data. - -Signature: - -```c++ -Nan::MaybeLocal Nan::NewOneByteString(const uint8_t * value, - int length = -1) -``` diff --git a/deploy/node_modules/nan/doc/node_misc.md b/deploy/node_modules/nan/doc/node_misc.md deleted file mode 100644 index 8aa080f..0000000 --- a/deploy/node_modules/nan/doc/node_misc.md +++ /dev/null @@ -1,63 +0,0 @@ -## Miscellaneous Node Helpers - - - Nan::MakeCallback() - - NAN_MODULE_INIT() - - Nan::Export() - - - -### Nan::MakeCallback() - -Wrappers around `node::MakeCallback()` providing a consistent API across all supported versions of Node. - -Use `MakeCallback()` rather than using `v8::Function#Call()` directly in order to properly process internal Node functionality including domains, async hooks, the microtask queue, and other debugging functionality. - -Signatures: - -```c++ -v8::Local Nan::MakeCallback(v8::Local target, - v8::Local func, - int argc, - v8::Local* argv); -v8::Local Nan::MakeCallback(v8::Local target, - v8::Local symbol, - int argc, - v8::Local* argv); -v8::Local Nan::MakeCallback(v8::Local target, - const char* method, - int argc, - v8::Local* argv); -``` - - - -### NAN_MODULE_INIT() - -Used to define the entry point function to a Node add-on. Creates a function with a given `name` that receives a `target` object representing the equivalent of the JavaScript `exports` object. - -See example below. - - -### Nan::Export() - -A simple helper to register a `v8::FunctionTemplate` from a JavaScript-accessible method (see [Methods](./methods.md)) as a property on an object. Can be used in a way similar to assigning properties to `module.exports` in JavaScript. - -Signature: - -```c++ -void Export(v8::Local target, const char *name, Nan::FunctionCallback f) -``` - -Also available as the shortcut `NAN_EXPORT` macro. - -Example: - -```c++ -NAN_METHOD(Foo) { - ... -} - -NAN_MODULE_INIT(Init) { - NAN_EXPORT(target, Foo); -} -``` diff --git a/deploy/node_modules/nan/doc/object_wrappers.md b/deploy/node_modules/nan/doc/object_wrappers.md deleted file mode 100644 index e89832b..0000000 --- a/deploy/node_modules/nan/doc/object_wrappers.md +++ /dev/null @@ -1,263 +0,0 @@ -## Object Wrappers - -The `ObjectWrap` class can be used to make wrapped C++ objects and a factory of wrapped objects. - - - Nan::ObjectWrap - - - -### Nan::ObjectWrap() - -A reimplementation of `node::ObjectWrap` that adds some API not present in older versions of Node. Should be preferred over `node::ObjectWrap` in all cases for consistency. - -Definition: - -```c++ -class ObjectWrap { - public: - ObjectWrap(); - - virtual ~ObjectWrap(); - - template - static inline T* Unwrap(v8::Local handle); - - inline v8::Local handle(); - - inline Nan::Persistent& persistent(); - - protected: - inline void Wrap(v8::Local handle); - - inline void MakeWeak(); - - /* Ref() marks the object as being attached to an event loop. - * Refed objects will not be garbage collected, even if - * all references are lost. - */ - virtual void Ref(); - - /* Unref() marks an object as detached from the event loop. This is its - * default state. When an object with a "weak" reference changes from - * attached to detached state it will be freed. Be careful not to access - * the object after making this call as it might be gone! - * (A "weak reference" means an object that only has a - * persistant handle.) - * - * DO NOT CALL THIS FROM DESTRUCTOR - */ - virtual void Unref(); - - int refs_; // ro -}; -``` - -See the Node documentation on [Wrapping C++ Objects](https://nodejs.org/api/addons.html#addons_wrapping_c_objects) for more details. - -### This vs. Holder - -When calling `Unwrap`, it is important that the argument is indeed some JavaScript object which got wrapped by a `Wrap` call for this class or any derived class. -The `Signature` installed by [`Nan::SetPrototypeMethod()`](methods.md#api_nan_set_prototype_method) does ensure that `info.Holder()` is just such an instance. -In Node 0.12 and later, `info.This()` will also be of such a type, since otherwise the invocation will get rejected. -However, in Node 0.10 and before it was possible to invoke a method on a JavaScript object which just had the extension type in its prototype chain. -In such a situation, calling `Unwrap` on `info.This()` will likely lead to a failed assertion causing a crash, but could lead to even more serious corruption. - -On the other hand, calling `Unwrap` in an [accessor](methods.md#api_nan_set_accessor) should not use `Holder()` if the accessor is defined on the prototype. -So either define your accessors on the instance template, -or use `This()` after verifying that it is indeed a valid object. - -### Examples - -#### Basic - -```c++ -class MyObject : public Nan::ObjectWrap { - public: - static NAN_MODULE_INIT(Init) { - v8::Local tpl = Nan::New(New); - tpl->SetClassName(Nan::New("MyObject").ToLocalChecked()); - tpl->InstanceTemplate()->SetInternalFieldCount(1); - - Nan::SetPrototypeMethod(tpl, "getHandle", GetHandle); - Nan::SetPrototypeMethod(tpl, "getValue", GetValue); - - constructor().Reset(Nan::GetFunction(tpl).ToLocalChecked()); - Nan::Set(target, Nan::New("MyObject").ToLocalChecked(), - Nan::GetFunction(tpl).ToLocalChecked()); - } - - private: - explicit MyObject(double value = 0) : value_(value) {} - ~MyObject() {} - - static NAN_METHOD(New) { - if (info.IsConstructCall()) { - double value = info[0]->IsUndefined() ? 0 : Nan::To(info[0]).FromJust(); - MyObject *obj = new MyObject(value); - obj->Wrap(info.This()); - info.GetReturnValue().Set(info.This()); - } else { - const int argc = 1; - v8::Local argv[argc] = {info[0]}; - v8::Local cons = Nan::New(constructor()); - info.GetReturnValue().Set(cons->NewInstance(argc, argv)); - } - } - - static NAN_METHOD(GetHandle) { - MyObject* obj = Nan::ObjectWrap::Unwrap(info.Holder()); - info.GetReturnValue().Set(obj->handle()); - } - - static NAN_METHOD(GetValue) { - MyObject* obj = Nan::ObjectWrap::Unwrap(info.Holder()); - info.GetReturnValue().Set(obj->value_); - } - - static inline Nan::Persistent & constructor() { - static Nan::Persistent my_constructor; - return my_constructor; - } - - double value_; -}; - -NODE_MODULE(objectwrapper, MyObject::Init) -``` - -To use in Javascript: - -```Javascript -var objectwrapper = require('bindings')('objectwrapper'); - -var obj = new objectwrapper.MyObject(5); -console.log('Should be 5: ' + obj.getValue()); -``` - -#### Factory of wrapped objects - -```c++ -class MyFactoryObject : public Nan::ObjectWrap { - public: - static NAN_MODULE_INIT(Init) { - v8::Local tpl = Nan::New(New); - tpl->InstanceTemplate()->SetInternalFieldCount(1); - - Nan::SetPrototypeMethod(tpl, "getValue", GetValue); - - constructor().Reset(Nan::GetFunction(tpl).ToLocalChecked()); - } - - static NAN_METHOD(NewInstance) { - v8::Local cons = Nan::New(constructor()); - double value = info[0]->IsNumber() ? Nan::To(info[0]).FromJust() : 0; - const int argc = 1; - v8::Local argv[1] = {Nan::New(value)}; - info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked()); - } - - // Needed for the next example: - inline double value() const { - return value_; - } - - private: - explicit MyFactoryObject(double value = 0) : value_(value) {} - ~MyFactoryObject() {} - - static NAN_METHOD(New) { - if (info.IsConstructCall()) { - double value = info[0]->IsNumber() ? Nan::To(info[0]).FromJust() : 0; - MyFactoryObject * obj = new MyFactoryObject(value); - obj->Wrap(info.This()); - info.GetReturnValue().Set(info.This()); - } else { - const int argc = 1; - v8::Local argv[argc] = {info[0]}; - v8::Local cons = Nan::New(constructor()); - info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked()); - } - } - - static NAN_METHOD(GetValue) { - MyFactoryObject* obj = ObjectWrap::Unwrap(info.Holder()); - info.GetReturnValue().Set(obj->value_); - } - - static inline Nan::Persistent & constructor() { - static Nan::Persistent my_constructor; - return my_constructor; - } - - double value_; -}; - -NAN_MODULE_INIT(Init) { - MyFactoryObject::Init(target); - Nan::Set(target, - Nan::New("newFactoryObjectInstance").ToLocalChecked(), - Nan::GetFunction( - Nan::New(MyFactoryObject::NewInstance)).ToLocalChecked() - ); -} - -NODE_MODULE(wrappedobjectfactory, Init) -``` - -To use in Javascript: - -```Javascript -var wrappedobjectfactory = require('bindings')('wrappedobjectfactory'); - -var obj = wrappedobjectfactory.newFactoryObjectInstance(10); -console.log('Should be 10: ' + obj.getValue()); -``` - -#### Passing wrapped objects around - -Use the `MyFactoryObject` class above along with the following: - -```c++ -static NAN_METHOD(Sum) { - Nan::MaybeLocal maybe1 = Nan::To(info[0]); - Nan::MaybeLocal maybe2 = Nan::To(info[1]); - - // Quick check: - if (maybe1.IsEmpty() || maybe2.IsEmpty()) { - // return value is undefined by default - return; - } - - MyFactoryObject* obj1 = - Nan::ObjectWrap::Unwrap(maybe1.ToLocalChecked()); - MyFactoryObject* obj2 = - Nan::ObjectWrap::Unwrap(maybe2.ToLocalChecked()); - - info.GetReturnValue().Set(Nan::New(obj1->value() + obj2->value())); -} - -NAN_MODULE_INIT(Init) { - MyFactoryObject::Init(target); - Nan::Set(target, - Nan::New("newFactoryObjectInstance").ToLocalChecked(), - Nan::GetFunction( - Nan::New(MyFactoryObject::NewInstance)).ToLocalChecked() - ); - Nan::Set(target, - Nan::New("sum").ToLocalChecked(), - Nan::GetFunction(Nan::New(Sum)).ToLocalChecked() - ); -} - -NODE_MODULE(myaddon, Init) -``` - -To use in Javascript: - -```Javascript -var myaddon = require('bindings')('myaddon'); - -var obj1 = myaddon.newFactoryObjectInstance(5); -var obj2 = myaddon.newFactoryObjectInstance(10); -console.log('sum of object values: ' + myaddon.sum(obj1, obj2)); -``` diff --git a/deploy/node_modules/nan/doc/persistent.md b/deploy/node_modules/nan/doc/persistent.md deleted file mode 100644 index 743b44a..0000000 --- a/deploy/node_modules/nan/doc/persistent.md +++ /dev/null @@ -1,295 +0,0 @@ -## Persistent references - -An object reference that is independent of any `HandleScope` is a _persistent_ reference. Where a `Local` handle only lives as long as the `HandleScope` in which it was allocated, a `Persistent` handle remains valid until it is explicitly disposed. - -Due to the evolution of the V8 API, it is necessary for NAN to provide a wrapper implementation of the `Persistent` classes to supply compatibility across the V8 versions supported. - - - Nan::PersistentBase & v8::PersistentBase - - Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits - - Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits - - Nan::Persistent - - Nan::Global - - Nan::WeakCallbackInfo - - Nan::WeakCallbackType - -Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://developers.google.com/v8/embed#handles). - - -### Nan::PersistentBase & v8::PersistentBase - -A persistent handle contains a reference to a storage cell in V8 which holds an object value and which is updated by the garbage collector whenever the object is moved. A new storage cell can be created using the constructor or `Nan::PersistentBase::Reset()`. Existing handles can be disposed using an argument-less `Nan::PersistentBase::Reset()`. - -Definition: - -_(note: this is implemented as `Nan::PersistentBase` for older versions of V8 and the native `v8::PersistentBase` is used for newer versions of V8)_ - -```c++ -template class PersistentBase { - public: - /** - * If non-empty, destroy the underlying storage cell - */ - void Reset(); - - /** - * If non-empty, destroy the underlying storage cell and create a new one with - * the contents of another if it is also non-empty - */ - template void Reset(const v8::Local &other); - - /** - * If non-empty, destroy the underlying storage cell and create a new one with - * the contents of another if it is also non-empty - */ - template void Reset(const PersistentBase &other); - - /** - * If non-empty, destroy the underlying storage cell - * IsEmpty() will return true after this call. - */ - bool IsEmpty(); - - void Empty(); - - template bool operator==(const PersistentBase &that); - - template bool operator==(const v8::Local &that); - - template bool operator!=(const PersistentBase &that); - - template bool operator!=(const v8::Local &that); - - /** - * Install a finalization callback on this object. - * NOTE: There is no guarantee as to *when* or even *if* the callback is - * invoked. The invocation is performed solely on a best effort basis. - * As always, GC-based finalization should *not* be relied upon for any - * critical form of resource management! At the moment you can either - * specify a parameter for the callback or the location of two internal - * fields in the dying object. - */ - template - void SetWeak(P *parameter, - typename WeakCallbackInfo

::Callback callback, - WeakCallbackType type); - - void ClearWeak(); - - /** - * Marks the reference to this object independent. Garbage collector is free - * to ignore any object groups containing this object. Weak callback for an - * independent handle should not assume that it will be preceded by a global - * GC prologue callback or followed by a global GC epilogue callback. - */ - void MarkIndependent() const; - - bool IsIndependent() const; - - /** Checks if the handle holds the only reference to an object. */ - bool IsNearDeath() const; - - /** Returns true if the handle's reference is weak. */ - bool IsWeak() const -}; -``` - -See the V8 documentation for [`PersistentBase`](https://v8docs.nodesource.com/io.js-3.0/d4/dca/classv8_1_1_persistent_base.html) for further information. - -**Tip:** To get a `v8::Local` reference to the original object back from a `PersistentBase` or `Persistent` object: - -```c++ -v8::Local object = Nan::New(persistent); -``` - - -### Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits - -Default traits for `Nan::Persistent`. This class does not allow use of the a copy constructor or assignment operator. At present `kResetInDestructor` is not set, but that will change in a future version. - -Definition: - -_(note: this is implemented as `Nan::NonCopyablePersistentTraits` for older versions of V8 and the native `v8::NonCopyablePersistentTraits` is used for newer versions of V8)_ - -```c++ -template class NonCopyablePersistentTraits { - public: - typedef Persistent > NonCopyablePersistent; - - static const bool kResetInDestructor = false; - - template - static void Copy(const Persistent &source, - NonCopyablePersistent *dest); - - template static void Uncompilable(); -}; -``` - -See the V8 documentation for [`NonCopyablePersistentTraits`](https://v8docs.nodesource.com/io.js-3.0/de/d73/classv8_1_1_non_copyable_persistent_traits.html) for further information. - - -### Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits - -A helper class of traits to allow copying and assignment of `Persistent`. This will clone the contents of storage cell, but not any of the flags, etc.. - -Definition: - -_(note: this is implemented as `Nan::CopyablePersistentTraits` for older versions of V8 and the native `v8::NonCopyablePersistentTraits` is used for newer versions of V8)_ - -```c++ -template -class CopyablePersistentTraits { - public: - typedef Persistent > CopyablePersistent; - - static const bool kResetInDestructor = true; - - template - static void Copy(const Persistent &source, - CopyablePersistent *dest); -}; -``` - -See the V8 documentation for [`CopyablePersistentTraits`](https://v8docs.nodesource.com/io.js-3.0/da/d5c/structv8_1_1_copyable_persistent_traits.html) for further information. - - -### Nan::Persistent - -A type of `PersistentBase` which allows copy and assignment. Copy, assignment and destructor behavior is controlled by the traits class `M`. - -Definition: - -```c++ -template > -class Persistent; - -template class Persistent : public PersistentBase { - public: - /** - * A Persistent with no storage cell. - */ - Persistent(); - - /** - * Construct a Persistent from a v8::Local. When the v8::Local is non-empty, a - * new storage cell is created pointing to the same object, and no flags are - * set. - */ - template Persistent(v8::Local that); - - /** - * Construct a Persistent from a Persistent. When the Persistent is non-empty, - * a new storage cell is created pointing to the same object, and no flags are - * set. - */ - Persistent(const Persistent &that); - - /** - * The copy constructors and assignment operator create a Persistent exactly - * as the Persistent constructor, but the Copy function from the traits class - * is called, allowing the setting of flags based on the copied Persistent. - */ - Persistent &operator=(const Persistent &that); - - template - Persistent &operator=(const Persistent &that); - - /** - * The destructor will dispose the Persistent based on the kResetInDestructor - * flags in the traits class. Since not calling dispose can result in a - * memory leak, it is recommended to always set this flag. - */ - ~Persistent(); -}; -``` - -See the V8 documentation for [`Persistent`](https://v8docs.nodesource.com/io.js-3.0/d2/d78/classv8_1_1_persistent.html) for further information. - - -### Nan::Global - -A type of `PersistentBase` which has move semantics. - -```c++ -template class Global : public PersistentBase { - public: - /** - * A Global with no storage cell. - */ - Global(); - - /** - * Construct a Global from a v8::Local. When the v8::Local is non-empty, a new - * storage cell is created pointing to the same object, and no flags are set. - */ - template Global(v8::Local that); - /** - * Construct a Global from a PersistentBase. When the Persistent is non-empty, - * a new storage cell is created pointing to the same object, and no flags are - * set. - */ - template Global(const PersistentBase &that); - - /** - * Pass allows returning globals from functions, etc. - */ - Global Pass(); -}; -``` - -See the V8 documentation for [`Global`](https://v8docs.nodesource.com/io.js-3.0/d5/d40/classv8_1_1_global.html) for further information. - - -### Nan::WeakCallbackInfo - -`Nan::WeakCallbackInfo` is used as an argument when setting a persistent reference as weak. You may need to free any external resources attached to the object. It is a mirror of `v8:WeakCallbackInfo` as found in newer versions of V8. - -Definition: - -```c++ -template class WeakCallbackInfo { - public: - typedef void (*Callback)(const WeakCallbackInfo& data); - - v8::Isolate *GetIsolate() const; - - /** - * Get the parameter that was associated with the weak handle. - */ - T *GetParameter() const; - - /** - * Get pointer from internal field, index can be 0 or 1. - */ - void *GetInternalField(int index) const; -}; -``` - -Example usage: - -```c++ -void weakCallback(const WeakCallbackInfo &data) { - int *parameter = data.GetParameter(); - delete parameter; -} - -Persistent obj; -int *data = new int(0); -obj.SetWeak(data, callback, WeakCallbackType::kParameter); -``` - -See the V8 documentation for [`WeakCallbackInfo`](https://v8docs.nodesource.com/io.js-3.0/d8/d06/classv8_1_1_weak_callback_info.html) for further information. - - -### Nan::WeakCallbackType - -Represents the type of a weak callback. -A weak callback of type `kParameter` makes the supplied parameter to `Nan::PersistentBase::SetWeak` available through `WeakCallbackInfo::GetParameter`. -A weak callback of type `kInternalFields` uses up to two internal fields at indices 0 and 1 on the `Nan::PersistentBase` being made weak. -Note that only `v8::Object`s and derivatives can have internal fields. - -Definition: - -```c++ -enum class WeakCallbackType { kParameter, kInternalFields }; -``` diff --git a/deploy/node_modules/nan/doc/scopes.md b/deploy/node_modules/nan/doc/scopes.md deleted file mode 100644 index 060c8e4..0000000 --- a/deploy/node_modules/nan/doc/scopes.md +++ /dev/null @@ -1,73 +0,0 @@ -## Scopes - -A _local handle_ is a pointer to an object. All V8 objects are accessed using handles, they are necessary because of the way the V8 garbage collector works. - -A handle scope can be thought of as a container for any number of handles. When you've finished with your handles, instead of deleting each one individually you can simply delete their scope. - -The creation of `HandleScope` objects is different across the supported versions of V8. Therefore, NAN provides its own implementations that can be used safely across these. - - - Nan::HandleScope - - Nan::EscapableHandleScope - -Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://github.com/v8/v8/wiki/Embedder%27s%20Guide#handles-and-garbage-collection). - - -### Nan::HandleScope - -A simple wrapper around [`v8::HandleScope`](https://v8docs.nodesource.com/io.js-3.0/d3/d95/classv8_1_1_handle_scope.html). - -Definition: - -```c++ -class Nan::HandleScope { - public: - Nan::HandleScope(); - static int NumberOfHandles(); -}; -``` - -Allocate a new `Nan::HandleScope` whenever you are creating new V8 JavaScript objects. Note that an implicit `HandleScope` is created for you on JavaScript-accessible methods so you do not need to insert one yourself. - -Example: - -```c++ -// new object is created, it needs a new scope: -void Pointless() { - Nan::HandleScope scope; - v8::Local obj = Nan::New(); -} - -// JavaScript-accessible method already has a HandleScope -NAN_METHOD(Pointless2) { - v8::Local obj = Nan::New(); -} -``` - - -### Nan::EscapableHandleScope - -Similar to [`Nan::HandleScope`](#api_nan_handle_scope) but should be used in cases where a function needs to return a V8 JavaScript type that has been created within it. - -Definition: - -```c++ -class Nan::EscapableHandleScope { - public: - Nan::EscapableHandleScope(); - static int NumberOfHandles(); - template v8::Local Escape(v8::Local value); -} -``` - -Use `Escape(value)` to return the object. - -Example: - -```c++ -v8::Local EmptyObj() { - Nan::EscapableHandleScope scope; - v8::Local obj = Nan::New(); - return scope.Escape(obj); -} -``` - diff --git a/deploy/node_modules/nan/doc/script.md b/deploy/node_modules/nan/doc/script.md deleted file mode 100644 index 1267b5e..0000000 --- a/deploy/node_modules/nan/doc/script.md +++ /dev/null @@ -1,38 +0,0 @@ -## Script - -NAN provides a `v8::Script` helpers as the API has changed over the supported versions of V8. - - - Nan::CompileScript() - - Nan::RunScript() - - - -### Nan::CompileScript() - -A wrapper around [`v8::Script::Compile()`](https://v8docs.nodesource.com/io.js-3.0/da/da5/classv8_1_1_script_compiler.html#a93f5072a0db55d881b969e9fc98e564b). - -Note that `Nan::BoundScript` is an alias for `v8::Script`. - -Signature: - -```c++ -Nan::MaybeLocal Nan::CompileScript( - v8::Local s, - const v8::ScriptOrigin& origin); -Nan::MaybeLocal Nan::CompileScript(v8::Local s); -``` - - - -### Nan::RunScript() - -Calls `script->Run()` or `script->BindToCurrentContext()->Run(Nan::GetCurrentContext())`. - -Note that `Nan::BoundScript` is an alias for `v8::Script` and `Nan::UnboundScript` is an alias for `v8::UnboundScript` where available and `v8::Script` on older versions of V8. - -Signature: - -```c++ -Nan::MaybeLocal Nan::RunScript(v8::Local script) -Nan::MaybeLocal Nan::RunScript(v8::Local script) -``` diff --git a/deploy/node_modules/nan/doc/string_bytes.md b/deploy/node_modules/nan/doc/string_bytes.md deleted file mode 100644 index 7c1bd32..0000000 --- a/deploy/node_modules/nan/doc/string_bytes.md +++ /dev/null @@ -1,62 +0,0 @@ -## Strings & Bytes - -Miscellaneous string & byte encoding and decoding functionality provided for compatibility across supported versions of V8 and Node. Implemented by NAN to ensure that all encoding types are supported, even for older versions of Node where they are missing. - - - Nan::Encoding - - Nan::Encode() - - Nan::DecodeBytes() - - Nan::DecodeWrite() - - - -### Nan::Encoding - -An enum representing the supported encoding types. A copy of `node::encoding` that is consistent across versions of Node. - -Definition: - -```c++ -enum Nan::Encoding { ASCII, UTF8, BASE64, UCS2, BINARY, HEX, BUFFER } -``` - - - -### Nan::Encode() - -A wrapper around `node::Encode()` that provides a consistent implementation across supported versions of Node. - -Signature: - -```c++ -v8::Local Nan::Encode(const void *buf, - size_t len, - enum Nan::Encoding encoding = BINARY); -``` - - - -### Nan::DecodeBytes() - -A wrapper around `node::DecodeBytes()` that provides a consistent implementation across supported versions of Node. - -Signature: - -```c++ -ssize_t Nan::DecodeBytes(v8::Local val, - enum Nan::Encoding encoding = BINARY); -``` - - - -### Nan::DecodeWrite() - -A wrapper around `node::DecodeWrite()` that provides a consistent implementation across supported versions of Node. - -Signature: - -```c++ -ssize_t Nan::DecodeWrite(char *buf, - size_t len, - v8::Local val, - enum Nan::Encoding encoding = BINARY); -``` diff --git a/deploy/node_modules/nan/doc/v8_internals.md b/deploy/node_modules/nan/doc/v8_internals.md deleted file mode 100644 index ce5f230..0000000 --- a/deploy/node_modules/nan/doc/v8_internals.md +++ /dev/null @@ -1,199 +0,0 @@ -## V8 internals - -The hooks to access V8 internals—including GC and statistics—are different across the supported versions of V8, therefore NAN provides its own hooks that call the appropriate V8 methods. - - - NAN_GC_CALLBACK() - - Nan::AddGCEpilogueCallback() - - Nan::RemoveGCEpilogueCallback() - - Nan::AddGCPrologueCallback() - - Nan::RemoveGCPrologueCallback() - - Nan::GetHeapStatistics() - - Nan::SetCounterFunction() - - Nan::SetCreateHistogramFunction() - - Nan::SetAddHistogramSampleFunction() - - Nan::IdleNotification() - - Nan::LowMemoryNotification() - - Nan::ContextDisposedNotification() - - Nan::GetInternalFieldPointer() - - Nan::SetInternalFieldPointer() - - Nan::AdjustExternalMemory() - - - -### NAN_GC_CALLBACK(callbackname) - -Use `NAN_GC_CALLBACK` to declare your callbacks for `Nan::AddGCPrologueCallback()` and `Nan::AddGCEpilogueCallback()`. Your new method receives the arguments `v8::GCType type` and `v8::GCCallbackFlags flags`. - -```c++ -static Nan::Persistent callback; - -NAN_GC_CALLBACK(gcPrologueCallback) { - v8::Local argv[] = { Nan::New("prologue").ToLocalChecked() }; - Nan::MakeCallback(Nan::GetCurrentContext()->Global(), Nan::New(callback), 1, argv); -} - -NAN_METHOD(Hook) { - callback.Reset(args[0].As()); - Nan::AddGCPrologueCallback(gcPrologueCallback); - info.GetReturnValue().Set(info.Holder()); -} -``` - - -### Nan::AddGCEpilogueCallback() - -Signature: - -```c++ -void Nan::AddGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback, v8::GCType gc_type_filter = v8::kGCTypeAll) -``` - -Calls V8's [`AddGCEpilogueCallback()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a90d1860babc76059c62514b422f56960). - - -### Nan::RemoveGCEpilogueCallback() - -Signature: - -```c++ -void Nan::RemoveGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback) -``` - -Calls V8's [`RemoveGCEpilogueCallback()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a05c60859fd4b8e96bfcd451281ed6c7c). - - -### Nan::AddGCPrologueCallback() - -Signature: - -```c++ -void Nan::AddGCPrologueCallback(v8::Isolate::GCPrologueCallback, v8::GCType gc_type_filter callback) -``` - -Calls V8's [`AddGCPrologueCallback()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#ab4b87b8f9f8e5bf95eba4009357e001f). - - -### Nan::RemoveGCPrologueCallback() - -Signature: - -```c++ -void Nan::RemoveGCPrologueCallback(v8::Isolate::GCPrologueCallback callback) -``` - -Calls V8's [`RemoveGCEpilogueCallback()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a9f6c51932811593f81ff30b949124186). - - -### Nan::GetHeapStatistics() - -Signature: - -```c++ -void Nan::GetHeapStatistics(v8::HeapStatistics *heap_statistics) -``` - -Calls V8's [`GetHeapStatistics()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a5593ac74687b713095c38987e5950b34). - - -### Nan::SetCounterFunction() - -Signature: - -```c++ -void Nan::SetCounterFunction(v8::CounterLookupCallback cb) -``` - -Calls V8's [`SetCounterFunction()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a045d7754e62fa0ec72ae6c259b29af94). - - -### Nan::SetCreateHistogramFunction() - -Signature: - -```c++ -void Nan::SetCreateHistogramFunction(v8::CreateHistogramCallback cb) -``` - -Calls V8's [`SetCreateHistogramFunction()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a542d67e85089cb3f92aadf032f99e732). - - -### Nan::SetAddHistogramSampleFunction() - -Signature: - -```c++ -void Nan::SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) -``` - -Calls V8's [`SetAddHistogramSampleFunction()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#aeb420b690bc2c216882d6fdd00ddd3ea). - - -### Nan::IdleNotification() - -Signature: - -```c++ -void Nan::IdleNotification(v8::HeapStatistics *heap_statistics) -``` - -Calls V8's [`IdleNotification()` or `IdleNotificationDeadline()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#ad6a2a02657f5425ad460060652a5a118) depending on V8 version. - - -### Nan::LowMemoryNotification() - -Signature: - -```c++ -void Nan::LowMemoryNotification() -``` - -Calls V8's [`LowMemoryNotification()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a24647f61d6b41f69668094bdcd6ea91f). - - -### Nan::ContextDisposedNotification() - -Signature: - -```c++ -void Nan::ContextDisposedNotification() -``` - -Calls V8's [`ContextDisposedNotification()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#ad7f5dc559866343fe6cd8db1f134d48b). - - -### Nan::GetInternalFieldPointer() - -Gets a pointer to the internal field with at `index` from a V8 `Object` handle. - -Signature: - -```c++ -void* Nan::GetInternalFieldPointer(v8::Local object, int index) -``` - -Calls the Object's [`GetAlignedPointerFromInternalField()` or `GetPointerFromInternalField()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#ab3c57184263cf29963ef0017bec82281) depending on the version of V8. - - -### Nan::SetInternalFieldPointer() - -Sets the value of the internal field at `index` on a V8 `Object` handle. - -Signature: - -```c++ -void Nan::SetInternalFieldPointer(v8::Local object, int index, void* value) -``` - -Calls the Object's [`SetAlignedPointerInInternalField()` or `SetPointerInInternalField()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#ad7f5dc559866343fe6cd8db1f134d48b) depending on the version of V8. - - -### Nan::AdjustExternalMemory() - -Signature: - -```c++ -int Nan::AdjustExternalMemory(int bytesChange) -``` - -Calls V8's [`AdjustAmountOfExternalAllocatedMemory()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#ae1a59cac60409d3922582c4af675473e). - diff --git a/deploy/node_modules/nan/doc/v8_misc.md b/deploy/node_modules/nan/doc/v8_misc.md deleted file mode 100644 index 64f736d..0000000 --- a/deploy/node_modules/nan/doc/v8_misc.md +++ /dev/null @@ -1,85 +0,0 @@ -## Miscellaneous V8 Helpers - - - Nan::Utf8String - - Nan::GetCurrentContext() - - Nan::SetIsolateData() - - Nan::GetIsolateData() - - Nan::TypedArrayContents - - - -### Nan::Utf8String - -Converts an object to a UTF-8-encoded character array. If conversion to a string fails (e.g. due to an exception in the toString() method of the object) then the length() method returns 0 and the * operator returns NULL. The underlying memory used for this object is managed by the object. - -An implementation of [`v8::String::Utf8Value`](https://v8docs.nodesource.com/io.js-3.0/d4/d1b/classv8_1_1_string_1_1_utf8_value.html) that is consistent across all supported versions of V8. - -Definition: - -```c++ -class Nan::Utf8String { - public: - Nan::Utf8String(v8::Local from); - - int length() const; - - char* operator*(); - const char* operator*() const; -}; -``` - - -### Nan::GetCurrentContext() - -A call to [`v8::Isolate::GetCurrent()->GetCurrentContext()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a81c7a1ed7001ae2a65e89107f75fd053) that works across all supported versions of V8. - -Signature: - -```c++ -v8::Local Nan::GetCurrentContext() -``` - - -### Nan::SetIsolateData() - -A helper to provide a consistent API to [`v8::Isolate#SetData()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a7acadfe7965997e9c386a05f098fbe36). - -Signature: - -```c++ -void Nan::SetIsolateData(v8::Isolate *isolate, T *data) -``` - - - -### Nan::GetIsolateData() - -A helper to provide a consistent API to [`v8::Isolate#GetData()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#aabd223436bc1100a787dadaa024c6257). - -Signature: - -```c++ -T *Nan::GetIsolateData(v8::Isolate *isolate) -``` - - -### Nan::TypedArrayContents - -A helper class for accessing the contents of an ArrayBufferView (aka a typedarray) from C++. If the input array is not a valid typedarray, then the data pointer of TypedArrayContents will default to `NULL` and the length will be 0. If the data pointer is not compatible with the alignment requirements of type, an assertion error will fail. - -Note that you must store a reference to the `array` object while you are accessing its contents. - -Definition: - -```c++ -template -class Nan::TypedArrayContents { - public: - TypedArrayContents(v8::Local array); - - size_t length() const; - - T* const operator*(); - const T* const operator*() const; -}; -``` diff --git a/deploy/node_modules/nan/include_dirs.js b/deploy/node_modules/nan/include_dirs.js deleted file mode 100644 index 4f1dfb4..0000000 --- a/deploy/node_modules/nan/include_dirs.js +++ /dev/null @@ -1 +0,0 @@ -console.log(require('path').relative('.', __dirname)); diff --git a/deploy/node_modules/nan/nan.h b/deploy/node_modules/nan/nan.h deleted file mode 100644 index ffbf960..0000000 --- a/deploy/node_modules/nan/nan.h +++ /dev/null @@ -1,2321 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors: - * - Rod Vagg - * - Benjamin Byholm - * - Trevor Norris - * - Nathan Rajlich - * - Brett Lawson - * - Ben Noordhuis - * - David Siegel - * - Michael Ira Krufky - * - * MIT License - * - * Version 2.7.0: current Node 8.4.0, Node 12: 0.12.18, Node 10: 0.10.48, iojs: 3.3.1 - * - * See https://github.com/nodejs/nan for the latest update to this file - **********************************************************************************/ - -#ifndef NAN_H_ -#define NAN_H_ - -#include - -#define NODE_0_10_MODULE_VERSION 11 -#define NODE_0_12_MODULE_VERSION 14 -#define ATOM_0_21_MODULE_VERSION 41 -#define IOJS_1_0_MODULE_VERSION 42 -#define IOJS_1_1_MODULE_VERSION 43 -#define IOJS_2_0_MODULE_VERSION 44 -#define IOJS_3_0_MODULE_VERSION 45 -#define NODE_4_0_MODULE_VERSION 46 -#define NODE_5_0_MODULE_VERSION 47 -#define NODE_6_0_MODULE_VERSION 48 -#define NODE_7_0_MODULE_VERSION 51 - -#ifdef _MSC_VER -# define NAN_HAS_CPLUSPLUS_11 (_MSC_VER >= 1800) -#else -# define NAN_HAS_CPLUSPLUS_11 (__cplusplus >= 201103L) -#endif - -#if NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION && !NAN_HAS_CPLUSPLUS_11 -# error This version of node/NAN/v8 requires a C++11 compiler -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#if defined(_MSC_VER) -# pragma warning( push ) -# pragma warning( disable : 4530 ) -# include -# include -# pragma warning( pop ) -#else -# include -# include -#endif - -// uv helpers -#ifdef UV_VERSION_MAJOR -# ifndef UV_VERSION_PATCH -# define UV_VERSION_PATCH 0 -# endif -# define NAUV_UVVERSION ((UV_VERSION_MAJOR << 16) | \ - (UV_VERSION_MINOR << 8) | \ - (UV_VERSION_PATCH)) -#else -# define NAUV_UVVERSION 0x000b00 -#endif - -#if NAUV_UVVERSION < 0x000b0b -# ifdef WIN32 -# include -# else -# include -# endif -#endif - -namespace Nan { - -#define NAN_INLINE inline // TODO(bnoordhuis) Remove in v3.0.0. - -#if defined(__GNUC__) && \ - !(defined(V8_DISABLE_DEPRECATIONS) && V8_DISABLE_DEPRECATIONS) -# define NAN_DEPRECATED __attribute__((deprecated)) -#elif defined(_MSC_VER) && \ - !(defined(V8_DISABLE_DEPRECATIONS) && V8_DISABLE_DEPRECATIONS) -# define NAN_DEPRECATED __declspec(deprecated) -#else -# define NAN_DEPRECATED -#endif - -#if NAN_HAS_CPLUSPLUS_11 -# define NAN_DISALLOW_ASSIGN(CLASS) void operator=(const CLASS&) = delete; -# define NAN_DISALLOW_COPY(CLASS) CLASS(const CLASS&) = delete; -# define NAN_DISALLOW_MOVE(CLASS) \ - CLASS(CLASS&&) = delete; /* NOLINT(build/c++11) */ \ - void operator=(CLASS&&) = delete; -#else -# define NAN_DISALLOW_ASSIGN(CLASS) void operator=(const CLASS&); -# define NAN_DISALLOW_COPY(CLASS) CLASS(const CLASS&); -# define NAN_DISALLOW_MOVE(CLASS) -#endif - -#define NAN_DISALLOW_ASSIGN_COPY(CLASS) \ - NAN_DISALLOW_ASSIGN(CLASS) \ - NAN_DISALLOW_COPY(CLASS) - -#define NAN_DISALLOW_ASSIGN_MOVE(CLASS) \ - NAN_DISALLOW_ASSIGN(CLASS) \ - NAN_DISALLOW_MOVE(CLASS) - -#define NAN_DISALLOW_COPY_MOVE(CLASS) \ - NAN_DISALLOW_COPY(CLASS) \ - NAN_DISALLOW_MOVE(CLASS) - -#define NAN_DISALLOW_ASSIGN_COPY_MOVE(CLASS) \ - NAN_DISALLOW_ASSIGN(CLASS) \ - NAN_DISALLOW_COPY(CLASS) \ - NAN_DISALLOW_MOVE(CLASS) - -#define TYPE_CHECK(T, S) \ - while (false) { \ - *(static_cast(0)) = static_cast(0); \ - } - -//=== RegistrationFunction ===================================================== - -#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION - typedef v8::Handle ADDON_REGISTER_FUNCTION_ARGS_TYPE; -#else - typedef v8::Local ADDON_REGISTER_FUNCTION_ARGS_TYPE; -#endif - -#define NAN_MODULE_INIT(name) \ - void name(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) - -//=== CallbackInfo ============================================================= - -#include "nan_callbacks.h" // NOLINT(build/include) - -//============================================================================== - -#if (NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION) -typedef v8::Script UnboundScript; -typedef v8::Script BoundScript; -#else -typedef v8::UnboundScript UnboundScript; -typedef v8::Script BoundScript; -#endif - -#if (NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION) -typedef v8::String::ExternalAsciiStringResource - ExternalOneByteStringResource; -#else -typedef v8::String::ExternalOneByteStringResource - ExternalOneByteStringResource; -#endif - -#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) -template -class NonCopyablePersistentTraits : - public v8::NonCopyablePersistentTraits {}; -template -class CopyablePersistentTraits : - public v8::CopyablePersistentTraits {}; - -template -class PersistentBase : - public v8::PersistentBase {}; - -template > -class Persistent; -#else -template class NonCopyablePersistentTraits; -template class PersistentBase; -template class WeakCallbackData; -template > -class Persistent; -#endif // NODE_MODULE_VERSION - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) -# include "nan_maybe_43_inl.h" // NOLINT(build/include) -#else -# include "nan_maybe_pre_43_inl.h" // NOLINT(build/include) -#endif - -#include "nan_converters.h" // NOLINT(build/include) -#include "nan_new.h" // NOLINT(build/include) - -#if NAUV_UVVERSION < 0x000b17 -#define NAUV_WORK_CB(func) \ - void func(uv_async_t *async, int) -#else -#define NAUV_WORK_CB(func) \ - void func(uv_async_t *async) -#endif - -#if NAUV_UVVERSION >= 0x000b0b - -typedef uv_key_t nauv_key_t; - -inline int nauv_key_create(nauv_key_t *key) { - return uv_key_create(key); -} - -inline void nauv_key_delete(nauv_key_t *key) { - uv_key_delete(key); -} - -inline void* nauv_key_get(nauv_key_t *key) { - return uv_key_get(key); -} - -inline void nauv_key_set(nauv_key_t *key, void *value) { - uv_key_set(key, value); -} - -#else - -/* Implement thread local storage for older versions of libuv. - * This is essentially a backport of libuv commit 5d2434bf - * written by Ben Noordhuis, adjusted for names and inline. - */ - -#ifndef WIN32 - -typedef pthread_key_t nauv_key_t; - -inline int nauv_key_create(nauv_key_t* key) { - return -pthread_key_create(key, NULL); -} - -inline void nauv_key_delete(nauv_key_t* key) { - if (pthread_key_delete(*key)) - abort(); -} - -inline void* nauv_key_get(nauv_key_t* key) { - return pthread_getspecific(*key); -} - -inline void nauv_key_set(nauv_key_t* key, void* value) { - if (pthread_setspecific(*key, value)) - abort(); -} - -#else - -typedef struct { - DWORD tls_index; -} nauv_key_t; - -inline int nauv_key_create(nauv_key_t* key) { - key->tls_index = TlsAlloc(); - if (key->tls_index == TLS_OUT_OF_INDEXES) - return UV_ENOMEM; - return 0; -} - -inline void nauv_key_delete(nauv_key_t* key) { - if (TlsFree(key->tls_index) == FALSE) - abort(); - key->tls_index = TLS_OUT_OF_INDEXES; -} - -inline void* nauv_key_get(nauv_key_t* key) { - void* value = TlsGetValue(key->tls_index); - if (value == NULL) - if (GetLastError() != ERROR_SUCCESS) - abort(); - return value; -} - -inline void nauv_key_set(nauv_key_t* key, void* value) { - if (TlsSetValue(key->tls_index, value) == FALSE) - abort(); -} - -#endif -#endif - -#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION -template -v8::Local New(v8::Handle); -#endif - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) - typedef v8::WeakCallbackType WeakCallbackType; -#else -struct WeakCallbackType { - enum E {kParameter, kInternalFields}; - E type; - WeakCallbackType(E other) : type(other) {} // NOLINT(runtime/explicit) - inline bool operator==(E other) { return other == this->type; } - inline bool operator!=(E other) { return !operator==(other); } -}; -#endif - -template class WeakCallbackInfo; - -#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION -# include "nan_persistent_12_inl.h" // NOLINT(build/include) -#else -# include "nan_persistent_pre_12_inl.h" // NOLINT(build/include) -#endif - -namespace imp { - static const size_t kMaxLength = 0x3fffffff; - // v8::String::REPLACE_INVALID_UTF8 was introduced - // in node.js v0.10.29 and v0.8.27. -#if NODE_MAJOR_VERSION > 0 || \ - NODE_MINOR_VERSION > 10 || \ - NODE_MINOR_VERSION == 10 && NODE_PATCH_VERSION >= 29 || \ - NODE_MINOR_VERSION == 8 && NODE_PATCH_VERSION >= 27 - static const unsigned kReplaceInvalidUtf8 = v8::String::REPLACE_INVALID_UTF8; -#else - static const unsigned kReplaceInvalidUtf8 = 0; -#endif -} // end of namespace imp - -//=== HandleScope ============================================================== - -class HandleScope { - v8::HandleScope scope; - - public: -#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION - inline HandleScope() : scope(v8::Isolate::GetCurrent()) {} - inline static int NumberOfHandles() { - return v8::HandleScope::NumberOfHandles(v8::Isolate::GetCurrent()); - } -#else - inline HandleScope() : scope() {} - inline static int NumberOfHandles() { - return v8::HandleScope::NumberOfHandles(); - } -#endif - - private: - // Make it hard to create heap-allocated or illegal handle scopes by - // disallowing certain operations. - HandleScope(const HandleScope &); - void operator=(const HandleScope &); - void *operator new(size_t size); - void operator delete(void *, size_t) { - abort(); - } -}; - -class EscapableHandleScope { - public: -#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION - inline EscapableHandleScope() : scope(v8::Isolate::GetCurrent()) {} - - inline static int NumberOfHandles() { - return v8::EscapableHandleScope::NumberOfHandles(v8::Isolate::GetCurrent()); - } - - template - inline v8::Local Escape(v8::Local value) { - return scope.Escape(value); - } - - private: - v8::EscapableHandleScope scope; -#else - inline EscapableHandleScope() : scope() {} - - inline static int NumberOfHandles() { - return v8::HandleScope::NumberOfHandles(); - } - - template - inline v8::Local Escape(v8::Local value) { - return scope.Close(value); - } - - private: - v8::HandleScope scope; -#endif - - private: - // Make it hard to create heap-allocated or illegal handle scopes by - // disallowing certain operations. - EscapableHandleScope(const EscapableHandleScope &); - void operator=(const EscapableHandleScope &); - void *operator new(size_t size); - void operator delete(void *, size_t) { - abort(); - } -}; - -//=== TryCatch ================================================================= - -class TryCatch { - v8::TryCatch try_catch_; - friend void FatalException(const TryCatch&); - - public: -#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION - TryCatch() : try_catch_(v8::Isolate::GetCurrent()) {} -#endif - - inline bool HasCaught() const { return try_catch_.HasCaught(); } - - inline bool CanContinue() const { return try_catch_.CanContinue(); } - - inline v8::Local ReThrow() { -#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION - return New(try_catch_.ReThrow()); -#else - return try_catch_.ReThrow(); -#endif - } - - inline v8::Local Exception() const { - return try_catch_.Exception(); - } - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) - inline v8::MaybeLocal StackTrace() const { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(try_catch_.StackTrace(isolate->GetCurrentContext()) - .FromMaybe(v8::Local())); - } -#else - inline MaybeLocal StackTrace() const { - return try_catch_.StackTrace(); - } -#endif - - inline v8::Local Message() const { - return try_catch_.Message(); - } - - inline void Reset() { try_catch_.Reset(); } - - inline void SetVerbose(bool value) { try_catch_.SetVerbose(value); } - - inline void SetCaptureMessage(bool value) { - try_catch_.SetCaptureMessage(value); - } -}; - -//============ ================================================================= - -/* node 0.12 */ -#if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION - inline - void SetCounterFunction(v8::CounterLookupCallback cb) { - v8::Isolate::GetCurrent()->SetCounterFunction(cb); - } - - inline - void SetCreateHistogramFunction(v8::CreateHistogramCallback cb) { - v8::Isolate::GetCurrent()->SetCreateHistogramFunction(cb); - } - - inline - void SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) { - v8::Isolate::GetCurrent()->SetAddHistogramSampleFunction(cb); - } - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) - inline bool IdleNotification(int idle_time_in_ms) { - return v8::Isolate::GetCurrent()->IdleNotificationDeadline( - idle_time_in_ms * 0.001); - } -# else - inline bool IdleNotification(int idle_time_in_ms) { - return v8::Isolate::GetCurrent()->IdleNotification(idle_time_in_ms); - } -#endif - - inline void LowMemoryNotification() { - v8::Isolate::GetCurrent()->LowMemoryNotification(); - } - - inline void ContextDisposedNotification() { - v8::Isolate::GetCurrent()->ContextDisposedNotification(); - } -#else - inline - void SetCounterFunction(v8::CounterLookupCallback cb) { - v8::V8::SetCounterFunction(cb); - } - - inline - void SetCreateHistogramFunction(v8::CreateHistogramCallback cb) { - v8::V8::SetCreateHistogramFunction(cb); - } - - inline - void SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) { - v8::V8::SetAddHistogramSampleFunction(cb); - } - - inline bool IdleNotification(int idle_time_in_ms) { - return v8::V8::IdleNotification(idle_time_in_ms); - } - - inline void LowMemoryNotification() { - v8::V8::LowMemoryNotification(); - } - - inline void ContextDisposedNotification() { - v8::V8::ContextDisposedNotification(); - } -#endif - -#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) // Node 0.12 - inline v8::Local Undefined() { -# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION - EscapableHandleScope scope; - return scope.Escape(New(v8::Undefined(v8::Isolate::GetCurrent()))); -# else - return v8::Undefined(v8::Isolate::GetCurrent()); -# endif - } - - inline v8::Local Null() { -# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION - EscapableHandleScope scope; - return scope.Escape(New(v8::Null(v8::Isolate::GetCurrent()))); -# else - return v8::Null(v8::Isolate::GetCurrent()); -# endif - } - - inline v8::Local True() { -# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION - EscapableHandleScope scope; - return scope.Escape(New(v8::True(v8::Isolate::GetCurrent()))); -# else - return v8::True(v8::Isolate::GetCurrent()); -# endif - } - - inline v8::Local False() { -# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION - EscapableHandleScope scope; - return scope.Escape(New(v8::False(v8::Isolate::GetCurrent()))); -# else - return v8::False(v8::Isolate::GetCurrent()); -# endif - } - - inline v8::Local EmptyString() { - return v8::String::Empty(v8::Isolate::GetCurrent()); - } - - inline int AdjustExternalMemory(int bc) { - return static_cast( - v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(bc)); - } - - inline void SetTemplate( - v8::Local templ - , const char *name - , v8::Local value) { - templ->Set(v8::Isolate::GetCurrent(), name, value); - } - - inline void SetTemplate( - v8::Local templ - , v8::Local name - , v8::Local value - , v8::PropertyAttribute attributes) { - templ->Set(name, value, attributes); - } - - inline v8::Local GetCurrentContext() { - return v8::Isolate::GetCurrent()->GetCurrentContext(); - } - - inline void* GetInternalFieldPointer( - v8::Local object - , int index) { - return object->GetAlignedPointerFromInternalField(index); - } - - inline void SetInternalFieldPointer( - v8::Local object - , int index - , void* value) { - object->SetAlignedPointerInInternalField(index, value); - } - -# define NAN_GC_CALLBACK(name) \ - void name(v8::Isolate *isolate, v8::GCType type, v8::GCCallbackFlags flags) - -#if NODE_MODULE_VERSION <= NODE_4_0_MODULE_VERSION - typedef v8::Isolate::GCEpilogueCallback GCEpilogueCallback; - typedef v8::Isolate::GCPrologueCallback GCPrologueCallback; -#else - typedef v8::Isolate::GCCallback GCEpilogueCallback; - typedef v8::Isolate::GCCallback GCPrologueCallback; -#endif - - inline void AddGCEpilogueCallback( - GCEpilogueCallback callback - , v8::GCType gc_type_filter = v8::kGCTypeAll) { - v8::Isolate::GetCurrent()->AddGCEpilogueCallback(callback, gc_type_filter); - } - - inline void RemoveGCEpilogueCallback( - GCEpilogueCallback callback) { - v8::Isolate::GetCurrent()->RemoveGCEpilogueCallback(callback); - } - - inline void AddGCPrologueCallback( - GCPrologueCallback callback - , v8::GCType gc_type_filter = v8::kGCTypeAll) { - v8::Isolate::GetCurrent()->AddGCPrologueCallback(callback, gc_type_filter); - } - - inline void RemoveGCPrologueCallback( - GCPrologueCallback callback) { - v8::Isolate::GetCurrent()->RemoveGCPrologueCallback(callback); - } - - inline void GetHeapStatistics( - v8::HeapStatistics *heap_statistics) { - v8::Isolate::GetCurrent()->GetHeapStatistics(heap_statistics); - } - -# define X(NAME) \ - inline v8::Local NAME(const char *msg) { \ - EscapableHandleScope scope; \ - return scope.Escape(v8::Exception::NAME(New(msg).ToLocalChecked())); \ - } \ - \ - inline \ - v8::Local NAME(v8::Local msg) { \ - return v8::Exception::NAME(msg); \ - } \ - \ - inline void Throw ## NAME(const char *msg) { \ - HandleScope scope; \ - v8::Isolate::GetCurrent()->ThrowException( \ - v8::Exception::NAME(New(msg).ToLocalChecked())); \ - } \ - \ - inline void Throw ## NAME(v8::Local msg) { \ - HandleScope scope; \ - v8::Isolate::GetCurrent()->ThrowException( \ - v8::Exception::NAME(msg)); \ - } - - X(Error) - X(RangeError) - X(ReferenceError) - X(SyntaxError) - X(TypeError) - -# undef X - - inline void ThrowError(v8::Local error) { - v8::Isolate::GetCurrent()->ThrowException(error); - } - - inline MaybeLocal NewBuffer( - char *data - , size_t length -#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION - , node::Buffer::FreeCallback callback -#else - , node::smalloc::FreeCallback callback -#endif - , void *hint - ) { - // arbitrary buffer lengths requires - // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION - assert(length <= imp::kMaxLength && "too large buffer"); -#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION - return node::Buffer::New( - v8::Isolate::GetCurrent(), data, length, callback, hint); -#else - return node::Buffer::New(v8::Isolate::GetCurrent(), data, length, callback, - hint); -#endif - } - - inline MaybeLocal CopyBuffer( - const char *data - , uint32_t size - ) { - // arbitrary buffer lengths requires - // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION - assert(size <= imp::kMaxLength && "too large buffer"); -#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION - return node::Buffer::Copy( - v8::Isolate::GetCurrent(), data, size); -#else - return node::Buffer::New(v8::Isolate::GetCurrent(), data, size); -#endif - } - - inline MaybeLocal NewBuffer(uint32_t size) { - // arbitrary buffer lengths requires - // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION - assert(size <= imp::kMaxLength && "too large buffer"); -#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION - return node::Buffer::New( - v8::Isolate::GetCurrent(), size); -#else - return node::Buffer::New(v8::Isolate::GetCurrent(), size); -#endif - } - - inline MaybeLocal NewBuffer( - char* data - , uint32_t size - ) { - // arbitrary buffer lengths requires - // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION - assert(size <= imp::kMaxLength && "too large buffer"); -#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION - return node::Buffer::New(v8::Isolate::GetCurrent(), data, size); -#else - return node::Buffer::Use(v8::Isolate::GetCurrent(), data, size); -#endif - } - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) - inline MaybeLocal - NewOneByteString(const uint8_t * value, int length = -1) { - return v8::String::NewFromOneByte(v8::Isolate::GetCurrent(), value, - v8::NewStringType::kNormal, length); - } - - inline MaybeLocal CompileScript( - v8::Local s - , const v8::ScriptOrigin& origin - ) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - v8::ScriptCompiler::Source source(s, origin); - return scope.Escape( - v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &source) - .FromMaybe(v8::Local())); - } - - inline MaybeLocal CompileScript( - v8::Local s - ) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - v8::ScriptCompiler::Source source(s); - return scope.Escape( - v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &source) - .FromMaybe(v8::Local())); - } - - inline MaybeLocal RunScript( - v8::Local script - ) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(script->BindToCurrentContext() - ->Run(isolate->GetCurrentContext()) - .FromMaybe(v8::Local())); - } - - inline MaybeLocal RunScript( - v8::Local script - ) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(script->Run(isolate->GetCurrentContext()) - .FromMaybe(v8::Local())); - } -#else - inline MaybeLocal - NewOneByteString(const uint8_t * value, int length = -1) { - return v8::String::NewFromOneByte(v8::Isolate::GetCurrent(), value, - v8::String::kNormalString, length); - } - - inline MaybeLocal CompileScript( - v8::Local s - , const v8::ScriptOrigin& origin - ) { - v8::ScriptCompiler::Source source(s, origin); - return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source); - } - - inline MaybeLocal CompileScript( - v8::Local s - ) { - v8::ScriptCompiler::Source source(s); - return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source); - } - - inline MaybeLocal RunScript( - v8::Local script - ) { - EscapableHandleScope scope; - return scope.Escape(script->BindToCurrentContext()->Run()); - } - - inline MaybeLocal RunScript( - v8::Local script - ) { - return script->Run(); - } -#endif - - inline v8::Local MakeCallback( - v8::Local target - , v8::Local func - , int argc - , v8::Local* argv) { -#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION - EscapableHandleScope scope; - return scope.Escape(New(node::MakeCallback( - v8::Isolate::GetCurrent(), target, func, argc, argv))); -#else - return node::MakeCallback( - v8::Isolate::GetCurrent(), target, func, argc, argv); -#endif - } - - inline v8::Local MakeCallback( - v8::Local target - , v8::Local symbol - , int argc - , v8::Local* argv) { -#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION - EscapableHandleScope scope; - return scope.Escape(New(node::MakeCallback( - v8::Isolate::GetCurrent(), target, symbol, argc, argv))); -#else - return node::MakeCallback( - v8::Isolate::GetCurrent(), target, symbol, argc, argv); -#endif - } - - inline v8::Local MakeCallback( - v8::Local target - , const char* method - , int argc - , v8::Local* argv) { -#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION - EscapableHandleScope scope; - return scope.Escape(New(node::MakeCallback( - v8::Isolate::GetCurrent(), target, method, argc, argv))); -#else - return node::MakeCallback( - v8::Isolate::GetCurrent(), target, method, argc, argv); -#endif - } - - inline void FatalException(const TryCatch& try_catch) { - node::FatalException(v8::Isolate::GetCurrent(), try_catch.try_catch_); - } - - inline v8::Local ErrnoException( - int errorno - , const char* syscall = NULL - , const char* message = NULL - , const char* path = NULL) { - return node::ErrnoException(v8::Isolate::GetCurrent(), errorno, syscall, - message, path); - } - - NAN_DEPRECATED inline v8::Local NanErrnoException( - int errorno - , const char* syscall = NULL - , const char* message = NULL - , const char* path = NULL) { - return ErrnoException(errorno, syscall, message, path); - } - - template - inline void SetIsolateData( - v8::Isolate *isolate - , T *data - ) { - isolate->SetData(0, data); - } - - template - inline T *GetIsolateData( - v8::Isolate *isolate - ) { - return static_cast(isolate->GetData(0)); - } - -class Utf8String { - public: - inline explicit Utf8String(v8::Local from) : - length_(0), str_(str_st_) { - HandleScope scope; - if (!from.IsEmpty()) { - v8::Local string = from->ToString(); - if (!string.IsEmpty()) { - size_t len = 3 * string->Length() + 1; - assert(len <= INT_MAX); - if (len > sizeof (str_st_)) { - str_ = static_cast(malloc(len)); - assert(str_ != 0); - } - const int flags = - v8::String::NO_NULL_TERMINATION | imp::kReplaceInvalidUtf8; - length_ = string->WriteUtf8(str_, static_cast(len), 0, flags); - str_[length_] = '\0'; - } - } - } - - inline int length() const { - return length_; - } - - inline char* operator*() { return str_; } - inline const char* operator*() const { return str_; } - - inline ~Utf8String() { - if (str_ != str_st_) { - free(str_); - } - } - - private: - NAN_DISALLOW_ASSIGN_COPY_MOVE(Utf8String) - - int length_; - char *str_; - char str_st_[1024]; -}; - -#else // Node 0.8 and 0.10 - inline v8::Local Undefined() { - EscapableHandleScope scope; - return scope.Escape(New(v8::Undefined())); - } - - inline v8::Local Null() { - EscapableHandleScope scope; - return scope.Escape(New(v8::Null())); - } - - inline v8::Local True() { - EscapableHandleScope scope; - return scope.Escape(New(v8::True())); - } - - inline v8::Local False() { - EscapableHandleScope scope; - return scope.Escape(New(v8::False())); - } - - inline v8::Local EmptyString() { - return v8::String::Empty(); - } - - inline int AdjustExternalMemory(int bc) { - return static_cast(v8::V8::AdjustAmountOfExternalAllocatedMemory(bc)); - } - - inline void SetTemplate( - v8::Local templ - , const char *name - , v8::Local value) { - templ->Set(name, value); - } - - inline void SetTemplate( - v8::Local templ - , v8::Local name - , v8::Local value - , v8::PropertyAttribute attributes) { - templ->Set(name, value, attributes); - } - - inline v8::Local GetCurrentContext() { - return v8::Context::GetCurrent(); - } - - inline void* GetInternalFieldPointer( - v8::Local object - , int index) { - return object->GetPointerFromInternalField(index); - } - - inline void SetInternalFieldPointer( - v8::Local object - , int index - , void* value) { - object->SetPointerInInternalField(index, value); - } - -# define NAN_GC_CALLBACK(name) \ - void name(v8::GCType type, v8::GCCallbackFlags flags) - - inline void AddGCEpilogueCallback( - v8::GCEpilogueCallback callback - , v8::GCType gc_type_filter = v8::kGCTypeAll) { - v8::V8::AddGCEpilogueCallback(callback, gc_type_filter); - } - inline void RemoveGCEpilogueCallback( - v8::GCEpilogueCallback callback) { - v8::V8::RemoveGCEpilogueCallback(callback); - } - inline void AddGCPrologueCallback( - v8::GCPrologueCallback callback - , v8::GCType gc_type_filter = v8::kGCTypeAll) { - v8::V8::AddGCPrologueCallback(callback, gc_type_filter); - } - inline void RemoveGCPrologueCallback( - v8::GCPrologueCallback callback) { - v8::V8::RemoveGCPrologueCallback(callback); - } - inline void GetHeapStatistics( - v8::HeapStatistics *heap_statistics) { - v8::V8::GetHeapStatistics(heap_statistics); - } - -# define X(NAME) \ - inline v8::Local NAME(const char *msg) { \ - EscapableHandleScope scope; \ - return scope.Escape(v8::Exception::NAME(New(msg).ToLocalChecked())); \ - } \ - \ - inline \ - v8::Local NAME(v8::Local msg) { \ - return v8::Exception::NAME(msg); \ - } \ - \ - inline void Throw ## NAME(const char *msg) { \ - HandleScope scope; \ - v8::ThrowException(v8::Exception::NAME(New(msg).ToLocalChecked())); \ - } \ - \ - inline \ - void Throw ## NAME(v8::Local errmsg) { \ - HandleScope scope; \ - v8::ThrowException(v8::Exception::NAME(errmsg)); \ - } - - X(Error) - X(RangeError) - X(ReferenceError) - X(SyntaxError) - X(TypeError) - -# undef X - - inline void ThrowError(v8::Local error) { - v8::ThrowException(error); - } - - inline MaybeLocal NewBuffer( - char *data - , size_t length - , node::Buffer::free_callback callback - , void *hint - ) { - EscapableHandleScope scope; - // arbitrary buffer lengths requires - // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION - assert(length <= imp::kMaxLength && "too large buffer"); - return scope.Escape( - New(node::Buffer::New(data, length, callback, hint)->handle_)); - } - - inline MaybeLocal CopyBuffer( - const char *data - , uint32_t size - ) { - EscapableHandleScope scope; - // arbitrary buffer lengths requires - // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION - assert(size <= imp::kMaxLength && "too large buffer"); -#if NODE_MODULE_VERSION >= NODE_0_10_MODULE_VERSION - return scope.Escape(New(node::Buffer::New(data, size)->handle_)); -#else - return scope.Escape( - New(node::Buffer::New(const_cast(data), size)->handle_)); -#endif - } - - inline MaybeLocal NewBuffer(uint32_t size) { - // arbitrary buffer lengths requires - // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION - EscapableHandleScope scope; - assert(size <= imp::kMaxLength && "too large buffer"); - return scope.Escape(New(node::Buffer::New(size)->handle_)); - } - - inline void FreeData(char *data, void *hint) { - (void) hint; // unused - delete[] data; - } - - inline MaybeLocal NewBuffer( - char* data - , uint32_t size - ) { - EscapableHandleScope scope; - // arbitrary buffer lengths requires - // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION - assert(size <= imp::kMaxLength && "too large buffer"); - return scope.Escape( - New(node::Buffer::New(data, size, FreeData, NULL)->handle_)); - } - -namespace imp { -inline void -widenString(std::vector *ws, const uint8_t *s, int l) { - size_t len = static_cast(l); - if (l < 0) { - len = strlen(reinterpret_cast(s)); - } - assert(len <= INT_MAX && "string too long"); - ws->resize(len); - std::copy(s, s + len, ws->begin()); // NOLINT(build/include_what_you_use) -} -} // end of namespace imp - - inline MaybeLocal - NewOneByteString(const uint8_t * value, int length = -1) { - std::vector wideString; // NOLINT(build/include_what_you_use) - imp::widenString(&wideString, value, length); - return v8::String::New(wideString.data(), - static_cast(wideString.size())); - } - - inline MaybeLocal CompileScript( - v8::Local s - , const v8::ScriptOrigin& origin - ) { - return v8::Script::Compile(s, const_cast(&origin)); - } - - inline MaybeLocal CompileScript( - v8::Local s - ) { - return v8::Script::Compile(s); - } - - inline - MaybeLocal RunScript(v8::Local script) { - return script->Run(); - } - - inline v8::Local MakeCallback( - v8::Local target - , v8::Local func - , int argc - , v8::Local* argv) { - v8::HandleScope scope; - return scope.Close(New(node::MakeCallback(target, func, argc, argv))); - } - - inline v8::Local MakeCallback( - v8::Local target - , v8::Local symbol - , int argc - , v8::Local* argv) { - v8::HandleScope scope; - return scope.Close(New(node::MakeCallback(target, symbol, argc, argv))); - } - - inline v8::Local MakeCallback( - v8::Local target - , const char* method - , int argc - , v8::Local* argv) { - v8::HandleScope scope; - return scope.Close(New(node::MakeCallback(target, method, argc, argv))); - } - - inline void FatalException(const TryCatch& try_catch) { - node::FatalException(const_cast(try_catch.try_catch_)); - } - - inline v8::Local ErrnoException( - int errorno - , const char* syscall = NULL - , const char* message = NULL - , const char* path = NULL) { - return node::ErrnoException(errorno, syscall, message, path); - } - - NAN_DEPRECATED inline v8::Local NanErrnoException( - int errorno - , const char* syscall = NULL - , const char* message = NULL - , const char* path = NULL) { - return ErrnoException(errorno, syscall, message, path); - } - - - template - inline void SetIsolateData( - v8::Isolate *isolate - , T *data - ) { - isolate->SetData(data); - } - - template - inline T *GetIsolateData( - v8::Isolate *isolate - ) { - return static_cast(isolate->GetData()); - } - -class Utf8String { - public: - inline explicit Utf8String(v8::Local from) : - length_(0), str_(str_st_) { - v8::HandleScope scope; - if (!from.IsEmpty()) { - v8::Local string = from->ToString(); - if (!string.IsEmpty()) { - size_t len = 3 * string->Length() + 1; - assert(len <= INT_MAX); - if (len > sizeof (str_st_)) { - str_ = static_cast(malloc(len)); - assert(str_ != 0); - } - const int flags = - v8::String::NO_NULL_TERMINATION | imp::kReplaceInvalidUtf8; - length_ = string->WriteUtf8(str_, static_cast(len), 0, flags); - str_[length_] = '\0'; - } - } - } - - inline int length() const { - return length_; - } - - inline char* operator*() { return str_; } - inline const char* operator*() const { return str_; } - - inline ~Utf8String() { - if (str_ != str_st_) { - free(str_); - } - } - - private: - NAN_DISALLOW_ASSIGN_COPY_MOVE(Utf8String) - - int length_; - char *str_; - char str_st_[1024]; -}; - -#endif // NODE_MODULE_VERSION - -typedef void (*FreeCallback)(char *data, void *hint); - -typedef const FunctionCallbackInfo& NAN_METHOD_ARGS_TYPE; -typedef void NAN_METHOD_RETURN_TYPE; - -typedef const PropertyCallbackInfo& NAN_GETTER_ARGS_TYPE; -typedef void NAN_GETTER_RETURN_TYPE; - -typedef const PropertyCallbackInfo& NAN_SETTER_ARGS_TYPE; -typedef void NAN_SETTER_RETURN_TYPE; - -typedef const PropertyCallbackInfo& - NAN_PROPERTY_GETTER_ARGS_TYPE; -typedef void NAN_PROPERTY_GETTER_RETURN_TYPE; - -typedef const PropertyCallbackInfo& - NAN_PROPERTY_SETTER_ARGS_TYPE; -typedef void NAN_PROPERTY_SETTER_RETURN_TYPE; - -typedef const PropertyCallbackInfo& - NAN_PROPERTY_ENUMERATOR_ARGS_TYPE; -typedef void NAN_PROPERTY_ENUMERATOR_RETURN_TYPE; - -typedef const PropertyCallbackInfo& - NAN_PROPERTY_DELETER_ARGS_TYPE; -typedef void NAN_PROPERTY_DELETER_RETURN_TYPE; - -typedef const PropertyCallbackInfo& - NAN_PROPERTY_QUERY_ARGS_TYPE; -typedef void NAN_PROPERTY_QUERY_RETURN_TYPE; - -typedef const PropertyCallbackInfo& NAN_INDEX_GETTER_ARGS_TYPE; -typedef void NAN_INDEX_GETTER_RETURN_TYPE; - -typedef const PropertyCallbackInfo& NAN_INDEX_SETTER_ARGS_TYPE; -typedef void NAN_INDEX_SETTER_RETURN_TYPE; - -typedef const PropertyCallbackInfo& - NAN_INDEX_ENUMERATOR_ARGS_TYPE; -typedef void NAN_INDEX_ENUMERATOR_RETURN_TYPE; - -typedef const PropertyCallbackInfo& - NAN_INDEX_DELETER_ARGS_TYPE; -typedef void NAN_INDEX_DELETER_RETURN_TYPE; - -typedef const PropertyCallbackInfo& - NAN_INDEX_QUERY_ARGS_TYPE; -typedef void NAN_INDEX_QUERY_RETURN_TYPE; - -#define NAN_METHOD(name) \ - Nan::NAN_METHOD_RETURN_TYPE name(Nan::NAN_METHOD_ARGS_TYPE info) -#define NAN_GETTER(name) \ - Nan::NAN_GETTER_RETURN_TYPE name( \ - v8::Local property \ - , Nan::NAN_GETTER_ARGS_TYPE info) -#define NAN_SETTER(name) \ - Nan::NAN_SETTER_RETURN_TYPE name( \ - v8::Local property \ - , v8::Local value \ - , Nan::NAN_SETTER_ARGS_TYPE info) -#define NAN_PROPERTY_GETTER(name) \ - Nan::NAN_PROPERTY_GETTER_RETURN_TYPE name( \ - v8::Local property \ - , Nan::NAN_PROPERTY_GETTER_ARGS_TYPE info) -#define NAN_PROPERTY_SETTER(name) \ - Nan::NAN_PROPERTY_SETTER_RETURN_TYPE name( \ - v8::Local property \ - , v8::Local value \ - , Nan::NAN_PROPERTY_SETTER_ARGS_TYPE info) -#define NAN_PROPERTY_ENUMERATOR(name) \ - Nan::NAN_PROPERTY_ENUMERATOR_RETURN_TYPE name( \ - Nan::NAN_PROPERTY_ENUMERATOR_ARGS_TYPE info) -#define NAN_PROPERTY_DELETER(name) \ - Nan::NAN_PROPERTY_DELETER_RETURN_TYPE name( \ - v8::Local property \ - , Nan::NAN_PROPERTY_DELETER_ARGS_TYPE info) -#define NAN_PROPERTY_QUERY(name) \ - Nan::NAN_PROPERTY_QUERY_RETURN_TYPE name( \ - v8::Local property \ - , Nan::NAN_PROPERTY_QUERY_ARGS_TYPE info) -# define NAN_INDEX_GETTER(name) \ - Nan::NAN_INDEX_GETTER_RETURN_TYPE name( \ - uint32_t index \ - , Nan::NAN_INDEX_GETTER_ARGS_TYPE info) -#define NAN_INDEX_SETTER(name) \ - Nan::NAN_INDEX_SETTER_RETURN_TYPE name( \ - uint32_t index \ - , v8::Local value \ - , Nan::NAN_INDEX_SETTER_ARGS_TYPE info) -#define NAN_INDEX_ENUMERATOR(name) \ - Nan::NAN_INDEX_ENUMERATOR_RETURN_TYPE \ - name(Nan::NAN_INDEX_ENUMERATOR_ARGS_TYPE info) -#define NAN_INDEX_DELETER(name) \ - Nan::NAN_INDEX_DELETER_RETURN_TYPE name( \ - uint32_t index \ - , Nan::NAN_INDEX_DELETER_ARGS_TYPE info) -#define NAN_INDEX_QUERY(name) \ - Nan::NAN_INDEX_QUERY_RETURN_TYPE name( \ - uint32_t index \ - , Nan::NAN_INDEX_QUERY_ARGS_TYPE info) - -class Callback { - public: - Callback() {} - - explicit Callback(const v8::Local &fn) : handle_(fn) {} - - ~Callback() { - handle_.Reset(); - } - - bool operator==(const Callback &other) const { - return handle_ == other.handle_; - } - - bool operator!=(const Callback &other) const { - return !operator==(other); - } - - inline - v8::Local operator*() const { return GetFunction(); } - - inline v8::Local operator()( - v8::Local target - , int argc = 0 - , v8::Local argv[] = 0) const { - return this->Call(target, argc, argv); - } - - inline v8::Local operator()( - int argc = 0 - , v8::Local argv[] = 0) const { - return this->Call(argc, argv); - } - - // TODO(kkoopa): remove - inline void SetFunction(const v8::Local &fn) { - Reset(fn); - } - - inline void Reset(const v8::Local &fn) { - handle_.Reset(fn); - } - - inline void Reset() { - handle_.Reset(); - } - - inline v8::Local GetFunction() const { - return New(handle_); - } - - inline bool IsEmpty() const { - return handle_.IsEmpty(); - } - - inline v8::Local - Call(v8::Local target - , int argc - , v8::Local argv[]) const { -#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - return Call_(isolate, target, argc, argv); -#else - return Call_(target, argc, argv); -#endif - } - - inline v8::Local - Call(int argc, v8::Local argv[]) const { -#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape( - Call_(isolate, isolate->GetCurrentContext()->Global(), argc, argv)); -#else - v8::HandleScope scope; - return scope.Close(Call_(v8::Context::GetCurrent()->Global(), argc, argv)); -#endif - } - - private: - NAN_DISALLOW_ASSIGN_COPY_MOVE(Callback) - Persistent handle_; - -#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) - v8::Local Call_(v8::Isolate *isolate - , v8::Local target - , int argc - , v8::Local argv[]) const { - EscapableHandleScope scope; - - v8::Local callback = New(handle_); -# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION - return scope.Escape(New(node::MakeCallback( - isolate - , target - , callback - , argc - , argv - ))); -# else - return scope.Escape(node::MakeCallback( - isolate - , target - , callback - , argc - , argv - )); -# endif - } -#else - v8::Local Call_(v8::Local target - , int argc - , v8::Local argv[]) const { - EscapableHandleScope scope; - - v8::Local callback = New(handle_); - return scope.Escape(New(node::MakeCallback( - target - , callback - , argc - , argv - ))); - } -#endif -}; - -/* abstract */ class AsyncWorker { - public: - explicit AsyncWorker(Callback *callback_) - : callback(callback_), errmsg_(NULL) { - request.data = this; - - HandleScope scope; - v8::Local obj = New(); - persistentHandle.Reset(obj); - } - - virtual ~AsyncWorker() { - HandleScope scope; - - if (!persistentHandle.IsEmpty()) - persistentHandle.Reset(); - delete callback; - delete[] errmsg_; - } - - virtual void WorkComplete() { - HandleScope scope; - - if (errmsg_ == NULL) - HandleOKCallback(); - else - HandleErrorCallback(); - delete callback; - callback = NULL; - } - - inline void SaveToPersistent( - const char *key, const v8::Local &value) { - HandleScope scope; - New(persistentHandle)->Set(New(key).ToLocalChecked(), value); - } - - inline void SaveToPersistent( - const v8::Local &key, const v8::Local &value) { - HandleScope scope; - New(persistentHandle)->Set(key, value); - } - - inline void SaveToPersistent( - uint32_t index, const v8::Local &value) { - HandleScope scope; - New(persistentHandle)->Set(index, value); - } - - inline v8::Local GetFromPersistent(const char *key) const { - EscapableHandleScope scope; - return scope.Escape( - New(persistentHandle)->Get(New(key).ToLocalChecked())); - } - - inline v8::Local - GetFromPersistent(const v8::Local &key) const { - EscapableHandleScope scope; - return scope.Escape(New(persistentHandle)->Get(key)); - } - - inline v8::Local GetFromPersistent(uint32_t index) const { - EscapableHandleScope scope; - return scope.Escape(New(persistentHandle)->Get(index)); - } - - virtual void Execute() = 0; - - uv_work_t request; - - virtual void Destroy() { - delete this; - } - - protected: - Persistent persistentHandle; - Callback *callback; - - virtual void HandleOKCallback() { - HandleScope scope; - - callback->Call(0, NULL); - } - - virtual void HandleErrorCallback() { - HandleScope scope; - - v8::Local argv[] = { - v8::Exception::Error(New(ErrorMessage()).ToLocalChecked()) - }; - callback->Call(1, argv); - } - - void SetErrorMessage(const char *msg) { - delete[] errmsg_; - - size_t size = strlen(msg) + 1; - errmsg_ = new char[size]; - memcpy(errmsg_, msg, size); - } - - const char* ErrorMessage() const { - return errmsg_; - } - - private: - NAN_DISALLOW_ASSIGN_COPY_MOVE(AsyncWorker) - char *errmsg_; -}; - - -template -/* abstract */ class AsyncProgressWorkerBase : public AsyncWorker { - public: - explicit AsyncProgressWorkerBase(Callback *callback_) - : AsyncWorker(callback_), asyncdata_(NULL), asyncsize_(0) { - async = new uv_async_t; - uv_async_init( - uv_default_loop() - , async - , AsyncProgress_ - ); - async->data = this; - - uv_mutex_init(&async_lock); - } - - virtual ~AsyncProgressWorkerBase() { - uv_mutex_destroy(&async_lock); - - delete[] asyncdata_; - } - - void WorkProgress() { - uv_mutex_lock(&async_lock); - T *data = asyncdata_; - size_t size = asyncsize_; - asyncdata_ = NULL; - uv_mutex_unlock(&async_lock); - - // Don't send progress events after we've already completed. - if (callback) { - HandleProgressCallback(data, size); - } - delete[] data; - } - - class ExecutionProgress { - friend class AsyncProgressWorkerBase; - public: - void Signal() const { - uv_async_send(that_->async); - } - - void Send(const T* data, size_t count) const { - that_->SendProgress_(data, count); - } - - private: - explicit ExecutionProgress(AsyncProgressWorkerBase *that) : that_(that) {} - NAN_DISALLOW_ASSIGN_COPY_MOVE(ExecutionProgress) - AsyncProgressWorkerBase* const that_; - }; - - virtual void Execute(const ExecutionProgress& progress) = 0; - virtual void HandleProgressCallback(const T *data, size_t size) = 0; - - virtual void Destroy() { - uv_close(reinterpret_cast(async), AsyncClose_); - } - - private: - void Execute() /*final override*/ { - ExecutionProgress progress(this); - Execute(progress); - } - - void SendProgress_(const T *data, size_t count) { - T *new_data = new T[count]; - { - T *it = new_data; - std::copy(data, data + count, it); - } - - uv_mutex_lock(&async_lock); - T *old_data = asyncdata_; - asyncdata_ = new_data; - asyncsize_ = count; - uv_mutex_unlock(&async_lock); - - delete[] old_data; - uv_async_send(async); - } - - inline static NAUV_WORK_CB(AsyncProgress_) { - AsyncProgressWorkerBase *worker = - static_cast(async->data); - worker->WorkProgress(); - } - - inline static void AsyncClose_(uv_handle_t* handle) { - AsyncProgressWorkerBase *worker = - static_cast(handle->data); - delete reinterpret_cast(handle); - delete worker; - } - - uv_async_t *async; - uv_mutex_t async_lock; - T *asyncdata_; - size_t asyncsize_; -}; - -// This ensures compatibility to the previous un-templated AsyncProgressWorker -// class definition. -typedef AsyncProgressWorkerBase AsyncProgressWorker; - -inline void AsyncExecute (uv_work_t* req) { - AsyncWorker *worker = static_cast(req->data); - worker->Execute(); -} - -inline void AsyncExecuteComplete (uv_work_t* req) { - AsyncWorker* worker = static_cast(req->data); - worker->WorkComplete(); - worker->Destroy(); -} - -inline void AsyncQueueWorker (AsyncWorker* worker) { - uv_queue_work( - uv_default_loop() - , &worker->request - , AsyncExecute - , reinterpret_cast(AsyncExecuteComplete) - ); -} - -namespace imp { - -inline -ExternalOneByteStringResource const* -GetExternalResource(v8::Local str) { -#if NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION - return str->GetExternalAsciiStringResource(); -#else - return str->GetExternalOneByteStringResource(); -#endif -} - -inline -bool -IsExternal(v8::Local str) { -#if NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION - return str->IsExternalAscii(); -#else - return str->IsExternalOneByte(); -#endif -} - -} // end of namespace imp - -enum Encoding {ASCII, UTF8, BASE64, UCS2, BINARY, HEX, BUFFER}; - -#if NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION -# include "nan_string_bytes.h" // NOLINT(build/include) -#endif - -inline v8::Local Encode( - const void *buf, size_t len, enum Encoding encoding = BINARY) { -#if (NODE_MODULE_VERSION >= ATOM_0_21_MODULE_VERSION) - v8::Isolate* isolate = v8::Isolate::GetCurrent(); - node::encoding node_enc = static_cast(encoding); - - if (encoding == UCS2) { - return node::Encode( - isolate - , reinterpret_cast(buf) - , len / 2); - } else { - return node::Encode( - isolate - , reinterpret_cast(buf) - , len - , node_enc); - } -#elif (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) - return node::Encode( - v8::Isolate::GetCurrent() - , buf, len - , static_cast(encoding)); -#else -# if NODE_MODULE_VERSION >= NODE_0_10_MODULE_VERSION - return node::Encode(buf, len, static_cast(encoding)); -# else - return imp::Encode(reinterpret_cast(buf), len, encoding); -# endif -#endif -} - -inline ssize_t DecodeBytes( - v8::Local val, enum Encoding encoding = BINARY) { -#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) - return node::DecodeBytes( - v8::Isolate::GetCurrent() - , val - , static_cast(encoding)); -#else -# if (NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION) - if (encoding == BUFFER) { - return node::DecodeBytes(val, node::BINARY); - } -# endif - return node::DecodeBytes(val, static_cast(encoding)); -#endif -} - -inline ssize_t DecodeWrite( - char *buf - , size_t len - , v8::Local val - , enum Encoding encoding = BINARY) { -#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) - return node::DecodeWrite( - v8::Isolate::GetCurrent() - , buf - , len - , val - , static_cast(encoding)); -#else -# if (NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION) - if (encoding == BUFFER) { - return node::DecodeWrite(buf, len, val, node::BINARY); - } -# endif - return node::DecodeWrite( - buf - , len - , val - , static_cast(encoding)); -#endif -} - -inline void SetPrototypeTemplate( - v8::Local templ - , const char *name - , v8::Local value -) { - HandleScope scope; - SetTemplate(templ->PrototypeTemplate(), name, value); -} - -inline void SetPrototypeTemplate( - v8::Local templ - , v8::Local name - , v8::Local value - , v8::PropertyAttribute attributes -) { - HandleScope scope; - SetTemplate(templ->PrototypeTemplate(), name, value, attributes); -} - -inline void SetInstanceTemplate( - v8::Local templ - , const char *name - , v8::Local value -) { - HandleScope scope; - SetTemplate(templ->InstanceTemplate(), name, value); -} - -inline void SetInstanceTemplate( - v8::Local templ - , v8::Local name - , v8::Local value - , v8::PropertyAttribute attributes -) { - HandleScope scope; - SetTemplate(templ->InstanceTemplate(), name, value, attributes); -} - -namespace imp { - -// Note(@agnat): Helper to distinguish different receiver types. The first -// version deals with receivers derived from v8::Template. The second version -// handles everything else. The final argument only serves as discriminator and -// is unused. -template -inline -void -SetMethodAux(T recv, - v8::Local name, - v8::Local tpl, - v8::Template *) { - recv->Set(name, tpl); -} - -template -inline -void -SetMethodAux(T recv, - v8::Local name, - v8::Local tpl, - ...) { - recv->Set(name, GetFunction(tpl).ToLocalChecked()); -} - -} // end of namespace imp - -template class HandleType> -inline void SetMethod( - HandleType recv - , const char *name - , FunctionCallback callback) { - HandleScope scope; - v8::Local t = New(callback); - v8::Local fn_name = New(name).ToLocalChecked(); - t->SetClassName(fn_name); - // Note(@agnat): Pass an empty T* as discriminator. See note on - // SetMethodAux(...) above - imp::SetMethodAux(recv, fn_name, t, static_cast(0)); -} - -inline void SetPrototypeMethod( - v8::Local recv - , const char* name, FunctionCallback callback) { - HandleScope scope; - v8::Local t = New( - callback - , v8::Local() - , New(recv)); - v8::Local fn_name = New(name).ToLocalChecked(); - recv->PrototypeTemplate()->Set(fn_name, t); - t->SetClassName(fn_name); -} - -//=== Accessors and Such ======================================================= - -inline void SetAccessor( - v8::Local tpl - , v8::Local name - , GetterCallback getter - , SetterCallback setter = 0 - , v8::Local data = v8::Local() - , v8::AccessControl settings = v8::DEFAULT - , v8::PropertyAttribute attribute = v8::None - , imp::Sig signature = imp::Sig()) { - HandleScope scope; - - imp::NativeGetter getter_ = - imp::GetterCallbackWrapper; - imp::NativeSetter setter_ = - setter ? imp::SetterCallbackWrapper : 0; - - v8::Local otpl = New(); - otpl->SetInternalFieldCount(imp::kAccessorFieldCount); - v8::Local obj = NewInstance(otpl).ToLocalChecked(); - - obj->SetInternalField( - imp::kGetterIndex - , New(reinterpret_cast(getter))); - - if (setter != 0) { - obj->SetInternalField( - imp::kSetterIndex - , New(reinterpret_cast(setter))); - } - - if (!data.IsEmpty()) { - obj->SetInternalField(imp::kDataIndex, data); - } - - tpl->SetAccessor( - name - , getter_ - , setter_ - , obj - , settings - , attribute - , signature); -} - -inline bool SetAccessor( - v8::Local obj - , v8::Local name - , GetterCallback getter - , SetterCallback setter = 0 - , v8::Local data = v8::Local() - , v8::AccessControl settings = v8::DEFAULT - , v8::PropertyAttribute attribute = v8::None) { - HandleScope scope; - - imp::NativeGetter getter_ = - imp::GetterCallbackWrapper; - imp::NativeSetter setter_ = - setter ? imp::SetterCallbackWrapper : 0; - - v8::Local otpl = New(); - otpl->SetInternalFieldCount(imp::kAccessorFieldCount); - v8::Local dataobj = NewInstance(otpl).ToLocalChecked(); - - dataobj->SetInternalField( - imp::kGetterIndex - , New(reinterpret_cast(getter))); - - if (!data.IsEmpty()) { - dataobj->SetInternalField(imp::kDataIndex, data); - } - - if (setter) { - dataobj->SetInternalField( - imp::kSetterIndex - , New(reinterpret_cast(setter))); - } - -#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION) - return obj->SetAccessor( - GetCurrentContext() - , name - , getter_ - , setter_ - , dataobj - , settings - , attribute).FromMaybe(false); -#else - return obj->SetAccessor( - name - , getter_ - , setter_ - , dataobj - , settings - , attribute); -#endif -} - -inline void SetNamedPropertyHandler( - v8::Local tpl - , PropertyGetterCallback getter - , PropertySetterCallback setter = 0 - , PropertyQueryCallback query = 0 - , PropertyDeleterCallback deleter = 0 - , PropertyEnumeratorCallback enumerator = 0 - , v8::Local data = v8::Local()) { - HandleScope scope; - - imp::NativePropertyGetter getter_ = - imp::PropertyGetterCallbackWrapper; - imp::NativePropertySetter setter_ = - setter ? imp::PropertySetterCallbackWrapper : 0; - imp::NativePropertyQuery query_ = - query ? imp::PropertyQueryCallbackWrapper : 0; - imp::NativePropertyDeleter *deleter_ = - deleter ? imp::PropertyDeleterCallbackWrapper : 0; - imp::NativePropertyEnumerator enumerator_ = - enumerator ? imp::PropertyEnumeratorCallbackWrapper : 0; - - v8::Local otpl = New(); - otpl->SetInternalFieldCount(imp::kPropertyFieldCount); - v8::Local obj = NewInstance(otpl).ToLocalChecked(); - obj->SetInternalField( - imp::kPropertyGetterIndex - , New(reinterpret_cast(getter))); - - if (setter) { - obj->SetInternalField( - imp::kPropertySetterIndex - , New(reinterpret_cast(setter))); - } - - if (query) { - obj->SetInternalField( - imp::kPropertyQueryIndex - , New(reinterpret_cast(query))); - } - - if (deleter) { - obj->SetInternalField( - imp::kPropertyDeleterIndex - , New(reinterpret_cast(deleter))); - } - - if (enumerator) { - obj->SetInternalField( - imp::kPropertyEnumeratorIndex - , New(reinterpret_cast(enumerator))); - } - - if (!data.IsEmpty()) { - obj->SetInternalField(imp::kDataIndex, data); - } - -#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION - tpl->SetHandler(v8::NamedPropertyHandlerConfiguration( - getter_, setter_, query_, deleter_, enumerator_, obj)); -#else - tpl->SetNamedPropertyHandler( - getter_ - , setter_ - , query_ - , deleter_ - , enumerator_ - , obj); -#endif -} - -inline void SetIndexedPropertyHandler( - v8::Local tpl - , IndexGetterCallback getter - , IndexSetterCallback setter = 0 - , IndexQueryCallback query = 0 - , IndexDeleterCallback deleter = 0 - , IndexEnumeratorCallback enumerator = 0 - , v8::Local data = v8::Local()) { - HandleScope scope; - - imp::NativeIndexGetter getter_ = - imp::IndexGetterCallbackWrapper; - imp::NativeIndexSetter setter_ = - setter ? imp::IndexSetterCallbackWrapper : 0; - imp::NativeIndexQuery query_ = - query ? imp::IndexQueryCallbackWrapper : 0; - imp::NativeIndexDeleter deleter_ = - deleter ? imp::IndexDeleterCallbackWrapper : 0; - imp::NativeIndexEnumerator enumerator_ = - enumerator ? imp::IndexEnumeratorCallbackWrapper : 0; - - v8::Local otpl = New(); - otpl->SetInternalFieldCount(imp::kIndexPropertyFieldCount); - v8::Local obj = NewInstance(otpl).ToLocalChecked(); - obj->SetInternalField( - imp::kIndexPropertyGetterIndex - , New(reinterpret_cast(getter))); - - if (setter) { - obj->SetInternalField( - imp::kIndexPropertySetterIndex - , New(reinterpret_cast(setter))); - } - - if (query) { - obj->SetInternalField( - imp::kIndexPropertyQueryIndex - , New(reinterpret_cast(query))); - } - - if (deleter) { - obj->SetInternalField( - imp::kIndexPropertyDeleterIndex - , New(reinterpret_cast(deleter))); - } - - if (enumerator) { - obj->SetInternalField( - imp::kIndexPropertyEnumeratorIndex - , New(reinterpret_cast(enumerator))); - } - - if (!data.IsEmpty()) { - obj->SetInternalField(imp::kDataIndex, data); - } - -#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION - tpl->SetHandler(v8::IndexedPropertyHandlerConfiguration( - getter_, setter_, query_, deleter_, enumerator_, obj)); -#else - tpl->SetIndexedPropertyHandler( - getter_ - , setter_ - , query_ - , deleter_ - , enumerator_ - , obj); -#endif -} - -inline void SetCallHandler( - v8::Local tpl - , FunctionCallback callback - , v8::Local data = v8::Local()) { - HandleScope scope; - - v8::Local otpl = New(); - otpl->SetInternalFieldCount(imp::kFunctionFieldCount); - v8::Local obj = NewInstance(otpl).ToLocalChecked(); - - obj->SetInternalField( - imp::kFunctionIndex - , New(reinterpret_cast(callback))); - - if (!data.IsEmpty()) { - obj->SetInternalField(imp::kDataIndex, data); - } - - tpl->SetCallHandler(imp::FunctionCallbackWrapper, obj); -} - - -inline void SetCallAsFunctionHandler( - v8::Local tpl, - FunctionCallback callback, - v8::Local data = v8::Local()) { - HandleScope scope; - - v8::Local otpl = New(); - otpl->SetInternalFieldCount(imp::kFunctionFieldCount); - v8::Local obj = NewInstance(otpl).ToLocalChecked(); - - obj->SetInternalField( - imp::kFunctionIndex - , New(reinterpret_cast(callback))); - - if (!data.IsEmpty()) { - obj->SetInternalField(imp::kDataIndex, data); - } - - tpl->SetCallAsFunctionHandler(imp::FunctionCallbackWrapper, obj); -} - -//=== Weak Persistent Handling ================================================= - -#include "nan_weak.h" // NOLINT(build/include) - -//=== ObjectWrap =============================================================== - -#include "nan_object_wrap.h" // NOLINT(build/include) - -//=== HiddenValue/Private ====================================================== - -#include "nan_private.h" // NOLINT(build/include) - -//=== Export ================================================================== - -inline -void -Export(ADDON_REGISTER_FUNCTION_ARGS_TYPE target, const char *name, - FunctionCallback f) { - HandleScope scope; - - Set(target, New(name).ToLocalChecked(), - GetFunction(New(f)).ToLocalChecked()); -} - -//=== Tap Reverse Binding ===================================================== - -struct Tap { - explicit Tap(v8::Local t) : t_() { - HandleScope scope; - - t_.Reset(To(t).ToLocalChecked()); - } - - ~Tap() { t_.Reset(); } // not sure if neccessary - - inline void plan(int i) { - HandleScope scope; - v8::Local arg = New(i); - MakeCallback(New(t_), "plan", 1, &arg); - } - - inline void ok(bool isOk, const char *msg = NULL) { - HandleScope scope; - v8::Local args[2]; - args[0] = New(isOk); - if (msg) args[1] = New(msg).ToLocalChecked(); - MakeCallback(New(t_), "ok", msg ? 2 : 1, args); - } - - inline void pass(const char * msg = NULL) { - HandleScope scope; - v8::Local hmsg; - if (msg) hmsg = New(msg).ToLocalChecked(); - MakeCallback(New(t_), "pass", msg ? 1 : 0, &hmsg); - } - - private: - Persistent t_; -}; - -#define NAN_STRINGIZE2(x) #x -#define NAN_STRINGIZE(x) NAN_STRINGIZE2(x) -#define NAN_TEST_EXPRESSION(expression) \ - ( expression ), __FILE__ ":" NAN_STRINGIZE(__LINE__) ": " #expression - -#define NAN_EXPORT(target, function) Export(target, #function, function) - -#undef TYPE_CHECK - -//=== Generic Maybefication =================================================== - -namespace imp { - -template struct Maybefier; - -template struct Maybefier > { - inline static MaybeLocal convert(v8::Local v) { - return v; - } -}; - -template struct Maybefier > { - inline static MaybeLocal convert(MaybeLocal v) { - return v; - } -}; - -} // end of namespace imp - -template class MaybeMaybe> -inline MaybeLocal -MakeMaybe(MaybeMaybe v) { - return imp::Maybefier >::convert(v); -} - -//=== TypedArrayContents ======================================================= - -#include "nan_typedarray_contents.h" // NOLINT(build/include) - -//=== JSON ===================================================================== - -#include "nan_json.h" // NOLINT(build/include) - -} // end of namespace Nan - -#endif // NAN_H_ diff --git a/deploy/node_modules/nan/nan_callbacks.h b/deploy/node_modules/nan/nan_callbacks.h deleted file mode 100644 index c612cee..0000000 --- a/deploy/node_modules/nan/nan_callbacks.h +++ /dev/null @@ -1,88 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_CALLBACKS_H_ -#define NAN_CALLBACKS_H_ - -template class FunctionCallbackInfo; -template class PropertyCallbackInfo; -template class Global; - -typedef void(*FunctionCallback)(const FunctionCallbackInfo&); -typedef void(*GetterCallback) - (v8::Local, const PropertyCallbackInfo&); -typedef void(*SetterCallback)( - v8::Local, - v8::Local, - const PropertyCallbackInfo&); -typedef void(*PropertyGetterCallback)( - v8::Local, - const PropertyCallbackInfo&); -typedef void(*PropertySetterCallback)( - v8::Local, - v8::Local, - const PropertyCallbackInfo&); -typedef void(*PropertyEnumeratorCallback) - (const PropertyCallbackInfo&); -typedef void(*PropertyDeleterCallback)( - v8::Local, - const PropertyCallbackInfo&); -typedef void(*PropertyQueryCallback)( - v8::Local, - const PropertyCallbackInfo&); -typedef void(*IndexGetterCallback)( - uint32_t, - const PropertyCallbackInfo&); -typedef void(*IndexSetterCallback)( - uint32_t, - v8::Local, - const PropertyCallbackInfo&); -typedef void(*IndexEnumeratorCallback) - (const PropertyCallbackInfo&); -typedef void(*IndexDeleterCallback)( - uint32_t, - const PropertyCallbackInfo&); -typedef void(*IndexQueryCallback)( - uint32_t, - const PropertyCallbackInfo&); - -namespace imp { -typedef v8::Local Sig; - -static const int kDataIndex = 0; - -static const int kFunctionIndex = 1; -static const int kFunctionFieldCount = 2; - -static const int kGetterIndex = 1; -static const int kSetterIndex = 2; -static const int kAccessorFieldCount = 3; - -static const int kPropertyGetterIndex = 1; -static const int kPropertySetterIndex = 2; -static const int kPropertyEnumeratorIndex = 3; -static const int kPropertyDeleterIndex = 4; -static const int kPropertyQueryIndex = 5; -static const int kPropertyFieldCount = 6; - -static const int kIndexPropertyGetterIndex = 1; -static const int kIndexPropertySetterIndex = 2; -static const int kIndexPropertyEnumeratorIndex = 3; -static const int kIndexPropertyDeleterIndex = 4; -static const int kIndexPropertyQueryIndex = 5; -static const int kIndexPropertyFieldCount = 6; - -} // end of namespace imp - -#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION -# include "nan_callbacks_12_inl.h" // NOLINT(build/include) -#else -# include "nan_callbacks_pre_12_inl.h" // NOLINT(build/include) -#endif - -#endif // NAN_CALLBACKS_H_ diff --git a/deploy/node_modules/nan/nan_callbacks_12_inl.h b/deploy/node_modules/nan/nan_callbacks_12_inl.h deleted file mode 100644 index 9c8bf7e..0000000 --- a/deploy/node_modules/nan/nan_callbacks_12_inl.h +++ /dev/null @@ -1,512 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_CALLBACKS_12_INL_H_ -#define NAN_CALLBACKS_12_INL_H_ - -template -class ReturnValue { - v8::ReturnValue value_; - - public: - template - explicit inline ReturnValue(const v8::ReturnValue &value) : - value_(value) {} - template - explicit inline ReturnValue(const ReturnValue& that) - : value_(that.value_) { - TYPE_CHECK(T, S); - } - - // Handle setters - template inline void Set(const v8::Local &handle) { - TYPE_CHECK(T, S); - value_.Set(handle); - } - - template inline void Set(const Global &handle) { - TYPE_CHECK(T, S); -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && \ - (V8_MINOR_VERSION > 5 || (V8_MINOR_VERSION == 5 && \ - defined(V8_BUILD_NUMBER) && V8_BUILD_NUMBER >= 8)))) - value_.Set(handle); -#else - value_.Set(*reinterpret_cast*>(&handle)); - const_cast &>(handle).Reset(); -#endif - } - - // Fast primitive setters - inline void Set(bool value) { - TYPE_CHECK(T, v8::Boolean); - value_.Set(value); - } - - inline void Set(double i) { - TYPE_CHECK(T, v8::Number); - value_.Set(i); - } - - inline void Set(int32_t i) { - TYPE_CHECK(T, v8::Integer); - value_.Set(i); - } - - inline void Set(uint32_t i) { - TYPE_CHECK(T, v8::Integer); - value_.Set(i); - } - - // Fast JS primitive setters - inline void SetNull() { - TYPE_CHECK(T, v8::Primitive); - value_.SetNull(); - } - - inline void SetUndefined() { - TYPE_CHECK(T, v8::Primitive); - value_.SetUndefined(); - } - - inline void SetEmptyString() { - TYPE_CHECK(T, v8::String); - value_.SetEmptyString(); - } - - // Convenience getter for isolate - inline v8::Isolate *GetIsolate() const { - return value_.GetIsolate(); - } - - // Pointer setter: Uncompilable to prevent inadvertent misuse. - template - inline void Set(S *whatever) { TYPE_CHECK(S*, v8::Primitive); } -}; - -template -class FunctionCallbackInfo { - const v8::FunctionCallbackInfo &info_; - const v8::Local data_; - - public: - explicit inline FunctionCallbackInfo( - const v8::FunctionCallbackInfo &info - , v8::Local data) : - info_(info) - , data_(data) {} - - inline ReturnValue GetReturnValue() const { - return ReturnValue(info_.GetReturnValue()); - } - - inline v8::Local Callee() const { return info_.Callee(); } - inline v8::Local Data() const { return data_; } - inline v8::Local Holder() const { return info_.Holder(); } - inline bool IsConstructCall() const { return info_.IsConstructCall(); } - inline int Length() const { return info_.Length(); } - inline v8::Local operator[](int i) const { return info_[i]; } - inline v8::Local This() const { return info_.This(); } - inline v8::Isolate *GetIsolate() const { return info_.GetIsolate(); } - - - protected: - static const int kHolderIndex = 0; - static const int kIsolateIndex = 1; - static const int kReturnValueDefaultValueIndex = 2; - static const int kReturnValueIndex = 3; - static const int kDataIndex = 4; - static const int kCalleeIndex = 5; - static const int kContextSaveIndex = 6; - static const int kArgsLength = 7; - - private: - NAN_DISALLOW_ASSIGN_COPY_MOVE(FunctionCallbackInfo) -}; - -template -class PropertyCallbackInfo { - const v8::PropertyCallbackInfo &info_; - const v8::Local data_; - - public: - explicit inline PropertyCallbackInfo( - const v8::PropertyCallbackInfo &info - , const v8::Local data) : - info_(info) - , data_(data) {} - - inline v8::Isolate* GetIsolate() const { return info_.GetIsolate(); } - inline v8::Local Data() const { return data_; } - inline v8::Local This() const { return info_.This(); } - inline v8::Local Holder() const { return info_.Holder(); } - inline ReturnValue GetReturnValue() const { - return ReturnValue(info_.GetReturnValue()); - } - - protected: - static const int kHolderIndex = 0; - static const int kIsolateIndex = 1; - static const int kReturnValueDefaultValueIndex = 2; - static const int kReturnValueIndex = 3; - static const int kDataIndex = 4; - static const int kThisIndex = 5; - static const int kArgsLength = 6; - - private: - NAN_DISALLOW_ASSIGN_COPY_MOVE(PropertyCallbackInfo) -}; - -namespace imp { -static -void FunctionCallbackWrapper(const v8::FunctionCallbackInfo &info) { - v8::Local obj = info.Data().As(); - FunctionCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kFunctionIndex).As()->Value())); - FunctionCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - callback(cbinfo); -} - -typedef void (*NativeFunction)(const v8::FunctionCallbackInfo &); - -#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION -static -void GetterCallbackWrapper( - v8::Local property - , const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - GetterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kGetterIndex).As()->Value())); - callback(property.As(), cbinfo); -} - -typedef void (*NativeGetter) - (v8::Local, const v8::PropertyCallbackInfo &); - -static -void SetterCallbackWrapper( - v8::Local property - , v8::Local value - , const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - SetterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kSetterIndex).As()->Value())); - callback(property.As(), value, cbinfo); -} - -typedef void (*NativeSetter)( - v8::Local - , v8::Local - , const v8::PropertyCallbackInfo &); -#else -static -void GetterCallbackWrapper( - v8::Local property - , const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - GetterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kGetterIndex).As()->Value())); - callback(property, cbinfo); -} - -typedef void (*NativeGetter) - (v8::Local, const v8::PropertyCallbackInfo &); - -static -void SetterCallbackWrapper( - v8::Local property - , v8::Local value - , const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - SetterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kSetterIndex).As()->Value())); - callback(property, value, cbinfo); -} - -typedef void (*NativeSetter)( - v8::Local - , v8::Local - , const v8::PropertyCallbackInfo &); -#endif - -#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION -static -void PropertyGetterCallbackWrapper( - v8::Local property - , const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - PropertyGetterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kPropertyGetterIndex) - .As()->Value())); - callback(property.As(), cbinfo); -} - -typedef void (*NativePropertyGetter) - (v8::Local, const v8::PropertyCallbackInfo &); - -static -void PropertySetterCallbackWrapper( - v8::Local property - , v8::Local value - , const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - PropertySetterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kPropertySetterIndex) - .As()->Value())); - callback(property.As(), value, cbinfo); -} - -typedef void (*NativePropertySetter)( - v8::Local - , v8::Local - , const v8::PropertyCallbackInfo &); - -static -void PropertyEnumeratorCallbackWrapper( - const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - PropertyEnumeratorCallback callback = - reinterpret_cast(reinterpret_cast( - obj->GetInternalField(kPropertyEnumeratorIndex) - .As()->Value())); - callback(cbinfo); -} - -typedef void (*NativePropertyEnumerator) - (const v8::PropertyCallbackInfo &); - -static -void PropertyDeleterCallbackWrapper( - v8::Local property - , const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - PropertyDeleterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kPropertyDeleterIndex) - .As()->Value())); - callback(property.As(), cbinfo); -} - -typedef void (NativePropertyDeleter) - (v8::Local, const v8::PropertyCallbackInfo &); - -static -void PropertyQueryCallbackWrapper( - v8::Local property - , const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - PropertyQueryCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kPropertyQueryIndex) - .As()->Value())); - callback(property.As(), cbinfo); -} - -typedef void (*NativePropertyQuery) - (v8::Local, const v8::PropertyCallbackInfo &); -#else -static -void PropertyGetterCallbackWrapper( - v8::Local property - , const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - PropertyGetterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kPropertyGetterIndex) - .As()->Value())); - callback(property, cbinfo); -} - -typedef void (*NativePropertyGetter) - (v8::Local, const v8::PropertyCallbackInfo &); - -static -void PropertySetterCallbackWrapper( - v8::Local property - , v8::Local value - , const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - PropertySetterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kPropertySetterIndex) - .As()->Value())); - callback(property, value, cbinfo); -} - -typedef void (*NativePropertySetter)( - v8::Local - , v8::Local - , const v8::PropertyCallbackInfo &); - -static -void PropertyEnumeratorCallbackWrapper( - const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - PropertyEnumeratorCallback callback = - reinterpret_cast(reinterpret_cast( - obj->GetInternalField(kPropertyEnumeratorIndex) - .As()->Value())); - callback(cbinfo); -} - -typedef void (*NativePropertyEnumerator) - (const v8::PropertyCallbackInfo &); - -static -void PropertyDeleterCallbackWrapper( - v8::Local property - , const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - PropertyDeleterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kPropertyDeleterIndex) - .As()->Value())); - callback(property, cbinfo); -} - -typedef void (NativePropertyDeleter) - (v8::Local, const v8::PropertyCallbackInfo &); - -static -void PropertyQueryCallbackWrapper( - v8::Local property - , const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - PropertyQueryCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kPropertyQueryIndex) - .As()->Value())); - callback(property, cbinfo); -} - -typedef void (*NativePropertyQuery) - (v8::Local, const v8::PropertyCallbackInfo &); -#endif - -static -void IndexGetterCallbackWrapper( - uint32_t index, const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - IndexGetterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kIndexPropertyGetterIndex) - .As()->Value())); - callback(index, cbinfo); -} - -typedef void (*NativeIndexGetter) - (uint32_t, const v8::PropertyCallbackInfo &); - -static -void IndexSetterCallbackWrapper( - uint32_t index - , v8::Local value - , const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - IndexSetterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kIndexPropertySetterIndex) - .As()->Value())); - callback(index, value, cbinfo); -} - -typedef void (*NativeIndexSetter)( - uint32_t - , v8::Local - , const v8::PropertyCallbackInfo &); - -static -void IndexEnumeratorCallbackWrapper( - const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - IndexEnumeratorCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField( - kIndexPropertyEnumeratorIndex).As()->Value())); - callback(cbinfo); -} - -typedef void (*NativeIndexEnumerator) - (const v8::PropertyCallbackInfo &); - -static -void IndexDeleterCallbackWrapper( - uint32_t index, const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - IndexDeleterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kIndexPropertyDeleterIndex) - .As()->Value())); - callback(index, cbinfo); -} - -typedef void (*NativeIndexDeleter) - (uint32_t, const v8::PropertyCallbackInfo &); - -static -void IndexQueryCallbackWrapper( - uint32_t index, const v8::PropertyCallbackInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - IndexQueryCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kIndexPropertyQueryIndex) - .As()->Value())); - callback(index, cbinfo); -} - -typedef void (*NativeIndexQuery) - (uint32_t, const v8::PropertyCallbackInfo &); -} // end of namespace imp - -#endif // NAN_CALLBACKS_12_INL_H_ diff --git a/deploy/node_modules/nan/nan_callbacks_pre_12_inl.h b/deploy/node_modules/nan/nan_callbacks_pre_12_inl.h deleted file mode 100644 index 087ee52..0000000 --- a/deploy/node_modules/nan/nan_callbacks_pre_12_inl.h +++ /dev/null @@ -1,520 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_CALLBACKS_PRE_12_INL_H_ -#define NAN_CALLBACKS_PRE_12_INL_H_ - -namespace imp { -template class ReturnValueImp; -} // end of namespace imp - -template -class ReturnValue { - v8::Isolate *isolate_; - v8::Persistent *value_; - friend class imp::ReturnValueImp; - - public: - template - explicit inline ReturnValue(v8::Isolate *isolate, v8::Persistent *p) : - isolate_(isolate), value_(p) {} - template - explicit inline ReturnValue(const ReturnValue& that) - : isolate_(that.isolate_), value_(that.value_) { - TYPE_CHECK(T, S); - } - - // Handle setters - template inline void Set(const v8::Local &handle) { - TYPE_CHECK(T, S); - value_->Dispose(); - *value_ = v8::Persistent::New(handle); - } - - template inline void Set(const Global &handle) { - TYPE_CHECK(T, S); - value_->Dispose(); - *value_ = v8::Persistent::New(handle.persistent); - const_cast &>(handle).Reset(); - } - - // Fast primitive setters - inline void Set(bool value) { - v8::HandleScope scope; - - TYPE_CHECK(T, v8::Boolean); - value_->Dispose(); - *value_ = v8::Persistent::New(v8::Boolean::New(value)); - } - - inline void Set(double i) { - v8::HandleScope scope; - - TYPE_CHECK(T, v8::Number); - value_->Dispose(); - *value_ = v8::Persistent::New(v8::Number::New(i)); - } - - inline void Set(int32_t i) { - v8::HandleScope scope; - - TYPE_CHECK(T, v8::Integer); - value_->Dispose(); - *value_ = v8::Persistent::New(v8::Int32::New(i)); - } - - inline void Set(uint32_t i) { - v8::HandleScope scope; - - TYPE_CHECK(T, v8::Integer); - value_->Dispose(); - *value_ = v8::Persistent::New(v8::Uint32::NewFromUnsigned(i)); - } - - // Fast JS primitive setters - inline void SetNull() { - v8::HandleScope scope; - - TYPE_CHECK(T, v8::Primitive); - value_->Dispose(); - *value_ = v8::Persistent::New(v8::Null()); - } - - inline void SetUndefined() { - v8::HandleScope scope; - - TYPE_CHECK(T, v8::Primitive); - value_->Dispose(); - *value_ = v8::Persistent::New(v8::Undefined()); - } - - inline void SetEmptyString() { - v8::HandleScope scope; - - TYPE_CHECK(T, v8::String); - value_->Dispose(); - *value_ = v8::Persistent::New(v8::String::Empty()); - } - - // Convenience getter for isolate - inline v8::Isolate *GetIsolate() const { - return isolate_; - } - - // Pointer setter: Uncompilable to prevent inadvertent misuse. - template - inline void Set(S *whatever) { TYPE_CHECK(S*, v8::Primitive); } -}; - -template -class FunctionCallbackInfo { - const v8::Arguments &args_; - v8::Local data_; - ReturnValue return_value_; - v8::Persistent retval_; - - public: - explicit inline FunctionCallbackInfo( - const v8::Arguments &args - , v8::Local data) : - args_(args) - , data_(data) - , return_value_(args.GetIsolate(), &retval_) - , retval_(v8::Persistent::New(v8::Undefined())) {} - - inline ~FunctionCallbackInfo() { - retval_.Dispose(); - retval_.Clear(); - } - - inline ReturnValue GetReturnValue() const { - return ReturnValue(return_value_); - } - - inline v8::Local Callee() const { return args_.Callee(); } - inline v8::Local Data() const { return data_; } - inline v8::Local Holder() const { return args_.Holder(); } - inline bool IsConstructCall() const { return args_.IsConstructCall(); } - inline int Length() const { return args_.Length(); } - inline v8::Local operator[](int i) const { return args_[i]; } - inline v8::Local This() const { return args_.This(); } - inline v8::Isolate *GetIsolate() const { return args_.GetIsolate(); } - - - protected: - static const int kHolderIndex = 0; - static const int kIsolateIndex = 1; - static const int kReturnValueDefaultValueIndex = 2; - static const int kReturnValueIndex = 3; - static const int kDataIndex = 4; - static const int kCalleeIndex = 5; - static const int kContextSaveIndex = 6; - static const int kArgsLength = 7; - - private: - NAN_DISALLOW_ASSIGN_COPY_MOVE(FunctionCallbackInfo) -}; - -template -class PropertyCallbackInfoBase { - const v8::AccessorInfo &info_; - const v8::Local data_; - - public: - explicit inline PropertyCallbackInfoBase( - const v8::AccessorInfo &info - , const v8::Local data) : - info_(info) - , data_(data) {} - - inline v8::Isolate* GetIsolate() const { return info_.GetIsolate(); } - inline v8::Local Data() const { return data_; } - inline v8::Local This() const { return info_.This(); } - inline v8::Local Holder() const { return info_.Holder(); } - - protected: - static const int kHolderIndex = 0; - static const int kIsolateIndex = 1; - static const int kReturnValueDefaultValueIndex = 2; - static const int kReturnValueIndex = 3; - static const int kDataIndex = 4; - static const int kThisIndex = 5; - static const int kArgsLength = 6; - - private: - NAN_DISALLOW_ASSIGN_COPY_MOVE(PropertyCallbackInfoBase) -}; - -template -class PropertyCallbackInfo : public PropertyCallbackInfoBase { - ReturnValue return_value_; - v8::Persistent retval_; - - public: - explicit inline PropertyCallbackInfo( - const v8::AccessorInfo &info - , const v8::Local data) : - PropertyCallbackInfoBase(info, data) - , return_value_(info.GetIsolate(), &retval_) - , retval_(v8::Persistent::New(v8::Undefined())) {} - - inline ~PropertyCallbackInfo() { - retval_.Dispose(); - retval_.Clear(); - } - - inline ReturnValue GetReturnValue() const { return return_value_; } -}; - -template<> -class PropertyCallbackInfo : - public PropertyCallbackInfoBase { - ReturnValue return_value_; - v8::Persistent retval_; - - public: - explicit inline PropertyCallbackInfo( - const v8::AccessorInfo &info - , const v8::Local data) : - PropertyCallbackInfoBase(info, data) - , return_value_(info.GetIsolate(), &retval_) - , retval_(v8::Persistent::New(v8::Local())) {} - - inline ~PropertyCallbackInfo() { - retval_.Dispose(); - retval_.Clear(); - } - - inline ReturnValue GetReturnValue() const { - return return_value_; - } -}; - -template<> -class PropertyCallbackInfo : - public PropertyCallbackInfoBase { - ReturnValue return_value_; - v8::Persistent retval_; - - public: - explicit inline PropertyCallbackInfo( - const v8::AccessorInfo &info - , const v8::Local data) : - PropertyCallbackInfoBase(info, data) - , return_value_(info.GetIsolate(), &retval_) - , retval_(v8::Persistent::New(v8::Local())) {} - - inline ~PropertyCallbackInfo() { - retval_.Dispose(); - retval_.Clear(); - } - - inline ReturnValue GetReturnValue() const { - return return_value_; - } -}; - -template<> -class PropertyCallbackInfo : - public PropertyCallbackInfoBase { - ReturnValue return_value_; - v8::Persistent retval_; - - public: - explicit inline PropertyCallbackInfo( - const v8::AccessorInfo &info - , const v8::Local data) : - PropertyCallbackInfoBase(info, data) - , return_value_(info.GetIsolate(), &retval_) - , retval_(v8::Persistent::New(v8::Local())) {} - - inline ~PropertyCallbackInfo() { - retval_.Dispose(); - retval_.Clear(); - } - - inline ReturnValue GetReturnValue() const { - return return_value_; - } -}; - -namespace imp { -template -class ReturnValueImp : public ReturnValue { - public: - explicit ReturnValueImp(ReturnValue that) : - ReturnValue(that) {} - inline v8::Handle Value() { - return *ReturnValue::value_; - } -}; - -static -v8::Handle FunctionCallbackWrapper(const v8::Arguments &args) { - v8::Local obj = args.Data().As(); - FunctionCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kFunctionIndex).As()->Value())); - FunctionCallbackInfo - cbinfo(args, obj->GetInternalField(kDataIndex)); - callback(cbinfo); - return ReturnValueImp(cbinfo.GetReturnValue()).Value(); -} - -typedef v8::Handle (*NativeFunction)(const v8::Arguments &); - -static -v8::Handle GetterCallbackWrapper( - v8::Local property, const v8::AccessorInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - GetterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kGetterIndex).As()->Value())); - callback(property, cbinfo); - return ReturnValueImp(cbinfo.GetReturnValue()).Value(); -} - -typedef v8::Handle (*NativeGetter) - (v8::Local, const v8::AccessorInfo &); - -static -void SetterCallbackWrapper( - v8::Local property - , v8::Local value - , const v8::AccessorInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - SetterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kSetterIndex).As()->Value())); - callback(property, value, cbinfo); -} - -typedef void (*NativeSetter) - (v8::Local, v8::Local, const v8::AccessorInfo &); - -static -v8::Handle PropertyGetterCallbackWrapper( - v8::Local property, const v8::AccessorInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - PropertyGetterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kPropertyGetterIndex) - .As()->Value())); - callback(property, cbinfo); - return ReturnValueImp(cbinfo.GetReturnValue()).Value(); -} - -typedef v8::Handle (*NativePropertyGetter) - (v8::Local, const v8::AccessorInfo &); - -static -v8::Handle PropertySetterCallbackWrapper( - v8::Local property - , v8::Local value - , const v8::AccessorInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - PropertySetterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kPropertySetterIndex) - .As()->Value())); - callback(property, value, cbinfo); - return ReturnValueImp(cbinfo.GetReturnValue()).Value(); -} - -typedef v8::Handle (*NativePropertySetter) - (v8::Local, v8::Local, const v8::AccessorInfo &); - -static -v8::Handle PropertyEnumeratorCallbackWrapper( - const v8::AccessorInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - PropertyEnumeratorCallback callback = - reinterpret_cast(reinterpret_cast( - obj->GetInternalField(kPropertyEnumeratorIndex) - .As()->Value())); - callback(cbinfo); - return ReturnValueImp(cbinfo.GetReturnValue()).Value(); -} - -typedef v8::Handle (*NativePropertyEnumerator) - (const v8::AccessorInfo &); - -static -v8::Handle PropertyDeleterCallbackWrapper( - v8::Local property - , const v8::AccessorInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - PropertyDeleterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kPropertyDeleterIndex) - .As()->Value())); - callback(property, cbinfo); - return ReturnValueImp(cbinfo.GetReturnValue()).Value(); -} - -typedef v8::Handle (NativePropertyDeleter) - (v8::Local, const v8::AccessorInfo &); - -static -v8::Handle PropertyQueryCallbackWrapper( - v8::Local property, const v8::AccessorInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - PropertyQueryCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kPropertyQueryIndex) - .As()->Value())); - callback(property, cbinfo); - return ReturnValueImp(cbinfo.GetReturnValue()).Value(); -} - -typedef v8::Handle (*NativePropertyQuery) - (v8::Local, const v8::AccessorInfo &); - -static -v8::Handle IndexGetterCallbackWrapper( - uint32_t index, const v8::AccessorInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - IndexGetterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kIndexPropertyGetterIndex) - .As()->Value())); - callback(index, cbinfo); - return ReturnValueImp(cbinfo.GetReturnValue()).Value(); -} - -typedef v8::Handle (*NativeIndexGetter) - (uint32_t, const v8::AccessorInfo &); - -static -v8::Handle IndexSetterCallbackWrapper( - uint32_t index - , v8::Local value - , const v8::AccessorInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - IndexSetterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kIndexPropertySetterIndex) - .As()->Value())); - callback(index, value, cbinfo); - return ReturnValueImp(cbinfo.GetReturnValue()).Value(); -} - -typedef v8::Handle (*NativeIndexSetter) - (uint32_t, v8::Local, const v8::AccessorInfo &); - -static -v8::Handle IndexEnumeratorCallbackWrapper( - const v8::AccessorInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - IndexEnumeratorCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kIndexPropertyEnumeratorIndex) - .As()->Value())); - callback(cbinfo); - return ReturnValueImp(cbinfo.GetReturnValue()).Value(); -} - -typedef v8::Handle (*NativeIndexEnumerator) - (const v8::AccessorInfo &); - -static -v8::Handle IndexDeleterCallbackWrapper( - uint32_t index, const v8::AccessorInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - IndexDeleterCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kIndexPropertyDeleterIndex) - .As()->Value())); - callback(index, cbinfo); - return ReturnValueImp(cbinfo.GetReturnValue()).Value(); -} - -typedef v8::Handle (*NativeIndexDeleter) - (uint32_t, const v8::AccessorInfo &); - -static -v8::Handle IndexQueryCallbackWrapper( - uint32_t index, const v8::AccessorInfo &info) { - v8::Local obj = info.Data().As(); - PropertyCallbackInfo - cbinfo(info, obj->GetInternalField(kDataIndex)); - IndexQueryCallback callback = reinterpret_cast( - reinterpret_cast( - obj->GetInternalField(kIndexPropertyQueryIndex) - .As()->Value())); - callback(index, cbinfo); - return ReturnValueImp(cbinfo.GetReturnValue()).Value(); -} - -typedef v8::Handle (*NativeIndexQuery) - (uint32_t, const v8::AccessorInfo &); -} // end of namespace imp - -#endif // NAN_CALLBACKS_PRE_12_INL_H_ diff --git a/deploy/node_modules/nan/nan_converters.h b/deploy/node_modules/nan/nan_converters.h deleted file mode 100644 index 8a569b5..0000000 --- a/deploy/node_modules/nan/nan_converters.h +++ /dev/null @@ -1,72 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_CONVERTERS_H_ -#define NAN_CONVERTERS_H_ - -namespace imp { -template struct ToFactoryBase { - typedef MaybeLocal return_t; -}; -template struct ValueFactoryBase { typedef Maybe return_t; }; - -template struct ToFactory; - -template<> -struct ToFactory : ToFactoryBase { - static inline return_t convert(v8::Local val) { - if (val.IsEmpty() || !val->IsFunction()) return MaybeLocal(); - return MaybeLocal(val.As()); - } -}; - -#define X(TYPE) \ - template<> \ - struct ToFactory : ToFactoryBase { \ - static inline return_t convert(v8::Local val); \ - }; - -X(Boolean) -X(Number) -X(String) -X(Object) -X(Integer) -X(Uint32) -X(Int32) - -#undef X - -#define X(TYPE) \ - template<> \ - struct ToFactory : ValueFactoryBase { \ - static inline return_t convert(v8::Local val); \ - }; - -X(bool) -X(double) -X(int64_t) -X(uint32_t) -X(int32_t) - -#undef X -} // end of namespace imp - -template -inline -typename imp::ToFactory::return_t To(v8::Local val) { - return imp::ToFactory::convert(val); -} - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) -# include "nan_converters_43_inl.h" -#else -# include "nan_converters_pre_43_inl.h" -#endif - -#endif // NAN_CONVERTERS_H_ diff --git a/deploy/node_modules/nan/nan_converters_43_inl.h b/deploy/node_modules/nan/nan_converters_43_inl.h deleted file mode 100644 index 0c7cd50..0000000 --- a/deploy/node_modules/nan/nan_converters_43_inl.h +++ /dev/null @@ -1,48 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_CONVERTERS_43_INL_H_ -#define NAN_CONVERTERS_43_INL_H_ - -#define X(TYPE) \ -imp::ToFactory::return_t \ -imp::ToFactory::convert(v8::Local val) { \ - v8::Isolate *isolate = v8::Isolate::GetCurrent(); \ - v8::EscapableHandleScope scope(isolate); \ - return scope.Escape( \ - val->To ## TYPE(v8::Isolate::GetCurrent()->GetCurrentContext()) \ - .FromMaybe(v8::Local())); \ -} - -X(Boolean) -X(Number) -X(String) -X(Object) -X(Integer) -X(Uint32) -X(Int32) - -#undef X - -#define X(TYPE, NAME) \ -imp::ToFactory::return_t \ -imp::ToFactory::convert(v8::Local val) { \ - v8::Isolate *isolate = v8::Isolate::GetCurrent(); \ - v8::HandleScope scope(isolate); \ - return val->NAME ## Value(isolate->GetCurrentContext()); \ -} - -X(bool, Boolean) -X(double, Number) -X(int64_t, Integer) -X(uint32_t, Uint32) -X(int32_t, Int32) - -#undef X - -#endif // NAN_CONVERTERS_43_INL_H_ diff --git a/deploy/node_modules/nan/nan_converters_pre_43_inl.h b/deploy/node_modules/nan/nan_converters_pre_43_inl.h deleted file mode 100644 index 3391be2..0000000 --- a/deploy/node_modules/nan/nan_converters_pre_43_inl.h +++ /dev/null @@ -1,42 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_CONVERTERS_PRE_43_INL_H_ -#define NAN_CONVERTERS_PRE_43_INL_H_ - -#define X(TYPE) \ -imp::ToFactory::return_t \ -imp::ToFactory::convert(v8::Local val) { \ - return val->To ## TYPE(); \ -} - -X(Boolean) -X(Number) -X(String) -X(Object) -X(Integer) -X(Uint32) -X(Int32) - -#undef X - -#define X(TYPE, NAME) \ -imp::ToFactory::return_t \ -imp::ToFactory::convert(v8::Local val) { \ - return Just(val->NAME ## Value()); \ -} - -X(bool, Boolean) -X(double, Number) -X(int64_t, Integer) -X(uint32_t, Uint32) -X(int32_t, Int32) - -#undef X - -#endif // NAN_CONVERTERS_PRE_43_INL_H_ diff --git a/deploy/node_modules/nan/nan_implementation_12_inl.h b/deploy/node_modules/nan/nan_implementation_12_inl.h deleted file mode 100644 index be80a45..0000000 --- a/deploy/node_modules/nan/nan_implementation_12_inl.h +++ /dev/null @@ -1,399 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_IMPLEMENTATION_12_INL_H_ -#define NAN_IMPLEMENTATION_12_INL_H_ -//============================================================================== -// node v0.11 implementation -//============================================================================== - -namespace imp { - -//=== Array ==================================================================== - -Factory::return_t -Factory::New() { - return v8::Array::New(v8::Isolate::GetCurrent()); -} - -Factory::return_t -Factory::New(int length) { - return v8::Array::New(v8::Isolate::GetCurrent(), length); -} - -//=== Boolean ================================================================== - -Factory::return_t -Factory::New(bool value) { - return v8::Boolean::New(v8::Isolate::GetCurrent(), value); -} - -//=== Boolean Object =========================================================== - -Factory::return_t -Factory::New(bool value) { -#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION) - return v8::BooleanObject::New( - v8::Isolate::GetCurrent(), value).As(); -#else - return v8::BooleanObject::New(value).As(); -#endif -} - -//=== Context ================================================================== - -Factory::return_t -Factory::New( v8::ExtensionConfiguration* extensions - , v8::Local tmpl - , v8::Local obj) { - return v8::Context::New(v8::Isolate::GetCurrent(), extensions, tmpl, obj); -} - -//=== Date ===================================================================== - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) -Factory::return_t -Factory::New(double value) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(v8::Date::New(isolate->GetCurrentContext(), value) - .FromMaybe(v8::Local()).As()); -} -#else -Factory::return_t -Factory::New(double value) { - return v8::Date::New(v8::Isolate::GetCurrent(), value).As(); -} -#endif - -//=== External ================================================================= - -Factory::return_t -Factory::New(void * value) { - return v8::External::New(v8::Isolate::GetCurrent(), value); -} - -//=== Function ================================================================= - -Factory::return_t -Factory::New( FunctionCallback callback - , v8::Local data) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - v8::Local tpl = v8::ObjectTemplate::New(isolate); - tpl->SetInternalFieldCount(imp::kFunctionFieldCount); - v8::Local obj = NewInstance(tpl).ToLocalChecked(); - - obj->SetInternalField( - imp::kFunctionIndex - , v8::External::New(isolate, reinterpret_cast(callback))); - - v8::Local val = v8::Local::New(isolate, data); - - if (!val.IsEmpty()) { - obj->SetInternalField(imp::kDataIndex, val); - } - - return scope.Escape(v8::Function::New( isolate - , imp::FunctionCallbackWrapper - , obj)); -} - -//=== Function Template ======================================================== - -Factory::return_t -Factory::New( FunctionCallback callback - , v8::Local data - , v8::Local signature) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - if (callback) { - v8::EscapableHandleScope scope(isolate); - v8::Local tpl = v8::ObjectTemplate::New(isolate); - tpl->SetInternalFieldCount(imp::kFunctionFieldCount); - v8::Local obj = NewInstance(tpl).ToLocalChecked(); - - obj->SetInternalField( - imp::kFunctionIndex - , v8::External::New(isolate, reinterpret_cast(callback))); - v8::Local val = v8::Local::New(isolate, data); - - if (!val.IsEmpty()) { - obj->SetInternalField(imp::kDataIndex, val); - } - - return scope.Escape(v8::FunctionTemplate::New( isolate - , imp::FunctionCallbackWrapper - , obj - , signature)); - } else { - return v8::FunctionTemplate::New(isolate, 0, data, signature); - } -} - -//=== Number =================================================================== - -Factory::return_t -Factory::New(double value) { - return v8::Number::New(v8::Isolate::GetCurrent(), value); -} - -//=== Number Object ============================================================ - -Factory::return_t -Factory::New(double value) { - return v8::NumberObject::New( v8::Isolate::GetCurrent() - , value).As(); -} - -//=== Integer, Int32 and Uint32 ================================================ - -template -typename IntegerFactory::return_t -IntegerFactory::New(int32_t value) { - return To(T::New(v8::Isolate::GetCurrent(), value)); -} - -template -typename IntegerFactory::return_t -IntegerFactory::New(uint32_t value) { - return To(T::NewFromUnsigned(v8::Isolate::GetCurrent(), value)); -} - -Factory::return_t -Factory::New(int32_t value) { - return To( - v8::Uint32::NewFromUnsigned(v8::Isolate::GetCurrent(), value)); -} - -Factory::return_t -Factory::New(uint32_t value) { - return To( - v8::Uint32::NewFromUnsigned(v8::Isolate::GetCurrent(), value)); -} - -//=== Object =================================================================== - -Factory::return_t -Factory::New() { - return v8::Object::New(v8::Isolate::GetCurrent()); -} - -//=== Object Template ========================================================== - -Factory::return_t -Factory::New() { - return v8::ObjectTemplate::New(v8::Isolate::GetCurrent()); -} - -//=== RegExp =================================================================== - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) -Factory::return_t -Factory::New( - v8::Local pattern - , v8::RegExp::Flags flags) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape( - v8::RegExp::New(isolate->GetCurrentContext(), pattern, flags) - .FromMaybe(v8::Local())); -} -#else -Factory::return_t -Factory::New( - v8::Local pattern - , v8::RegExp::Flags flags) { - return v8::RegExp::New(pattern, flags); -} -#endif - -//=== Script =================================================================== - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) -Factory::return_t -Factory::New( v8::Local source) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - v8::ScriptCompiler::Source src(source); - return scope.Escape( - v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &src) - .FromMaybe(v8::Local())); -} - -Factory::return_t -Factory::New( v8::Local source - , v8::ScriptOrigin const& origin) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - v8::ScriptCompiler::Source src(source, origin); - return scope.Escape( - v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &src) - .FromMaybe(v8::Local())); -} -#else -Factory::return_t -Factory::New( v8::Local source) { - v8::ScriptCompiler::Source src(source); - return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &src); -} - -Factory::return_t -Factory::New( v8::Local source - , v8::ScriptOrigin const& origin) { - v8::ScriptCompiler::Source src(source, origin); - return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &src); -} -#endif - -//=== Signature ================================================================ - -Factory::return_t -Factory::New(Factory::FTH receiver) { - return v8::Signature::New(v8::Isolate::GetCurrent(), receiver); -} - -//=== String =================================================================== - -Factory::return_t -Factory::New() { - return v8::String::Empty(v8::Isolate::GetCurrent()); -} - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) -Factory::return_t -Factory::New(const char * value, int length) { - return v8::String::NewFromUtf8( - v8::Isolate::GetCurrent(), value, v8::NewStringType::kNormal, length); -} - -Factory::return_t -Factory::New(std::string const& value) { - assert(value.size() <= INT_MAX && "string too long"); - return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), - value.data(), v8::NewStringType::kNormal, static_cast(value.size())); -} - -Factory::return_t -Factory::New(const uint16_t * value, int length) { - return v8::String::NewFromTwoByte(v8::Isolate::GetCurrent(), value, - v8::NewStringType::kNormal, length); -} - -Factory::return_t -Factory::New(v8::String::ExternalStringResource * value) { - return v8::String::NewExternalTwoByte(v8::Isolate::GetCurrent(), value); -} - -Factory::return_t -Factory::New(ExternalOneByteStringResource * value) { - return v8::String::NewExternalOneByte(v8::Isolate::GetCurrent(), value); -} -#else -Factory::return_t -Factory::New(const char * value, int length) { - return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), value, - v8::String::kNormalString, length); -} - -Factory::return_t -Factory::New( - std::string const& value) /* NOLINT(build/include_what_you_use) */ { - assert(value.size() <= INT_MAX && "string too long"); - return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), value.data(), - v8::String::kNormalString, - static_cast(value.size())); -} - -Factory::return_t -Factory::New(const uint16_t * value, int length) { - return v8::String::NewFromTwoByte(v8::Isolate::GetCurrent(), value, - v8::String::kNormalString, length); -} - -Factory::return_t -Factory::New(v8::String::ExternalStringResource * value) { - return v8::String::NewExternal(v8::Isolate::GetCurrent(), value); -} - -Factory::return_t -Factory::New(ExternalOneByteStringResource * value) { - return v8::String::NewExternal(v8::Isolate::GetCurrent(), value); -} -#endif - -//=== String Object ============================================================ - -Factory::return_t -Factory::New(v8::Local value) { - return v8::StringObject::New(value).As(); -} - -//=== Unbound Script =========================================================== - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) -Factory::return_t -Factory::New(v8::Local source) { - v8::ScriptCompiler::Source src(source); - return v8::ScriptCompiler::CompileUnboundScript( - v8::Isolate::GetCurrent(), &src); -} - -Factory::return_t -Factory::New( v8::Local source - , v8::ScriptOrigin const& origin) { - v8::ScriptCompiler::Source src(source, origin); - return v8::ScriptCompiler::CompileUnboundScript( - v8::Isolate::GetCurrent(), &src); -} -#else -Factory::return_t -Factory::New(v8::Local source) { - v8::ScriptCompiler::Source src(source); - return v8::ScriptCompiler::CompileUnbound(v8::Isolate::GetCurrent(), &src); -} - -Factory::return_t -Factory::New( v8::Local source - , v8::ScriptOrigin const& origin) { - v8::ScriptCompiler::Source src(source, origin); - return v8::ScriptCompiler::CompileUnbound(v8::Isolate::GetCurrent(), &src); -} -#endif - -} // end of namespace imp - -//=== Presistents and Handles ================================================== - -#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION -template -inline v8::Local New(v8::Handle h) { - return v8::Local::New(v8::Isolate::GetCurrent(), h); -} -#endif - -template -inline v8::Local New(v8::Persistent const& p) { - return v8::Local::New(v8::Isolate::GetCurrent(), p); -} - -template -inline v8::Local New(Persistent const& p) { - return v8::Local::New(v8::Isolate::GetCurrent(), p); -} - -template -inline v8::Local New(Global const& p) { - return v8::Local::New(v8::Isolate::GetCurrent(), p); -} - -#endif // NAN_IMPLEMENTATION_12_INL_H_ diff --git a/deploy/node_modules/nan/nan_implementation_pre_12_inl.h b/deploy/node_modules/nan/nan_implementation_pre_12_inl.h deleted file mode 100644 index 6afe94c..0000000 --- a/deploy/node_modules/nan/nan_implementation_pre_12_inl.h +++ /dev/null @@ -1,263 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_IMPLEMENTATION_PRE_12_INL_H_ -#define NAN_IMPLEMENTATION_PRE_12_INL_H_ - -//============================================================================== -// node v0.10 implementation -//============================================================================== - -namespace imp { - -//=== Array ==================================================================== - -Factory::return_t -Factory::New() { - return v8::Array::New(); -} - -Factory::return_t -Factory::New(int length) { - return v8::Array::New(length); -} - -//=== Boolean ================================================================== - -Factory::return_t -Factory::New(bool value) { - return v8::Boolean::New(value)->ToBoolean(); -} - -//=== Boolean Object =========================================================== - -Factory::return_t -Factory::New(bool value) { - return v8::BooleanObject::New(value).As(); -} - -//=== Context ================================================================== - -Factory::return_t -Factory::New( v8::ExtensionConfiguration* extensions - , v8::Local tmpl - , v8::Local obj) { - v8::Persistent ctx = v8::Context::New(extensions, tmpl, obj); - v8::Local lctx = v8::Local::New(ctx); - ctx.Dispose(); - return lctx; -} - -//=== Date ===================================================================== - -Factory::return_t -Factory::New(double value) { - return v8::Date::New(value).As(); -} - -//=== External ================================================================= - -Factory::return_t -Factory::New(void * value) { - return v8::External::New(value); -} - -//=== Function ================================================================= - -Factory::return_t -Factory::New( FunctionCallback callback - , v8::Local data) { - v8::HandleScope scope; - - return scope.Close(Factory::New( - callback, data, v8::Local()) - ->GetFunction()); -} - - -//=== FunctionTemplate ========================================================= - -Factory::return_t -Factory::New( FunctionCallback callback - , v8::Local data - , v8::Local signature) { - if (callback) { - v8::HandleScope scope; - - v8::Local tpl = v8::ObjectTemplate::New(); - tpl->SetInternalFieldCount(imp::kFunctionFieldCount); - v8::Local obj = tpl->NewInstance(); - - obj->SetInternalField( - imp::kFunctionIndex - , v8::External::New(reinterpret_cast(callback))); - - v8::Local val = v8::Local::New(data); - - if (!val.IsEmpty()) { - obj->SetInternalField(imp::kDataIndex, val); - } - - // Note(agnat): Emulate length argument here. Unfortunately, I couldn't find - // a way. Have at it though... - return scope.Close( - v8::FunctionTemplate::New(imp::FunctionCallbackWrapper - , obj - , signature)); - } else { - return v8::FunctionTemplate::New(0, data, signature); - } -} - -//=== Number =================================================================== - -Factory::return_t -Factory::New(double value) { - return v8::Number::New(value); -} - -//=== Number Object ============================================================ - -Factory::return_t -Factory::New(double value) { - return v8::NumberObject::New(value).As(); -} - -//=== Integer, Int32 and Uint32 ================================================ - -template -typename IntegerFactory::return_t -IntegerFactory::New(int32_t value) { - return To(T::New(value)); -} - -template -typename IntegerFactory::return_t -IntegerFactory::New(uint32_t value) { - return To(T::NewFromUnsigned(value)); -} - -Factory::return_t -Factory::New(int32_t value) { - return To(v8::Uint32::NewFromUnsigned(value)); -} - -Factory::return_t -Factory::New(uint32_t value) { - return To(v8::Uint32::NewFromUnsigned(value)); -} - - -//=== Object =================================================================== - -Factory::return_t -Factory::New() { - return v8::Object::New(); -} - -//=== Object Template ========================================================== - -Factory::return_t -Factory::New() { - return v8::ObjectTemplate::New(); -} - -//=== RegExp =================================================================== - -Factory::return_t -Factory::New( - v8::Local pattern - , v8::RegExp::Flags flags) { - return v8::RegExp::New(pattern, flags); -} - -//=== Script =================================================================== - -Factory::return_t -Factory::New( v8::Local source) { - return v8::Script::New(source); -} -Factory::return_t -Factory::New( v8::Local source - , v8::ScriptOrigin const& origin) { - return v8::Script::New(source, const_cast(&origin)); -} - -//=== Signature ================================================================ - -Factory::return_t -Factory::New(Factory::FTH receiver) { - return v8::Signature::New(receiver); -} - -//=== String =================================================================== - -Factory::return_t -Factory::New() { - return v8::String::Empty(); -} - -Factory::return_t -Factory::New(const char * value, int length) { - return v8::String::New(value, length); -} - -Factory::return_t -Factory::New( - std::string const& value) /* NOLINT(build/include_what_you_use) */ { - assert(value.size() <= INT_MAX && "string too long"); - return v8::String::New(value.data(), static_cast(value.size())); -} - -Factory::return_t -Factory::New(const uint16_t * value, int length) { - return v8::String::New(value, length); -} - -Factory::return_t -Factory::New(v8::String::ExternalStringResource * value) { - return v8::String::NewExternal(value); -} - -Factory::return_t -Factory::New(v8::String::ExternalAsciiStringResource * value) { - return v8::String::NewExternal(value); -} - -//=== String Object ============================================================ - -Factory::return_t -Factory::New(v8::Local value) { - return v8::StringObject::New(value).As(); -} - -} // end of namespace imp - -//=== Presistents and Handles ================================================== - -template -inline v8::Local New(v8::Handle h) { - return v8::Local::New(h); -} - -template -inline v8::Local New(v8::Persistent const& p) { - return v8::Local::New(p); -} - -template -inline v8::Local New(Persistent const& p) { - return v8::Local::New(p.persistent); -} - -template -inline v8::Local New(Global const& p) { - return v8::Local::New(p.persistent); -} - -#endif // NAN_IMPLEMENTATION_PRE_12_INL_H_ diff --git a/deploy/node_modules/nan/nan_json.h b/deploy/node_modules/nan/nan_json.h deleted file mode 100644 index 465614b..0000000 --- a/deploy/node_modules/nan/nan_json.h +++ /dev/null @@ -1,159 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_JSON_H_ -#define NAN_JSON_H_ - -#if NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION -#define NAN_JSON_H_NEED_PARSE 1 -#else -#define NAN_JSON_H_NEED_PARSE 0 -#endif // NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION - -#if NODE_MODULE_VERSION >= NODE_7_0_MODULE_VERSION -#define NAN_JSON_H_NEED_STRINGIFY 0 -#else -#define NAN_JSON_H_NEED_STRINGIFY 1 -#endif // NODE_MODULE_VERSION >= NODE_7_0_MODULE_VERSION - -class JSON { - public: - JSON() { -#if NAN_JSON_H_NEED_PARSE + NAN_JSON_H_NEED_STRINGIFY - Nan::HandleScope scope; - - Nan::MaybeLocal maybe_global_json = Nan::Get( - Nan::GetCurrentContext()->Global(), - Nan::New("JSON").ToLocalChecked() - ); - - assert(!maybe_global_json.IsEmpty() && "global JSON is empty"); - v8::Local val_global_json = maybe_global_json.ToLocalChecked(); - - assert(val_global_json->IsObject() && "global JSON is not an object"); - Nan::MaybeLocal maybe_obj_global_json = - Nan::To(val_global_json); - - assert(!maybe_obj_global_json.IsEmpty() && "global JSON object is empty"); - v8::Local global_json = maybe_obj_global_json.ToLocalChecked(); - -#if NAN_JSON_H_NEED_PARSE - Nan::MaybeLocal maybe_parse_method = Nan::Get( - global_json, Nan::New("parse").ToLocalChecked() - ); - - assert(!maybe_parse_method.IsEmpty() && "JSON.parse is empty"); - v8::Local parse_method = maybe_parse_method.ToLocalChecked(); - - assert(parse_method->IsFunction() && "JSON.parse is not a function"); - parse_cb_.Reset(parse_method.As()); -#endif // NAN_JSON_H_NEED_PARSE - -#if NAN_JSON_H_NEED_STRINGIFY - Nan::MaybeLocal maybe_stringify_method = Nan::Get( - global_json, Nan::New("stringify").ToLocalChecked() - ); - - assert(!maybe_stringify_method.IsEmpty() && "JSON.stringify is empty"); - v8::Local stringify_method = - maybe_stringify_method.ToLocalChecked(); - - assert( - stringify_method->IsFunction() && "JSON.stringify is not a function" - ); - stringify_cb_.Reset(stringify_method.As()); -#endif // NAN_JSON_H_NEED_STRINGIFY -#endif // NAN_JSON_H_NEED_PARSE + NAN_JSON_H_NEED_STRINGIFY - } - - inline - Nan::MaybeLocal Parse(v8::Local json_string) { - Nan::EscapableHandleScope scope; -#if NAN_JSON_H_NEED_PARSE - return scope.Escape(parse(json_string)); -#else - Nan::MaybeLocal result; -#if NODE_MODULE_VERSION == NODE_0_12_MODULE_VERSION - result = v8::JSON::Parse(json_string); -#else -#if NODE_MODULE_VERSION > NODE_6_0_MODULE_VERSION - v8::Local context_or_isolate = Nan::GetCurrentContext(); -#else - v8::Isolate* context_or_isolate = v8::Isolate::GetCurrent(); -#endif // NODE_MODULE_VERSION > NODE_6_0_MODULE_VERSION - result = v8::JSON::Parse(context_or_isolate, json_string); -#endif // NODE_MODULE_VERSION == NODE_0_12_MODULE_VERSION - if (result.IsEmpty()) return v8::Local(); - return scope.Escape(result.ToLocalChecked()); -#endif // NAN_JSON_H_NEED_PARSE - } - - inline - Nan::MaybeLocal Stringify(v8::Local json_object) { - Nan::EscapableHandleScope scope; - Nan::MaybeLocal result = -#if NAN_JSON_H_NEED_STRINGIFY - Nan::To(stringify(json_object)); -#else - v8::JSON::Stringify(Nan::GetCurrentContext(), json_object); -#endif // NAN_JSON_H_NEED_STRINGIFY - if (result.IsEmpty()) return v8::Local(); - return scope.Escape(result.ToLocalChecked()); - } - - inline - Nan::MaybeLocal Stringify(v8::Local json_object, - v8::Local gap) { - Nan::EscapableHandleScope scope; - Nan::MaybeLocal result = -#if NAN_JSON_H_NEED_STRINGIFY - Nan::To(stringify(json_object, gap)); -#else - v8::JSON::Stringify(Nan::GetCurrentContext(), json_object, gap); -#endif // NAN_JSON_H_NEED_STRINGIFY - if (result.IsEmpty()) return v8::Local(); - return scope.Escape(result.ToLocalChecked()); - } - - private: - NAN_DISALLOW_ASSIGN_COPY_MOVE(JSON) -#if NAN_JSON_H_NEED_PARSE - Nan::Callback parse_cb_; -#endif // NAN_JSON_H_NEED_PARSE -#if NAN_JSON_H_NEED_STRINGIFY - Nan::Callback stringify_cb_; -#endif // NAN_JSON_H_NEED_STRINGIFY - -#if NAN_JSON_H_NEED_PARSE - inline v8::Local parse(v8::Local arg) { - assert(!parse_cb_.IsEmpty() && "parse_cb_ is empty"); - return parse_cb_.Call(1, &arg); - } -#endif // NAN_JSON_H_NEED_PARSE - -#if NAN_JSON_H_NEED_STRINGIFY - inline v8::Local stringify(v8::Local arg) { - assert(!stringify_cb_.IsEmpty() && "stringify_cb_ is empty"); - return stringify_cb_.Call(1, &arg); - } - - inline v8::Local stringify(v8::Local arg, - v8::Local gap) { - assert(!stringify_cb_.IsEmpty() && "stringify_cb_ is empty"); - - v8::Local argv[] = { - arg, - Nan::Null(), - gap - }; - return stringify_cb_.Call(3, argv); - } -#endif // NAN_JSON_H_NEED_STRINGIFY -}; - -#endif // NAN_JSON_H_ diff --git a/deploy/node_modules/nan/nan_maybe_43_inl.h b/deploy/node_modules/nan/nan_maybe_43_inl.h deleted file mode 100644 index 10eeb02..0000000 --- a/deploy/node_modules/nan/nan_maybe_43_inl.h +++ /dev/null @@ -1,337 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_MAYBE_43_INL_H_ -#define NAN_MAYBE_43_INL_H_ - -template -using MaybeLocal = v8::MaybeLocal; - -template -using Maybe = v8::Maybe; - -template -inline Maybe Nothing() { - return v8::Nothing(); -} - -template -inline Maybe Just(const T& t) { - return v8::Just(t); -} - -inline -MaybeLocal ToDetailString(v8::Local val) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(val->ToDetailString(isolate->GetCurrentContext()) - .FromMaybe(v8::Local())); -} - -inline -MaybeLocal ToArrayIndex(v8::Local val) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(val->ToArrayIndex(isolate->GetCurrentContext()) - .FromMaybe(v8::Local())); -} - -inline -Maybe Equals(v8::Local a, v8::Local(b)) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return a->Equals(isolate->GetCurrentContext(), b); -} - -inline -MaybeLocal NewInstance(v8::Local h) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(h->NewInstance(isolate->GetCurrentContext()) - .FromMaybe(v8::Local())); -} - -inline -MaybeLocal NewInstance( - v8::Local h - , int argc - , v8::Local argv[]) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(h->NewInstance(isolate->GetCurrentContext(), argc, argv) - .FromMaybe(v8::Local())); -} - -inline -MaybeLocal NewInstance(v8::Local h) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(h->NewInstance(isolate->GetCurrentContext()) - .FromMaybe(v8::Local())); -} - - -inline MaybeLocal GetFunction( - v8::Local t) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(t->GetFunction(isolate->GetCurrentContext()) - .FromMaybe(v8::Local())); -} - -inline Maybe Set( - v8::Local obj - , v8::Local key - , v8::Local value) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return obj->Set(isolate->GetCurrentContext(), key, value); -} - -inline Maybe Set( - v8::Local obj - , uint32_t index - , v8::Local value) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return obj->Set(isolate->GetCurrentContext(), index, value); -} - -inline Maybe ForceSet( - v8::Local obj - , v8::Local key - , v8::Local value - , v8::PropertyAttribute attribs = v8::None) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return obj->ForceSet(isolate->GetCurrentContext(), key, value, attribs); -} - -inline MaybeLocal Get( - v8::Local obj - , v8::Local key) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(obj->Get(isolate->GetCurrentContext(), key) - .FromMaybe(v8::Local())); -} - -inline -MaybeLocal Get(v8::Local obj, uint32_t index) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(obj->Get(isolate->GetCurrentContext(), index) - .FromMaybe(v8::Local())); -} - -inline v8::PropertyAttribute GetPropertyAttributes( - v8::Local obj - , v8::Local key) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return obj->GetPropertyAttributes(isolate->GetCurrentContext(), key) - .FromJust(); -} - -inline Maybe Has( - v8::Local obj - , v8::Local key) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return obj->Has(isolate->GetCurrentContext(), key); -} - -inline Maybe Has(v8::Local obj, uint32_t index) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return obj->Has(isolate->GetCurrentContext(), index); -} - -inline Maybe Delete( - v8::Local obj - , v8::Local key) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return obj->Delete(isolate->GetCurrentContext(), key); -} - -inline -Maybe Delete(v8::Local obj, uint32_t index) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return obj->Delete(isolate->GetCurrentContext(), index); -} - -inline -MaybeLocal GetPropertyNames(v8::Local obj) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(obj->GetPropertyNames(isolate->GetCurrentContext()) - .FromMaybe(v8::Local())); -} - -inline -MaybeLocal GetOwnPropertyNames(v8::Local obj) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(obj->GetOwnPropertyNames(isolate->GetCurrentContext()) - .FromMaybe(v8::Local())); -} - -inline Maybe SetPrototype( - v8::Local obj - , v8::Local prototype) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return obj->SetPrototype(isolate->GetCurrentContext(), prototype); -} - -inline MaybeLocal ObjectProtoToString( - v8::Local obj) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(obj->ObjectProtoToString(isolate->GetCurrentContext()) - .FromMaybe(v8::Local())); -} - -inline Maybe HasOwnProperty( - v8::Local obj - , v8::Local key) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return obj->HasOwnProperty(isolate->GetCurrentContext(), key); -} - -inline Maybe HasRealNamedProperty( - v8::Local obj - , v8::Local key) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return obj->HasRealNamedProperty(isolate->GetCurrentContext(), key); -} - -inline Maybe HasRealIndexedProperty( - v8::Local obj - , uint32_t index) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return obj->HasRealIndexedProperty(isolate->GetCurrentContext(), index); -} - -inline Maybe HasRealNamedCallbackProperty( - v8::Local obj - , v8::Local key) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return obj->HasRealNamedCallbackProperty(isolate->GetCurrentContext(), key); -} - -inline MaybeLocal GetRealNamedPropertyInPrototypeChain( - v8::Local obj - , v8::Local key) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(obj->GetRealNamedPropertyInPrototypeChain( - isolate->GetCurrentContext(), key) - .FromMaybe(v8::Local())); -} - -inline MaybeLocal GetRealNamedProperty( - v8::Local obj - , v8::Local key) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape( - obj->GetRealNamedProperty(isolate->GetCurrentContext(), key) - .FromMaybe(v8::Local())); -} - -inline MaybeLocal CallAsFunction( - v8::Local obj - , v8::Local recv - , int argc - , v8::Local argv[]) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape( - obj->CallAsFunction(isolate->GetCurrentContext(), recv, argc, argv) - .FromMaybe(v8::Local())); -} - -inline MaybeLocal CallAsConstructor( - v8::Local obj - , int argc, v8::Local argv[]) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape( - obj->CallAsConstructor(isolate->GetCurrentContext(), argc, argv) - .FromMaybe(v8::Local())); -} - -inline -MaybeLocal GetSourceLine(v8::Local msg) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(msg->GetSourceLine(isolate->GetCurrentContext()) - .FromMaybe(v8::Local())); -} - -inline Maybe GetLineNumber(v8::Local msg) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return msg->GetLineNumber(isolate->GetCurrentContext()); -} - -inline Maybe GetStartColumn(v8::Local msg) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return msg->GetStartColumn(isolate->GetCurrentContext()); -} - -inline Maybe GetEndColumn(v8::Local msg) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - return msg->GetEndColumn(isolate->GetCurrentContext()); -} - -inline MaybeLocal CloneElementAt( - v8::Local array - , uint32_t index) { -#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION) - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - v8::Local context = isolate->GetCurrentContext(); - v8::Local elem; - v8::Local obj; - if (!array->Get(context, index).ToLocal(&elem)) { - return scope.Escape(obj); - } - if (!elem->ToObject(context).ToLocal(&obj)) { - return scope.Escape(v8::Local()); - } - return scope.Escape(obj->Clone()); -#else - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(array->CloneElementAt(isolate->GetCurrentContext(), index) - .FromMaybe(v8::Local())); -#endif -} - -inline MaybeLocal Call( - v8::Local fun - , v8::Local recv - , int argc - , v8::Local argv[]) { - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - return scope.Escape(fun->Call(isolate->GetCurrentContext(), recv, argc, argv) - .FromMaybe(v8::Local())); -} - -#endif // NAN_MAYBE_43_INL_H_ diff --git a/deploy/node_modules/nan/nan_maybe_pre_43_inl.h b/deploy/node_modules/nan/nan_maybe_pre_43_inl.h deleted file mode 100644 index f0248f9..0000000 --- a/deploy/node_modules/nan/nan_maybe_pre_43_inl.h +++ /dev/null @@ -1,305 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_MAYBE_PRE_43_INL_H_ -#define NAN_MAYBE_PRE_43_INL_H_ - -template -class MaybeLocal { - public: - inline MaybeLocal() : val_(v8::Local()) {} - - template -# if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION - inline - MaybeLocal(v8::Local that) : val_(that) {} // NOLINT(runtime/explicit) -# else - inline - MaybeLocal(v8::Local that) : // NOLINT(runtime/explicit) - val_(*reinterpret_cast*>(&that)) {} -# endif - - inline bool IsEmpty() const { return val_.IsEmpty(); } - - template - inline bool ToLocal(v8::Local *out) const { - *out = val_; - return !IsEmpty(); - } - - inline v8::Local ToLocalChecked() const { -#if defined(V8_ENABLE_CHECKS) - assert(!IsEmpty() && "ToLocalChecked is Empty"); -#endif // V8_ENABLE_CHECKS - return val_; - } - - template - inline v8::Local FromMaybe(v8::Local default_value) const { - return IsEmpty() ? default_value : v8::Local(val_); - } - - private: - v8::Local val_; -}; - -template -class Maybe { - public: - inline bool IsNothing() const { return !has_value_; } - inline bool IsJust() const { return has_value_; } - - inline T FromJust() const { -#if defined(V8_ENABLE_CHECKS) - assert(IsJust() && "FromJust is Nothing"); -#endif // V8_ENABLE_CHECKS - return value_; - } - - inline T FromMaybe(const T& default_value) const { - return has_value_ ? value_ : default_value; - } - - inline bool operator==(const Maybe &other) const { - return (IsJust() == other.IsJust()) && - (!IsJust() || FromJust() == other.FromJust()); - } - - inline bool operator!=(const Maybe &other) const { - return !operator==(other); - } - - private: - Maybe() : has_value_(false) {} - explicit Maybe(const T& t) : has_value_(true), value_(t) {} - bool has_value_; - T value_; - - template - friend Maybe Nothing(); - template - friend Maybe Just(const U& u); -}; - -template -inline Maybe Nothing() { - return Maybe(); -} - -template -inline Maybe Just(const T& t) { - return Maybe(t); -} - -inline -MaybeLocal ToDetailString(v8::Handle val) { - return MaybeLocal(val->ToDetailString()); -} - -inline -MaybeLocal ToArrayIndex(v8::Handle val) { - return MaybeLocal(val->ToArrayIndex()); -} - -inline -Maybe Equals(v8::Handle a, v8::Handle(b)) { - return Just(a->Equals(b)); -} - -inline -MaybeLocal NewInstance(v8::Handle h) { - return MaybeLocal(h->NewInstance()); -} - -inline -MaybeLocal NewInstance( - v8::Local h - , int argc - , v8::Local argv[]) { - return MaybeLocal(h->NewInstance(argc, argv)); -} - -inline -MaybeLocal NewInstance(v8::Handle h) { - return MaybeLocal(h->NewInstance()); -} - -inline -MaybeLocal GetFunction(v8::Handle t) { - return MaybeLocal(t->GetFunction()); -} - -inline Maybe Set( - v8::Handle obj - , v8::Handle key - , v8::Handle value) { - return Just(obj->Set(key, value)); -} - -inline Maybe Set( - v8::Handle obj - , uint32_t index - , v8::Handle value) { - return Just(obj->Set(index, value)); -} - -inline Maybe ForceSet( - v8::Handle obj - , v8::Handle key - , v8::Handle value - , v8::PropertyAttribute attribs = v8::None) { - return Just(obj->ForceSet(key, value, attribs)); -} - -inline MaybeLocal Get( - v8::Handle obj - , v8::Handle key) { - return MaybeLocal(obj->Get(key)); -} - -inline MaybeLocal Get( - v8::Handle obj - , uint32_t index) { - return MaybeLocal(obj->Get(index)); -} - -inline Maybe GetPropertyAttributes( - v8::Handle obj - , v8::Handle key) { - return Just(obj->GetPropertyAttributes(key)); -} - -inline Maybe Has( - v8::Handle obj - , v8::Handle key) { - return Just(obj->Has(key)); -} - -inline Maybe Has( - v8::Handle obj - , uint32_t index) { - return Just(obj->Has(index)); -} - -inline Maybe Delete( - v8::Handle obj - , v8::Handle key) { - return Just(obj->Delete(key)); -} - -inline Maybe Delete( - v8::Handle obj - , uint32_t index) { - return Just(obj->Delete(index)); -} - -inline -MaybeLocal GetPropertyNames(v8::Handle obj) { - return MaybeLocal(obj->GetPropertyNames()); -} - -inline -MaybeLocal GetOwnPropertyNames(v8::Handle obj) { - return MaybeLocal(obj->GetOwnPropertyNames()); -} - -inline Maybe SetPrototype( - v8::Handle obj - , v8::Handle prototype) { - return Just(obj->SetPrototype(prototype)); -} - -inline MaybeLocal ObjectProtoToString( - v8::Handle obj) { - return MaybeLocal(obj->ObjectProtoToString()); -} - -inline Maybe HasOwnProperty( - v8::Handle obj - , v8::Handle key) { - return Just(obj->HasOwnProperty(key)); -} - -inline Maybe HasRealNamedProperty( - v8::Handle obj - , v8::Handle key) { - return Just(obj->HasRealNamedProperty(key)); -} - -inline Maybe HasRealIndexedProperty( - v8::Handle obj - , uint32_t index) { - return Just(obj->HasRealIndexedProperty(index)); -} - -inline Maybe HasRealNamedCallbackProperty( - v8::Handle obj - , v8::Handle key) { - return Just(obj->HasRealNamedCallbackProperty(key)); -} - -inline MaybeLocal GetRealNamedPropertyInPrototypeChain( - v8::Handle obj - , v8::Handle key) { - return MaybeLocal( - obj->GetRealNamedPropertyInPrototypeChain(key)); -} - -inline MaybeLocal GetRealNamedProperty( - v8::Handle obj - , v8::Handle key) { - return MaybeLocal(obj->GetRealNamedProperty(key)); -} - -inline MaybeLocal CallAsFunction( - v8::Handle obj - , v8::Handle recv - , int argc - , v8::Handle argv[]) { - return MaybeLocal(obj->CallAsFunction(recv, argc, argv)); -} - -inline MaybeLocal CallAsConstructor( - v8::Handle obj - , int argc - , v8::Local argv[]) { - return MaybeLocal(obj->CallAsConstructor(argc, argv)); -} - -inline -MaybeLocal GetSourceLine(v8::Handle msg) { - return MaybeLocal(msg->GetSourceLine()); -} - -inline Maybe GetLineNumber(v8::Handle msg) { - return Just(msg->GetLineNumber()); -} - -inline Maybe GetStartColumn(v8::Handle msg) { - return Just(msg->GetStartColumn()); -} - -inline Maybe GetEndColumn(v8::Handle msg) { - return Just(msg->GetEndColumn()); -} - -inline MaybeLocal CloneElementAt( - v8::Handle array - , uint32_t index) { - return MaybeLocal(array->CloneElementAt(index)); -} - -inline MaybeLocal Call( - v8::Local fun - , v8::Local recv - , int argc - , v8::Local argv[]) { - return MaybeLocal(fun->Call(recv, argc, argv)); -} - -#endif // NAN_MAYBE_PRE_43_INL_H_ diff --git a/deploy/node_modules/nan/nan_new.h b/deploy/node_modules/nan/nan_new.h deleted file mode 100644 index 628f40c..0000000 --- a/deploy/node_modules/nan/nan_new.h +++ /dev/null @@ -1,340 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_NEW_H_ -#define NAN_NEW_H_ - -namespace imp { // scnr - -// TODO(agnat): Generalize -template v8::Local To(v8::Local i); - -template <> -inline -v8::Local -To(v8::Local i) { - return Nan::To(i).ToLocalChecked(); -} - -template <> -inline -v8::Local -To(v8::Local i) { - return Nan::To(i).ToLocalChecked(); -} - -template <> -inline -v8::Local -To(v8::Local i) { - return Nan::To(i).ToLocalChecked(); -} - -template struct FactoryBase { - typedef v8::Local return_t; -}; - -template struct MaybeFactoryBase { - typedef MaybeLocal return_t; -}; - -template struct Factory; - -template <> -struct Factory : FactoryBase { - static inline return_t New(); - static inline return_t New(int length); -}; - -template <> -struct Factory : FactoryBase { - static inline return_t New(bool value); -}; - -template <> -struct Factory : FactoryBase { - static inline return_t New(bool value); -}; - -template <> -struct Factory : FactoryBase { - static inline - return_t - New( v8::ExtensionConfiguration* extensions = NULL - , v8::Local tmpl = v8::Local() - , v8::Local obj = v8::Local()); -}; - -template <> -struct Factory : MaybeFactoryBase { - static inline return_t New(double value); -}; - -template <> -struct Factory : FactoryBase { - static inline return_t New(void *value); -}; - -template <> -struct Factory : FactoryBase { - static inline - return_t - New( FunctionCallback callback - , v8::Local data = v8::Local()); -}; - -template <> -struct Factory : FactoryBase { - static inline - return_t - New( FunctionCallback callback = NULL - , v8::Local data = v8::Local() - , v8::Local signature = v8::Local()); -}; - -template <> -struct Factory : FactoryBase { - static inline return_t New(double value); -}; - -template <> -struct Factory : FactoryBase { - static inline return_t New(double value); -}; - -template -struct IntegerFactory : FactoryBase { - typedef typename FactoryBase::return_t return_t; - static inline return_t New(int32_t value); - static inline return_t New(uint32_t value); -}; - -template <> -struct Factory : IntegerFactory {}; - -template <> -struct Factory : IntegerFactory {}; - -template <> -struct Factory : FactoryBase { - static inline return_t New(int32_t value); - static inline return_t New(uint32_t value); -}; - -template <> -struct Factory : FactoryBase { - static inline return_t New(); -}; - -template <> -struct Factory : FactoryBase { - static inline return_t New(); -}; - -template <> -struct Factory : MaybeFactoryBase { - static inline return_t New( - v8::Local pattern, v8::RegExp::Flags flags); -}; - -template <> -struct Factory : MaybeFactoryBase { - static inline return_t New( v8::Local source); - static inline return_t New( v8::Local source - , v8::ScriptOrigin const& origin); -}; - -template <> -struct Factory : FactoryBase { - typedef v8::Local FTH; - static inline return_t New(FTH receiver = FTH()); -}; - -template <> -struct Factory : MaybeFactoryBase { - static inline return_t New(); - static inline return_t New(const char *value, int length = -1); - static inline return_t New(const uint16_t *value, int length = -1); - static inline return_t New(std::string const& value); - - static inline return_t New(v8::String::ExternalStringResource * value); - static inline return_t New(ExternalOneByteStringResource * value); -}; - -template <> -struct Factory : FactoryBase { - static inline return_t New(v8::Local value); -}; - -} // end of namespace imp - -#if (NODE_MODULE_VERSION >= 12) - -namespace imp { - -template <> -struct Factory : MaybeFactoryBase { - static inline return_t New( v8::Local source); - static inline return_t New( v8::Local source - , v8::ScriptOrigin const& origin); -}; - -} // end of namespace imp - -# include "nan_implementation_12_inl.h" - -#else // NODE_MODULE_VERSION >= 12 - -# include "nan_implementation_pre_12_inl.h" - -#endif - -//=== API ====================================================================== - -template -typename imp::Factory::return_t -New() { - return imp::Factory::New(); -} - -template -typename imp::Factory::return_t -New(A0 arg0) { - return imp::Factory::New(arg0); -} - -template -typename imp::Factory::return_t -New(A0 arg0, A1 arg1) { - return imp::Factory::New(arg0, arg1); -} - -template -typename imp::Factory::return_t -New(A0 arg0, A1 arg1, A2 arg2) { - return imp::Factory::New(arg0, arg1, arg2); -} - -template -typename imp::Factory::return_t -New(A0 arg0, A1 arg1, A2 arg2, A3 arg3) { - return imp::Factory::New(arg0, arg1, arg2, arg3); -} - -// Note(agnat): When passing overloaded function pointers to template functions -// as generic arguments the compiler needs help in picking the right overload. -// These two functions handle New and New with -// all argument variations. - -// v8::Function and v8::FunctionTemplate with one or two arguments -template -typename imp::Factory::return_t -New( FunctionCallback callback - , v8::Local data = v8::Local()) { - return imp::Factory::New(callback, data); -} - -// v8::Function and v8::FunctionTemplate with three arguments -template -typename imp::Factory::return_t -New( FunctionCallback callback - , v8::Local data = v8::Local() - , A2 a2 = A2()) { - return imp::Factory::New(callback, data, a2); -} - -// Convenience - -#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION -template inline v8::Local New(v8::Handle h); -#endif - -#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION -template - inline v8::Local New(v8::Persistent const& p); -#else -template inline v8::Local New(v8::Persistent const& p); -#endif -template -inline v8::Local New(Persistent const& p); -template -inline v8::Local New(Global const& p); - -inline -imp::Factory::return_t -New(bool value) { - return New(value); -} - -inline -imp::Factory::return_t -New(int32_t value) { - return New(value); -} - -inline -imp::Factory::return_t -New(uint32_t value) { - return New(value); -} - -inline -imp::Factory::return_t -New(double value) { - return New(value); -} - -inline -imp::Factory::return_t -New(std::string const& value) { // NOLINT(build/include_what_you_use) - return New(value); -} - -inline -imp::Factory::return_t -New(const char * value, int length) { - return New(value, length); -} - -inline -imp::Factory::return_t -New(const uint16_t * value, int length) { - return New(value, length); -} - -inline -imp::Factory::return_t -New(const char * value) { - return New(value); -} - -inline -imp::Factory::return_t -New(const uint16_t * value) { - return New(value); -} - -inline -imp::Factory::return_t -New(v8::String::ExternalStringResource * value) { - return New(value); -} - -inline -imp::Factory::return_t -New(ExternalOneByteStringResource * value) { - return New(value); -} - -inline -imp::Factory::return_t -New(v8::Local pattern, v8::RegExp::Flags flags) { - return New(pattern, flags); -} - -#endif // NAN_NEW_H_ diff --git a/deploy/node_modules/nan/nan_object_wrap.h b/deploy/node_modules/nan/nan_object_wrap.h deleted file mode 100644 index 28281b0..0000000 --- a/deploy/node_modules/nan/nan_object_wrap.h +++ /dev/null @@ -1,155 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_OBJECT_WRAP_H_ -#define NAN_OBJECT_WRAP_H_ - -class ObjectWrap { - public: - ObjectWrap() { - refs_ = 0; - } - - - virtual ~ObjectWrap() { - if (persistent().IsEmpty()) { - return; - } - - assert(persistent().IsNearDeath()); - persistent().ClearWeak(); - persistent().Reset(); - } - - - template - static inline T* Unwrap(v8::Local object) { - assert(!object.IsEmpty()); - assert(object->InternalFieldCount() > 0); - // Cast to ObjectWrap before casting to T. A direct cast from void - // to T won't work right when T has more than one base class. - void* ptr = GetInternalFieldPointer(object, 0); - ObjectWrap* wrap = static_cast(ptr); - return static_cast(wrap); - } - - - inline v8::Local handle() const { - return New(handle_); - } - - - inline Persistent& persistent() { - return handle_; - } - - - protected: - inline void Wrap(v8::Local object) { - assert(persistent().IsEmpty()); - assert(object->InternalFieldCount() > 0); - SetInternalFieldPointer(object, 0, this); - persistent().Reset(object); - MakeWeak(); - } - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) - - inline void MakeWeak() { - persistent().v8::PersistentBase::SetWeak( - this, WeakCallback, v8::WeakCallbackType::kParameter); - persistent().MarkIndependent(); - } - -#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION - - inline void MakeWeak() { - persistent().v8::PersistentBase::SetWeak(this, WeakCallback); - persistent().MarkIndependent(); - } - -#else - - inline void MakeWeak() { - persistent().persistent.MakeWeak(this, WeakCallback); - persistent().MarkIndependent(); - } - -#endif - - /* Ref() marks the object as being attached to an event loop. - * Refed objects will not be garbage collected, even if - * all references are lost. - */ - virtual void Ref() { - assert(!persistent().IsEmpty()); - persistent().ClearWeak(); - refs_++; - } - - /* Unref() marks an object as detached from the event loop. This is its - * default state. When an object with a "weak" reference changes from - * attached to detached state it will be freed. Be careful not to access - * the object after making this call as it might be gone! - * (A "weak reference" means an object that only has a - * persistant handle.) - * - * DO NOT CALL THIS FROM DESTRUCTOR - */ - virtual void Unref() { - assert(!persistent().IsEmpty()); - assert(!persistent().IsWeak()); - assert(refs_ > 0); - if (--refs_ == 0) - MakeWeak(); - } - - int refs_; // ro - - private: - NAN_DISALLOW_ASSIGN_COPY_MOVE(ObjectWrap) -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) - - static void - WeakCallback(v8::WeakCallbackInfo const& info) { - ObjectWrap* wrap = info.GetParameter(); - assert(wrap->refs_ == 0); - assert(wrap->handle_.IsNearDeath()); - wrap->handle_.Reset(); - delete wrap; - } - -#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION - - static void - WeakCallback(v8::WeakCallbackData const& data) { - ObjectWrap* wrap = data.GetParameter(); - assert(wrap->refs_ == 0); - assert(wrap->handle_.IsNearDeath()); - wrap->handle_.Reset(); - delete wrap; - } - -#else - - static void WeakCallback(v8::Persistent value, void *data) { - ObjectWrap *wrap = static_cast(data); - assert(wrap->refs_ == 0); - assert(wrap->handle_.IsNearDeath()); - wrap->handle_.Reset(); - delete wrap; - } - -#endif - Persistent handle_; -}; - - -#endif // NAN_OBJECT_WRAP_H_ diff --git a/deploy/node_modules/nan/nan_persistent_12_inl.h b/deploy/node_modules/nan/nan_persistent_12_inl.h deleted file mode 100644 index a23d899..0000000 --- a/deploy/node_modules/nan/nan_persistent_12_inl.h +++ /dev/null @@ -1,132 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_PERSISTENT_12_INL_H_ -#define NAN_PERSISTENT_12_INL_H_ - -template class Persistent : - public v8::Persistent { - public: - inline Persistent() : v8::Persistent() {} - - template inline Persistent(v8::Local that) : - v8::Persistent(v8::Isolate::GetCurrent(), that) {} - - template - inline - Persistent(const v8::Persistent &that) : // NOLINT(runtime/explicit) - v8::Persistent(v8::Isolate::GetCurrent(), that) {} - - inline void Reset() { v8::PersistentBase::Reset(); } - - template - inline void Reset(const v8::Local &other) { - v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); - } - - template - inline void Reset(const v8::PersistentBase &other) { - v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); - } - - template - inline void SetWeak( - P *parameter - , typename WeakCallbackInfo

::Callback callback - , WeakCallbackType type); - - private: - inline T *operator*() const { return *PersistentBase::persistent; } - - template - inline void Copy(const Persistent &that) { - TYPE_CHECK(T, S); - - this->Reset(); - - if (!that.IsEmpty()) { - this->Reset(that); - M::Copy(that, this); - } - } -}; - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) -template -class Global : public v8::Global { - public: - inline Global() : v8::Global() {} - - template inline Global(v8::Local that) : - v8::Global(v8::Isolate::GetCurrent(), that) {} - - template - inline - Global(const v8::PersistentBase &that) : // NOLINT(runtime/explicit) - v8::Global(v8::Isolate::GetCurrent(), that) {} - - inline void Reset() { v8::PersistentBase::Reset(); } - - template - inline void Reset(const v8::Local &other) { - v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); - } - - template - inline void Reset(const v8::PersistentBase &other) { - v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); - } - - template - inline void SetWeak( - P *parameter - , typename WeakCallbackInfo

::Callback callback - , WeakCallbackType type) { - reinterpret_cast*>(this)->SetWeak( - parameter, callback, type); - } -}; -#else -template -class Global : public v8::UniquePersistent { - public: - inline Global() : v8::UniquePersistent() {} - - template inline Global(v8::Local that) : - v8::UniquePersistent(v8::Isolate::GetCurrent(), that) {} - - template - inline - Global(const v8::PersistentBase &that) : // NOLINT(runtime/explicit) - v8::UniquePersistent(v8::Isolate::GetCurrent(), that) {} - - inline void Reset() { v8::PersistentBase::Reset(); } - - template - inline void Reset(const v8::Local &other) { - v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); - } - - template - inline void Reset(const v8::PersistentBase &other) { - v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); - } - - template - inline void SetWeak( - P *parameter - , typename WeakCallbackInfo

::Callback callback - , WeakCallbackType type) { - reinterpret_cast*>(this)->SetWeak( - parameter, callback, type); - } -}; -#endif - -#endif // NAN_PERSISTENT_12_INL_H_ diff --git a/deploy/node_modules/nan/nan_persistent_pre_12_inl.h b/deploy/node_modules/nan/nan_persistent_pre_12_inl.h deleted file mode 100644 index f915746..0000000 --- a/deploy/node_modules/nan/nan_persistent_pre_12_inl.h +++ /dev/null @@ -1,242 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_PERSISTENT_PRE_12_INL_H_ -#define NAN_PERSISTENT_PRE_12_INL_H_ - -template -class PersistentBase { - v8::Persistent persistent; - template - friend v8::Local New(const PersistentBase &p); - template - friend v8::Local New(const Persistent &p); - template - friend v8::Local New(const Global &p); - template friend class ReturnValue; - - public: - inline PersistentBase() : - persistent() {} - - inline void Reset() { - persistent.Dispose(); - persistent.Clear(); - } - - template - inline void Reset(const v8::Local &other) { - TYPE_CHECK(T, S); - - if (!persistent.IsEmpty()) { - persistent.Dispose(); - } - - if (other.IsEmpty()) { - persistent.Clear(); - } else { - persistent = v8::Persistent::New(other); - } - } - - template - inline void Reset(const PersistentBase &other) { - TYPE_CHECK(T, S); - - if (!persistent.IsEmpty()) { - persistent.Dispose(); - } - - if (other.IsEmpty()) { - persistent.Clear(); - } else { - persistent = v8::Persistent::New(other.persistent); - } - } - - inline bool IsEmpty() const { return persistent.IsEmpty(); } - - inline void Empty() { persistent.Clear(); } - - template - inline bool operator==(const PersistentBase &that) const { - return this->persistent == that.persistent; - } - - template - inline bool operator==(const v8::Local &that) const { - return this->persistent == that; - } - - template - inline bool operator!=(const PersistentBase &that) const { - return !operator==(that); - } - - template - inline bool operator!=(const v8::Local &that) const { - return !operator==(that); - } - - template - inline void SetWeak( - P *parameter - , typename WeakCallbackInfo

::Callback callback - , WeakCallbackType type); - - inline void ClearWeak() { persistent.ClearWeak(); } - - inline void MarkIndependent() { persistent.MarkIndependent(); } - - inline bool IsIndependent() const { return persistent.IsIndependent(); } - - inline bool IsNearDeath() const { return persistent.IsNearDeath(); } - - inline bool IsWeak() const { return persistent.IsWeak(); } - - private: - inline explicit PersistentBase(v8::Persistent that) : - persistent(that) { } - inline explicit PersistentBase(T *val) : persistent(val) {} - template friend class Persistent; - template friend class Global; - friend class ObjectWrap; -}; - -template -class NonCopyablePersistentTraits { - public: - typedef Persistent > - NonCopyablePersistent; - static const bool kResetInDestructor = false; - template - inline static void Copy(const Persistent &source, - NonCopyablePersistent *dest) { - Uncompilable(); - } - - template inline static void Uncompilable() { - TYPE_CHECK(O, v8::Primitive); - } -}; - -template -struct CopyablePersistentTraits { - typedef Persistent > CopyablePersistent; - static const bool kResetInDestructor = true; - template - static inline void Copy(const Persistent &source, - CopyablePersistent *dest) {} -}; - -template class Persistent : - public PersistentBase { - public: - inline Persistent() {} - - template inline Persistent(v8::Handle that) - : PersistentBase(v8::Persistent::New(that)) { - TYPE_CHECK(T, S); - } - - inline Persistent(const Persistent &that) : PersistentBase() { - Copy(that); - } - - template - inline Persistent(const Persistent &that) : - PersistentBase() { - Copy(that); - } - - inline Persistent &operator=(const Persistent &that) { - Copy(that); - return *this; - } - - template - inline Persistent &operator=(const Persistent &that) { - Copy(that); - return *this; - } - - inline ~Persistent() { - if (M::kResetInDestructor) this->Reset(); - } - - private: - inline T *operator*() const { return *PersistentBase::persistent; } - - template - inline void Copy(const Persistent &that) { - TYPE_CHECK(T, S); - - this->Reset(); - - if (!that.IsEmpty()) { - this->persistent = v8::Persistent::New(that.persistent); - M::Copy(that, this); - } - } -}; - -template -class Global : public PersistentBase { - struct RValue { - inline explicit RValue(Global* obj) : object(obj) {} - Global* object; - }; - - public: - inline Global() : PersistentBase(0) { } - - template - inline Global(v8::Local that) // NOLINT(runtime/explicit) - : PersistentBase(v8::Persistent::New(that)) { - TYPE_CHECK(T, S); - } - - template - inline Global(const PersistentBase &that) // NOLINT(runtime/explicit) - : PersistentBase(that) { - TYPE_CHECK(T, S); - } - /** - * Move constructor. - */ - inline Global(RValue rvalue) // NOLINT(runtime/explicit) - : PersistentBase(rvalue.object->persistent) { - rvalue.object->Reset(); - } - inline ~Global() { this->Reset(); } - /** - * Move via assignment. - */ - template - inline Global &operator=(Global rhs) { - TYPE_CHECK(T, S); - this->Reset(rhs.persistent); - rhs.Reset(); - return *this; - } - /** - * Cast operator for moves. - */ - inline operator RValue() { return RValue(this); } - /** - * Pass allows returning uniques from functions, etc. - */ - Global Pass() { return Global(RValue(this)); } - - private: - Global(Global &); - void operator=(Global &); - template friend class ReturnValue; -}; - -#endif // NAN_PERSISTENT_PRE_12_INL_H_ diff --git a/deploy/node_modules/nan/nan_private.h b/deploy/node_modules/nan/nan_private.h deleted file mode 100644 index 03082cd..0000000 --- a/deploy/node_modules/nan/nan_private.h +++ /dev/null @@ -1,73 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_PRIVATE_H_ -#define NAN_PRIVATE_H_ - -inline Maybe -HasPrivate(v8::Local object, v8::Local key) { - HandleScope scope; -#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::Local context = isolate->GetCurrentContext(); - v8::Local private_key = v8::Private::ForApi(isolate, key); - return object->HasPrivate(context, private_key); -#else - return Just(!object->GetHiddenValue(key).IsEmpty()); -#endif -} - -inline MaybeLocal -GetPrivate(v8::Local object, v8::Local key) { -#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::EscapableHandleScope scope(isolate); - v8::Local context = isolate->GetCurrentContext(); - v8::Local private_key = v8::Private::ForApi(isolate, key); - v8::MaybeLocal v = object->GetPrivate(context, private_key); - return scope.Escape(v.ToLocalChecked()); -#else - EscapableHandleScope scope; - v8::Local v = object->GetHiddenValue(key); - if (v.IsEmpty()) { - v = Undefined(); - } - return scope.Escape(v); -#endif -} - -inline Maybe SetPrivate( - v8::Local object, - v8::Local key, - v8::Local value) { -#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION - HandleScope scope; - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::Local context = isolate->GetCurrentContext(); - v8::Local private_key = v8::Private::ForApi(isolate, key); - return object->SetPrivate(context, private_key, value); -#else - return Just(object->SetHiddenValue(key, value)); -#endif -} - -inline Maybe DeletePrivate( - v8::Local object, - v8::Local key) { -#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION - HandleScope scope; - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::Local private_key = v8::Private::ForApi(isolate, key); - return object->DeletePrivate(isolate->GetCurrentContext(), private_key); -#else - return Just(object->DeleteHiddenValue(key)); -#endif -} - -#endif // NAN_PRIVATE_H_ - diff --git a/deploy/node_modules/nan/nan_string_bytes.h b/deploy/node_modules/nan/nan_string_bytes.h deleted file mode 100644 index a2e6437..0000000 --- a/deploy/node_modules/nan/nan_string_bytes.h +++ /dev/null @@ -1,305 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -#ifndef NAN_STRING_BYTES_H_ -#define NAN_STRING_BYTES_H_ - -// Decodes a v8::Local or Buffer to a raw char* - -namespace imp { - -using v8::Local; -using v8::Object; -using v8::String; -using v8::Value; - - -//// Base 64 //// - -#define base64_encoded_size(size) ((size + 2 - ((size + 2) % 3)) / 3 * 4) - - - -//// HEX //// - -static bool contains_non_ascii_slow(const char* buf, size_t len) { - for (size_t i = 0; i < len; ++i) { - if (buf[i] & 0x80) return true; - } - return false; -} - - -static bool contains_non_ascii(const char* src, size_t len) { - if (len < 16) { - return contains_non_ascii_slow(src, len); - } - - const unsigned bytes_per_word = sizeof(void*); - const unsigned align_mask = bytes_per_word - 1; - const unsigned unaligned = reinterpret_cast(src) & align_mask; - - if (unaligned > 0) { - const unsigned n = bytes_per_word - unaligned; - if (contains_non_ascii_slow(src, n)) return true; - src += n; - len -= n; - } - - -#if defined(__x86_64__) || defined(_WIN64) - const uintptr_t mask = 0x8080808080808080ll; -#else - const uintptr_t mask = 0x80808080l; -#endif - - const uintptr_t* srcw = reinterpret_cast(src); - - for (size_t i = 0, n = len / bytes_per_word; i < n; ++i) { - if (srcw[i] & mask) return true; - } - - const unsigned remainder = len & align_mask; - if (remainder > 0) { - const size_t offset = len - remainder; - if (contains_non_ascii_slow(src + offset, remainder)) return true; - } - - return false; -} - - -static void force_ascii_slow(const char* src, char* dst, size_t len) { - for (size_t i = 0; i < len; ++i) { - dst[i] = src[i] & 0x7f; - } -} - - -static void force_ascii(const char* src, char* dst, size_t len) { - if (len < 16) { - force_ascii_slow(src, dst, len); - return; - } - - const unsigned bytes_per_word = sizeof(void*); - const unsigned align_mask = bytes_per_word - 1; - const unsigned src_unalign = reinterpret_cast(src) & align_mask; - const unsigned dst_unalign = reinterpret_cast(dst) & align_mask; - - if (src_unalign > 0) { - if (src_unalign == dst_unalign) { - const unsigned unalign = bytes_per_word - src_unalign; - force_ascii_slow(src, dst, unalign); - src += unalign; - dst += unalign; - len -= src_unalign; - } else { - force_ascii_slow(src, dst, len); - return; - } - } - -#if defined(__x86_64__) || defined(_WIN64) - const uintptr_t mask = ~0x8080808080808080ll; -#else - const uintptr_t mask = ~0x80808080l; -#endif - - const uintptr_t* srcw = reinterpret_cast(src); - uintptr_t* dstw = reinterpret_cast(dst); - - for (size_t i = 0, n = len / bytes_per_word; i < n; ++i) { - dstw[i] = srcw[i] & mask; - } - - const unsigned remainder = len & align_mask; - if (remainder > 0) { - const size_t offset = len - remainder; - force_ascii_slow(src + offset, dst + offset, remainder); - } -} - - -static size_t base64_encode(const char* src, - size_t slen, - char* dst, - size_t dlen) { - // We know how much we'll write, just make sure that there's space. - assert(dlen >= base64_encoded_size(slen) && - "not enough space provided for base64 encode"); - - dlen = base64_encoded_size(slen); - - unsigned a; - unsigned b; - unsigned c; - unsigned i; - unsigned k; - unsigned n; - - static const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz" - "0123456789+/"; - - i = 0; - k = 0; - n = slen / 3 * 3; - - while (i < n) { - a = src[i + 0] & 0xff; - b = src[i + 1] & 0xff; - c = src[i + 2] & 0xff; - - dst[k + 0] = table[a >> 2]; - dst[k + 1] = table[((a & 3) << 4) | (b >> 4)]; - dst[k + 2] = table[((b & 0x0f) << 2) | (c >> 6)]; - dst[k + 3] = table[c & 0x3f]; - - i += 3; - k += 4; - } - - if (n != slen) { - switch (slen - n) { - case 1: - a = src[i + 0] & 0xff; - dst[k + 0] = table[a >> 2]; - dst[k + 1] = table[(a & 3) << 4]; - dst[k + 2] = '='; - dst[k + 3] = '='; - break; - - case 2: - a = src[i + 0] & 0xff; - b = src[i + 1] & 0xff; - dst[k + 0] = table[a >> 2]; - dst[k + 1] = table[((a & 3) << 4) | (b >> 4)]; - dst[k + 2] = table[(b & 0x0f) << 2]; - dst[k + 3] = '='; - break; - } - } - - return dlen; -} - - -static size_t hex_encode(const char* src, size_t slen, char* dst, size_t dlen) { - // We know how much we'll write, just make sure that there's space. - assert(dlen >= slen * 2 && - "not enough space provided for hex encode"); - - dlen = slen * 2; - for (uint32_t i = 0, k = 0; k < dlen; i += 1, k += 2) { - static const char hex[] = "0123456789abcdef"; - uint8_t val = static_cast(src[i]); - dst[k + 0] = hex[val >> 4]; - dst[k + 1] = hex[val & 15]; - } - - return dlen; -} - - - -static Local Encode(const char* buf, - size_t buflen, - enum Encoding encoding) { - assert(buflen <= node::Buffer::kMaxLength); - if (!buflen && encoding != BUFFER) - return New("").ToLocalChecked(); - - Local val; - switch (encoding) { - case BUFFER: - return CopyBuffer(buf, buflen).ToLocalChecked(); - - case ASCII: - if (contains_non_ascii(buf, buflen)) { - char* out = new char[buflen]; - force_ascii(buf, out, buflen); - val = New(out, buflen).ToLocalChecked(); - delete[] out; - } else { - val = New(buf, buflen).ToLocalChecked(); - } - break; - - case UTF8: - val = New(buf, buflen).ToLocalChecked(); - break; - - case BINARY: { - // TODO(isaacs) use ExternalTwoByteString? - const unsigned char *cbuf = reinterpret_cast(buf); - uint16_t * twobytebuf = new uint16_t[buflen]; - for (size_t i = 0; i < buflen; i++) { - // XXX is the following line platform independent? - twobytebuf[i] = cbuf[i]; - } - val = New(twobytebuf, buflen).ToLocalChecked(); - delete[] twobytebuf; - break; - } - - case BASE64: { - size_t dlen = base64_encoded_size(buflen); - char* dst = new char[dlen]; - - size_t written = base64_encode(buf, buflen, dst, dlen); - assert(written == dlen); - - val = New(dst, dlen).ToLocalChecked(); - delete[] dst; - break; - } - - case UCS2: { - const uint16_t* data = reinterpret_cast(buf); - val = New(data, buflen / 2).ToLocalChecked(); - break; - } - - case HEX: { - size_t dlen = buflen * 2; - char* dst = new char[dlen]; - size_t written = hex_encode(buf, buflen, dst, dlen); - assert(written == dlen); - - val = New(dst, dlen).ToLocalChecked(); - delete[] dst; - break; - } - - default: - assert(0 && "unknown encoding"); - break; - } - - return val; -} - -#undef base64_encoded_size - -} // end of namespace imp - -#endif // NAN_STRING_BYTES_H_ diff --git a/deploy/node_modules/nan/nan_typedarray_contents.h b/deploy/node_modules/nan/nan_typedarray_contents.h deleted file mode 100644 index 17c9681..0000000 --- a/deploy/node_modules/nan/nan_typedarray_contents.h +++ /dev/null @@ -1,90 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_TYPEDARRAY_CONTENTS_H_ -#define NAN_TYPEDARRAY_CONTENTS_H_ - -template -class TypedArrayContents { - public: - inline explicit TypedArrayContents(v8::Local from) : - length_(0), data_(NULL) { - HandleScope scope; - - size_t length = 0; - void* data = NULL; - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) - - if (from->IsArrayBufferView()) { - v8::Local array = - v8::Local::Cast(from); - - const size_t byte_length = array->ByteLength(); - const ptrdiff_t byte_offset = array->ByteOffset(); - v8::Local buffer = array->Buffer(); - - length = byte_length / sizeof(T); - data = static_cast(buffer->GetContents().Data()) + byte_offset; - } - -#else - - if (from->IsObject() && !from->IsNull()) { - v8::Local array = v8::Local::Cast(from); - - MaybeLocal buffer = Get(array, - New("buffer").ToLocalChecked()); - MaybeLocal byte_length = Get(array, - New("byteLength").ToLocalChecked()); - MaybeLocal byte_offset = Get(array, - New("byteOffset").ToLocalChecked()); - - if (!buffer.IsEmpty() && - !byte_length.IsEmpty() && byte_length.ToLocalChecked()->IsUint32() && - !byte_offset.IsEmpty() && byte_offset.ToLocalChecked()->IsUint32()) { - data = array->GetIndexedPropertiesExternalArrayData(); - if(data) { - length = byte_length.ToLocalChecked()->Uint32Value() / sizeof(T); - } - } - } - -#endif - -#if defined(_MSC_VER) && _MSC_VER >= 1900 || __cplusplus >= 201103L - assert(reinterpret_cast(data) % alignof (T) == 0); -#elif defined(_MSC_VER) && _MSC_VER >= 1600 || defined(__GNUC__) - assert(reinterpret_cast(data) % __alignof(T) == 0); -#else - assert(reinterpret_cast(data) % sizeof (T) == 0); -#endif - - length_ = length; - data_ = static_cast(data); - } - - inline size_t length() const { return length_; } - inline T* operator*() { return data_; } - inline const T* operator*() const { return data_; } - - private: - NAN_DISALLOW_ASSIGN_COPY_MOVE(TypedArrayContents) - - //Disable heap allocation - void *operator new(size_t size); - void operator delete(void *, size_t) { - abort(); - } - - size_t length_; - T* data_; -}; - -#endif // NAN_TYPEDARRAY_CONTENTS_H_ diff --git a/deploy/node_modules/nan/nan_weak.h b/deploy/node_modules/nan/nan_weak.h deleted file mode 100644 index 3f2d569..0000000 --- a/deploy/node_modules/nan/nan_weak.h +++ /dev/null @@ -1,432 +0,0 @@ -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -#ifndef NAN_WEAK_H_ -#define NAN_WEAK_H_ - -static const int kInternalFieldsInWeakCallback = 2; -static const int kNoInternalFieldIndex = -1; - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) -# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \ - v8::WeakCallbackInfo > const& -# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \ - NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ -# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ -# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ -#elif NODE_MODULE_VERSION > IOJS_1_1_MODULE_VERSION -# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \ - v8::PhantomCallbackData > const& -# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \ - NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ -# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ -# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ -#elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION -# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \ - v8::PhantomCallbackData > const& -# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \ - v8::InternalFieldsCallbackData, void> const& -# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ -# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ -#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION -# define NAN_WEAK_CALLBACK_DATA_TYPE_ \ - v8::WeakCallbackData > const& -# define NAN_WEAK_CALLBACK_SIG_ NAN_WEAK_CALLBACK_DATA_TYPE_ -#else -# define NAN_WEAK_CALLBACK_DATA_TYPE_ void * -# define NAN_WEAK_CALLBACK_SIG_ \ - v8::Persistent, NAN_WEAK_CALLBACK_DATA_TYPE_ -#endif - -template -class WeakCallbackInfo { - public: - typedef void (*Callback)(const WeakCallbackInfo& data); - WeakCallbackInfo( - Persistent *persistent - , Callback callback - , void *parameter - , void *field1 = 0 - , void *field2 = 0) : - callback_(callback), isolate_(0), parameter_(parameter) { - std::memcpy(&persistent_, persistent, sizeof (v8::Persistent)); - internal_fields_[0] = field1; - internal_fields_[1] = field2; - } - inline v8::Isolate *GetIsolate() const { return isolate_; } - inline T *GetParameter() const { return static_cast(parameter_); } - inline void *GetInternalField(int index) const { - assert((index == 0 || index == 1) && "internal field index out of bounds"); - if (index == 0) { - return internal_fields_[0]; - } else { - return internal_fields_[1]; - } - } - - private: - NAN_DISALLOW_ASSIGN_COPY_MOVE(WeakCallbackInfo) - Callback callback_; - v8::Isolate *isolate_; - void *parameter_; - void *internal_fields_[kInternalFieldsInWeakCallback]; - v8::Persistent persistent_; - template friend class Persistent; - template friend class PersistentBase; -#if NODE_MODULE_VERSION <= NODE_0_12_MODULE_VERSION -# if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION - template - static void invoke(NAN_WEAK_CALLBACK_SIG_ data); - template - static WeakCallbackInfo *unwrap(NAN_WEAK_CALLBACK_DATA_TYPE_ data); -# else - static void invoke(NAN_WEAK_CALLBACK_SIG_ data); - static WeakCallbackInfo *unwrap(NAN_WEAK_CALLBACK_DATA_TYPE_ data); -# endif -#else -# if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) - template - static void invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data); - template - static void invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data); -# else - static void invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data); - static void invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data); -# endif - static WeakCallbackInfo *unwrapparameter( - NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data); - static WeakCallbackInfo *unwraptwofield( - NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data); -#endif -}; - - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) - -template -template -void -WeakCallbackInfo::invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data) { - WeakCallbackInfo *cbinfo = unwrapparameter(data); - if (isFirstPass) { - cbinfo->persistent_.Reset(); - data.SetSecondPassCallback(invokeparameter); - } else { - cbinfo->callback_(*cbinfo); - delete cbinfo; - } -} - -template -template -void -WeakCallbackInfo::invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data) { - WeakCallbackInfo *cbinfo = unwraptwofield(data); - if (isFirstPass) { - cbinfo->persistent_.Reset(); - data.SetSecondPassCallback(invoketwofield); - } else { - cbinfo->callback_(*cbinfo); - delete cbinfo; - } -} - -template -WeakCallbackInfo *WeakCallbackInfo::unwrapparameter( - NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data) { - WeakCallbackInfo *cbinfo = - static_cast*>(data.GetParameter()); - cbinfo->isolate_ = data.GetIsolate(); - return cbinfo; -} - -template -WeakCallbackInfo *WeakCallbackInfo::unwraptwofield( - NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data) { - WeakCallbackInfo *cbinfo = - static_cast*>(data.GetInternalField(0)); - cbinfo->isolate_ = data.GetIsolate(); - return cbinfo; -} - -#undef NAN_WEAK_PARAMETER_CALLBACK_SIG_ -#undef NAN_WEAK_TWOFIELD_CALLBACK_SIG_ -#undef NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ -#undef NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ -# elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION - -template -void -WeakCallbackInfo::invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data) { - WeakCallbackInfo *cbinfo = unwrapparameter(data); - cbinfo->persistent_.Reset(); - cbinfo->callback_(*cbinfo); - delete cbinfo; -} - -template -void -WeakCallbackInfo::invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data) { - WeakCallbackInfo *cbinfo = unwraptwofield(data); - cbinfo->persistent_.Reset(); - cbinfo->callback_(*cbinfo); - delete cbinfo; -} - -template -WeakCallbackInfo *WeakCallbackInfo::unwrapparameter( - NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data) { - WeakCallbackInfo *cbinfo = - static_cast*>(data.GetParameter()); - cbinfo->isolate_ = data.GetIsolate(); - return cbinfo; -} - -template -WeakCallbackInfo *WeakCallbackInfo::unwraptwofield( - NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data) { - WeakCallbackInfo *cbinfo = - static_cast*>(data.GetInternalField1()); - cbinfo->isolate_ = data.GetIsolate(); - return cbinfo; -} - -#undef NAN_WEAK_PARAMETER_CALLBACK_SIG_ -#undef NAN_WEAK_TWOFIELD_CALLBACK_SIG_ -#undef NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ -#undef NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ -#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION - -template -template -void WeakCallbackInfo::invoke(NAN_WEAK_CALLBACK_SIG_ data) { - WeakCallbackInfo *cbinfo = unwrap(data); - cbinfo->persistent_.Reset(); - cbinfo->callback_(*cbinfo); - delete cbinfo; -} - -template -template -WeakCallbackInfo *WeakCallbackInfo::unwrap( - NAN_WEAK_CALLBACK_DATA_TYPE_ data) { - void *parameter = data.GetParameter(); - WeakCallbackInfo *cbinfo = - static_cast*>(parameter); - cbinfo->isolate_ = data.GetIsolate(); - return cbinfo; -} - -#undef NAN_WEAK_CALLBACK_SIG_ -#undef NAN_WEAK_CALLBACK_DATA_TYPE_ -#else - -template -void WeakCallbackInfo::invoke(NAN_WEAK_CALLBACK_SIG_ data) { - WeakCallbackInfo *cbinfo = unwrap(data); - cbinfo->persistent_.Dispose(); - cbinfo->persistent_.Clear(); - cbinfo->callback_(*cbinfo); - delete cbinfo; -} - -template -WeakCallbackInfo *WeakCallbackInfo::unwrap( - NAN_WEAK_CALLBACK_DATA_TYPE_ data) { - WeakCallbackInfo *cbinfo = - static_cast*>(data); - cbinfo->isolate_ = v8::Isolate::GetCurrent(); - return cbinfo; -} - -#undef NAN_WEAK_CALLBACK_SIG_ -#undef NAN_WEAK_CALLBACK_DATA_TYPE_ -#endif - -#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ - (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) -template -template -inline void Persistent::SetWeak( - P *parameter - , typename WeakCallbackInfo

::Callback callback - , WeakCallbackType type) { - WeakCallbackInfo

*wcbd; - if (type == WeakCallbackType::kParameter) { - wcbd = new WeakCallbackInfo

( - reinterpret_cast*>(this) - , callback - , parameter); - v8::PersistentBase::SetWeak( - wcbd - , WeakCallbackInfo

::template invokeparameter - , type); - } else { - v8::Local* self = reinterpret_cast*>(this); - assert((*self)->IsObject()); - int count = (*self)->InternalFieldCount(); - void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0}; - for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) { - internal_fields[i] = (*self)->GetAlignedPointerFromInternalField(i); - } - wcbd = new WeakCallbackInfo

( - reinterpret_cast*>(this) - , callback - , 0 - , internal_fields[0] - , internal_fields[1]); - (*self)->SetAlignedPointerInInternalField(0, wcbd); - v8::PersistentBase::SetWeak( - static_cast*>(0) - , WeakCallbackInfo

::template invoketwofield - , type); - } -} -#elif NODE_MODULE_VERSION > IOJS_1_1_MODULE_VERSION -template -template -inline void Persistent::SetWeak( - P *parameter - , typename WeakCallbackInfo

::Callback callback - , WeakCallbackType type) { - WeakCallbackInfo

*wcbd; - if (type == WeakCallbackType::kParameter) { - wcbd = new WeakCallbackInfo

( - reinterpret_cast*>(this) - , callback - , parameter); - v8::PersistentBase::SetPhantom( - wcbd - , WeakCallbackInfo

::invokeparameter); - } else { - v8::Local* self = reinterpret_cast*>(this); - assert((*self)->IsObject()); - int count = (*self)->InternalFieldCount(); - void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0}; - for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) { - internal_fields[i] = (*self)->GetAlignedPointerFromInternalField(i); - } - wcbd = new WeakCallbackInfo

( - reinterpret_cast*>(this) - , callback - , 0 - , internal_fields[0] - , internal_fields[1]); - (*self)->SetAlignedPointerInInternalField(0, wcbd); - v8::PersistentBase::SetPhantom( - static_cast*>(0) - , WeakCallbackInfo

::invoketwofield - , 0 - , count > 1 ? 1 : kNoInternalFieldIndex); - } -} -#elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION -template -template -inline void Persistent::SetWeak( - P *parameter - , typename WeakCallbackInfo

::Callback callback - , WeakCallbackType type) { - WeakCallbackInfo

*wcbd; - if (type == WeakCallbackType::kParameter) { - wcbd = new WeakCallbackInfo

( - reinterpret_cast*>(this) - , callback - , parameter); - v8::PersistentBase::SetPhantom( - wcbd - , WeakCallbackInfo

::invokeparameter); - } else { - v8::Local* self = reinterpret_cast*>(this); - assert((*self)->IsObject()); - int count = (*self)->InternalFieldCount(); - void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0}; - for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) { - internal_fields[i] = (*self)->GetAlignedPointerFromInternalField(i); - } - wcbd = new WeakCallbackInfo

( - reinterpret_cast*>(this) - , callback - , 0 - , internal_fields[0] - , internal_fields[1]); - (*self)->SetAlignedPointerInInternalField(0, wcbd); - v8::PersistentBase::SetPhantom( - WeakCallbackInfo

::invoketwofield - , 0 - , count > 1 ? 1 : kNoInternalFieldIndex); - } -} -#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION -template -template -inline void Persistent::SetWeak( - P *parameter - , typename WeakCallbackInfo

::Callback callback - , WeakCallbackType type) { - WeakCallbackInfo

*wcbd; - if (type == WeakCallbackType::kParameter) { - wcbd = new WeakCallbackInfo

( - reinterpret_cast*>(this) - , callback - , parameter); - v8::PersistentBase::SetWeak(wcbd, WeakCallbackInfo

::invoke); - } else { - v8::Local* self = reinterpret_cast*>(this); - assert((*self)->IsObject()); - int count = (*self)->InternalFieldCount(); - void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0}; - for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) { - internal_fields[i] = (*self)->GetAlignedPointerFromInternalField(i); - } - wcbd = new WeakCallbackInfo

( - reinterpret_cast*>(this) - , callback - , 0 - , internal_fields[0] - , internal_fields[1]); - v8::PersistentBase::SetWeak(wcbd, WeakCallbackInfo

::invoke); - } -} -#else -template -template -inline void PersistentBase::SetWeak( - P *parameter - , typename WeakCallbackInfo

::Callback callback - , WeakCallbackType type) { - WeakCallbackInfo

*wcbd; - if (type == WeakCallbackType::kParameter) { - wcbd = new WeakCallbackInfo

( - reinterpret_cast*>(this) - , callback - , parameter); - persistent.MakeWeak(wcbd, WeakCallbackInfo

::invoke); - } else { - v8::Local* self = reinterpret_cast*>(this); - assert((*self)->IsObject()); - int count = (*self)->InternalFieldCount(); - void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0}; - for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) { - internal_fields[i] = (*self)->GetPointerFromInternalField(i); - } - wcbd = new WeakCallbackInfo

( - reinterpret_cast*>(this) - , callback - , 0 - , internal_fields[0] - , internal_fields[1]); - persistent.MakeWeak(wcbd, WeakCallbackInfo

::invoke); - } -} -#endif - -#endif // NAN_WEAK_H_ diff --git a/deploy/node_modules/nan/package.json b/deploy/node_modules/nan/package.json deleted file mode 100644 index 8e0139b..0000000 --- a/deploy/node_modules/nan/package.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "_from": "nan@^2.3.3", - "_id": "nan@2.7.0", - "_inBundle": false, - "_integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", - "_location": "/nan", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "nan@^2.3.3", - "name": "nan", - "escapedName": "nan", - "rawSpec": "^2.3.3", - "saveSpec": null, - "fetchSpec": "^2.3.3" - }, - "_requiredBy": [ - "/websocket" - ], - "_resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", - "_shasum": "d95bf721ec877e08db276ed3fc6eb78f9083ad46", - "_spec": "nan@^2.3.3", - "_where": "/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/websocket", - "bugs": { - "url": "https://github.com/nodejs/nan/issues" - }, - "bundleDependencies": false, - "contributors": [ - { - "name": "Rod Vagg", - "email": "r@va.gg", - "url": "https://github.com/rvagg" - }, - { - "name": "Benjamin Byholm", - "email": "bbyholm@abo.fi", - "url": "https://github.com/kkoopa/" - }, - { - "name": "Trevor Norris", - "email": "trev.norris@gmail.com", - "url": "https://github.com/trevnorris" - }, - { - "name": "Nathan Rajlich", - "email": "nathan@tootallnate.net", - "url": "https://github.com/TooTallNate" - }, - { - "name": "Brett Lawson", - "email": "brett19@gmail.com", - "url": "https://github.com/brett19" - }, - { - "name": "Ben Noordhuis", - "email": "info@bnoordhuis.nl", - "url": "https://github.com/bnoordhuis" - }, - { - "name": "David Siegel", - "email": "david@artcom.de", - "url": "https://github.com/agnat" - }, - { - "name": "Michael Ira Krufky", - "email": "mkrufky@gmail.com", - "url": "https://github.com/mkrufky" - } - ], - "deprecated": false, - "description": "Native Abstractions for Node.js: C++ header for Node 0.8 -> 8 compatibility", - "devDependencies": { - "bindings": "~1.2.1", - "commander": "^2.8.1", - "glob": "^5.0.14", - "node-gyp": "~3.0.1", - "readable-stream": "^2.1.4", - "tap": "~0.7.1", - "xtend": "~4.0.0" - }, - "homepage": "https://github.com/nodejs/nan#readme", - "license": "MIT", - "main": "include_dirs.js", - "name": "nan", - "repository": { - "type": "git", - "url": "git://github.com/nodejs/nan.git" - }, - "scripts": { - "docs": "doc/.build.sh", - "rebuild-tests": "node-gyp rebuild --msvs_version=2013 --directory test", - "test": "tap --gc --stderr test/js/*-test.js" - }, - "version": "2.7.0" -} diff --git a/deploy/node_modules/nan/tools/1to2.js b/deploy/node_modules/nan/tools/1to2.js deleted file mode 100755 index 1e86be7..0000000 --- a/deploy/node_modules/nan/tools/1to2.js +++ /dev/null @@ -1,412 +0,0 @@ -#!/usr/bin/env node -/********************************************************************* - * NAN - Native Abstractions for Node.js - * - * Copyright (c) 2017 NAN contributors - * - * MIT License - ********************************************************************/ - -var commander = require('commander'), - fs = require('fs'), - glob = require('glob'), - groups = [], - total = 0, - warning1 = '/* ERROR: Rewrite using Buffer */\n', - warning2 = '\\/\\* ERROR\\: Rewrite using Buffer \\*\\/\\n', - length, - i; - -fs.readFile(__dirname + '/package.json', 'utf8', function (err, data) { - if (err) { - throw err; - } - - commander - .version(JSON.parse(data).version) - .usage('[options] ') - .parse(process.argv); - - if (!process.argv.slice(2).length) { - commander.outputHelp(); - } -}); - -/* construct strings representing regular expressions - each expression contains a unique group allowing for identification of the match - the index of this key group, relative to the regular expression in question, - is indicated by the first array member */ - -/* simple substistutions, key group is the entire match, 0 */ -groups.push([0, [ - '_NAN_', - 'NODE_SET_METHOD', - 'NODE_SET_PROTOTYPE_METHOD', - 'NanAsciiString', - 'NanEscapeScope', - 'NanReturnValue', - 'NanUcs2String'].join('|')]); - -/* substitutions of parameterless macros, key group is 1 */ -groups.push([1, ['(', [ - 'NanEscapableScope', - 'NanReturnNull', - 'NanReturnUndefined', - 'NanScope'].join('|'), ')\\(\\)'].join('')]); - -/* replace TryCatch with NanTryCatch once, gobbling possible namespace, key group 2 */ -groups.push([2, '(?:(?:v8\\:\\:)?|(Nan)?)(TryCatch)']); - -/* NanNew("string") will likely not fail a ToLocalChecked(), key group 1 */ -groups.push([1, ['(NanNew)', '(\\("[^\\"]*"[^\\)]*\\))(?!\\.ToLocalChecked\\(\\))'].join('')]); - -/* Removed v8 APIs, warn that the code needs rewriting using node::Buffer, key group 2 */ -groups.push([2, ['(', warning2, ')?', '^.*?(', [ - 'GetIndexedPropertiesExternalArrayDataLength', - 'GetIndexedPropertiesExternalArrayData', - 'GetIndexedPropertiesExternalArrayDataType', - 'GetIndexedPropertiesPixelData', - 'GetIndexedPropertiesPixelDataLength', - 'HasIndexedPropertiesInExternalArrayData', - 'HasIndexedPropertiesInPixelData', - 'SetIndexedPropertiesToExternalArrayData', - 'SetIndexedPropertiesToPixelData'].join('|'), ')'].join('')]); - -/* No need for NanScope in V8-exposed methods, key group 2 */ -groups.push([2, ['((', [ - 'NAN_METHOD', - 'NAN_GETTER', - 'NAN_SETTER', - 'NAN_PROPERTY_GETTER', - 'NAN_PROPERTY_SETTER', - 'NAN_PROPERTY_ENUMERATOR', - 'NAN_PROPERTY_DELETER', - 'NAN_PROPERTY_QUERY', - 'NAN_INDEX_GETTER', - 'NAN_INDEX_SETTER', - 'NAN_INDEX_ENUMERATOR', - 'NAN_INDEX_DELETER', - 'NAN_INDEX_QUERY'].join('|'), ')\\([^\\)]*\\)\\s*\\{)\\s*NanScope\\(\\)\\s*;'].join('')]); - -/* v8::Value::ToXXXXXXX returns v8::MaybeLocal, key group 3 */ -groups.push([3, ['([\\s\\(\\)])([^\\s\\(\\)]+)->(', [ - 'Boolean', - 'Number', - 'String', - 'Object', - 'Integer', - 'Uint32', - 'Int32'].join('|'), ')\\('].join('')]); - -/* v8::Value::XXXXXXXValue returns v8::Maybe, key group 3 */ -groups.push([3, ['([\\s\\(\\)])([^\\s\\(\\)]+)->((?:', [ - 'Boolean', - 'Number', - 'Integer', - 'Uint32', - 'Int32'].join('|'), ')Value)\\('].join('')]); - -/* NAN_WEAK_CALLBACK macro was removed, write out callback definition, key group 1 */ -groups.push([1, '(NAN_WEAK_CALLBACK)\\(([^\\s\\)]+)\\)']); - -/* node::ObjectWrap and v8::Persistent have been replaced with Nan implementations, key group 1 */ -groups.push([1, ['(', [ - 'NanDisposePersistent', - 'NanObjectWrapHandle'].join('|'), ')\\s*\\(\\s*([^\\s\\)]+)'].join('')]); - -/* Since NanPersistent there is no need for NanMakeWeakPersistent, key group 1 */ -groups.push([1, '(NanMakeWeakPersistent)\\s*\\(\\s*([^\\s,]+)\\s*,\\s*']); - -/* Many methods of v8::Object and others now return v8::MaybeLocal, key group 3 */ -groups.push([3, ['([\\s])([^\\s]+)->(', [ - 'GetEndColumn', - 'GetFunction', - 'GetLineNumber', - 'NewInstance', - 'GetPropertyNames', - 'GetOwnPropertyNames', - 'GetSourceLine', - 'GetStartColumn', - 'ObjectProtoToString', - 'ToArrayIndex', - 'ToDetailString', - 'CallAsConstructor', - 'CallAsFunction', - 'CloneElementAt', - 'Delete', - 'ForceSet', - 'Get', - 'GetPropertyAttributes', - 'GetRealNamedProperty', - 'GetRealNamedPropertyInPrototypeChain', - 'Has', - 'HasOwnProperty', - 'HasRealIndexedProperty', - 'HasRealNamedCallbackProperty', - 'HasRealNamedProperty', - 'Set', - 'SetAccessor', - 'SetIndexedPropertyHandler', - 'SetNamedPropertyHandler', - 'SetPrototype'].join('|'), ')\\('].join('')]); - -/* You should get an error if any of these fail anyways, - or handle the error better, it is indicated either way, key group 2 */ -groups.push([2, ['NanNew(<(?:v8\\:\\:)?(', ['Date', 'String', 'RegExp'].join('|'), ')>)(\\([^\\)]*\\))(?!\\.ToLocalChecked\\(\\))'].join('')]); - -/* v8::Value::Equals now returns a v8::Maybe, key group 3 */ -groups.push([3, '([\\s\\(\\)])([^\\s\\(\\)]+)->(Equals)\\(([^\\s\\)]+)']); - -/* NanPersistent makes this unnecessary, key group 1 */ -groups.push([1, '(NanAssignPersistent)(?:]+>)?\\(([^,]+),\\s*']); - -/* args has been renamed to info, key group 2 */ -groups.push([2, '(\\W)(args)(\\W)']) - -/* node::ObjectWrap was replaced with NanObjectWrap, key group 2 */ -groups.push([2, '(\\W)(?:node\\:\\:)?(ObjectWrap)(\\W)']); - -/* v8::Persistent was replaced with NanPersistent, key group 2 */ -groups.push([2, '(\\W)(?:v8\\:\\:)?(Persistent)(\\W)']); - -/* counts the number of capturing groups in a well-formed regular expression, - ignoring non-capturing groups and escaped parentheses */ -function groupcount(s) { - var positive = s.match(/\((?!\?)/g), - negative = s.match(/\\\(/g); - return (positive ? positive.length : 0) - (negative ? negative.length : 0); -} - -/* compute the absolute position of each key group in the joined master RegExp */ -for (i = 1, length = groups.length; i < length; i++) { - total += groupcount(groups[i - 1][1]); - groups[i][0] += total; -} - -/* create the master RegExp, whis is the union of all the groups' expressions */ -master = new RegExp(groups.map(function (a) { return a[1]; }).join('|'), 'gm'); - -/* replacement function for String.replace, receives 21 arguments */ -function replace() { - /* simple expressions */ - switch (arguments[groups[0][0]]) { - case '_NAN_': - return 'NAN_'; - case 'NODE_SET_METHOD': - return 'NanSetMethod'; - case 'NODE_SET_PROTOTYPE_METHOD': - return 'NanSetPrototypeMethod'; - case 'NanAsciiString': - return 'NanUtf8String'; - case 'NanEscapeScope': - return 'scope.Escape'; - case 'NanReturnNull': - return 'info.GetReturnValue().SetNull'; - case 'NanReturnValue': - return 'info.GetReturnValue().Set'; - case 'NanUcs2String': - return 'v8::String::Value'; - default: - } - - /* macros without arguments */ - switch (arguments[groups[1][0]]) { - case 'NanEscapableScope': - return 'NanEscapableScope scope' - case 'NanReturnUndefined': - return 'return'; - case 'NanScope': - return 'NanScope scope'; - default: - } - - /* TryCatch, emulate negative backref */ - if (arguments[groups[2][0]] === 'TryCatch') { - return arguments[groups[2][0] - 1] ? arguments[0] : 'NanTryCatch'; - } - - /* NanNew("foo") --> NanNew("foo").ToLocalChecked() */ - if (arguments[groups[3][0]] === 'NanNew') { - return [arguments[0], '.ToLocalChecked()'].join(''); - } - - /* insert warning for removed functions as comment on new line above */ - switch (arguments[groups[4][0]]) { - case 'GetIndexedPropertiesExternalArrayData': - case 'GetIndexedPropertiesExternalArrayDataLength': - case 'GetIndexedPropertiesExternalArrayDataType': - case 'GetIndexedPropertiesPixelData': - case 'GetIndexedPropertiesPixelDataLength': - case 'HasIndexedPropertiesInExternalArrayData': - case 'HasIndexedPropertiesInPixelData': - case 'SetIndexedPropertiesToExternalArrayData': - case 'SetIndexedPropertiesToPixelData': - return arguments[groups[4][0] - 1] ? arguments[0] : [warning1, arguments[0]].join(''); - default: - } - - /* remove unnecessary NanScope() */ - switch (arguments[groups[5][0]]) { - case 'NAN_GETTER': - case 'NAN_METHOD': - case 'NAN_SETTER': - case 'NAN_INDEX_DELETER': - case 'NAN_INDEX_ENUMERATOR': - case 'NAN_INDEX_GETTER': - case 'NAN_INDEX_QUERY': - case 'NAN_INDEX_SETTER': - case 'NAN_PROPERTY_DELETER': - case 'NAN_PROPERTY_ENUMERATOR': - case 'NAN_PROPERTY_GETTER': - case 'NAN_PROPERTY_QUERY': - case 'NAN_PROPERTY_SETTER': - return arguments[groups[5][0] - 1]; - default: - } - - /* Value converstion */ - switch (arguments[groups[6][0]]) { - case 'Boolean': - case 'Int32': - case 'Integer': - case 'Number': - case 'Object': - case 'String': - case 'Uint32': - return [arguments[groups[6][0] - 2], 'NanTo(', arguments[groups[6][0] - 1]].join(''); - default: - } - - /* other value conversion */ - switch (arguments[groups[7][0]]) { - case 'BooleanValue': - return [arguments[groups[7][0] - 2], 'NanTo(', arguments[groups[7][0] - 1]].join(''); - case 'Int32Value': - return [arguments[groups[7][0] - 2], 'NanTo(', arguments[groups[7][0] - 1]].join(''); - case 'IntegerValue': - return [arguments[groups[7][0] - 2], 'NanTo(', arguments[groups[7][0] - 1]].join(''); - case 'Uint32Value': - return [arguments[groups[7][0] - 2], 'NanTo(', arguments[groups[7][0] - 1]].join(''); - default: - } - - /* NAN_WEAK_CALLBACK */ - if (arguments[groups[8][0]] === 'NAN_WEAK_CALLBACK') { - return ['template\nvoid ', - arguments[groups[8][0] + 1], '(const NanWeakCallbackInfo &data)'].join(''); - } - - /* use methods on NAN classes instead */ - switch (arguments[groups[9][0]]) { - case 'NanDisposePersistent': - return [arguments[groups[9][0] + 1], '.Reset('].join(''); - case 'NanObjectWrapHandle': - return [arguments[groups[9][0] + 1], '->handle('].join(''); - default: - } - - /* use method on NanPersistent instead */ - if (arguments[groups[10][0]] === 'NanMakeWeakPersistent') { - return arguments[groups[10][0] + 1] + '.SetWeak('; - } - - /* These return Maybes, the upper ones take no arguments */ - switch (arguments[groups[11][0]]) { - case 'GetEndColumn': - case 'GetFunction': - case 'GetLineNumber': - case 'GetOwnPropertyNames': - case 'GetPropertyNames': - case 'GetSourceLine': - case 'GetStartColumn': - case 'NewInstance': - case 'ObjectProtoToString': - case 'ToArrayIndex': - case 'ToDetailString': - return [arguments[groups[11][0] - 2], 'Nan', arguments[groups[11][0]], '(', arguments[groups[11][0] - 1]].join(''); - case 'CallAsConstructor': - case 'CallAsFunction': - case 'CloneElementAt': - case 'Delete': - case 'ForceSet': - case 'Get': - case 'GetPropertyAttributes': - case 'GetRealNamedProperty': - case 'GetRealNamedPropertyInPrototypeChain': - case 'Has': - case 'HasOwnProperty': - case 'HasRealIndexedProperty': - case 'HasRealNamedCallbackProperty': - case 'HasRealNamedProperty': - case 'Set': - case 'SetAccessor': - case 'SetIndexedPropertyHandler': - case 'SetNamedPropertyHandler': - case 'SetPrototype': - return [arguments[groups[11][0] - 2], 'Nan', arguments[groups[11][0]], '(', arguments[groups[11][0] - 1], ', '].join(''); - default: - } - - /* Automatic ToLocalChecked(), take it or leave it */ - switch (arguments[groups[12][0]]) { - case 'Date': - case 'String': - case 'RegExp': - return ['NanNew', arguments[groups[12][0] - 1], arguments[groups[12][0] + 1], '.ToLocalChecked()'].join(''); - default: - } - - /* NanEquals is now required for uniformity */ - if (arguments[groups[13][0]] === 'Equals') { - return [arguments[groups[13][0] - 1], 'NanEquals(', arguments[groups[13][0] - 1], ', ', arguments[groups[13][0] + 1]].join(''); - } - - /* use method on replacement class instead */ - if (arguments[groups[14][0]] === 'NanAssignPersistent') { - return [arguments[groups[14][0] + 1], '.Reset('].join(''); - } - - /* args --> info */ - if (arguments[groups[15][0]] === 'args') { - return [arguments[groups[15][0] - 1], 'info', arguments[groups[15][0] + 1]].join(''); - } - - /* ObjectWrap --> NanObjectWrap */ - if (arguments[groups[16][0]] === 'ObjectWrap') { - return [arguments[groups[16][0] - 1], 'NanObjectWrap', arguments[groups[16][0] + 1]].join(''); - } - - /* Persistent --> NanPersistent */ - if (arguments[groups[17][0]] === 'Persistent') { - return [arguments[groups[17][0] - 1], 'NanPersistent', arguments[groups[17][0] + 1]].join(''); - } - - /* This should not happen. A switch is probably missing a case if it does. */ - throw 'Unhandled match: ' + arguments[0]; -} - -/* reads a file, runs replacement and writes it back */ -function processFile(file) { - fs.readFile(file, {encoding: 'utf8'}, function (err, data) { - if (err) { - throw err; - } - - /* run replacement twice, might need more runs */ - fs.writeFile(file, data.replace(master, replace).replace(master, replace), function (err) { - if (err) { - throw err; - } - }); - }); -} - -/* process file names from command line and process the identified files */ -for (i = 2, length = process.argv.length; i < length; i++) { - glob(process.argv[i], function (err, matches) { - if (err) { - throw err; - } - matches.forEach(processFile); - }); -} diff --git a/deploy/node_modules/nan/tools/README.md b/deploy/node_modules/nan/tools/README.md deleted file mode 100644 index 7f07e4b..0000000 --- a/deploy/node_modules/nan/tools/README.md +++ /dev/null @@ -1,14 +0,0 @@ -1to2 naively converts source code files from NAN 1 to NAN 2. There will be erroneous conversions, -false positives and missed opportunities. The input files are rewritten in place. Make sure that -you have backups. You will have to manually review the changes afterwards and do some touchups. - -```sh -$ tools/1to2.js - - Usage: 1to2 [options] - - Options: - - -h, --help output usage information - -V, --version output the version number -``` diff --git a/deploy/node_modules/nan/tools/package.json b/deploy/node_modules/nan/tools/package.json deleted file mode 100644 index 2dcdd78..0000000 --- a/deploy/node_modules/nan/tools/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "1to2", - "version": "1.0.0", - "description": "NAN 1 -> 2 Migration Script", - "main": "1to2.js", - "repository": { - "type": "git", - "url": "git://github.com/nodejs/nan.git" - }, - "contributors": [ - "Benjamin Byholm (https://github.com/kkoopa/)", - "Mathias Küsel (https://github.com/mathiask88/)" - ], - "dependencies": { - "glob": "~5.0.10", - "commander": "~2.8.1" - }, - "license": "MIT" -} diff --git a/deploy/node_modules/typedarray-to-buffer/.travis.yml b/deploy/node_modules/typedarray-to-buffer/.travis.yml deleted file mode 100644 index 70f4cf1..0000000 --- a/deploy/node_modules/typedarray-to-buffer/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: node_js -node_js: -- 'node' -env: - global: - - secure: i51rE9rZGHbcZWlL58j3H1qtL23OIV2r0X4TcQKNI3pw2mubdHFJmfPNNO19ItfReu8wwQMxOehKamwaNvqMiKWyHfn/QcThFQysqzgGZ6AgnUbYx9od6XFNDeWd1sVBf7QBAL07y7KWlYGWCwFwWjabSVySzQhEBdisPcskfkI= - - secure: BKq6/5z9LK3KDkTjs7BGeBZ1KsWgz+MsAXZ4P64NSeVGFaBdXU45+ww1mwxXFt5l22/mhyOQZfebQl+kGVqRSZ+DEgQeCymkNZ6CD8c6w6cLuOJXiXwuu/cDM2DD0tfGeu2YZC7yEikP7BqEFwH3D324rRzSGLF2RSAAwkOI7bE= diff --git a/deploy/node_modules/typedarray-to-buffer/.zuul.yml b/deploy/node_modules/typedarray-to-buffer/.zuul.yml deleted file mode 100644 index 0367f75..0000000 --- a/deploy/node_modules/typedarray-to-buffer/.zuul.yml +++ /dev/null @@ -1,20 +0,0 @@ -ui: tape -browsers: - - name: chrome - version: latest - - name: firefox - version: latest - - name: safari - version: latest - - name: microsoftedge - version: latest - - name: ie - version: latest - - name: opera - version: latest - - name: iphone - version: latest - - name: ipad - version: latest - - name: android - version: latest diff --git a/deploy/node_modules/typedarray-to-buffer/LICENSE b/deploy/node_modules/typedarray-to-buffer/LICENSE deleted file mode 100644 index 0c068ce..0000000 --- a/deploy/node_modules/typedarray-to-buffer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Feross Aboukhadijeh - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/deploy/node_modules/typedarray-to-buffer/README.md b/deploy/node_modules/typedarray-to-buffer/README.md deleted file mode 100644 index 98dc2c4..0000000 --- a/deploy/node_modules/typedarray-to-buffer/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# typedarray-to-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][npm-url] - -#### Convert a typed array to a [Buffer](https://github.com/feross/buffer) without a copy. - -[![saucelabs][saucelabs-image]][saucelabs-url] - -[travis-image]: https://img.shields.io/travis/feross/typedarray-to-buffer/master.svg -[travis-url]: https://travis-ci.org/feross/typedarray-to-buffer -[npm-image]: https://img.shields.io/npm/v/typedarray-to-buffer.svg -[npm-url]: https://npmjs.org/package/typedarray-to-buffer -[downloads-image]: https://img.shields.io/npm/dm/typedarray-to-buffer.svg -[saucelabs-image]: https://saucelabs.com/browser-matrix/typedarray-to-buffer.svg -[saucelabs-url]: https://saucelabs.com/u/typedarray-to-buffer - -Say you're using the ['buffer'](https://github.com/feross/buffer) module on npm, or -[browserify](http://browserify.org/) and you're working with lots of binary data. - -Unfortunately, sometimes the browser or someone else's API gives you a typed array like -`Uint8Array` to work with and you need to convert it to a `Buffer`. What do you do? - -Of course: `new Buffer(uint8array)` - -But, alas, every time you do `new Buffer(uint8array)` **the entire array gets copied**. -The `Buffer` constructor does a copy; this is -defined by the [node docs](http://nodejs.org/api/buffer.html) and the 'buffer' module -matches the node API exactly. - -So, how can we avoid this expensive copy in -[performance critical applications](https://github.com/feross/buffer/issues/22)? - -***Simply use this module, of course!*** - -If you have an `ArrayBuffer`, you don't need this module, because -`new Buffer(arrayBuffer)` -[is already efficient](https://nodejs.org/api/buffer.html#buffer_new_buffer_arraybuffer). - -## install - -```bash -npm install typedarray-to-buffer -``` - -## usage - -To convert a typed array to a `Buffer` **without a copy**, do this: - -```js -var toBuffer = require('typedarray-to-buffer') - -var arr = new Uint8Array([1, 2, 3]) -arr = toBuffer(arr) - -// arr is a buffer now! - -arr.toString() // '\u0001\u0002\u0003' -arr.readUInt16BE(0) // 258 -``` - -## how it works - -If the browser supports typed arrays, then `toBuffer` will **augment the typed array** you -pass in with the `Buffer` methods and return it. See [how does Buffer -work?](https://github.com/feross/buffer#how-does-it-work) for more about how augmentation -works. - -This module uses the typed array's underlying `ArrayBuffer` to back the new `Buffer`. This -respects the "view" on the `ArrayBuffer`, i.e. `byteOffset` and `byteLength`. In other -words, if you do `toBuffer(new Uint32Array([1, 2, 3]))`, then the new `Buffer` will -contain `[1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]`, **not** `[1, 2, 3]`. And it still doesn't -require a copy. - -If the browser doesn't support typed arrays, then `toBuffer` will create a new `Buffer` -object, copy the data into it, and return it. There's no simple performance optimization -we can do for old browsers. Oh well. - -If this module is used in node, then it will just call `new Buffer`. This is just for -the convenience of modules that work in both node and the browser. - -## license - -MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org). diff --git a/deploy/node_modules/typedarray-to-buffer/index.js b/deploy/node_modules/typedarray-to-buffer/index.js deleted file mode 100644 index 861cb05..0000000 --- a/deploy/node_modules/typedarray-to-buffer/index.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Convert a typed array to a Buffer without a copy - * - * Author: Feross Aboukhadijeh - * License: MIT - * - * `npm install typedarray-to-buffer` - */ - -var isTypedArray = require('is-typedarray').strict - -module.exports = function typedarrayToBuffer (arr) { - if (isTypedArray(arr)) { - // To avoid a copy, use the typed array's underlying ArrayBuffer to back new Buffer - var buf = new Buffer(arr.buffer) - if (arr.byteLength !== arr.buffer.byteLength) { - // Respect the "view", i.e. byteOffset and byteLength, without doing a copy - buf = buf.slice(arr.byteOffset, arr.byteOffset + arr.byteLength) - } - return buf - } else { - // Pass through all other types to the `Buffer` constructor - return new Buffer(arr) - } -} diff --git a/deploy/node_modules/typedarray-to-buffer/package.json b/deploy/node_modules/typedarray-to-buffer/package.json deleted file mode 100644 index 3798a20..0000000 --- a/deploy/node_modules/typedarray-to-buffer/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "_from": "typedarray-to-buffer@^3.1.2", - "_id": "typedarray-to-buffer@3.1.2", - "_inBundle": false, - "_integrity": "sha1-EBezLZhP9VbroQD1AViauhrOLgQ=", - "_location": "/typedarray-to-buffer", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "typedarray-to-buffer@^3.1.2", - "name": "typedarray-to-buffer", - "escapedName": "typedarray-to-buffer", - "rawSpec": "^3.1.2", - "saveSpec": null, - "fetchSpec": "^3.1.2" - }, - "_requiredBy": [ - "/websocket" - ], - "_resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.2.tgz", - "_shasum": "1017b32d984ff556eba100f501589aba1ace2e04", - "_spec": "typedarray-to-buffer@^3.1.2", - "_where": "/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/websocket", - "author": { - "name": "Feross Aboukhadijeh", - "email": "feross@feross.org", - "url": "http://feross.org/" - }, - "bugs": { - "url": "https://github.com/feross/typedarray-to-buffer/issues" - }, - "bundleDependencies": false, - "dependencies": { - "is-typedarray": "^1.0.0" - }, - "deprecated": false, - "description": "Convert a typed array to a Buffer without a copy", - "devDependencies": { - "standard": "^6.0.4", - "tape": "^4.0.0", - "zuul": "^3.0.0" - }, - "homepage": "http://feross.org", - "keywords": [ - "buffer", - "typed array", - "convert", - "no copy", - "uint8array", - "uint16array", - "uint32array", - "int16array", - "int32array", - "float32array", - "float64array", - "browser", - "arraybuffer", - "dataview" - ], - "license": "MIT", - "main": "index.js", - "name": "typedarray-to-buffer", - "repository": { - "type": "git", - "url": "git://github.com/feross/typedarray-to-buffer.git" - }, - "scripts": { - "test": "standard && npm run test-node && npm run test-browser", - "test-browser": "zuul -- test/*.js", - "test-browser-local": "zuul --local -- test/*.js", - "test-node": "tape test/*.js" - }, - "version": "3.1.2" -} diff --git a/deploy/node_modules/typedarray-to-buffer/test/basic.js b/deploy/node_modules/typedarray-to-buffer/test/basic.js deleted file mode 100644 index e7052e9..0000000 --- a/deploy/node_modules/typedarray-to-buffer/test/basic.js +++ /dev/null @@ -1,50 +0,0 @@ -var test = require('tape') -var toBuffer = require('../') - -test('convert to buffer from Uint8Array', function (t) { - if (typeof Uint8Array !== 'undefined') { - var arr = new Uint8Array([1, 2, 3]) - arr = toBuffer(arr) - - t.deepEqual(arr, new Buffer([1, 2, 3]), 'contents equal') - t.ok(Buffer.isBuffer(arr), 'is buffer') - t.equal(arr.readUInt8(0), 1) - t.equal(arr.readUInt8(1), 2) - t.equal(arr.readUInt8(2), 3) - } else { - t.pass('browser lacks Uint8Array support, skip test') - } - t.end() -}) - -test('convert to buffer from another arrayview type (Uint32Array)', function (t) { - if (typeof Uint32Array !== 'undefined' && Buffer.TYPED_ARRAY_SUPPORT !== false) { - var arr = new Uint32Array([1, 2, 3]) - arr = toBuffer(arr) - - t.deepEqual(arr, new Buffer([1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]), 'contents equal') - t.ok(Buffer.isBuffer(arr), 'is buffer') - t.equal(arr.readUInt32LE(0), 1) - t.equal(arr.readUInt32LE(4), 2) - t.equal(arr.readUInt32LE(8), 3) - t.equal(arr instanceof Uint8Array, true) - } else { - t.pass('browser lacks Uint32Array support, skip test') - } - t.end() -}) - -test('convert to buffer from ArrayBuffer', function (t) { - if (typeof Uint32Array !== 'undefined' && Buffer.TYPED_ARRAY_SUPPORT !== false) { - var arr = new Uint32Array([1, 2, 3]).subarray(1, 2) - arr = toBuffer(arr) - - t.deepEqual(arr, new Buffer([2, 0, 0, 0]), 'contents equal') - t.ok(Buffer.isBuffer(arr), 'is buffer') - t.equal(arr.readUInt32LE(0), 2) - t.equal(arr instanceof Uint8Array, true) - } else { - t.pass('browser lacks ArrayBuffer support, skip test') - } - t.end() -}) diff --git a/deploy/node_modules/util/.npmignore b/deploy/node_modules/util/.npmignore deleted file mode 100644 index 3c3629e..0000000 --- a/deploy/node_modules/util/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/deploy/node_modules/util/.travis.yml b/deploy/node_modules/util/.travis.yml deleted file mode 100644 index ded625c..0000000 --- a/deploy/node_modules/util/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: node_js -node_js: -- '0.8' -- '0.10' -env: - global: - - secure: AdUubswCR68/eGD+WWjwTHgFbelwQGnNo81j1IOaUxKw+zgFPzSnFEEtDw7z98pWgg7p9DpCnyzzSnSllP40wq6AG19OwyUJjSLoZK57fp+r8zwTQwWiSqUgMu2YSMmKJPIO/aoSGpRQXT+L1nRrHoUJXgFodyIZgz40qzJeZjc= - - secure: heQuxPVsQ7jBbssoVKimXDpqGjQFiucm6W5spoujmspjDG7oEcHD9ANo9++LoRPrsAmNx56SpMK5fNfVmYediw6SvhXm4Mxt56/fYCrLDBtgGG+1neCeffAi8z1rO8x48m77hcQ6YhbUL5R9uBimUjMX92fZcygAt8Rg804zjFo= diff --git a/deploy/node_modules/util/.zuul.yml b/deploy/node_modules/util/.zuul.yml deleted file mode 100644 index 2105010..0000000 --- a/deploy/node_modules/util/.zuul.yml +++ /dev/null @@ -1,10 +0,0 @@ -ui: mocha-qunit -browsers: - - name: chrome - version: 27..latest - - name: firefox - version: latest - - name: safari - version: latest - - name: ie - version: 9..latest diff --git a/deploy/node_modules/util/LICENSE b/deploy/node_modules/util/LICENSE deleted file mode 100644 index e3d4e69..0000000 --- a/deploy/node_modules/util/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -Copyright Joyent, Inc. and other Node contributors. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. diff --git a/deploy/node_modules/util/README.md b/deploy/node_modules/util/README.md deleted file mode 100644 index 1c473d2..0000000 --- a/deploy/node_modules/util/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# util - -[![Build Status](https://travis-ci.org/defunctzombie/node-util.png?branch=master)](https://travis-ci.org/defunctzombie/node-util) - -node.js [util](http://nodejs.org/api/util.html) module as a module - -## install via [npm](npmjs.org) - -```shell -npm install util -``` - -## browser support - -This module also works in modern browsers. If you need legacy browser support you will need to polyfill ES5 features. diff --git a/deploy/node_modules/util/package.json b/deploy/node_modules/util/package.json deleted file mode 100644 index 5b33cfd..0000000 --- a/deploy/node_modules/util/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "_from": "util", - "_id": "util@0.10.3", - "_inBundle": false, - "_integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "_location": "/util", - "_phantomChildren": {}, - "_requested": { - "type": "tag", - "registry": true, - "raw": "util", - "name": "util", - "escapedName": "util", - "rawSpec": "", - "saveSpec": null, - "fetchSpec": "latest" - }, - "_requiredBy": [ - "#DEV:/", - "#USER" - ], - "_resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "_shasum": "7afb1afe50805246489e3db7fe0ed379336ac0f9", - "_spec": "util", - "_where": "/Users/prophesi/Projects/websocket-kinect/deploy", - "author": { - "name": "Joyent", - "url": "http://www.joyent.com" - }, - "browser": { - "./support/isBuffer.js": "./support/isBufferBrowser.js" - }, - "bugs": { - "url": "https://github.com/defunctzombie/node-util/issues" - }, - "bundleDependencies": false, - "dependencies": { - "inherits": "2.0.1" - }, - "deprecated": false, - "description": "Node.JS util module", - "devDependencies": { - "zuul": "~1.0.9" - }, - "homepage": "https://github.com/defunctzombie/node-util", - "keywords": [ - "util" - ], - "license": "MIT", - "main": "./util.js", - "name": "util", - "repository": { - "type": "git", - "url": "git://github.com/defunctzombie/node-util.git" - }, - "scripts": { - "test": "node test/node/*.js && zuul test/browser/*.js" - }, - "version": "0.10.3" -} diff --git a/deploy/node_modules/util/support/isBuffer.js b/deploy/node_modules/util/support/isBuffer.js deleted file mode 100644 index ace9ac0..0000000 --- a/deploy/node_modules/util/support/isBuffer.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = function isBuffer(arg) { - return arg instanceof Buffer; -} diff --git a/deploy/node_modules/util/support/isBufferBrowser.js b/deploy/node_modules/util/support/isBufferBrowser.js deleted file mode 100644 index 0e1bee1..0000000 --- a/deploy/node_modules/util/support/isBufferBrowser.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = function isBuffer(arg) { - return arg && typeof arg === 'object' - && typeof arg.copy === 'function' - && typeof arg.fill === 'function' - && typeof arg.readUInt8 === 'function'; -} \ No newline at end of file diff --git a/deploy/node_modules/util/test/browser/inspect.js b/deploy/node_modules/util/test/browser/inspect.js deleted file mode 100644 index 91af3b0..0000000 --- a/deploy/node_modules/util/test/browser/inspect.js +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var assert = require('assert'); -var util = require('../../'); - -suite('inspect'); - -test('util.inspect - test for sparse array', function () { - var a = ['foo', 'bar', 'baz']; - assert.equal(util.inspect(a), '[ \'foo\', \'bar\', \'baz\' ]'); - delete a[1]; - assert.equal(util.inspect(a), '[ \'foo\', , \'baz\' ]'); - assert.equal(util.inspect(a, true), '[ \'foo\', , \'baz\', [length]: 3 ]'); - assert.equal(util.inspect(new Array(5)), '[ , , , , ]'); -}); - -test('util.inspect - exceptions should print the error message, not \'{}\'', function () { - assert.equal(util.inspect(new Error()), '[Error]'); - assert.equal(util.inspect(new Error('FAIL')), '[Error: FAIL]'); - assert.equal(util.inspect(new TypeError('FAIL')), '[TypeError: FAIL]'); - assert.equal(util.inspect(new SyntaxError('FAIL')), '[SyntaxError: FAIL]'); -}); diff --git a/deploy/node_modules/util/test/browser/is.js b/deploy/node_modules/util/test/browser/is.js deleted file mode 100644 index f63bff9..0000000 --- a/deploy/node_modules/util/test/browser/is.js +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var assert = require('assert'); - -var util = require('../../'); - -suite('is'); - -test('util.isArray', function () { - assert.equal(true, util.isArray([])); - assert.equal(true, util.isArray(Array())); - assert.equal(true, util.isArray(new Array())); - assert.equal(true, util.isArray(new Array(5))); - assert.equal(true, util.isArray(new Array('with', 'some', 'entries'))); - assert.equal(false, util.isArray({})); - assert.equal(false, util.isArray({ push: function() {} })); - assert.equal(false, util.isArray(/regexp/)); - assert.equal(false, util.isArray(new Error())); - assert.equal(false, util.isArray(Object.create(Array.prototype))); -}); - -test('util.isRegExp', function () { - assert.equal(true, util.isRegExp(/regexp/)); - assert.equal(true, util.isRegExp(RegExp())); - assert.equal(true, util.isRegExp(new RegExp())); - assert.equal(false, util.isRegExp({})); - assert.equal(false, util.isRegExp([])); - assert.equal(false, util.isRegExp(new Date())); - assert.equal(false, util.isRegExp(Object.create(RegExp.prototype))); -}); - -test('util.isDate', function () { - assert.equal(true, util.isDate(new Date())); - assert.equal(true, util.isDate(new Date(0))); - assert.equal(false, util.isDate(Date())); - assert.equal(false, util.isDate({})); - assert.equal(false, util.isDate([])); - assert.equal(false, util.isDate(new Error())); - assert.equal(false, util.isDate(Object.create(Date.prototype))); -}); - -test('util.isError', function () { - assert.equal(true, util.isError(new Error())); - assert.equal(true, util.isError(new TypeError())); - assert.equal(true, util.isError(new SyntaxError())); - assert.equal(false, util.isError({})); - assert.equal(false, util.isError({ name: 'Error', message: '' })); - assert.equal(false, util.isError([])); - assert.equal(true, util.isError(Object.create(Error.prototype))); -}); - -test('util._extend', function () { - assert.deepEqual(util._extend({a:1}), {a:1}); - assert.deepEqual(util._extend({a:1}, []), {a:1}); - assert.deepEqual(util._extend({a:1}, null), {a:1}); - assert.deepEqual(util._extend({a:1}, true), {a:1}); - assert.deepEqual(util._extend({a:1}, false), {a:1}); - assert.deepEqual(util._extend({a:1}, {b:2}), {a:1, b:2}); - assert.deepEqual(util._extend({a:1, b:2}, {b:3}), {a:1, b:3}); -}); - -test('util.isBuffer', function () { - assert.equal(true, util.isBuffer(new Buffer(4))); - assert.equal(true, util.isBuffer(Buffer(4))); - assert.equal(true, util.isBuffer(new Buffer(4))); - assert.equal(true, util.isBuffer(new Buffer([1, 2, 3, 4]))); - assert.equal(false, util.isBuffer({})); - assert.equal(false, util.isBuffer([])); - assert.equal(false, util.isBuffer(new Error())); - assert.equal(false, util.isRegExp(new Date())); - assert.equal(true, util.isBuffer(Object.create(Buffer.prototype))); -}); diff --git a/deploy/node_modules/util/test/node/debug.js b/deploy/node_modules/util/test/node/debug.js deleted file mode 100644 index ef5f69f..0000000 --- a/deploy/node_modules/util/test/node/debug.js +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var assert = require('assert'); -var util = require('../../'); - -if (process.argv[2] === 'child') - child(); -else - parent(); - -function parent() { - test('foo,tud,bar', true); - test('foo,tud', true); - test('tud,bar', true); - test('tud', true); - test('foo,bar', false); - test('', false); -} - -function test(environ, shouldWrite) { - var expectErr = ''; - if (shouldWrite) { - expectErr = 'TUD %PID%: this { is: \'a\' } /debugging/\n' + - 'TUD %PID%: number=1234 string=asdf obj={"foo":"bar"}\n'; - } - var expectOut = 'ok\n'; - var didTest = false; - - var spawn = require('child_process').spawn; - var child = spawn(process.execPath, [__filename, 'child'], { - env: { NODE_DEBUG: environ } - }); - - expectErr = expectErr.split('%PID%').join(child.pid); - - var err = ''; - child.stderr.setEncoding('utf8'); - child.stderr.on('data', function(c) { - err += c; - }); - - var out = ''; - child.stdout.setEncoding('utf8'); - child.stdout.on('data', function(c) { - out += c; - }); - - child.on('close', function(c) { - assert(!c); - assert.equal(err, expectErr); - assert.equal(out, expectOut); - didTest = true; - console.log('ok %j %j', environ, shouldWrite); - }); - - process.on('exit', function() { - assert(didTest); - }); -} - - -function child() { - var debug = util.debuglog('tud'); - debug('this', { is: 'a' }, /debugging/); - debug('number=%d string=%s obj=%j', 1234, 'asdf', { foo: 'bar' }); - console.log('ok'); -} diff --git a/deploy/node_modules/util/test/node/format.js b/deploy/node_modules/util/test/node/format.js deleted file mode 100644 index f2d1862..0000000 --- a/deploy/node_modules/util/test/node/format.js +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - - - -var assert = require('assert'); -var util = require('../../'); - -assert.equal(util.format(), ''); -assert.equal(util.format(''), ''); -assert.equal(util.format([]), '[]'); -assert.equal(util.format({}), '{}'); -assert.equal(util.format(null), 'null'); -assert.equal(util.format(true), 'true'); -assert.equal(util.format(false), 'false'); -assert.equal(util.format('test'), 'test'); - -// CHECKME this is for console.log() compatibility - but is it *right*? -assert.equal(util.format('foo', 'bar', 'baz'), 'foo bar baz'); - -assert.equal(util.format('%d', 42.0), '42'); -assert.equal(util.format('%d', 42), '42'); -assert.equal(util.format('%s', 42), '42'); -assert.equal(util.format('%j', 42), '42'); - -assert.equal(util.format('%d', '42.0'), '42'); -assert.equal(util.format('%d', '42'), '42'); -assert.equal(util.format('%s', '42'), '42'); -assert.equal(util.format('%j', '42'), '"42"'); - -assert.equal(util.format('%%s%s', 'foo'), '%sfoo'); - -assert.equal(util.format('%s'), '%s'); -assert.equal(util.format('%s', undefined), 'undefined'); -assert.equal(util.format('%s', 'foo'), 'foo'); -assert.equal(util.format('%s:%s'), '%s:%s'); -assert.equal(util.format('%s:%s', undefined), 'undefined:%s'); -assert.equal(util.format('%s:%s', 'foo'), 'foo:%s'); -assert.equal(util.format('%s:%s', 'foo', 'bar'), 'foo:bar'); -assert.equal(util.format('%s:%s', 'foo', 'bar', 'baz'), 'foo:bar baz'); -assert.equal(util.format('%%%s%%', 'hi'), '%hi%'); -assert.equal(util.format('%%%s%%%%', 'hi'), '%hi%%'); - -(function() { - var o = {}; - o.o = o; - assert.equal(util.format('%j', o), '[Circular]'); -})(); - -// Errors -assert.equal(util.format(new Error('foo')), '[Error: foo]'); -function CustomError(msg) { - Error.call(this); - Object.defineProperty(this, 'message', { value: msg, enumerable: false }); - Object.defineProperty(this, 'name', { value: 'CustomError', enumerable: false }); -} -util.inherits(CustomError, Error); -assert.equal(util.format(new CustomError('bar')), '[CustomError: bar]'); diff --git a/deploy/node_modules/util/test/node/inspect.js b/deploy/node_modules/util/test/node/inspect.js deleted file mode 100644 index f766d11..0000000 --- a/deploy/node_modules/util/test/node/inspect.js +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - - - -var assert = require('assert'); -var util = require('../../'); - -// test the internal isDate implementation -var Date2 = require('vm').runInNewContext('Date'); -var d = new Date2(); -var orig = util.inspect(d); -Date2.prototype.foo = 'bar'; -var after = util.inspect(d); -assert.equal(orig, after); - -// test for sparse array -var a = ['foo', 'bar', 'baz']; -assert.equal(util.inspect(a), '[ \'foo\', \'bar\', \'baz\' ]'); -delete a[1]; -assert.equal(util.inspect(a), '[ \'foo\', , \'baz\' ]'); -assert.equal(util.inspect(a, true), '[ \'foo\', , \'baz\', [length]: 3 ]'); -assert.equal(util.inspect(new Array(5)), '[ , , , , ]'); - -// test for property descriptors -var getter = Object.create(null, { - a: { - get: function() { return 'aaa'; } - } -}); -var setter = Object.create(null, { - b: { - set: function() {} - } -}); -var getterAndSetter = Object.create(null, { - c: { - get: function() { return 'ccc'; }, - set: function() {} - } -}); -assert.equal(util.inspect(getter, true), '{ [a]: [Getter] }'); -assert.equal(util.inspect(setter, true), '{ [b]: [Setter] }'); -assert.equal(util.inspect(getterAndSetter, true), '{ [c]: [Getter/Setter] }'); - -// exceptions should print the error message, not '{}' -assert.equal(util.inspect(new Error()), '[Error]'); -assert.equal(util.inspect(new Error('FAIL')), '[Error: FAIL]'); -assert.equal(util.inspect(new TypeError('FAIL')), '[TypeError: FAIL]'); -assert.equal(util.inspect(new SyntaxError('FAIL')), '[SyntaxError: FAIL]'); -try { - undef(); -} catch (e) { - assert.equal(util.inspect(e), '[ReferenceError: undef is not defined]'); -} -var ex = util.inspect(new Error('FAIL'), true); -assert.ok(ex.indexOf('[Error: FAIL]') != -1); -assert.ok(ex.indexOf('[stack]') != -1); -assert.ok(ex.indexOf('[message]') != -1); - -// GH-1941 -// should not throw: -assert.equal(util.inspect(Object.create(Date.prototype)), '{}'); - -// GH-1944 -assert.doesNotThrow(function() { - var d = new Date(); - d.toUTCString = null; - util.inspect(d); -}); - -assert.doesNotThrow(function() { - var r = /regexp/; - r.toString = null; - util.inspect(r); -}); - -// bug with user-supplied inspect function returns non-string -assert.doesNotThrow(function() { - util.inspect([{ - inspect: function() { return 123; } - }]); -}); - -// GH-2225 -var x = { inspect: util.inspect }; -assert.ok(util.inspect(x).indexOf('inspect') != -1); - -// util.inspect.styles and util.inspect.colors -function test_color_style(style, input, implicit) { - var color_name = util.inspect.styles[style]; - var color = ['', '']; - if(util.inspect.colors[color_name]) - color = util.inspect.colors[color_name]; - - var without_color = util.inspect(input, false, 0, false); - var with_color = util.inspect(input, false, 0, true); - var expect = '\u001b[' + color[0] + 'm' + without_color + - '\u001b[' + color[1] + 'm'; - assert.equal(with_color, expect, 'util.inspect color for style '+style); -} - -test_color_style('special', function(){}); -test_color_style('number', 123.456); -test_color_style('boolean', true); -test_color_style('undefined', undefined); -test_color_style('null', null); -test_color_style('string', 'test string'); -test_color_style('date', new Date); -test_color_style('regexp', /regexp/); - -// an object with "hasOwnProperty" overwritten should not throw -assert.doesNotThrow(function() { - util.inspect({ - hasOwnProperty: null - }); -}); - -// new API, accepts an "options" object -var subject = { foo: 'bar', hello: 31, a: { b: { c: { d: 0 } } } }; -Object.defineProperty(subject, 'hidden', { enumerable: false, value: null }); - -assert(util.inspect(subject, { showHidden: false }).indexOf('hidden') === -1); -assert(util.inspect(subject, { showHidden: true }).indexOf('hidden') !== -1); -assert(util.inspect(subject, { colors: false }).indexOf('\u001b[32m') === -1); -assert(util.inspect(subject, { colors: true }).indexOf('\u001b[32m') !== -1); -assert(util.inspect(subject, { depth: 2 }).indexOf('c: [Object]') !== -1); -assert(util.inspect(subject, { depth: 0 }).indexOf('a: [Object]') !== -1); -assert(util.inspect(subject, { depth: null }).indexOf('{ d: 0 }') !== -1); - -// "customInspect" option can enable/disable calling inspect() on objects -subject = { inspect: function() { return 123; } }; - -assert(util.inspect(subject, { customInspect: true }).indexOf('123') !== -1); -assert(util.inspect(subject, { customInspect: true }).indexOf('inspect') === -1); -assert(util.inspect(subject, { customInspect: false }).indexOf('123') === -1); -assert(util.inspect(subject, { customInspect: false }).indexOf('inspect') !== -1); - -// custom inspect() functions should be able to return other Objects -subject.inspect = function() { return { foo: 'bar' }; }; - -assert.equal(util.inspect(subject), '{ foo: \'bar\' }'); - -subject.inspect = function(depth, opts) { - assert.strictEqual(opts.customInspectOptions, true); -}; - -util.inspect(subject, { customInspectOptions: true }); - -// util.inspect with "colors" option should produce as many lines as without it -function test_lines(input) { - var count_lines = function(str) { - return (str.match(/\n/g) || []).length; - } - - var without_color = util.inspect(input); - var with_color = util.inspect(input, {colors: true}); - assert.equal(count_lines(without_color), count_lines(with_color)); -} - -test_lines([1, 2, 3, 4, 5, 6, 7]); -test_lines(function() { - var big_array = []; - for (var i = 0; i < 100; i++) { - big_array.push(i); - } - return big_array; -}()); -test_lines({foo: 'bar', baz: 35, b: {a: 35}}); -test_lines({ - foo: 'bar', - baz: 35, - b: {a: 35}, - very_long_key: 'very_long_value', - even_longer_key: ['with even longer value in array'] -}); diff --git a/deploy/node_modules/util/test/node/log.js b/deploy/node_modules/util/test/node/log.js deleted file mode 100644 index 6bd96d1..0000000 --- a/deploy/node_modules/util/test/node/log.js +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - -var assert = require('assert'); -var util = require('../../'); - -assert.ok(process.stdout.writable); -assert.ok(process.stderr.writable); - -var stdout_write = global.process.stdout.write; -var strings = []; -global.process.stdout.write = function(string) { - strings.push(string); -}; -console._stderr = process.stdout; - -var tests = [ - {input: 'foo', output: 'foo'}, - {input: undefined, output: 'undefined'}, - {input: null, output: 'null'}, - {input: false, output: 'false'}, - {input: 42, output: '42'}, - {input: function(){}, output: '[Function]'}, - {input: parseInt('not a number', 10), output: 'NaN'}, - {input: {answer: 42}, output: '{ answer: 42 }'}, - {input: [1,2,3], output: '[ 1, 2, 3 ]'} -]; - -// test util.log() -tests.forEach(function(test) { - util.log(test.input); - var result = strings.shift().trim(), - re = (/[0-9]{1,2} [A-Z][a-z]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} - (.+)$/), - match = re.exec(result); - assert.ok(match); - assert.equal(match[1], test.output); -}); - -global.process.stdout.write = stdout_write; diff --git a/deploy/node_modules/util/test/node/util.js b/deploy/node_modules/util/test/node/util.js deleted file mode 100644 index 633ba69..0000000 --- a/deploy/node_modules/util/test/node/util.js +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - -var assert = require('assert'); -var context = require('vm').runInNewContext; - -var util = require('../../'); - -// isArray -assert.equal(true, util.isArray([])); -assert.equal(true, util.isArray(Array())); -assert.equal(true, util.isArray(new Array())); -assert.equal(true, util.isArray(new Array(5))); -assert.equal(true, util.isArray(new Array('with', 'some', 'entries'))); -assert.equal(true, util.isArray(context('Array')())); -assert.equal(false, util.isArray({})); -assert.equal(false, util.isArray({ push: function() {} })); -assert.equal(false, util.isArray(/regexp/)); -assert.equal(false, util.isArray(new Error)); -assert.equal(false, util.isArray(Object.create(Array.prototype))); - -// isRegExp -assert.equal(true, util.isRegExp(/regexp/)); -assert.equal(true, util.isRegExp(RegExp())); -assert.equal(true, util.isRegExp(new RegExp())); -assert.equal(true, util.isRegExp(context('RegExp')())); -assert.equal(false, util.isRegExp({})); -assert.equal(false, util.isRegExp([])); -assert.equal(false, util.isRegExp(new Date())); -assert.equal(false, util.isRegExp(Object.create(RegExp.prototype))); - -// isDate -assert.equal(true, util.isDate(new Date())); -assert.equal(true, util.isDate(new Date(0))); -assert.equal(true, util.isDate(new (context('Date')))); -assert.equal(false, util.isDate(Date())); -assert.equal(false, util.isDate({})); -assert.equal(false, util.isDate([])); -assert.equal(false, util.isDate(new Error)); -assert.equal(false, util.isDate(Object.create(Date.prototype))); - -// isError -assert.equal(true, util.isError(new Error)); -assert.equal(true, util.isError(new TypeError)); -assert.equal(true, util.isError(new SyntaxError)); -assert.equal(true, util.isError(new (context('Error')))); -assert.equal(true, util.isError(new (context('TypeError')))); -assert.equal(true, util.isError(new (context('SyntaxError')))); -assert.equal(false, util.isError({})); -assert.equal(false, util.isError({ name: 'Error', message: '' })); -assert.equal(false, util.isError([])); -assert.equal(true, util.isError(Object.create(Error.prototype))); - -// isObject -assert.ok(util.isObject({}) === true); - -// _extend -assert.deepEqual(util._extend({a:1}), {a:1}); -assert.deepEqual(util._extend({a:1}, []), {a:1}); -assert.deepEqual(util._extend({a:1}, null), {a:1}); -assert.deepEqual(util._extend({a:1}, true), {a:1}); -assert.deepEqual(util._extend({a:1}, false), {a:1}); -assert.deepEqual(util._extend({a:1}, {b:2}), {a:1, b:2}); -assert.deepEqual(util._extend({a:1, b:2}, {b:3}), {a:1, b:3}); diff --git a/deploy/node_modules/util/util.js b/deploy/node_modules/util/util.js deleted file mode 100644 index e0ea321..0000000 --- a/deploy/node_modules/util/util.js +++ /dev/null @@ -1,586 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var formatRegExp = /%[sdj%]/g; -exports.format = function(f) { - if (!isString(f)) { - var objects = []; - for (var i = 0; i < arguments.length; i++) { - objects.push(inspect(arguments[i])); - } - return objects.join(' '); - } - - var i = 1; - var args = arguments; - var len = args.length; - var str = String(f).replace(formatRegExp, function(x) { - if (x === '%%') return '%'; - if (i >= len) return x; - switch (x) { - case '%s': return String(args[i++]); - case '%d': return Number(args[i++]); - case '%j': - try { - return JSON.stringify(args[i++]); - } catch (_) { - return '[Circular]'; - } - default: - return x; - } - }); - for (var x = args[i]; i < len; x = args[++i]) { - if (isNull(x) || !isObject(x)) { - str += ' ' + x; - } else { - str += ' ' + inspect(x); - } - } - return str; -}; - - -// Mark that a method should not be used. -// Returns a modified function which warns once by default. -// If --no-deprecation is set, then it is a no-op. -exports.deprecate = function(fn, msg) { - // Allow for deprecating things in the process of starting up. - if (isUndefined(global.process)) { - return function() { - return exports.deprecate(fn, msg).apply(this, arguments); - }; - } - - if (process.noDeprecation === true) { - return fn; - } - - var warned = false; - function deprecated() { - if (!warned) { - if (process.throwDeprecation) { - throw new Error(msg); - } else if (process.traceDeprecation) { - console.trace(msg); - } else { - console.error(msg); - } - warned = true; - } - return fn.apply(this, arguments); - } - - return deprecated; -}; - - -var debugs = {}; -var debugEnviron; -exports.debuglog = function(set) { - if (isUndefined(debugEnviron)) - debugEnviron = process.env.NODE_DEBUG || ''; - set = set.toUpperCase(); - if (!debugs[set]) { - if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { - var pid = process.pid; - debugs[set] = function() { - var msg = exports.format.apply(exports, arguments); - console.error('%s %d: %s', set, pid, msg); - }; - } else { - debugs[set] = function() {}; - } - } - return debugs[set]; -}; - - -/** - * Echos the value of a value. Trys to print the value out - * in the best way possible given the different types. - * - * @param {Object} obj The object to print out. - * @param {Object} opts Optional options object that alters the output. - */ -/* legacy: obj, showHidden, depth, colors*/ -function inspect(obj, opts) { - // default options - var ctx = { - seen: [], - stylize: stylizeNoColor - }; - // legacy... - if (arguments.length >= 3) ctx.depth = arguments[2]; - if (arguments.length >= 4) ctx.colors = arguments[3]; - if (isBoolean(opts)) { - // legacy... - ctx.showHidden = opts; - } else if (opts) { - // got an "options" object - exports._extend(ctx, opts); - } - // set default options - if (isUndefined(ctx.showHidden)) ctx.showHidden = false; - if (isUndefined(ctx.depth)) ctx.depth = 2; - if (isUndefined(ctx.colors)) ctx.colors = false; - if (isUndefined(ctx.customInspect)) ctx.customInspect = true; - if (ctx.colors) ctx.stylize = stylizeWithColor; - return formatValue(ctx, obj, ctx.depth); -} -exports.inspect = inspect; - - -// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics -inspect.colors = { - 'bold' : [1, 22], - 'italic' : [3, 23], - 'underline' : [4, 24], - 'inverse' : [7, 27], - 'white' : [37, 39], - 'grey' : [90, 39], - 'black' : [30, 39], - 'blue' : [34, 39], - 'cyan' : [36, 39], - 'green' : [32, 39], - 'magenta' : [35, 39], - 'red' : [31, 39], - 'yellow' : [33, 39] -}; - -// Don't use 'blue' not visible on cmd.exe -inspect.styles = { - 'special': 'cyan', - 'number': 'yellow', - 'boolean': 'yellow', - 'undefined': 'grey', - 'null': 'bold', - 'string': 'green', - 'date': 'magenta', - // "name": intentionally not styling - 'regexp': 'red' -}; - - -function stylizeWithColor(str, styleType) { - var style = inspect.styles[styleType]; - - if (style) { - return '\u001b[' + inspect.colors[style][0] + 'm' + str + - '\u001b[' + inspect.colors[style][1] + 'm'; - } else { - return str; - } -} - - -function stylizeNoColor(str, styleType) { - return str; -} - - -function arrayToHash(array) { - var hash = {}; - - array.forEach(function(val, idx) { - hash[val] = true; - }); - - return hash; -} - - -function formatValue(ctx, value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (ctx.customInspect && - value && - isFunction(value.inspect) && - // Filter out the util module, it's inspect function is special - value.inspect !== exports.inspect && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - var ret = value.inspect(recurseTimes, ctx); - if (!isString(ret)) { - ret = formatValue(ctx, ret, recurseTimes); - } - return ret; - } - - // Primitive types cannot have properties - var primitive = formatPrimitive(ctx, value); - if (primitive) { - return primitive; - } - - // Look up the keys of the object. - var keys = Object.keys(value); - var visibleKeys = arrayToHash(keys); - - if (ctx.showHidden) { - keys = Object.getOwnPropertyNames(value); - } - - // IE doesn't make error fields non-enumerable - // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx - if (isError(value) - && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { - return formatError(value); - } - - // Some type of object without properties can be shortcutted. - if (keys.length === 0) { - if (isFunction(value)) { - var name = value.name ? ': ' + value.name : ''; - return ctx.stylize('[Function' + name + ']', 'special'); - } - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } - if (isDate(value)) { - return ctx.stylize(Date.prototype.toString.call(value), 'date'); - } - if (isError(value)) { - return formatError(value); - } - } - - var base = '', array = false, braces = ['{', '}']; - - // Make Array say that they are Array - if (isArray(value)) { - array = true; - braces = ['[', ']']; - } - - // Make functions say that they are functions - if (isFunction(value)) { - var n = value.name ? ': ' + value.name : ''; - base = ' [Function' + n + ']'; - } - - // Make RegExps say that they are RegExps - if (isRegExp(value)) { - base = ' ' + RegExp.prototype.toString.call(value); - } - - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + Date.prototype.toUTCString.call(value); - } - - // Make error with message first say the error - if (isError(value)) { - base = ' ' + formatError(value); - } - - if (keys.length === 0 && (!array || value.length == 0)) { - return braces[0] + base + braces[1]; - } - - if (recurseTimes < 0) { - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } else { - return ctx.stylize('[Object]', 'special'); - } - } - - ctx.seen.push(value); - - var output; - if (array) { - output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); - } else { - output = keys.map(function(key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); - }); - } - - ctx.seen.pop(); - - return reduceToSingleString(output, base, braces); -} - - -function formatPrimitive(ctx, value) { - if (isUndefined(value)) - return ctx.stylize('undefined', 'undefined'); - if (isString(value)) { - var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return ctx.stylize(simple, 'string'); - } - if (isNumber(value)) - return ctx.stylize('' + value, 'number'); - if (isBoolean(value)) - return ctx.stylize('' + value, 'boolean'); - // For some reason typeof null is "object", so special case here. - if (isNull(value)) - return ctx.stylize('null', 'null'); -} - - -function formatError(value) { - return '[' + Error.prototype.toString.call(value) + ']'; -} - - -function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { - var output = []; - for (var i = 0, l = value.length; i < l; ++i) { - if (hasOwnProperty(value, String(i))) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - String(i), true)); - } else { - output.push(''); - } - } - keys.forEach(function(key) { - if (!key.match(/^\d+$/)) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - key, true)); - } - }); - return output; -} - - -function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name, str, desc; - desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; - if (desc.get) { - if (desc.set) { - str = ctx.stylize('[Getter/Setter]', 'special'); - } else { - str = ctx.stylize('[Getter]', 'special'); - } - } else { - if (desc.set) { - str = ctx.stylize('[Setter]', 'special'); - } - } - if (!hasOwnProperty(visibleKeys, key)) { - name = '[' + key + ']'; - } - if (!str) { - if (ctx.seen.indexOf(desc.value) < 0) { - if (isNull(recurseTimes)) { - str = formatValue(ctx, desc.value, null); - } else { - str = formatValue(ctx, desc.value, recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (array) { - str = str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n'); - } - } - } else { - str = ctx.stylize('[Circular]', 'special'); - } - } - if (isUndefined(name)) { - if (array && key.match(/^\d+$/)) { - return str; - } - name = JSON.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = ctx.stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = ctx.stylize(name, 'string'); - } - } - - return name + ': ' + str; -} - - -function reduceToSingleString(output, base, braces) { - var numLinesEst = 0; - var length = output.reduce(function(prev, cur) { - numLinesEst++; - if (cur.indexOf('\n') >= 0) numLinesEst++; - return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; - }, 0); - - if (length > 60) { - return braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; - } - - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; -} - - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. -function isArray(ar) { - return Array.isArray(ar); -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; - -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; - -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; - -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; - -function isRegExp(re) { - return isObject(re) && objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return isObject(d) && objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return isObject(e) && - (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; - -exports.isBuffer = require('./support/isBuffer'); - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - - -function pad(n) { - return n < 10 ? '0' + n.toString(10) : n.toString(10); -} - - -var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', - 'Oct', 'Nov', 'Dec']; - -// 26 Feb 16:19:34 -function timestamp() { - var d = new Date(); - var time = [pad(d.getHours()), - pad(d.getMinutes()), - pad(d.getSeconds())].join(':'); - return [d.getDate(), months[d.getMonth()], time].join(' '); -} - - -// log is just a thin wrapper to console.log that prepends a timestamp -exports.log = function() { - console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); -}; - - -/** - * Inherit the prototype methods from one constructor into another. - * - * The Function.prototype.inherits from lang.js rewritten as a standalone - * function (not on Function.prototype). NOTE: If this file is to be loaded - * during bootstrapping this function needs to be rewritten using some native - * functions as prototype setup using normal JavaScript does not work as - * expected during bootstrapping (see mirror.js in r114903). - * - * @param {function} ctor Constructor function which needs to inherit the - * prototype. - * @param {function} superCtor Constructor function to inherit prototype from. - */ -exports.inherits = require('inherits'); - -exports._extend = function(origin, add) { - // Don't do anything if add isn't an object - if (!add || !isObject(add)) return origin; - - var keys = Object.keys(add); - var i = keys.length; - while (i--) { - origin[keys[i]] = add[keys[i]]; - } - return origin; -}; - -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} diff --git a/deploy/node_modules/websocket/.jshintrc b/deploy/node_modules/websocket/.jshintrc deleted file mode 100644 index 98d8766..0000000 --- a/deploy/node_modules/websocket/.jshintrc +++ /dev/null @@ -1,88 +0,0 @@ -{ - // JSHint Default Configuration File (as on JSHint website) - // See http://jshint.com/docs/ for more details - - "maxerr" : 50, // {int} Maximum error before stopping - - // Enforcing - "bitwise" : false, // true: Prohibit bitwise operators (&, |, ^, etc.) - "camelcase" : false, // true: Identifiers must be in camelCase - "curly" : true, // true: Require {} for every new block or scope - "eqeqeq" : true, // true: Require triple equals (===) for comparison - "freeze" : true, // true: prohibits overwriting prototypes of native objects such as Array, Date etc. - "forin" : false, // true: Require filtering for..in loops with obj.hasOwnProperty() - "immed" : true, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` - "latedef" : "nofunc", // true: Require variables/functions to be defined before being used - "newcap" : true, // true: Require capitalization of all constructor functions e.g. `new F()` - "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` - "noempty" : true, // true: Prohibit use of empty blocks - "nonbsp" : true, // true: Prohibit "non-breaking whitespace" characters. - "nonew" : true, // true: Prohibit use of constructors for side-effects (without assignment) - "plusplus" : false, // true: Prohibit use of `++` & `--` - "quotmark" : "single", // Quotation mark consistency: - // false : do nothing (default) - // true : ensure whatever is used is consistent - // "single" : require single quotes - // "double" : require double quotes - "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) - "unused" : "vars", // vars: Require all defined variables be used, ignore function params - "strict" : false, // true: Requires all functions run in ES5 Strict Mode - "maxparams" : false, // {int} Max number of formal params allowed per function - "maxdepth" : false, // {int} Max depth of nested blocks (within functions) - "maxstatements" : false, // {int} Max number statements per function - "maxcomplexity" : false, // {int} Max cyclomatic complexity per function - "maxlen" : false, // {int} Max number of characters per line - - // Relaxing - "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) - "boss" : false, // true: Tolerate assignments where comparisons would be expected - "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. - "eqnull" : false, // true: Tolerate use of `== null` - "es5" : false, // true: Allow ES5 syntax (ex: getters and setters) - "esnext" : true, // true: Allow ES.next (ES6) syntax (ex: `const`) - "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) - // (ex: `for each`, multiple try/catch, function expression…) - "evil" : false, // true: Tolerate use of `eval` and `new Function()` - "expr" : false, // true: Tolerate `ExpressionStatement` as Programs - "funcscope" : false, // true: Tolerate defining variables inside control statements - "globalstrict" : false, // true: Allow global "use strict" (also enables 'strict') - "iterator" : false, // true: Tolerate using the `__iterator__` property - "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block - "laxbreak" : false, // true: Tolerate possibly unsafe line breakings - "laxcomma" : false, // true: Tolerate comma-first style coding - "loopfunc" : false, // true: Tolerate functions being defined in loops - "multistr" : false, // true: Tolerate multi-line strings - "noyield" : false, // true: Tolerate generator functions with no yield statement in them. - "notypeof" : false, // true: Tolerate invalid typeof operator values - "proto" : false, // true: Tolerate using the `__proto__` property - "scripturl" : false, // true: Tolerate script-targeted URLs - "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;` - "sub" : true, // true: Tolerate using `[]` notation when it can still be expressed in dot notation - "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` - "validthis" : false, // true: Tolerate using this in a non-constructor function - - // Environments - "browser" : true, // Web Browser (window, document, etc) - "browserify" : true, // Browserify (node.js code in the browser) - "couch" : false, // CouchDB - "devel" : true, // Development/debugging (alert, confirm, etc) - "dojo" : false, // Dojo Toolkit - "jasmine" : false, // Jasmine - "jquery" : false, // jQuery - "mocha" : false, // Mocha - "mootools" : false, // MooTools - "node" : true, // Node.js - "nonstandard" : false, // Widely adopted globals (escape, unescape, etc) - "prototypejs" : false, // Prototype and Scriptaculous - "qunit" : false, // QUnit - "rhino" : false, // Rhino - "shelljs" : false, // ShellJS - "worker" : false, // Web Workers - "wsh" : false, // Windows Scripting Host - "yui" : false, // Yahoo User Interface - - // Custom Globals - "globals" : { // additional predefined global variables - "WebSocket": true - } -} diff --git a/deploy/node_modules/websocket/CHANGELOG.md b/deploy/node_modules/websocket/CHANGELOG.md deleted file mode 100644 index a2d8eab..0000000 --- a/deploy/node_modules/websocket/CHANGELOG.md +++ /dev/null @@ -1,213 +0,0 @@ -Changelog -========= - -Version 1.0.24 --------------- -*Released 2016-12-28* - -* Fixed a bug when using native keepalive on Node >= 6.0. (Thanks, [@prossin](https://github.com/prossin)) -* Upgrading outdated dependencies - -Version 1.0.23 --------------- -*Released 2016-05-18* - -* Official support for Node 6.x -* Updating dependencies. Specifically, updating nan to ^2.3.3 - -Version 1.0.22 --------------- -*Released 2015-09-28* - -* Updating to work with nan 2.x - -Version 1.0.21 --------------- -*Released 2015-07-22* - -* Incremented and re-published to work around an aborted npm publish of v1.0.20. - -Version 1.0.20 --------------- -*Released 2015-07-22* - -* Added EventTarget to the W3CWebSocket interface (Thanks, [@ibc](https://github.com/ibc)!) -* Corrected an inaccurate error message. (Thanks, [@lekoaf](https://github.com/lekoaf)!) - -Version 1.0.19 --------------- -*Released 2015-05-28* - -* Updated to nan v1.8.x (tested with v1.8.4) -* Added `"license": "Apache-2.0"` to package.json via [pull request #199](https://github.com/theturtle32/WebSocket-Node/pull/199) by [@pgilad](https://github.com/pgilad). See [npm1k.org](http://npm1k.org/). - - -Version 1.0.18 --------------- -*Released 2015-03-19* - -* Resolves [issue #195](https://github.com/theturtle32/WebSocket-Node/pull/179) - passing number to connection.send() causes crash -* [Added close code/reason arguments to W3CWebSocket#close()](https://github.com/theturtle32/WebSocket-Node/issues/184) - - -Version 1.0.17 --------------- -*Released 2015-01-17* - -* Resolves [issue #179](https://github.com/theturtle32/WebSocket-Node/pull/179) - Allow toBuffer to work with empty data - - -Version 1.0.16 --------------- -*Released 2015-01-16* - -* Resolves [issue #178](https://github.com/theturtle32/WebSocket-Node/issues/178) - Ping Frames with no data - - -Version 1.0.15 --------------- -*Released 2015-01-13* - -* Resolves [issue #177](https://github.com/theturtle32/WebSocket-Node/issues/177) - WebSocketClient ignores options unless it has a tlsOptions property - - -Version 1.0.14 --------------- -*Released 2014-12-03* - -* Resolves [issue #173](https://github.com/theturtle32/WebSocket-Node/issues/173) - To allow the W3CWebSocket interface to accept an optional non-standard configuration object as its third parameter, which will be ignored when running in a browser context. - - -Version 1.0.13 --------------- -*Released 2014-11-29* - -* Fixes [issue #171](https://github.com/theturtle32/WebSocket-Node/issues/171) - Code to prevent calling req.accept/req.reject multiple times breaks sanity checks in req.accept - - -Version 1.0.12 --------------- -*Released 2014-11-28* - -* Fixes [issue #170](https://github.com/theturtle32/WebSocket-Node/issues/170) - Non-native XOR implementation broken after making JSHint happy - - -Version 1.0.11 --------------- -*Released 2014-11-25* - -* Fixes some undefined behavior surrounding closing WebSocket connections and more reliably handles edge cases. -* Adds an implementation of the W3C WebSocket API for browsers to facilitate sharing code between client and server via browserify. (Thanks, [@ibc](https://github.com/ibc)!) -* `WebSocketConnection.prototype.close` now accepts optional `reasonCode` and `description` parameters. -* Calling `accept` or `reject` more than once on a `WebSocketRequest` will now throw an error. [Issue #149](https://github.com/theturtle32/WebSocket-Node/issues/149) -* Handling connections dropped by client before accepted by server [Issue #167](https://github.com/theturtle32/WebSocket-Node/issues/167) -* Integrating Gulp and JSHint (Thanks, [@ibc](https://github.com/ibc)!) -* Starting to add individual unit tests (using substack's [tape](github.com/substack/tape) and [faucet](github.com/substack/faucet)) - - -Version 1.0.10 --------------- -*Released 2014-10-22* - -* Fixed Issue [#146](https://github.com/theturtle32/WebSocket-Node/issues/146) that was causing WebSocketClient to throw errors when instantiated if passed `tlsOptions`. - -Version 1.0.9 -------------- -*Released 2014-10-20* - -* Fixing an insidious corner-case bug that prevented `WebSocketConnection` from firing the `close` event in certain cases when there was an error on the underlying `Socket`, leading to connections sticking around forever, stuck erroneously in the `connected` state. These "ghost" connections would cause an error event when trying to write to them. -* Removed deprecated `websocketVersion` property. Use `webSocketVersion` instead (case difference). -* Allowing user to specify all properties for `tlsOptions` in WebSocketClient, not just a few whitelisted properties. This keeps us from having to constantly add new config properties for new versions of Node. (Thanks, [jesusprubio](https://github.com/jesusprubio)) -* Removing support for Node 0.4.x and 0.6.x. -* Adding `fuzzingclient.json` spec file for the Autobahn Test Suite. -* Now more fairly emitting `message` events from the `WebSocketConnection`. Previously, all buffered frames for a connection would be processed and all `message` events emitted before moving on to processing the next connection with available data. Now We process one frame per connection (most of the time) in a more fair round-robin fashion. -* Now correctly calling the `EventEmitter` superclass constructor during class instance initialization. -* `WebSocketClient.prototype.connect` now accepts the empty string (`''`) to mean "no subprotocol requested." Previously either `null` or an empty array (`[]`) was required. -* Fixing a `TypeError` bug in `WebSocketRouter` (Thanks, [a0000778](https://github.com/a0000778)) -* Fixing a potential race condition when attaching event listeners to the underlying `Socket`. (Thanks [RichardBsolut](https://github.com/RichardBsolut)) -* `WebSocketClient` now accepts an optional options hash to be passed to `(http|https).request`. (Thanks [mildred](https://github.com/mildred) and [aus](https://github.com/aus)) This enables the following new abilities, amongst others: - * Use WebSocket-Node from behind HTTP/HTTPS proxy servers using [koichik/node-tunnel](https://github.com/koichik/node-tunnel) or similar. - * Specify the local port and local address to bind the outgoing request socket to. -* Adding option to ignore `X-Forwarded-For` headers when accepting connections from untrusted clients. -* Adding ability to mount a `WebSocketServer` instance to an arbitrary number of Node http/https servers. -* Adding browser shim so Browserify won't blow up when trying to package up code that uses WebSocket-Node. The shim is a no-op, it ***does not implement a wrapper*** providing the WebSocket-Node API in the browser. -* Incorporating upstream enhancements for the native C++ UTF-8 validation and xor masking functions. (Thanks [einaros](https://github.com/einaros) and [kkoopa](https://github.com/kkoopa)) - - -Version 1.0.8 -------------- -*Released 2012-12-26* - -* Fixed remaining naming inconsistency of "websocketVersion" as opposed to "webSocketVersion" throughout the code, and added deprecation warnings for use of the old casing throughout. -* Fixed an issue with our case-insensitive handling of WebSocket subprotocols. Clients that requested a mixed-case subprotocol would end up failing the connection when the server accepted the connection, returning a lower-case version of the subprotocol name. Now we return the subprotocol name in the exact casing that was requested by the client, while still maintaining the case-insensitive verification logic for convenience and practicality. -* Making sure that any socket-level activity timeout that may have been set on a TCP socket is removed when initializing a connection. -* Added support for native TCP Keep-Alive instead of using the WebSocket ping/pong packets to serve that function. -* Fixed cookie parsing to be compliant with RFC 2109 - -Version 1.0.7 -------------- -*Released 2012-08-12* - -* ***Native modules are now optional!*** If they fail to compile, WebSocket-Node will still work but will not verify that received UTF-8 data is valid, and xor masking/unmasking of payload data for security purposes will not be as efficient as it is performed in JavaScript instead of native code. -* Reduced Node.JS version requirement back to v0.6.10 - -Version 1.0.6 -------------- -*Released 2012-05-22* - -* Now requires Node v0.6.13 since that's the first version that I can manage to successfully build the native UTF-8 validator with node-gyp through npm. - -Version 1.0.5 -------------- -*Released 2012-05-21* - -* Fixes the issues that users were having building the native UTF-8 validator on Windows platforms. Special Thanks to: - * [zerodivisi0n](https://github.com/zerodivisi0n) - * [andreasbotsikas](https://github.com/andreasbotsikas) -* Fixed accidental global variable usage (Thanks, [hakobera](https://github.com/hakobera)!) -* Added callbacks to the send* methods that provide notification of messages being sent on the wire and any socket errors that may occur when sending a message. (Thanks, [zerodivisi0n](https://github.com/zerodivisi0n)!) -* Added option to disable logging in the echo-server in the test folder (Thanks, [oberstet](https://github.com/oberstet)!) - - -Version 1.0.4 -------------- -*Released 2011-12-18* - -* Now validates that incoming UTF-8 messages do, in fact, contain valid UTF-8 data. The connection is dropped with prejudice if invalid data is received. This strict behavior conforms to the WebSocket RFC and is verified by the Autobahn Test Suite. This is accomplished in a performant way by using a native C++ Node module created by [einaros](https://github.com/einaros). -* Updated handling of connection closure to pass more of the Autobahn Test Suite. - -Version 1.0.3 -------------- -*Released 2011-12-18* - -* Substantial speed increase (~150% on my machine, depending on the circumstances) due to an optimization in FastBufferList.js that drastically reduces the number of memory alloctions and buffer copying. ([kazuyukitanimura](https://github.com/kazuyukitanimura)) - - -Version 1.0.2 -------------- -*Released 2011-11-28* - -* Fixing whiteboard example to work under Node 0.6.x ([theturtle32](https://github.com/theturtle32)) -* Now correctly emitting a `close` event with a 1006 error code if there is a TCP error while writing to the socket during the handshake. ([theturtle32](https://github.com/theturtle32)) -* Catching errors when writing to the TCP socket during the handshake. ([justoneplanet](https://github.com/justoneplanet)) -* No longer outputting console.warn messages when there is an error writing to the TCP socket ([justoneplanet](https://github.com/justoneplanet)) -* Fixing some formatting errors, commas, semicolons, etc. ([kaisellgren](https://github.com/kaisellgren)) - - -Version 1.0.1 -------------- -*Released 2011-11-21* - -* Now works with Node 0.6.2 as well as 0.4.12 -* Support TLS in WebSocketClient -* Added support for setting and reading cookies -* Added WebSocketServer.prototype.broadcast(data) convenience method -* Added `resourceURL` property to WebSocketRequest objects. It is a Node URL object with the `resource` and any query string params already parsed. -* The WebSocket request router no longer includes the entire query string when trying to match the path name of the request. -* WebSocketRouterRequest objects now include all the properties and events of WebSocketRequest objects. -* Removed more console.log statements. Please rely on the various events emitted to be notified of error conditions. I decided that it is not a library's place to spew information to the console. -* Renamed the `websocketVersion` property to `webSocketVersion` throughout the code to fix inconsistent capitalization. `websocketVersion` has been kept for compatibility but is deprecated and may be removed in the future. -* Now outputting the sanitized version of custom header names rather than the raw value. This prevents invalid HTTP from being put onto the wire if given an illegal header name. - - -I decided it's time to start maintaining a changelog now, starting with version 1.0.1. diff --git a/deploy/node_modules/websocket/LICENSE b/deploy/node_modules/websocket/LICENSE deleted file mode 100644 index 430d42b..0000000 --- a/deploy/node_modules/websocket/LICENSE +++ /dev/null @@ -1,177 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS diff --git a/deploy/node_modules/websocket/Makefile b/deploy/node_modules/websocket/Makefile deleted file mode 100644 index 39ff645..0000000 --- a/deploy/node_modules/websocket/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -all: - node-gyp configure build - -clean: - node-gyp clean - -autobahn: - @NODE_PATH=lib node test/autobahn-test-client.js --host=127.0.0.1 --port=9000 - -autobahn-server: - @NODE_PATH=lib node test/echo-server.js diff --git a/deploy/node_modules/websocket/README.md b/deploy/node_modules/websocket/README.md deleted file mode 100644 index 6866b6c..0000000 --- a/deploy/node_modules/websocket/README.md +++ /dev/null @@ -1,314 +0,0 @@ -WebSocket Client & Server Implementation for Node -================================================= - -[![npm version](https://badge.fury.io/js/websocket.svg)](http://badge.fury.io/js/websocket) - -[![NPM Downloads](https://img.shields.io/npm/dm/websocket.svg)](https://www.npmjs.com/package/websocket) - -[![NPM](https://nodei.co/npm/websocket.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/websocket/) - -[![NPM](https://nodei.co/npm-dl/websocket.png?height=3)](https://nodei.co/npm/websocket/) - -[ ![Codeship Status for theturtle32/WebSocket-Node](https://codeship.com/projects/70458270-8ee7-0132-7756-0a0cf4fe8e66/status?branch=master)](https://codeship.com/projects/61106) - -Overview --------- -This is a (mostly) pure JavaScript implementation of the WebSocket protocol versions 8 and 13 for Node. There are some example client and server applications that implement various interoperability testing protocols in the "test/scripts" folder. - -For a WebSocket client written in ActionScript 3, see my [AS3WebScocket](https://github.com/theturtle32/AS3WebSocket) project. - - -Documentation -============= - -[You can read the full API documentation in the docs folder.](docs/index.md) - - -Changelog ---------- - -***Current Version: 1.0.24*** — Released 2016-12-28 - -***Version 1.0.24*** - -* Fixed a bug when using native keepalive on Node >= 6.0. (Thanks, [@prossin](https://github.com/prossin)) -* Upgrading outdated dependencies - -***Version 1.0.23*** - -* Official support for Node 6.x -* Updating dependencies. Specifically, updating nan to ^2.3.3 - -***Version 1.0.22*** - -* Updating to work with nan 2.x - - -***Version 1.0.21*** - -* Incremented and re-published to work around an aborted npm publish of v1.0.20. - -***Version 1.0.20*** - -* Added EventTarget to the W3CWebSocket interface (Thanks, [@ibc](https://github.com/ibc)!) -* Corrected an inaccurate error message. (Thanks, [@lekoaf](https://github.com/lekoaf)!) - -***Version 1.0.19*** - -* Updated to nan v1.8.x (tested with v1.8.4) -* Added `"license": "Apache-2.0"` to package.json via [pull request #199](https://github.com/theturtle32/WebSocket-Node/pull/199) by [@pgilad](https://github.com/pgilad). See [npm1k.org](http://npm1k.org/). - -[View the full changelog](CHANGELOG.md) - -Browser Support ---------------- - -All current browsers are fully supported. - -* Firefox 7-9 (Old) (Protocol Version 8) -* Firefox 10+ (Protocol Version 13) -* Chrome 14,15 (Old) (Protocol Version 8) -* Chrome 16+ (Protocol Version 13) -* Internet Explorer 10+ (Protocol Version 13) -* Safari 6+ (Protocol Version 13) - -***Safari older than 6.0 is not supported since it uses a very old draft of WebSockets*** - -***If you need to simultaneously support legacy browser versions that had implemented draft-75/draft-76/draft-00, take a look here: https://gist.github.com/1428579*** - -Benchmarks ----------- -There are some basic benchmarking sections in the Autobahn test suite. I've put up a [benchmark page](http://theturtle32.github.com/WebSocket-Node/benchmarks/) that shows the results from the Autobahn tests run against AutobahnServer 0.4.10, WebSocket-Node 1.0.2, WebSocket-Node 1.0.4, and ws 0.3.4. - -Autobahn Tests --------------- -The very complete [Autobahn Test Suite](http://autobahn.ws/testsuite/) is used by most WebSocket implementations to test spec compliance and interoperability. - -- [View Server Test Results](http://theturtle32.github.com/WebSocket-Node/test-report/servers/) -- [View Client Test Results](http://theturtle32.github.com/WebSocket-Node/test-report/clients/) - -Notes ------ -This library has been used in production on [worlize.com](https://www.worlize.com) since April 2011 and seems to be stable. Your mileage may vary. - -**Tested with the following node versions:** - -- 6.2.0 -- 5.11.1 -- 4.4.4 -- 0.10.45 - -It may work in earlier or later versions but I'm not actively testing it outside of the listed versions. YMMV. - -Installation ------------- - -A few users have reported difficulties building the native extensions without first manually installing node-gyp. If you have trouble building the native extensions, make sure you've got a C++ compiler, and have done `npm install -g node-gyp` first. - -Native extensions are optional, however, and WebSocket-Node will work even if the extensions cannot be compiled. - -In your project root: - - $ npm install websocket - -Then in your code: - -```javascript -var WebSocketServer = require('websocket').server; -var WebSocketClient = require('websocket').client; -var WebSocketFrame = require('websocket').frame; -var WebSocketRouter = require('websocket').router; -var W3CWebSocket = require('websocket').w3cwebsocket; -``` - -Note for Windows Users ----------------------- -Because there is a small C++ component used for validating UTF-8 data, you will need to install a few other software packages in addition to Node to be able to build this module: - -- [Microsoft Visual C++](http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express) -- [Python 2.7](http://www.python.org/download/) (NOT Python 3.x) - - -Current Features: ------------------ -- Licensed under the Apache License, Version 2.0 -- Protocol version "8" and "13" (Draft-08 through the final RFC) framing and handshake -- Can handle/aggregate received fragmented messages -- Can fragment outgoing messages -- Router to mount multiple applications to various path and protocol combinations -- TLS supported for outbound connections via WebSocketClient -- TLS supported for server connections (use https.createServer instead of http.createServer) - - Thanks to [pors](https://github.com/pors) for confirming this! -- Cookie setting and parsing -- Tunable settings - - Max Receivable Frame Size - - Max Aggregate ReceivedMessage Size - - Whether to fragment outgoing messages - - Fragmentation chunk size for outgoing messages - - Whether to automatically send ping frames for the purposes of keepalive - - Keep-alive ping interval - - Whether or not to automatically assemble received fragments (allows application to handle individual fragments directly) - - How long to wait after sending a close frame for acknowledgment before closing the socket. -- [W3C WebSocket API](http://www.w3.org/TR/websockets/) for applications running on both Node and browsers (via the `W3CWebSocket` class). - - -Known Issues/Missing Features: ------------------------------- -- No API for user-provided protocol extensions. - - -Usage Examples -============== - -Server Example --------------- - -Here's a short example showing a server that echos back anything sent to it, whether utf-8 or binary. - -```javascript -#!/usr/bin/env node -var WebSocketServer = require('websocket').server; -var http = require('http'); - -var server = http.createServer(function(request, response) { - console.log((new Date()) + ' Received request for ' + request.url); - response.writeHead(404); - response.end(); -}); -server.listen(8080, function() { - console.log((new Date()) + ' Server is listening on port 8080'); -}); - -wsServer = new WebSocketServer({ - httpServer: server, - // You should not use autoAcceptConnections for production - // applications, as it defeats all standard cross-origin protection - // facilities built into the protocol and the browser. You should - // *always* verify the connection's origin and decide whether or not - // to accept it. - autoAcceptConnections: false -}); - -function originIsAllowed(origin) { - // put logic here to detect whether the specified origin is allowed. - return true; -} - -wsServer.on('request', function(request) { - if (!originIsAllowed(request.origin)) { - // Make sure we only accept requests from an allowed origin - request.reject(); - console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.'); - return; - } - - var connection = request.accept('echo-protocol', request.origin); - console.log((new Date()) + ' Connection accepted.'); - connection.on('message', function(message) { - if (message.type === 'utf8') { - console.log('Received Message: ' + message.utf8Data); - connection.sendUTF(message.utf8Data); - } - else if (message.type === 'binary') { - console.log('Received Binary Message of ' + message.binaryData.length + ' bytes'); - connection.sendBytes(message.binaryData); - } - }); - connection.on('close', function(reasonCode, description) { - console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.'); - }); -}); -``` - -Client Example --------------- - -This is a simple example client that will print out any utf-8 messages it receives on the console, and periodically sends a random number. - -*This code demonstrates a client in Node.js, not in the browser* - -```javascript -#!/usr/bin/env node -var WebSocketClient = require('websocket').client; - -var client = new WebSocketClient(); - -client.on('connectFailed', function(error) { - console.log('Connect Error: ' + error.toString()); -}); - -client.on('connect', function(connection) { - console.log('WebSocket Client Connected'); - connection.on('error', function(error) { - console.log("Connection Error: " + error.toString()); - }); - connection.on('close', function() { - console.log('echo-protocol Connection Closed'); - }); - connection.on('message', function(message) { - if (message.type === 'utf8') { - console.log("Received: '" + message.utf8Data + "'"); - } - }); - - function sendNumber() { - if (connection.connected) { - var number = Math.round(Math.random() * 0xFFFFFF); - connection.sendUTF(number.toString()); - setTimeout(sendNumber, 1000); - } - } - sendNumber(); -}); - -client.connect('ws://localhost:8080/', 'echo-protocol'); -``` - -Client Example using the *W3C WebSocket API* --------------------------------------------- - -Same example as above but using the [W3C WebSocket API](http://www.w3.org/TR/websockets/). - -```javascript -var W3CWebSocket = require('websocket').w3cwebsocket; - -var client = new W3CWebSocket('ws://localhost:8080/', 'echo-protocol'); - -client.onerror = function() { - console.log('Connection Error'); -}; - -client.onopen = function() { - console.log('WebSocket Client Connected'); - - function sendNumber() { - if (client.readyState === client.OPEN) { - var number = Math.round(Math.random() * 0xFFFFFF); - client.send(number.toString()); - setTimeout(sendNumber, 1000); - } - } - sendNumber(); -}; - -client.onclose = function() { - console.log('echo-protocol Client Closed'); -}; - -client.onmessage = function(e) { - if (typeof e.data === 'string') { - console.log("Received: '" + e.data + "'"); - } -}; -``` - -Request Router Example ----------------------- - -For an example of using the request router, see `libwebsockets-test-server.js` in the `test` folder. - - -Resources ---------- - -A presentation on the state of the WebSockets protocol that I gave on July 23, 2011 at the LA Hacker News meetup. [WebSockets: The Real-Time Web, Delivered](http://www.scribd.com/doc/60898569/WebSockets-The-Real-Time-Web-Delivered) diff --git a/deploy/node_modules/websocket/binding.gyp b/deploy/node_modules/websocket/binding.gyp deleted file mode 100644 index 77b2ed5..0000000 --- a/deploy/node_modules/websocket/binding.gyp +++ /dev/null @@ -1,18 +0,0 @@ -{ - 'targets': [ - { - 'target_name': 'validation', - 'include_dirs': ["> $(depfile) -# Add extra rules as in (2). -# We remove slashes and replace spaces with new lines; -# remove blank lines; -# delete the first line and append a colon to the remaining lines. -sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\ - grep -v '^$$' |\ - sed -e 1d -e 's|$$|:|' \ - >> $(depfile) -rm $(depfile).raw -endef - -# Command definitions: -# - cmd_foo is the actual command to run; -# - quiet_cmd_foo is the brief-output summary of the command. - -quiet_cmd_cc = CC($(TOOLSET)) $@ -cmd_cc = $(CC.$(TOOLSET)) $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c -o $@ $< - -quiet_cmd_cxx = CXX($(TOOLSET)) $@ -cmd_cxx = $(CXX.$(TOOLSET)) $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< - -quiet_cmd_objc = CXX($(TOOLSET)) $@ -cmd_objc = $(CC.$(TOOLSET)) $(GYP_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< - -quiet_cmd_objcxx = CXX($(TOOLSET)) $@ -cmd_objcxx = $(CXX.$(TOOLSET)) $(GYP_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< - -# Commands for precompiled header files. -quiet_cmd_pch_c = CXX($(TOOLSET)) $@ -cmd_pch_c = $(CC.$(TOOLSET)) $(GYP_PCH_CFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< -quiet_cmd_pch_cc = CXX($(TOOLSET)) $@ -cmd_pch_cc = $(CC.$(TOOLSET)) $(GYP_PCH_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< -quiet_cmd_pch_m = CXX($(TOOLSET)) $@ -cmd_pch_m = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< -quiet_cmd_pch_mm = CXX($(TOOLSET)) $@ -cmd_pch_mm = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< - -# gyp-mac-tool is written next to the root Makefile by gyp. -# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd -# already. -quiet_cmd_mac_tool = MACTOOL $(4) $< -cmd_mac_tool = ./gyp-mac-tool $(4) $< "$@" - -quiet_cmd_mac_package_framework = PACKAGE FRAMEWORK $@ -cmd_mac_package_framework = ./gyp-mac-tool package-framework "$@" $(4) - -quiet_cmd_infoplist = INFOPLIST $@ -cmd_infoplist = $(CC.$(TOOLSET)) -E -P -Wno-trigraphs -x c $(INFOPLIST_DEFINES) "$<" -o "$@" - -quiet_cmd_touch = TOUCH $@ -cmd_touch = touch $@ - -quiet_cmd_copy = COPY $@ -# send stderr to /dev/null to ignore messages when linking directories. -cmd_copy = rm -rf "$@" && cp -af "$<" "$@" - -quiet_cmd_alink = LIBTOOL-STATIC $@ -cmd_alink = rm -f $@ && ./gyp-mac-tool filter-libtool libtool $(GYP_LIBTOOLFLAGS) -static -o $@ $(filter %.o,$^) - -quiet_cmd_link = LINK($(TOOLSET)) $@ -cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) - -quiet_cmd_solink = SOLINK($(TOOLSET)) $@ -cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) - -quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ -cmd_solink_module = $(LINK.$(TOOLSET)) -bundle $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) - - -# Define an escape_quotes function to escape single quotes. -# This allows us to handle quotes properly as long as we always use -# use single quotes and escape_quotes. -escape_quotes = $(subst ','\'',$(1)) -# This comment is here just to include a ' to unconfuse syntax highlighting. -# Define an escape_vars function to escape '$' variable syntax. -# This allows us to read/write command lines with shell variables (e.g. -# $LD_LIBRARY_PATH), without triggering make substitution. -escape_vars = $(subst $$,$$$$,$(1)) -# Helper that expands to a shell command to echo a string exactly as it is in -# make. This uses printf instead of echo because printf's behaviour with respect -# to escape sequences is more portable than echo's across different shells -# (e.g., dash, bash). -exact_echo = printf '%s\n' '$(call escape_quotes,$(1))' - -# Helper to compare the command we're about to run against the command -# we logged the last time we ran the command. Produces an empty -# string (false) when the commands match. -# Tricky point: Make has no string-equality test function. -# The kernel uses the following, but it seems like it would have false -# positives, where one string reordered its arguments. -# arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \ -# $(filter-out $(cmd_$@), $(cmd_$(1)))) -# We instead substitute each for the empty string into the other, and -# say they're equal if both substitutions produce the empty string. -# .d files contain ? instead of spaces, take that into account. -command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\ - $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1)))) - -# Helper that is non-empty when a prerequisite changes. -# Normally make does this implicitly, but we force rules to always run -# so we can check their command lines. -# $? -- new prerequisites -# $| -- order-only dependencies -prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?)) - -# Helper that executes all postbuilds until one fails. -define do_postbuilds - @E=0;\ - for p in $(POSTBUILDS); do\ - eval $$p;\ - E=$$?;\ - if [ $$E -ne 0 ]; then\ - break;\ - fi;\ - done;\ - if [ $$E -ne 0 ]; then\ - rm -rf "$@";\ - exit $$E;\ - fi -endef - -# do_cmd: run a command via the above cmd_foo names, if necessary. -# Should always run for a given target to handle command-line changes. -# Second argument, if non-zero, makes it do asm/C/C++ dependency munging. -# Third argument, if non-zero, makes it do POSTBUILDS processing. -# Note: We intentionally do NOT call dirx for depfile, since it contains ? for -# spaces already and dirx strips the ? characters. -define do_cmd -$(if $(or $(command_changed),$(prereq_changed)), - @$(call exact_echo, $($(quiet)cmd_$(1))) - @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))" - $(if $(findstring flock,$(word 2,$(cmd_$1))), - @$(cmd_$(1)) - @echo " $(quiet_cmd_$(1)): Finished", - @$(cmd_$(1)) - ) - @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile) - @$(if $(2),$(fixup_dep)) - $(if $(and $(3), $(POSTBUILDS)), - $(call do_postbuilds) - ) -) -endef - -# Declare the "all" target first so it is the default, -# even though we don't have the deps yet. -.PHONY: all -all: - -# make looks for ways to re-generate included makefiles, but in our case, we -# don't have a direct way. Explicitly telling make that it has nothing to do -# for them makes it go faster. -%.d: ; - -# Use FORCE_DO_CMD to force a target to run. Should be coupled with -# do_cmd. -.PHONY: FORCE_DO_CMD -FORCE_DO_CMD: - -TOOLSET := target -# Suffix rules, putting all outputs into $(obj). -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - -# Try building from generated source, too. -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - -$(obj).$(TOOLSET)/%.o: $(obj)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - - -ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ - $(findstring $(join ^,$(prefix)),\ - $(join ^,bufferutil.target.mk)))),) - include bufferutil.target.mk -endif -ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ - $(findstring $(join ^,$(prefix)),\ - $(join ^,validation.target.mk)))),) - include validation.target.mk -endif - -quiet_cmd_regen_makefile = ACTION Regenerating $@ -cmd_regen_makefile = cd $(srcdir); /usr/local/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py -fmake --ignore-environment "--toplevel-dir=." -I/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/websocket/build/config.gypi -I/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/Users/prophesi/.node-gyp/8.2.1/include/node/common.gypi "--depth=." "-Goutput_dir=." "--generator-output=build" "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/Users/prophesi/.node-gyp/8.2.1" "-Dnode_gyp_dir=/usr/local/lib/node_modules/npm/node_modules/node-gyp" "-Dnode_lib_file=/Users/prophesi/.node-gyp/8.2.1/<(target_arch)/node.lib" "-Dmodule_root_dir=/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/websocket" "-Dnode_engine=v8" binding.gyp -Makefile: $(srcdir)/../../../../../.node-gyp/8.2.1/include/node/common.gypi $(srcdir)/../../../../../../../usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi $(srcdir)/build/config.gypi $(srcdir)/binding.gyp - $(call do_cmd,regen_makefile) - -# "all" is a concatenation of the "all" targets from all the included -# sub-makefiles. This is just here to clarify. -all: - -# Add in dependency-tracking rules. $(all_deps) is the list of every single -# target in our tree. Only consider the ones with .d (dependency) info: -d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d)) -ifneq ($(d_files),) - include $(d_files) -endif diff --git a/deploy/node_modules/websocket/build/Release/.deps/Release/bufferutil.node.d b/deploy/node_modules/websocket/build/Release/.deps/Release/bufferutil.node.d deleted file mode 100644 index dace532..0000000 --- a/deploy/node_modules/websocket/build/Release/.deps/Release/bufferutil.node.d +++ /dev/null @@ -1 +0,0 @@ -cmd_Release/bufferutil.node := c++ -bundle -undefined dynamic_lookup -Wl,-no_pie -Wl,-search_paths_first -mmacosx-version-min=10.7 -arch x86_64 -L./Release -stdlib=libc++ -o Release/bufferutil.node Release/obj.target/bufferutil/src/bufferutil.o diff --git a/deploy/node_modules/websocket/build/Release/.deps/Release/obj.target/bufferutil/src/bufferutil.o.d b/deploy/node_modules/websocket/build/Release/.deps/Release/obj.target/bufferutil/src/bufferutil.o.d deleted file mode 100644 index 44d8031..0000000 --- a/deploy/node_modules/websocket/build/Release/.deps/Release/obj.target/bufferutil/src/bufferutil.o.d +++ /dev/null @@ -1,52 +0,0 @@ -cmd_Release/obj.target/bufferutil/src/bufferutil.o := c++ '-DNODE_GYP_MODULE_NAME=bufferutil' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DBUILDING_NODE_EXTENSION' -I/Users/prophesi/.node-gyp/8.2.1/include/node -I/Users/prophesi/.node-gyp/8.2.1/src -I/Users/prophesi/.node-gyp/8.2.1/deps/uv/include -I/Users/prophesi/.node-gyp/8.2.1/deps/v8/include -I../../nan -Os -gdwarf-2 -mmacosx-version-min=10.7 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -std=gnu++0x -stdlib=libc++ -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/bufferutil/src/bufferutil.o.d.raw -c -o Release/obj.target/bufferutil/src/bufferutil.o ../src/bufferutil.cc -Release/obj.target/bufferutil/src/bufferutil.o: ../src/bufferutil.cc \ - /Users/prophesi/.node-gyp/8.2.1/include/node/v8.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/v8-version.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/v8config.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/node.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/node_version.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/node_buffer.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/node_object_wrap.h \ - ../../nan/nan.h /Users/prophesi/.node-gyp/8.2.1/include/node/uv.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/uv-errno.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/uv-version.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/uv-unix.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/uv-threadpool.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/uv-darwin.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/pthread-barrier.h \ - ../../nan/nan_callbacks.h ../../nan/nan_callbacks_12_inl.h \ - ../../nan/nan_maybe_43_inl.h ../../nan/nan_converters.h \ - ../../nan/nan_converters_43_inl.h ../../nan/nan_new.h \ - ../../nan/nan_implementation_12_inl.h \ - ../../nan/nan_persistent_12_inl.h ../../nan/nan_weak.h \ - ../../nan/nan_object_wrap.h ../../nan/nan_private.h \ - ../../nan/nan_typedarray_contents.h ../../nan/nan_json.h -../src/bufferutil.cc: -/Users/prophesi/.node-gyp/8.2.1/include/node/v8.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/v8-version.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/v8config.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/node.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/node_version.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/node_buffer.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/node_object_wrap.h: -../../nan/nan.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/uv.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/uv-errno.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/uv-version.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/uv-unix.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/uv-threadpool.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/uv-darwin.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/pthread-barrier.h: -../../nan/nan_callbacks.h: -../../nan/nan_callbacks_12_inl.h: -../../nan/nan_maybe_43_inl.h: -../../nan/nan_converters.h: -../../nan/nan_converters_43_inl.h: -../../nan/nan_new.h: -../../nan/nan_implementation_12_inl.h: -../../nan/nan_persistent_12_inl.h: -../../nan/nan_weak.h: -../../nan/nan_object_wrap.h: -../../nan/nan_private.h: -../../nan/nan_typedarray_contents.h: -../../nan/nan_json.h: diff --git a/deploy/node_modules/websocket/build/Release/.deps/Release/obj.target/validation/src/validation.o.d b/deploy/node_modules/websocket/build/Release/.deps/Release/obj.target/validation/src/validation.o.d deleted file mode 100644 index 54f3c88..0000000 --- a/deploy/node_modules/websocket/build/Release/.deps/Release/obj.target/validation/src/validation.o.d +++ /dev/null @@ -1,52 +0,0 @@ -cmd_Release/obj.target/validation/src/validation.o := c++ '-DNODE_GYP_MODULE_NAME=validation' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DBUILDING_NODE_EXTENSION' -I/Users/prophesi/.node-gyp/8.2.1/include/node -I/Users/prophesi/.node-gyp/8.2.1/src -I/Users/prophesi/.node-gyp/8.2.1/deps/uv/include -I/Users/prophesi/.node-gyp/8.2.1/deps/v8/include -I../../nan -Os -gdwarf-2 -mmacosx-version-min=10.7 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -std=gnu++0x -stdlib=libc++ -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/validation/src/validation.o.d.raw -c -o Release/obj.target/validation/src/validation.o ../src/validation.cc -Release/obj.target/validation/src/validation.o: ../src/validation.cc \ - /Users/prophesi/.node-gyp/8.2.1/include/node/v8.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/v8-version.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/v8config.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/node.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/node_version.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/node_buffer.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/node_object_wrap.h \ - ../../nan/nan.h /Users/prophesi/.node-gyp/8.2.1/include/node/uv.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/uv-errno.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/uv-version.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/uv-unix.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/uv-threadpool.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/uv-darwin.h \ - /Users/prophesi/.node-gyp/8.2.1/include/node/pthread-barrier.h \ - ../../nan/nan_callbacks.h ../../nan/nan_callbacks_12_inl.h \ - ../../nan/nan_maybe_43_inl.h ../../nan/nan_converters.h \ - ../../nan/nan_converters_43_inl.h ../../nan/nan_new.h \ - ../../nan/nan_implementation_12_inl.h \ - ../../nan/nan_persistent_12_inl.h ../../nan/nan_weak.h \ - ../../nan/nan_object_wrap.h ../../nan/nan_private.h \ - ../../nan/nan_typedarray_contents.h ../../nan/nan_json.h -../src/validation.cc: -/Users/prophesi/.node-gyp/8.2.1/include/node/v8.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/v8-version.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/v8config.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/node.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/node_version.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/node_buffer.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/node_object_wrap.h: -../../nan/nan.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/uv.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/uv-errno.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/uv-version.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/uv-unix.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/uv-threadpool.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/uv-darwin.h: -/Users/prophesi/.node-gyp/8.2.1/include/node/pthread-barrier.h: -../../nan/nan_callbacks.h: -../../nan/nan_callbacks_12_inl.h: -../../nan/nan_maybe_43_inl.h: -../../nan/nan_converters.h: -../../nan/nan_converters_43_inl.h: -../../nan/nan_new.h: -../../nan/nan_implementation_12_inl.h: -../../nan/nan_persistent_12_inl.h: -../../nan/nan_weak.h: -../../nan/nan_object_wrap.h: -../../nan/nan_private.h: -../../nan/nan_typedarray_contents.h: -../../nan/nan_json.h: diff --git a/deploy/node_modules/websocket/build/Release/.deps/Release/validation.node.d b/deploy/node_modules/websocket/build/Release/.deps/Release/validation.node.d deleted file mode 100644 index 7f9e3a4..0000000 --- a/deploy/node_modules/websocket/build/Release/.deps/Release/validation.node.d +++ /dev/null @@ -1 +0,0 @@ -cmd_Release/validation.node := c++ -bundle -undefined dynamic_lookup -Wl,-no_pie -Wl,-search_paths_first -mmacosx-version-min=10.7 -arch x86_64 -L./Release -stdlib=libc++ -o Release/validation.node Release/obj.target/validation/src/validation.o diff --git a/deploy/node_modules/websocket/build/Release/bufferutil.node b/deploy/node_modules/websocket/build/Release/bufferutil.node deleted file mode 100755 index 10270b3ba47a6b9dcf2131b1598fe10b2bd531e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22764 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 S^1#FKuQT}1YUGmtN%jLga2>9 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 z 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%0A2hbQ-`gN?*@jpQ2zBLCLA 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 diff --git a/deploy/node_modules/websocket/build/Release/obj.target/validation/src/validation.o b/deploy/node_modules/websocket/build/Release/obj.target/validation/src/validation.o deleted file mode 100644 index 1d644acc26cea76db18812fd4b101abaaa6ebfd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222752 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 diff --git a/deploy/node_modules/websocket/build/Release/validation.node b/deploy/node_modules/websocket/build/Release/validation.node deleted file mode 100755 index da00df48c8455459dee86b3540f4996efc502249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22692 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 A@&Et; diff --git a/deploy/node_modules/websocket/build/binding.Makefile b/deploy/node_modules/websocket/build/binding.Makefile deleted file mode 100644 index 5d26a45..0000000 --- a/deploy/node_modules/websocket/build/binding.Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# This file is generated by gyp; do not edit. - -export builddir_name ?= ./build/. -.PHONY: all -all: - $(MAKE) validation bufferutil diff --git a/deploy/node_modules/websocket/build/bufferutil.target.mk b/deploy/node_modules/websocket/build/bufferutil.target.mk deleted file mode 100644 index 3dd8f7f..0000000 --- a/deploy/node_modules/websocket/build/bufferutil.target.mk +++ /dev/null @@ -1,180 +0,0 @@ -# This file is generated by gyp; do not edit. - -TOOLSET := target -TARGET := bufferutil -DEFS_Debug := \ - '-DNODE_GYP_MODULE_NAME=bufferutil' \ - '-DUSING_UV_SHARED=1' \ - '-DUSING_V8_SHARED=1' \ - '-DV8_DEPRECATION_WARNINGS=1' \ - '-D_DARWIN_USE_64_BIT_INODE=1' \ - '-D_LARGEFILE_SOURCE' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DBUILDING_NODE_EXTENSION' \ - '-DDEBUG' \ - '-D_DEBUG' \ - '-DV8_ENABLE_CHECKS' - -# Flags passed to all source files. -CFLAGS_Debug := \ - -O0 \ - -gdwarf-2 \ - -mmacosx-version-min=10.7 \ - -arch x86_64 \ - -Wall \ - -Wendif-labels \ - -W \ - -Wno-unused-parameter - -# Flags passed to only C files. -CFLAGS_C_Debug := \ - -fno-strict-aliasing - -# Flags passed to only C++ files. -CFLAGS_CC_Debug := \ - -std=gnu++0x \ - -stdlib=libc++ \ - -fno-rtti \ - -fno-exceptions \ - -fno-threadsafe-statics \ - -fno-strict-aliasing - -# Flags passed to only ObjC files. -CFLAGS_OBJC_Debug := - -# Flags passed to only ObjC++ files. -CFLAGS_OBJCC_Debug := - -INCS_Debug := \ - -I/Users/prophesi/.node-gyp/8.2.1/include/node \ - -I/Users/prophesi/.node-gyp/8.2.1/src \ - -I/Users/prophesi/.node-gyp/8.2.1/deps/uv/include \ - -I/Users/prophesi/.node-gyp/8.2.1/deps/v8/include \ - -I$(srcdir)/../nan - -DEFS_Release := \ - '-DNODE_GYP_MODULE_NAME=bufferutil' \ - '-DUSING_UV_SHARED=1' \ - '-DUSING_V8_SHARED=1' \ - '-DV8_DEPRECATION_WARNINGS=1' \ - '-D_DARWIN_USE_64_BIT_INODE=1' \ - '-D_LARGEFILE_SOURCE' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DBUILDING_NODE_EXTENSION' - -# Flags passed to all source files. -CFLAGS_Release := \ - -Os \ - -gdwarf-2 \ - -mmacosx-version-min=10.7 \ - -arch x86_64 \ - -Wall \ - -Wendif-labels \ - -W \ - -Wno-unused-parameter - -# Flags passed to only C files. -CFLAGS_C_Release := \ - -fno-strict-aliasing - -# Flags passed to only C++ files. -CFLAGS_CC_Release := \ - -std=gnu++0x \ - -stdlib=libc++ \ - -fno-rtti \ - -fno-exceptions \ - -fno-threadsafe-statics \ - -fno-strict-aliasing - -# Flags passed to only ObjC files. -CFLAGS_OBJC_Release := - -# Flags passed to only ObjC++ files. -CFLAGS_OBJCC_Release := - -INCS_Release := \ - -I/Users/prophesi/.node-gyp/8.2.1/include/node \ - -I/Users/prophesi/.node-gyp/8.2.1/src \ - -I/Users/prophesi/.node-gyp/8.2.1/deps/uv/include \ - -I/Users/prophesi/.node-gyp/8.2.1/deps/v8/include \ - -I$(srcdir)/../nan - -OBJS := \ - $(obj).target/$(TARGET)/src/bufferutil.o - -# Add to the list of files we specially track dependencies for. -all_deps += $(OBJS) - -# CFLAGS et al overrides must be target-local. -# See "Target-specific Variable Values" in the GNU Make manual. -$(OBJS): TOOLSET := $(TOOLSET) -$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) -$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) -$(OBJS): GYP_OBJCFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(CFLAGS_OBJC_$(BUILDTYPE)) -$(OBJS): GYP_OBJCXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(CFLAGS_OBJCC_$(BUILDTYPE)) - -# Suffix rules, putting all outputs into $(obj). - -$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) - -# Try building from generated source, too. - -$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) - -$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) - -# End of this set of suffix rules -### Rules for final target. -LDFLAGS_Debug := \ - -undefined dynamic_lookup \ - -Wl,-no_pie \ - -Wl,-search_paths_first \ - -mmacosx-version-min=10.7 \ - -arch x86_64 \ - -L$(builddir) \ - -stdlib=libc++ - -LIBTOOLFLAGS_Debug := \ - -undefined dynamic_lookup \ - -Wl,-no_pie \ - -Wl,-search_paths_first - -LDFLAGS_Release := \ - -undefined dynamic_lookup \ - -Wl,-no_pie \ - -Wl,-search_paths_first \ - -mmacosx-version-min=10.7 \ - -arch x86_64 \ - -L$(builddir) \ - -stdlib=libc++ - -LIBTOOLFLAGS_Release := \ - -undefined dynamic_lookup \ - -Wl,-no_pie \ - -Wl,-search_paths_first - -LIBS := - -$(builddir)/bufferutil.node: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE)) -$(builddir)/bufferutil.node: LIBS := $(LIBS) -$(builddir)/bufferutil.node: GYP_LIBTOOLFLAGS := $(LIBTOOLFLAGS_$(BUILDTYPE)) -$(builddir)/bufferutil.node: TOOLSET := $(TOOLSET) -$(builddir)/bufferutil.node: $(OBJS) FORCE_DO_CMD - $(call do_cmd,solink_module) - -all_deps += $(builddir)/bufferutil.node -# Add target alias -.PHONY: bufferutil -bufferutil: $(builddir)/bufferutil.node - -# Short alias for building this executable. -.PHONY: bufferutil.node -bufferutil.node: $(builddir)/bufferutil.node - -# Add executable to "all" target. -.PHONY: all -all: $(builddir)/bufferutil.node - diff --git a/deploy/node_modules/websocket/build/config.gypi b/deploy/node_modules/websocket/build/config.gypi deleted file mode 100644 index 0fbc051..0000000 --- a/deploy/node_modules/websocket/build/config.gypi +++ /dev/null @@ -1,170 +0,0 @@ -# Do not edit. File was generated by node-gyp's "configure" step -{ - "target_defaults": { - "cflags": [], - "default_configuration": "Release", - "defines": [], - "include_dirs": [], - "libraries": [] - }, - "variables": { - "asan": 0, - "coverage": "false", - "debug_devtools": "node", - "force_dynamic_crt": 0, - "host_arch": "x64", - "icu_gyp_path": "tools/icu/icu-system.gyp", - "icu_small": "false", - "llvm_version": 0, - "node_byteorder": "little", - "node_enable_d8": "false", - "node_enable_v8_vtunejit": "false", - "node_install_npm": "false", - "node_module_version": 57, - "node_no_browser_globals": "false", - "node_prefix": "/usr/local/Cellar/node/8.2.1", - "node_release_urlbase": "", - "node_shared": "false", - "node_shared_cares": "false", - "node_shared_http_parser": "false", - "node_shared_libuv": "false", - "node_shared_openssl": "false", - "node_shared_zlib": "false", - "node_tag": "", - "node_use_bundled_v8": "true", - "node_use_dtrace": "true", - "node_use_etw": "false", - "node_use_lttng": "false", - "node_use_openssl": "true", - "node_use_perfctr": "false", - "node_use_v8_platform": "true", - "node_without_node_options": "false", - "openssl_fips": "", - "openssl_no_asm": 0, - "shlib_suffix": "57.dylib", - "target_arch": "x64", - "uv_parent_path": "/deps/uv/", - "uv_use_dtrace": "true", - "v8_enable_gdbjit": 0, - "v8_enable_i18n_support": 1, - "v8_enable_inspector": 1, - "v8_no_strict_aliasing": 1, - "v8_optimized_debug": 0, - "v8_promise_internal_field_count": 1, - "v8_random_seed": 0, - "v8_trace_maps": 0, - "v8_use_snapshot": "false", - "want_separate_host_toolset": 0, - "want_separate_host_toolset_mkpeephole": 0, - "xcode_version": "8.1", - "nodedir": "/Users/prophesi/.node-gyp/8.2.1", - "standalone_static_library": 1, - "dry_run": "", - "legacy_bundling": "", - "save_dev": "", - "browser": "", - "only": "", - "viewer": "man", - "also": "", - "rollback": "true", - "usage": "", - "globalignorefile": "/usr/local/etc/npmignore", - "init_author_url": "", - "maxsockets": "50", - "shell": "/bin/bash", - "metrics_registry": "https://registry.npmjs.org/", - "parseable": "", - "shrinkwrap": "true", - "init_license": "ISC", - "timing": "", - "if_present": "", - "cache_max": "Infinity", - "init_author_email": "", - "sign_git_tag": "", - "cert": "", - "git_tag_version": "true", - "local_address": "", - "long": "", - "fetch_retries": "2", - "registry": "https://registry.npmjs.org/", - "key": "", - "message": "%s", - "versions": "", - "globalconfig": "/usr/local/etc/npmrc", - "always_auth": "", - "logs_max": "10", - "prefer_online": "", - "cache_lock_retries": "10", - "global_style": "", - "heading": "npm", - "fetch_retry_mintimeout": "10000", - "offline": "", - "proprietary_attribs": "true", - "searchlimit": "20", - "access": "", - "json": "", - "allow_same_version": "", - "description": "true", - "engine_strict": "", - "https_proxy": "", - "init_module": "/Users/prophesi/.npm-init.js", - "userconfig": "/Users/prophesi/.npmrc", - "node_version": "8.2.1", - "user": "", - "auth_type": "legacy", - "editor": "vi", - "ignore_prepublish": "", - "save": "true", - "script_shell": "", - "tag": "latest", - "global": "", - "progress": "true", - "ham_it_up": "", - "optional": "true", - "searchstaleness": "900", - "bin_links": "true", - "force": "", - "save_prod": "", - "searchopts": "", - "depth": "Infinity", - "rebuild_bundle": "true", - "sso_poll_frequency": "500", - "unicode": "true", - "fetch_retry_maxtimeout": "60000", - "ca": "", - "save_prefix": "^", - "scripts_prepend_node_path": "warn-only", - "sso_type": "oauth", - "strict_ssl": "true", - "tag_version_prefix": "v", - "dev": "", - "fetch_retry_factor": "10", - "group": "20", - "save_exact": "", - "cache_lock_stale": "60000", - "prefer_offline": "", - "version": "", - "cache_min": "10", - "cache": "/Users/prophesi/.npm", - "searchexclude": "", - "color": "true", - "package_lock": "true", - "save_optional": "", - "user_agent": "npm/5.3.0 node/v8.2.1 darwin x64", - "ignore_scripts": "", - "cache_lock_wait": "10000", - "production": "", - "save_bundle": "", - "send_metrics": "", - "init_version": "1.0.0", - "umask": "0022", - "scope": "", - "git": "git", - "init_author_name": "", - "onload_script": "", - "tmp": "/var/folders/cb/xw2m0t6j0k54rmmmqfgz2pb00000gn/T", - "unsafe_perm": "true", - "prefix": "/usr/local", - "link": "" - } -} diff --git a/deploy/node_modules/websocket/build/gyp-mac-tool b/deploy/node_modules/websocket/build/gyp-mac-tool deleted file mode 100755 index 8ef02b0..0000000 --- a/deploy/node_modules/websocket/build/gyp-mac-tool +++ /dev/null @@ -1,611 +0,0 @@ -#!/usr/bin/env python -# Generated by gyp. Do not edit. -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Utility functions to perform Xcode-style build steps. - -These functions are executed via gyp-mac-tool when using the Makefile generator. -""" - -import fcntl -import fnmatch -import glob -import json -import os -import plistlib -import re -import shutil -import string -import subprocess -import sys -import tempfile - - -def main(args): - executor = MacTool() - exit_code = executor.Dispatch(args) - if exit_code is not None: - sys.exit(exit_code) - - -class MacTool(object): - """This class performs all the Mac tooling steps. The methods can either be - executed directly, or dispatched from an argument list.""" - - def Dispatch(self, args): - """Dispatches a string command to a method.""" - if len(args) < 1: - raise Exception("Not enough arguments") - - method = "Exec%s" % self._CommandifyName(args[0]) - return getattr(self, method)(*args[1:]) - - def _CommandifyName(self, name_string): - """Transforms a tool name like copy-info-plist to CopyInfoPlist""" - return name_string.title().replace('-', '') - - def ExecCopyBundleResource(self, source, dest, convert_to_binary): - """Copies a resource file to the bundle/Resources directory, performing any - necessary compilation on each resource.""" - extension = os.path.splitext(source)[1].lower() - if os.path.isdir(source): - # Copy tree. - # TODO(thakis): This copies file attributes like mtime, while the - # single-file branch below doesn't. This should probably be changed to - # be consistent with the single-file branch. - if os.path.exists(dest): - shutil.rmtree(dest) - shutil.copytree(source, dest) - elif extension == '.xib': - return self._CopyXIBFile(source, dest) - elif extension == '.storyboard': - return self._CopyXIBFile(source, dest) - elif extension == '.strings': - self._CopyStringsFile(source, dest, convert_to_binary) - else: - shutil.copy(source, dest) - - def _CopyXIBFile(self, source, dest): - """Compiles a XIB file with ibtool into a binary plist in the bundle.""" - - # ibtool sometimes crashes with relative paths. See crbug.com/314728. - base = os.path.dirname(os.path.realpath(__file__)) - if os.path.relpath(source): - source = os.path.join(base, source) - if os.path.relpath(dest): - dest = os.path.join(base, dest) - - args = ['xcrun', 'ibtool', '--errors', '--warnings', '--notices', - '--output-format', 'human-readable-text', '--compile', dest, source] - ibtool_section_re = re.compile(r'/\*.*\*/') - ibtool_re = re.compile(r'.*note:.*is clipping its content') - ibtoolout = subprocess.Popen(args, stdout=subprocess.PIPE) - current_section_header = None - for line in ibtoolout.stdout: - if ibtool_section_re.match(line): - current_section_header = line - elif not ibtool_re.match(line): - if current_section_header: - sys.stdout.write(current_section_header) - current_section_header = None - sys.stdout.write(line) - return ibtoolout.returncode - - def _ConvertToBinary(self, dest): - subprocess.check_call([ - 'xcrun', 'plutil', '-convert', 'binary1', '-o', dest, dest]) - - def _CopyStringsFile(self, source, dest, convert_to_binary): - """Copies a .strings file using iconv to reconvert the input into UTF-16.""" - input_code = self._DetectInputEncoding(source) or "UTF-8" - - # Xcode's CpyCopyStringsFile / builtin-copyStrings seems to call - # CFPropertyListCreateFromXMLData() behind the scenes; at least it prints - # CFPropertyListCreateFromXMLData(): Old-style plist parser: missing - # semicolon in dictionary. - # on invalid files. Do the same kind of validation. - import CoreFoundation - s = open(source, 'rb').read() - d = CoreFoundation.CFDataCreate(None, s, len(s)) - _, error = CoreFoundation.CFPropertyListCreateFromXMLData(None, d, 0, None) - if error: - return - - fp = open(dest, 'wb') - fp.write(s.decode(input_code).encode('UTF-16')) - fp.close() - - if convert_to_binary == 'True': - self._ConvertToBinary(dest) - - def _DetectInputEncoding(self, file_name): - """Reads the first few bytes from file_name and tries to guess the text - encoding. Returns None as a guess if it can't detect it.""" - fp = open(file_name, 'rb') - try: - header = fp.read(3) - except e: - fp.close() - return None - fp.close() - if header.startswith("\xFE\xFF"): - return "UTF-16" - elif header.startswith("\xFF\xFE"): - return "UTF-16" - elif header.startswith("\xEF\xBB\xBF"): - return "UTF-8" - else: - return None - - def ExecCopyInfoPlist(self, source, dest, convert_to_binary, *keys): - """Copies the |source| Info.plist to the destination directory |dest|.""" - # Read the source Info.plist into memory. - fd = open(source, 'r') - lines = fd.read() - fd.close() - - # Insert synthesized key/value pairs (e.g. BuildMachineOSBuild). - plist = plistlib.readPlistFromString(lines) - if keys: - plist = dict(plist.items() + json.loads(keys[0]).items()) - lines = plistlib.writePlistToString(plist) - - # Go through all the environment variables and replace them as variables in - # the file. - IDENT_RE = re.compile(r'[/\s]') - for key in os.environ: - if key.startswith('_'): - continue - evar = '${%s}' % key - evalue = os.environ[key] - lines = string.replace(lines, evar, evalue) - - # Xcode supports various suffices on environment variables, which are - # all undocumented. :rfc1034identifier is used in the standard project - # template these days, and :identifier was used earlier. They are used to - # convert non-url characters into things that look like valid urls -- - # except that the replacement character for :identifier, '_' isn't valid - # in a URL either -- oops, hence :rfc1034identifier was born. - evar = '${%s:identifier}' % key - evalue = IDENT_RE.sub('_', os.environ[key]) - lines = string.replace(lines, evar, evalue) - - evar = '${%s:rfc1034identifier}' % key - evalue = IDENT_RE.sub('-', os.environ[key]) - lines = string.replace(lines, evar, evalue) - - # Remove any keys with values that haven't been replaced. - lines = lines.split('\n') - for i in range(len(lines)): - if lines[i].strip().startswith("${"): - lines[i] = None - lines[i - 1] = None - lines = '\n'.join(filter(lambda x: x is not None, lines)) - - # Write out the file with variables replaced. - fd = open(dest, 'w') - fd.write(lines) - fd.close() - - # Now write out PkgInfo file now that the Info.plist file has been - # "compiled". - self._WritePkgInfo(dest) - - if convert_to_binary == 'True': - self._ConvertToBinary(dest) - - def _WritePkgInfo(self, info_plist): - """This writes the PkgInfo file from the data stored in Info.plist.""" - plist = plistlib.readPlist(info_plist) - if not plist: - return - - # Only create PkgInfo for executable types. - package_type = plist['CFBundlePackageType'] - if package_type != 'APPL': - return - - # The format of PkgInfo is eight characters, representing the bundle type - # and bundle signature, each four characters. If that is missing, four - # '?' characters are used instead. - signature_code = plist.get('CFBundleSignature', '????') - if len(signature_code) != 4: # Wrong length resets everything, too. - signature_code = '?' * 4 - - dest = os.path.join(os.path.dirname(info_plist), 'PkgInfo') - fp = open(dest, 'w') - fp.write('%s%s' % (package_type, signature_code)) - fp.close() - - def ExecFlock(self, lockfile, *cmd_list): - """Emulates the most basic behavior of Linux's flock(1).""" - # Rely on exception handling to report errors. - fd = os.open(lockfile, os.O_RDONLY|os.O_NOCTTY|os.O_CREAT, 0o666) - fcntl.flock(fd, fcntl.LOCK_EX) - return subprocess.call(cmd_list) - - def ExecFilterLibtool(self, *cmd_list): - """Calls libtool and filters out '/path/to/libtool: file: foo.o has no - symbols'.""" - libtool_re = re.compile(r'^.*libtool: file: .* has no symbols$') - libtool_re5 = re.compile( - r'^.*libtool: warning for library: ' + - r'.* the table of contents is empty ' + - r'\(no object file members in the library define global symbols\)$') - env = os.environ.copy() - # Ref: - # http://www.opensource.apple.com/source/cctools/cctools-809/misc/libtool.c - # The problem with this flag is that it resets the file mtime on the file to - # epoch=0, e.g. 1970-1-1 or 1969-12-31 depending on timezone. - env['ZERO_AR_DATE'] = '1' - libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE, env=env) - _, err = libtoolout.communicate() - for line in err.splitlines(): - if not libtool_re.match(line) and not libtool_re5.match(line): - print >>sys.stderr, line - # Unconditionally touch the output .a file on the command line if present - # and the command succeeded. A bit hacky. - if not libtoolout.returncode: - for i in range(len(cmd_list) - 1): - if cmd_list[i] == "-o" and cmd_list[i+1].endswith('.a'): - os.utime(cmd_list[i+1], None) - break - return libtoolout.returncode - - def ExecPackageFramework(self, framework, version): - """Takes a path to Something.framework and the Current version of that and - sets up all the symlinks.""" - # Find the name of the binary based on the part before the ".framework". - binary = os.path.basename(framework).split('.')[0] - - CURRENT = 'Current' - RESOURCES = 'Resources' - VERSIONS = 'Versions' - - if not os.path.exists(os.path.join(framework, VERSIONS, version, binary)): - # Binary-less frameworks don't seem to contain symlinks (see e.g. - # chromium's out/Debug/org.chromium.Chromium.manifest/ bundle). - return - - # Move into the framework directory to set the symlinks correctly. - pwd = os.getcwd() - os.chdir(framework) - - # Set up the Current version. - self._Relink(version, os.path.join(VERSIONS, CURRENT)) - - # Set up the root symlinks. - self._Relink(os.path.join(VERSIONS, CURRENT, binary), binary) - self._Relink(os.path.join(VERSIONS, CURRENT, RESOURCES), RESOURCES) - - # Back to where we were before! - os.chdir(pwd) - - def _Relink(self, dest, link): - """Creates a symlink to |dest| named |link|. If |link| already exists, - it is overwritten.""" - if os.path.lexists(link): - os.remove(link) - os.symlink(dest, link) - - def ExecCompileXcassets(self, keys, *inputs): - """Compiles multiple .xcassets files into a single .car file. - - This invokes 'actool' to compile all the inputs .xcassets files. The - |keys| arguments is a json-encoded dictionary of extra arguments to - pass to 'actool' when the asset catalogs contains an application icon - or a launch image. - - Note that 'actool' does not create the Assets.car file if the asset - catalogs does not contains imageset. - """ - command_line = [ - 'xcrun', 'actool', '--output-format', 'human-readable-text', - '--compress-pngs', '--notices', '--warnings', '--errors', - ] - is_iphone_target = 'IPHONEOS_DEPLOYMENT_TARGET' in os.environ - if is_iphone_target: - platform = os.environ['CONFIGURATION'].split('-')[-1] - if platform not in ('iphoneos', 'iphonesimulator'): - platform = 'iphonesimulator' - command_line.extend([ - '--platform', platform, '--target-device', 'iphone', - '--target-device', 'ipad', '--minimum-deployment-target', - os.environ['IPHONEOS_DEPLOYMENT_TARGET'], '--compile', - os.path.abspath(os.environ['CONTENTS_FOLDER_PATH']), - ]) - else: - command_line.extend([ - '--platform', 'macosx', '--target-device', 'mac', - '--minimum-deployment-target', os.environ['MACOSX_DEPLOYMENT_TARGET'], - '--compile', - os.path.abspath(os.environ['UNLOCALIZED_RESOURCES_FOLDER_PATH']), - ]) - if keys: - keys = json.loads(keys) - for key, value in keys.iteritems(): - arg_name = '--' + key - if isinstance(value, bool): - if value: - command_line.append(arg_name) - elif isinstance(value, list): - for v in value: - command_line.append(arg_name) - command_line.append(str(v)) - else: - command_line.append(arg_name) - command_line.append(str(value)) - # Note: actool crashes if inputs path are relative, so use os.path.abspath - # to get absolute path name for inputs. - command_line.extend(map(os.path.abspath, inputs)) - subprocess.check_call(command_line) - - def ExecMergeInfoPlist(self, output, *inputs): - """Merge multiple .plist files into a single .plist file.""" - merged_plist = {} - for path in inputs: - plist = self._LoadPlistMaybeBinary(path) - self._MergePlist(merged_plist, plist) - plistlib.writePlist(merged_plist, output) - - def ExecCodeSignBundle(self, key, resource_rules, entitlements, provisioning): - """Code sign a bundle. - - This function tries to code sign an iOS bundle, following the same - algorithm as Xcode: - 1. copy ResourceRules.plist from the user or the SDK into the bundle, - 2. pick the provisioning profile that best match the bundle identifier, - and copy it into the bundle as embedded.mobileprovision, - 3. copy Entitlements.plist from user or SDK next to the bundle, - 4. code sign the bundle. - """ - resource_rules_path = self._InstallResourceRules(resource_rules) - substitutions, overrides = self._InstallProvisioningProfile( - provisioning, self._GetCFBundleIdentifier()) - entitlements_path = self._InstallEntitlements( - entitlements, substitutions, overrides) - subprocess.check_call([ - 'codesign', '--force', '--sign', key, '--resource-rules', - resource_rules_path, '--entitlements', entitlements_path, - os.path.join( - os.environ['TARGET_BUILD_DIR'], - os.environ['FULL_PRODUCT_NAME'])]) - - def _InstallResourceRules(self, resource_rules): - """Installs ResourceRules.plist from user or SDK into the bundle. - - Args: - resource_rules: string, optional, path to the ResourceRules.plist file - to use, default to "${SDKROOT}/ResourceRules.plist" - - Returns: - Path to the copy of ResourceRules.plist into the bundle. - """ - source_path = resource_rules - target_path = os.path.join( - os.environ['BUILT_PRODUCTS_DIR'], - os.environ['CONTENTS_FOLDER_PATH'], - 'ResourceRules.plist') - if not source_path: - source_path = os.path.join( - os.environ['SDKROOT'], 'ResourceRules.plist') - shutil.copy2(source_path, target_path) - return target_path - - def _InstallProvisioningProfile(self, profile, bundle_identifier): - """Installs embedded.mobileprovision into the bundle. - - Args: - profile: string, optional, short name of the .mobileprovision file - to use, if empty or the file is missing, the best file installed - will be used - bundle_identifier: string, value of CFBundleIdentifier from Info.plist - - Returns: - A tuple containing two dictionary: variables substitutions and values - to overrides when generating the entitlements file. - """ - source_path, provisioning_data, team_id = self._FindProvisioningProfile( - profile, bundle_identifier) - target_path = os.path.join( - os.environ['BUILT_PRODUCTS_DIR'], - os.environ['CONTENTS_FOLDER_PATH'], - 'embedded.mobileprovision') - shutil.copy2(source_path, target_path) - substitutions = self._GetSubstitutions(bundle_identifier, team_id + '.') - return substitutions, provisioning_data['Entitlements'] - - def _FindProvisioningProfile(self, profile, bundle_identifier): - """Finds the .mobileprovision file to use for signing the bundle. - - Checks all the installed provisioning profiles (or if the user specified - the PROVISIONING_PROFILE variable, only consult it) and select the most - specific that correspond to the bundle identifier. - - Args: - profile: string, optional, short name of the .mobileprovision file - to use, if empty or the file is missing, the best file installed - will be used - bundle_identifier: string, value of CFBundleIdentifier from Info.plist - - Returns: - A tuple of the path to the selected provisioning profile, the data of - the embedded plist in the provisioning profile and the team identifier - to use for code signing. - - Raises: - SystemExit: if no .mobileprovision can be used to sign the bundle. - """ - profiles_dir = os.path.join( - os.environ['HOME'], 'Library', 'MobileDevice', 'Provisioning Profiles') - if not os.path.isdir(profiles_dir): - print >>sys.stderr, ( - 'cannot find mobile provisioning for %s' % bundle_identifier) - sys.exit(1) - provisioning_profiles = None - if profile: - profile_path = os.path.join(profiles_dir, profile + '.mobileprovision') - if os.path.exists(profile_path): - provisioning_profiles = [profile_path] - if not provisioning_profiles: - provisioning_profiles = glob.glob( - os.path.join(profiles_dir, '*.mobileprovision')) - valid_provisioning_profiles = {} - for profile_path in provisioning_profiles: - profile_data = self._LoadProvisioningProfile(profile_path) - app_id_pattern = profile_data.get( - 'Entitlements', {}).get('application-identifier', '') - for team_identifier in profile_data.get('TeamIdentifier', []): - app_id = '%s.%s' % (team_identifier, bundle_identifier) - if fnmatch.fnmatch(app_id, app_id_pattern): - valid_provisioning_profiles[app_id_pattern] = ( - profile_path, profile_data, team_identifier) - if not valid_provisioning_profiles: - print >>sys.stderr, ( - 'cannot find mobile provisioning for %s' % bundle_identifier) - sys.exit(1) - # If the user has multiple provisioning profiles installed that can be - # used for ${bundle_identifier}, pick the most specific one (ie. the - # provisioning profile whose pattern is the longest). - selected_key = max(valid_provisioning_profiles, key=lambda v: len(v)) - return valid_provisioning_profiles[selected_key] - - def _LoadProvisioningProfile(self, profile_path): - """Extracts the plist embedded in a provisioning profile. - - Args: - profile_path: string, path to the .mobileprovision file - - Returns: - Content of the plist embedded in the provisioning profile as a dictionary. - """ - with tempfile.NamedTemporaryFile() as temp: - subprocess.check_call([ - 'security', 'cms', '-D', '-i', profile_path, '-o', temp.name]) - return self._LoadPlistMaybeBinary(temp.name) - - def _MergePlist(self, merged_plist, plist): - """Merge |plist| into |merged_plist|.""" - for key, value in plist.iteritems(): - if isinstance(value, dict): - merged_value = merged_plist.get(key, {}) - if isinstance(merged_value, dict): - self._MergePlist(merged_value, value) - merged_plist[key] = merged_value - else: - merged_plist[key] = value - else: - merged_plist[key] = value - - def _LoadPlistMaybeBinary(self, plist_path): - """Loads into a memory a plist possibly encoded in binary format. - - This is a wrapper around plistlib.readPlist that tries to convert the - plist to the XML format if it can't be parsed (assuming that it is in - the binary format). - - Args: - plist_path: string, path to a plist file, in XML or binary format - - Returns: - Content of the plist as a dictionary. - """ - try: - # First, try to read the file using plistlib that only supports XML, - # and if an exception is raised, convert a temporary copy to XML and - # load that copy. - return plistlib.readPlist(plist_path) - except: - pass - with tempfile.NamedTemporaryFile() as temp: - shutil.copy2(plist_path, temp.name) - subprocess.check_call(['plutil', '-convert', 'xml1', temp.name]) - return plistlib.readPlist(temp.name) - - def _GetSubstitutions(self, bundle_identifier, app_identifier_prefix): - """Constructs a dictionary of variable substitutions for Entitlements.plist. - - Args: - bundle_identifier: string, value of CFBundleIdentifier from Info.plist - app_identifier_prefix: string, value for AppIdentifierPrefix - - Returns: - Dictionary of substitutions to apply when generating Entitlements.plist. - """ - return { - 'CFBundleIdentifier': bundle_identifier, - 'AppIdentifierPrefix': app_identifier_prefix, - } - - def _GetCFBundleIdentifier(self): - """Extracts CFBundleIdentifier value from Info.plist in the bundle. - - Returns: - Value of CFBundleIdentifier in the Info.plist located in the bundle. - """ - info_plist_path = os.path.join( - os.environ['TARGET_BUILD_DIR'], - os.environ['INFOPLIST_PATH']) - info_plist_data = self._LoadPlistMaybeBinary(info_plist_path) - return info_plist_data['CFBundleIdentifier'] - - def _InstallEntitlements(self, entitlements, substitutions, overrides): - """Generates and install the ${BundleName}.xcent entitlements file. - - Expands variables "$(variable)" pattern in the source entitlements file, - add extra entitlements defined in the .mobileprovision file and the copy - the generated plist to "${BundlePath}.xcent". - - Args: - entitlements: string, optional, path to the Entitlements.plist template - to use, defaults to "${SDKROOT}/Entitlements.plist" - substitutions: dictionary, variable substitutions - overrides: dictionary, values to add to the entitlements - - Returns: - Path to the generated entitlements file. - """ - source_path = entitlements - target_path = os.path.join( - os.environ['BUILT_PRODUCTS_DIR'], - os.environ['PRODUCT_NAME'] + '.xcent') - if not source_path: - source_path = os.path.join( - os.environ['SDKROOT'], - 'Entitlements.plist') - shutil.copy2(source_path, target_path) - data = self._LoadPlistMaybeBinary(target_path) - data = self._ExpandVariables(data, substitutions) - if overrides: - for key in overrides: - if key not in data: - data[key] = overrides[key] - plistlib.writePlist(data, target_path) - return target_path - - def _ExpandVariables(self, data, substitutions): - """Expands variables "$(variable)" in data. - - Args: - data: object, can be either string, list or dictionary - substitutions: dictionary, variable substitutions to perform - - Returns: - Copy of data where each references to "$(variable)" has been replaced - by the corresponding value found in substitutions, or left intact if - the key was not found. - """ - if isinstance(data, str): - for key, value in substitutions.iteritems(): - data = data.replace('$(%s)' % key, value) - return data - if isinstance(data, list): - return [self._ExpandVariables(v, substitutions) for v in data] - if isinstance(data, dict): - return {k: self._ExpandVariables(data[k], substitutions) for k in data} - return data - -if __name__ == '__main__': - sys.exit(main(sys.argv[1:])) diff --git a/deploy/node_modules/websocket/build/validation.target.mk b/deploy/node_modules/websocket/build/validation.target.mk deleted file mode 100644 index 052bdf8..0000000 --- a/deploy/node_modules/websocket/build/validation.target.mk +++ /dev/null @@ -1,180 +0,0 @@ -# This file is generated by gyp; do not edit. - -TOOLSET := target -TARGET := validation -DEFS_Debug := \ - '-DNODE_GYP_MODULE_NAME=validation' \ - '-DUSING_UV_SHARED=1' \ - '-DUSING_V8_SHARED=1' \ - '-DV8_DEPRECATION_WARNINGS=1' \ - '-D_DARWIN_USE_64_BIT_INODE=1' \ - '-D_LARGEFILE_SOURCE' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DBUILDING_NODE_EXTENSION' \ - '-DDEBUG' \ - '-D_DEBUG' \ - '-DV8_ENABLE_CHECKS' - -# Flags passed to all source files. -CFLAGS_Debug := \ - -O0 \ - -gdwarf-2 \ - -mmacosx-version-min=10.7 \ - -arch x86_64 \ - -Wall \ - -Wendif-labels \ - -W \ - -Wno-unused-parameter - -# Flags passed to only C files. -CFLAGS_C_Debug := \ - -fno-strict-aliasing - -# Flags passed to only C++ files. -CFLAGS_CC_Debug := \ - -std=gnu++0x \ - -stdlib=libc++ \ - -fno-rtti \ - -fno-exceptions \ - -fno-threadsafe-statics \ - -fno-strict-aliasing - -# Flags passed to only ObjC files. -CFLAGS_OBJC_Debug := - -# Flags passed to only ObjC++ files. -CFLAGS_OBJCC_Debug := - -INCS_Debug := \ - -I/Users/prophesi/.node-gyp/8.2.1/include/node \ - -I/Users/prophesi/.node-gyp/8.2.1/src \ - -I/Users/prophesi/.node-gyp/8.2.1/deps/uv/include \ - -I/Users/prophesi/.node-gyp/8.2.1/deps/v8/include \ - -I$(srcdir)/../nan - -DEFS_Release := \ - '-DNODE_GYP_MODULE_NAME=validation' \ - '-DUSING_UV_SHARED=1' \ - '-DUSING_V8_SHARED=1' \ - '-DV8_DEPRECATION_WARNINGS=1' \ - '-D_DARWIN_USE_64_BIT_INODE=1' \ - '-D_LARGEFILE_SOURCE' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DBUILDING_NODE_EXTENSION' - -# Flags passed to all source files. -CFLAGS_Release := \ - -Os \ - -gdwarf-2 \ - -mmacosx-version-min=10.7 \ - -arch x86_64 \ - -Wall \ - -Wendif-labels \ - -W \ - -Wno-unused-parameter - -# Flags passed to only C files. -CFLAGS_C_Release := \ - -fno-strict-aliasing - -# Flags passed to only C++ files. -CFLAGS_CC_Release := \ - -std=gnu++0x \ - -stdlib=libc++ \ - -fno-rtti \ - -fno-exceptions \ - -fno-threadsafe-statics \ - -fno-strict-aliasing - -# Flags passed to only ObjC files. -CFLAGS_OBJC_Release := - -# Flags passed to only ObjC++ files. -CFLAGS_OBJCC_Release := - -INCS_Release := \ - -I/Users/prophesi/.node-gyp/8.2.1/include/node \ - -I/Users/prophesi/.node-gyp/8.2.1/src \ - -I/Users/prophesi/.node-gyp/8.2.1/deps/uv/include \ - -I/Users/prophesi/.node-gyp/8.2.1/deps/v8/include \ - -I$(srcdir)/../nan - -OBJS := \ - $(obj).target/$(TARGET)/src/validation.o - -# Add to the list of files we specially track dependencies for. -all_deps += $(OBJS) - -# CFLAGS et al overrides must be target-local. -# See "Target-specific Variable Values" in the GNU Make manual. -$(OBJS): TOOLSET := $(TOOLSET) -$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) -$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) -$(OBJS): GYP_OBJCFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(CFLAGS_OBJC_$(BUILDTYPE)) -$(OBJS): GYP_OBJCXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(CFLAGS_OBJCC_$(BUILDTYPE)) - -# Suffix rules, putting all outputs into $(obj). - -$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) - -# Try building from generated source, too. - -$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) - -$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) - -# End of this set of suffix rules -### Rules for final target. -LDFLAGS_Debug := \ - -undefined dynamic_lookup \ - -Wl,-no_pie \ - -Wl,-search_paths_first \ - -mmacosx-version-min=10.7 \ - -arch x86_64 \ - -L$(builddir) \ - -stdlib=libc++ - -LIBTOOLFLAGS_Debug := \ - -undefined dynamic_lookup \ - -Wl,-no_pie \ - -Wl,-search_paths_first - -LDFLAGS_Release := \ - -undefined dynamic_lookup \ - -Wl,-no_pie \ - -Wl,-search_paths_first \ - -mmacosx-version-min=10.7 \ - -arch x86_64 \ - -L$(builddir) \ - -stdlib=libc++ - -LIBTOOLFLAGS_Release := \ - -undefined dynamic_lookup \ - -Wl,-no_pie \ - -Wl,-search_paths_first - -LIBS := - -$(builddir)/validation.node: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE)) -$(builddir)/validation.node: LIBS := $(LIBS) -$(builddir)/validation.node: GYP_LIBTOOLFLAGS := $(LIBTOOLFLAGS_$(BUILDTYPE)) -$(builddir)/validation.node: TOOLSET := $(TOOLSET) -$(builddir)/validation.node: $(OBJS) FORCE_DO_CMD - $(call do_cmd,solink_module) - -all_deps += $(builddir)/validation.node -# Add target alias -.PHONY: validation -validation: $(builddir)/validation.node - -# Short alias for building this executable. -.PHONY: validation.node -validation.node: $(builddir)/validation.node - -# Add executable to "all" target. -.PHONY: all -all: $(builddir)/validation.node - diff --git a/deploy/node_modules/websocket/builderror.log b/deploy/node_modules/websocket/builderror.log deleted file mode 100644 index e69de29..0000000 diff --git a/deploy/node_modules/websocket/gulpfile.js b/deploy/node_modules/websocket/gulpfile.js deleted file mode 100644 index b515b92..0000000 --- a/deploy/node_modules/websocket/gulpfile.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Dependencies. - */ -var gulp = require('gulp'); -var jshint = require('gulp-jshint'); - -gulp.task('lint', function() { - return gulp.src(['gulpfile.js', 'lib/**/*.js', 'test/**/*.js']) - .pipe(jshint('.jshintrc')) - .pipe(jshint.reporter('jshint-stylish', {verbose: true})) - .pipe(jshint.reporter('fail')); -}); - -gulp.task('default', gulp.series('lint')); diff --git a/deploy/node_modules/websocket/index.js b/deploy/node_modules/websocket/index.js deleted file mode 100644 index 573969f..0000000 --- a/deploy/node_modules/websocket/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/websocket'); \ No newline at end of file diff --git a/deploy/node_modules/websocket/lib/BufferUtil.fallback.js b/deploy/node_modules/websocket/lib/BufferUtil.fallback.js deleted file mode 100644 index de18bfb..0000000 --- a/deploy/node_modules/websocket/lib/BufferUtil.fallback.js +++ /dev/null @@ -1,52 +0,0 @@ -/*! - * Copied from: - * ws: a node.js websocket client - * Copyright(c) 2011 Einar Otto Stangvik - * MIT Licensed - */ - -/* jshint -W086 */ - -module.exports.BufferUtil = { - merge: function(mergedBuffer, buffers) { - var offset = 0; - for (var i = 0, l = buffers.length; i < l; ++i) { - var buf = buffers[i]; - buf.copy(mergedBuffer, offset); - offset += buf.length; - } - }, - mask: function(source, mask, output, offset, length) { - var maskNum = mask.readUInt32LE(0, true); - var i = 0; - for (; i < length - 3; i += 4) { - var num = maskNum ^ source.readUInt32LE(i, true); - if (num < 0) { num = 4294967296 + num; } - output.writeUInt32LE(num, offset + i, true); - } - switch (length % 4) { - case 3: output[offset + i + 2] = source[i + 2] ^ mask[2]; - case 2: output[offset + i + 1] = source[i + 1] ^ mask[1]; - case 1: output[offset + i] = source[i] ^ mask[0]; - case 0: - } - }, - unmask: function(data, mask) { - var maskNum = mask.readUInt32LE(0, true); - var length = data.length; - var i = 0; - for (; i < length - 3; i += 4) { - var num = maskNum ^ data.readUInt32LE(i, true); - if (num < 0) { num = 4294967296 + num; } - data.writeUInt32LE(num, i, true); - } - switch (length % 4) { - case 3: data[i + 2] = data[i + 2] ^ mask[2]; - case 2: data[i + 1] = data[i + 1] ^ mask[1]; - case 1: data[i] = data[i] ^ mask[0]; - case 0: - } - } -}; - -/* jshint +W086 */ \ No newline at end of file diff --git a/deploy/node_modules/websocket/lib/BufferUtil.js b/deploy/node_modules/websocket/lib/BufferUtil.js deleted file mode 100644 index fa37c80..0000000 --- a/deploy/node_modules/websocket/lib/BufferUtil.js +++ /dev/null @@ -1,17 +0,0 @@ -/*! - * Copied from: - * ws: a node.js websocket client - * Copyright(c) 2011 Einar Otto Stangvik - * MIT Licensed - */ - -try { - module.exports = require('../build/Release/bufferutil'); -} catch (e) { try { - module.exports = require('../build/default/bufferutil'); -} catch (e) { try { - module.exports = require('./BufferUtil.fallback'); -} catch (e) { - console.error('bufferutil.node seems to not have been built. Run npm install.'); - throw e; -}}} diff --git a/deploy/node_modules/websocket/lib/Deprecation.js b/deploy/node_modules/websocket/lib/Deprecation.js deleted file mode 100644 index 094f160..0000000 --- a/deploy/node_modules/websocket/lib/Deprecation.js +++ /dev/null @@ -1,32 +0,0 @@ -/************************************************************************ - * Copyright 2010-2015 Brian McKelvey. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ***********************************************************************/ - -var Deprecation = { - disableWarnings: false, - - deprecationWarningMap: { - - }, - - warn: function(deprecationName) { - if (!this.disableWarnings && this.deprecationWarningMap[deprecationName]) { - console.warn('DEPRECATION WARNING: ' + this.deprecationWarningMap[deprecationName]); - this.deprecationWarningMap[deprecationName] = false; - } - } -}; - -module.exports = Deprecation; diff --git a/deploy/node_modules/websocket/lib/Validation.fallback.js b/deploy/node_modules/websocket/lib/Validation.fallback.js deleted file mode 100644 index 6160f88..0000000 --- a/deploy/node_modules/websocket/lib/Validation.fallback.js +++ /dev/null @@ -1,12 +0,0 @@ -/*! - * UTF-8 Validation Fallback Code originally from: - * ws: a node.js websocket client - * Copyright(c) 2011 Einar Otto Stangvik - * MIT Licensed - */ - -module.exports.Validation = { - isValidUTF8: function() { - return true; - } -}; diff --git a/deploy/node_modules/websocket/lib/Validation.js b/deploy/node_modules/websocket/lib/Validation.js deleted file mode 100644 index b4106e8..0000000 --- a/deploy/node_modules/websocket/lib/Validation.js +++ /dev/null @@ -1,17 +0,0 @@ -/*! - * UTF-8 Validation Code originally from: - * ws: a node.js websocket client - * Copyright(c) 2011 Einar Otto Stangvik - * MIT Licensed - */ - -try { - module.exports = require('../build/Release/validation'); -} catch (e) { try { - module.exports = require('../build/default/validation'); -} catch (e) { try { - module.exports = require('./Validation.fallback'); -} catch (e) { - console.error('validation.node seems not to have been built. Run npm install.'); - throw e; -}}} diff --git a/deploy/node_modules/websocket/lib/W3CWebSocket.js b/deploy/node_modules/websocket/lib/W3CWebSocket.js deleted file mode 100644 index 44a4ac9..0000000 --- a/deploy/node_modules/websocket/lib/W3CWebSocket.js +++ /dev/null @@ -1,257 +0,0 @@ -/************************************************************************ - * Copyright 2010-2015 Brian McKelvey. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ***********************************************************************/ - -var WebSocketClient = require('./WebSocketClient'); -var toBuffer = require('typedarray-to-buffer'); -var yaeti = require('yaeti'); - - -const CONNECTING = 0; -const OPEN = 1; -const CLOSING = 2; -const CLOSED = 3; - - -module.exports = W3CWebSocket; - - -function W3CWebSocket(url, protocols, origin, headers, requestOptions, clientConfig) { - // Make this an EventTarget. - yaeti.EventTarget.call(this); - - // Sanitize clientConfig. - clientConfig = clientConfig || {}; - clientConfig.assembleFragments = true; // Required in the W3C API. - - var self = this; - - this._url = url; - this._readyState = CONNECTING; - this._protocol = undefined; - this._extensions = ''; - this._bufferedAmount = 0; // Hack, always 0. - this._binaryType = 'arraybuffer'; // TODO: Should be 'blob' by default, but Node has no Blob. - - // The WebSocketConnection instance. - this._connection = undefined; - - // WebSocketClient instance. - this._client = new WebSocketClient(clientConfig); - - this._client.on('connect', function(connection) { - onConnect.call(self, connection); - }); - - this._client.on('connectFailed', function() { - onConnectFailed.call(self); - }); - - this._client.connect(url, protocols, origin, headers, requestOptions); -} - - -// Expose W3C read only attributes. -Object.defineProperties(W3CWebSocket.prototype, { - url: { get: function() { return this._url; } }, - readyState: { get: function() { return this._readyState; } }, - protocol: { get: function() { return this._protocol; } }, - extensions: { get: function() { return this._extensions; } }, - bufferedAmount: { get: function() { return this._bufferedAmount; } } -}); - - -// Expose W3C write/read attributes. -Object.defineProperties(W3CWebSocket.prototype, { - binaryType: { - get: function() { - return this._binaryType; - }, - set: function(type) { - // TODO: Just 'arraybuffer' supported. - if (type !== 'arraybuffer') { - throw new SyntaxError('just "arraybuffer" type allowed for "binaryType" attribute'); - } - this._binaryType = type; - } - } -}); - - -// Expose W3C readyState constants into the WebSocket instance as W3C states. -[['CONNECTING',CONNECTING], ['OPEN',OPEN], ['CLOSING',CLOSING], ['CLOSED',CLOSED]].forEach(function(property) { - Object.defineProperty(W3CWebSocket.prototype, property[0], { - get: function() { return property[1]; } - }); -}); - -// Also expose W3C readyState constants into the WebSocket class (not defined by the W3C, -// but there are so many libs relying on them). -[['CONNECTING',CONNECTING], ['OPEN',OPEN], ['CLOSING',CLOSING], ['CLOSED',CLOSED]].forEach(function(property) { - Object.defineProperty(W3CWebSocket, property[0], { - get: function() { return property[1]; } - }); -}); - - -W3CWebSocket.prototype.send = function(data) { - if (this._readyState !== OPEN) { - throw new Error('cannot call send() while not connected'); - } - - // Text. - if (typeof data === 'string' || data instanceof String) { - this._connection.sendUTF(data); - } - // Binary. - else { - // Node Buffer. - if (data instanceof Buffer) { - this._connection.sendBytes(data); - } - // If ArrayBuffer or ArrayBufferView convert it to Node Buffer. - else if (data.byteLength || data.byteLength === 0) { - data = toBuffer(data); - this._connection.sendBytes(data); - } - else { - throw new Error('unknown binary data:', data); - } - } -}; - - -W3CWebSocket.prototype.close = function(code, reason) { - switch(this._readyState) { - case CONNECTING: - // NOTE: We don't have the WebSocketConnection instance yet so no - // way to close the TCP connection. - // Artificially invoke the onConnectFailed event. - onConnectFailed.call(this); - // And close if it connects after a while. - this._client.on('connect', function(connection) { - if (code) { - connection.close(code, reason); - } else { - connection.close(); - } - }); - break; - case OPEN: - this._readyState = CLOSING; - if (code) { - this._connection.close(code, reason); - } else { - this._connection.close(); - } - break; - case CLOSING: - case CLOSED: - break; - } -}; - - -/** - * Private API. - */ - - -function createCloseEvent(code, reason) { - var event = new yaeti.Event('close'); - - event.code = code; - event.reason = reason; - event.wasClean = (typeof code === 'undefined' || code === 1000); - - return event; -} - - -function createMessageEvent(data) { - var event = new yaeti.Event('message'); - - event.data = data; - - return event; -} - - -function onConnect(connection) { - var self = this; - - this._readyState = OPEN; - this._connection = connection; - this._protocol = connection.protocol; - this._extensions = connection.extensions; - - this._connection.on('close', function(code, reason) { - onClose.call(self, code, reason); - }); - - this._connection.on('message', function(msg) { - onMessage.call(self, msg); - }); - - this.dispatchEvent(new yaeti.Event('open')); -} - - -function onConnectFailed() { - destroy.call(this); - this._readyState = CLOSED; - - try { - this.dispatchEvent(new yaeti.Event('error')); - } finally { - this.dispatchEvent(createCloseEvent(1006, 'connection failed')); - } -} - - -function onClose(code, reason) { - destroy.call(this); - this._readyState = CLOSED; - - this.dispatchEvent(createCloseEvent(code, reason || '')); -} - - -function onMessage(message) { - if (message.utf8Data) { - this.dispatchEvent(createMessageEvent(message.utf8Data)); - } - else if (message.binaryData) { - // Must convert from Node Buffer to ArrayBuffer. - // TODO: or to a Blob (which does not exist in Node!). - if (this.binaryType === 'arraybuffer') { - var buffer = message.binaryData; - var arraybuffer = new ArrayBuffer(buffer.length); - var view = new Uint8Array(arraybuffer); - for (var i=0, len=buffer.length; i', '@', - ',', ';', ':', '\\', '\"', - '/', '[', ']', '?', '=', - '{', '}', ' ', String.fromCharCode(9) -]; - -function WebSocketClient(config) { - // Superclass Constructor - EventEmitter.call(this); - - // TODO: Implement extensions - - this.config = { - // 1MiB max frame size. - maxReceivedFrameSize: 0x100000, - - // 8MiB max message size, only applicable if - // assembleFragments is true - maxReceivedMessageSize: 0x800000, - - // Outgoing messages larger than fragmentationThreshold will be - // split into multiple fragments. - fragmentOutgoingMessages: true, - - // Outgoing frames are fragmented if they exceed this threshold. - // Default is 16KiB - fragmentationThreshold: 0x4000, - - // Which version of the protocol to use for this session. This - // option will be removed once the protocol is finalized by the IETF - // It is only available to ease the transition through the - // intermediate draft protocol versions. - // At present, it only affects the name of the Origin header. - webSocketVersion: 13, - - // If true, fragmented messages will be automatically assembled - // and the full message will be emitted via a 'message' event. - // If false, each frame will be emitted via a 'frame' event and - // the application will be responsible for aggregating multiple - // fragmented frames. Single-frame messages will emit a 'message' - // event in addition to the 'frame' event. - // Most users will want to leave this set to 'true' - assembleFragments: true, - - // The Nagle Algorithm makes more efficient use of network resources - // by introducing a small delay before sending small packets so that - // multiple messages can be batched together before going onto the - // wire. This however comes at the cost of latency, so the default - // is to disable it. If you don't need low latency and are streaming - // lots of small messages, you can change this to 'false' - disableNagleAlgorithm: true, - - // The number of milliseconds to wait after sending a close frame - // for an acknowledgement to come back before giving up and just - // closing the socket. - closeTimeout: 5000, - - // Options to pass to https.connect if connecting via TLS - tlsOptions: {} - }; - - if (config) { - var tlsOptions; - if (config.tlsOptions) { - tlsOptions = config.tlsOptions; - delete config.tlsOptions; - } - else { - tlsOptions = {}; - } - extend(this.config, config); - extend(this.config.tlsOptions, tlsOptions); - } - - this._req = null; - - switch (this.config.webSocketVersion) { - case 8: - case 13: - break; - default: - throw new Error('Requested webSocketVersion is not supported. Allowed values are 8 and 13.'); - } -} - -util.inherits(WebSocketClient, EventEmitter); - -WebSocketClient.prototype.connect = function(requestUrl, protocols, origin, headers, extraRequestOptions) { - var self = this; - if (typeof(protocols) === 'string') { - if (protocols.length > 0) { - protocols = [protocols]; - } - else { - protocols = []; - } - } - if (!(protocols instanceof Array)) { - protocols = []; - } - this.protocols = protocols; - this.origin = origin; - - if (typeof(requestUrl) === 'string') { - this.url = url.parse(requestUrl); - } - else { - this.url = requestUrl; // in case an already parsed url is passed in. - } - if (!this.url.protocol) { - throw new Error('You must specify a full WebSocket URL, including protocol.'); - } - if (!this.url.host) { - throw new Error('You must specify a full WebSocket URL, including hostname. Relative URLs are not supported.'); - } - - this.secure = (this.url.protocol === 'wss:'); - - // validate protocol characters: - this.protocols.forEach(function(protocol) { - for (var i=0; i < protocol.length; i ++) { - var charCode = protocol.charCodeAt(i); - var character = protocol.charAt(i); - if (charCode < 0x0021 || charCode > 0x007E || protocolSeparators.indexOf(character) !== -1) { - throw new Error('Protocol list contains invalid character "' + String.fromCharCode(charCode) + '"'); - } - } - }); - - var defaultPorts = { - 'ws:': '80', - 'wss:': '443' - }; - - if (!this.url.port) { - this.url.port = defaultPorts[this.url.protocol]; - } - - var nonce = new Buffer(16); - for (var i=0; i < 16; i++) { - nonce[i] = Math.round(Math.random()*0xFF); - } - this.base64nonce = nonce.toString('base64'); - - var hostHeaderValue = this.url.hostname; - if ((this.url.protocol === 'ws:' && this.url.port !== '80') || - (this.url.protocol === 'wss:' && this.url.port !== '443')) { - hostHeaderValue += (':' + this.url.port); - } - - var reqHeaders = headers || {}; - extend(reqHeaders, { - 'Upgrade': 'websocket', - 'Connection': 'Upgrade', - 'Sec-WebSocket-Version': this.config.webSocketVersion.toString(10), - 'Sec-WebSocket-Key': this.base64nonce, - 'Host': hostHeaderValue - }); - - if (this.protocols.length > 0) { - reqHeaders['Sec-WebSocket-Protocol'] = this.protocols.join(', '); - } - if (this.origin) { - if (this.config.webSocketVersion === 13) { - reqHeaders['Origin'] = this.origin; - } - else if (this.config.webSocketVersion === 8) { - reqHeaders['Sec-WebSocket-Origin'] = this.origin; - } - } - - // TODO: Implement extensions - - var pathAndQuery; - // Ensure it begins with '/'. - if (this.url.pathname) { - pathAndQuery = this.url.path; - } - else if (this.url.path) { - pathAndQuery = '/' + this.url.path; - } - else { - pathAndQuery = '/'; - } - - function handleRequestError(error) { - self._req = null; - self.emit('connectFailed', error); - } - - var requestOptions = { - agent: false - }; - if (extraRequestOptions) { - extend(requestOptions, extraRequestOptions); - } - // These options are always overridden by the library. The user is not - // allowed to specify these directly. - extend(requestOptions, { - hostname: this.url.hostname, - port: this.url.port, - method: 'GET', - path: pathAndQuery, - headers: reqHeaders - }); - if (this.secure) { - for (var key in self.config.tlsOptions) { - if (self.config.tlsOptions.hasOwnProperty(key)) { - requestOptions[key] = self.config.tlsOptions[key]; - } - } - } - - var req = this._req = (this.secure ? https : http).request(requestOptions); - req.on('upgrade', function handleRequestUpgrade(response, socket, head) { - self._req = null; - req.removeListener('error', handleRequestError); - self.socket = socket; - self.response = response; - self.firstDataChunk = head; - self.validateHandshake(); - }); - req.on('error', handleRequestError); - - req.on('response', function(response) { - self._req = null; - if (utils.eventEmitterListenerCount(self, 'httpResponse') > 0) { - self.emit('httpResponse', response, self); - if (response.socket) { - response.socket.end(); - } - } - else { - var headerDumpParts = []; - for (var headerName in response.headers) { - headerDumpParts.push(headerName + ': ' + response.headers[headerName]); - } - self.failHandshake( - 'Server responded with a non-101 status: ' + - response.statusCode + - '\nResponse Headers Follow:\n' + - headerDumpParts.join('\n') + '\n' - ); - } - }); - req.end(); -}; - -WebSocketClient.prototype.validateHandshake = function() { - var headers = this.response.headers; - - if (this.protocols.length > 0) { - this.protocol = headers['sec-websocket-protocol']; - if (this.protocol) { - if (this.protocols.indexOf(this.protocol) === -1) { - this.failHandshake('Server did not respond with a requested protocol.'); - return; - } - } - else { - this.failHandshake('Expected a Sec-WebSocket-Protocol header.'); - return; - } - } - - if (!(headers['connection'] && headers['connection'].toLocaleLowerCase() === 'upgrade')) { - this.failHandshake('Expected a Connection: Upgrade header from the server'); - return; - } - - if (!(headers['upgrade'] && headers['upgrade'].toLocaleLowerCase() === 'websocket')) { - this.failHandshake('Expected an Upgrade: websocket header from the server'); - return; - } - - var sha1 = crypto.createHash('sha1'); - sha1.update(this.base64nonce + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'); - var expectedKey = sha1.digest('base64'); - - if (!headers['sec-websocket-accept']) { - this.failHandshake('Expected Sec-WebSocket-Accept header from server'); - return; - } - - if (headers['sec-websocket-accept'] !== expectedKey) { - this.failHandshake('Sec-WebSocket-Accept header from server didn\'t match expected value of ' + expectedKey); - return; - } - - // TODO: Support extensions - - this.succeedHandshake(); -}; - -WebSocketClient.prototype.failHandshake = function(errorDescription) { - if (this.socket && this.socket.writable) { - this.socket.end(); - } - this.emit('connectFailed', new Error(errorDescription)); -}; - -WebSocketClient.prototype.succeedHandshake = function() { - var connection = new WebSocketConnection(this.socket, [], this.protocol, true, this.config); - - connection.webSocketVersion = this.config.webSocketVersion; - connection._addSocketEventListeners(); - - this.emit('connect', connection); - if (this.firstDataChunk.length > 0) { - connection.handleSocketData(this.firstDataChunk); - } - this.firstDataChunk = null; -}; - -WebSocketClient.prototype.abort = function() { - if (this._req) { - this._req.abort(); - } -}; - -module.exports = WebSocketClient; diff --git a/deploy/node_modules/websocket/lib/WebSocketConnection.js b/deploy/node_modules/websocket/lib/WebSocketConnection.js deleted file mode 100644 index c8b1001..0000000 --- a/deploy/node_modules/websocket/lib/WebSocketConnection.js +++ /dev/null @@ -1,889 +0,0 @@ -/************************************************************************ - * Copyright 2010-2015 Brian McKelvey. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ***********************************************************************/ - -var util = require('util'); -var utils = require('./utils'); -var EventEmitter = require('events').EventEmitter; -var WebSocketFrame = require('./WebSocketFrame'); -var BufferList = require('../vendor/FastBufferList'); -var Validation = require('./Validation').Validation; - -// Connected, fully-open, ready to send and receive frames -const STATE_OPEN = 'open'; -// Received a close frame from the remote peer -const STATE_PEER_REQUESTED_CLOSE = 'peer_requested_close'; -// Sent close frame to remote peer. No further data can be sent. -const STATE_ENDING = 'ending'; -// Connection is fully closed. No further data can be sent or received. -const STATE_CLOSED = 'closed'; - -var setImmediateImpl = ('setImmediate' in global) ? - global.setImmediate.bind(global) : - process.nextTick.bind(process); - -var idCounter = 0; - -function WebSocketConnection(socket, extensions, protocol, maskOutgoingPackets, config) { - this._debug = utils.BufferingLogger('websocket:connection', ++idCounter); - this._debug('constructor'); - - if (this._debug.enabled) { - instrumentSocketForDebugging(this, socket); - } - - // Superclass Constructor - EventEmitter.call(this); - - this._pingListenerCount = 0; - this.on('newListener', function(ev) { - if (ev === 'ping'){ - this._pingListenerCount++; - } - }).on('removeListener', function(ev) { - if (ev === 'ping') { - this._pingListenerCount--; - } - }); - - this.config = config; - this.socket = socket; - this.protocol = protocol; - this.extensions = extensions; - this.remoteAddress = socket.remoteAddress; - this.closeReasonCode = -1; - this.closeDescription = null; - this.closeEventEmitted = false; - - // We have to mask outgoing packets if we're acting as a WebSocket client. - this.maskOutgoingPackets = maskOutgoingPackets; - - // We re-use the same buffers for the mask and frame header for all frames - // received on each connection to avoid a small memory allocation for each - // frame. - this.maskBytes = new Buffer(4); - this.frameHeader = new Buffer(10); - - // the BufferList will handle the data streaming in - this.bufferList = new BufferList(); - - // Prepare for receiving first frame - this.currentFrame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); - this.fragmentationSize = 0; // data received so far... - this.frameQueue = []; - - // Various bits of connection state - this.connected = true; - this.state = STATE_OPEN; - this.waitingForCloseResponse = false; - // Received TCP FIN, socket's readable stream is finished. - this.receivedEnd = false; - - this.closeTimeout = this.config.closeTimeout; - this.assembleFragments = this.config.assembleFragments; - this.maxReceivedMessageSize = this.config.maxReceivedMessageSize; - - this.outputBufferFull = false; - this.inputPaused = false; - this.receivedDataHandler = this.processReceivedData.bind(this); - this._closeTimerHandler = this.handleCloseTimer.bind(this); - - // Disable nagle algorithm? - this.socket.setNoDelay(this.config.disableNagleAlgorithm); - - // Make sure there is no socket inactivity timeout - this.socket.setTimeout(0); - - if (this.config.keepalive && !this.config.useNativeKeepalive) { - if (typeof(this.config.keepaliveInterval) !== 'number') { - throw new Error('keepaliveInterval must be specified and numeric ' + - 'if keepalive is true.'); - } - this._keepaliveTimerHandler = this.handleKeepaliveTimer.bind(this); - this.setKeepaliveTimer(); - - if (this.config.dropConnectionOnKeepaliveTimeout) { - if (typeof(this.config.keepaliveGracePeriod) !== 'number') { - throw new Error('keepaliveGracePeriod must be specified and ' + - 'numeric if dropConnectionOnKeepaliveTimeout ' + - 'is true.'); - } - this._gracePeriodTimerHandler = this.handleGracePeriodTimer.bind(this); - } - } - else if (this.config.keepalive && this.config.useNativeKeepalive) { - if (!('setKeepAlive' in this.socket)) { - throw new Error('Unable to use native keepalive: unsupported by ' + - 'this version of Node.'); - } - this.socket.setKeepAlive(true, this.config.keepaliveInterval); - } - - // The HTTP Client seems to subscribe to socket error events - // and re-dispatch them in such a way that doesn't make sense - // for users of our client, so we want to make sure nobody - // else is listening for error events on the socket besides us. - this.socket.removeAllListeners('error'); -} - -WebSocketConnection.CLOSE_REASON_NORMAL = 1000; -WebSocketConnection.CLOSE_REASON_GOING_AWAY = 1001; -WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR = 1002; -WebSocketConnection.CLOSE_REASON_UNPROCESSABLE_INPUT = 1003; -WebSocketConnection.CLOSE_REASON_RESERVED = 1004; // Reserved value. Undefined meaning. -WebSocketConnection.CLOSE_REASON_NOT_PROVIDED = 1005; // Not to be used on the wire -WebSocketConnection.CLOSE_REASON_ABNORMAL = 1006; // Not to be used on the wire -WebSocketConnection.CLOSE_REASON_INVALID_DATA = 1007; -WebSocketConnection.CLOSE_REASON_POLICY_VIOLATION = 1008; -WebSocketConnection.CLOSE_REASON_MESSAGE_TOO_BIG = 1009; -WebSocketConnection.CLOSE_REASON_EXTENSION_REQUIRED = 1010; -WebSocketConnection.CLOSE_REASON_INTERNAL_SERVER_ERROR = 1011; -WebSocketConnection.CLOSE_REASON_TLS_HANDSHAKE_FAILED = 1015; // Not to be used on the wire - -WebSocketConnection.CLOSE_DESCRIPTIONS = { - 1000: 'Normal connection closure', - 1001: 'Remote peer is going away', - 1002: 'Protocol error', - 1003: 'Unprocessable input', - 1004: 'Reserved', - 1005: 'Reason not provided', - 1006: 'Abnormal closure, no further detail available', - 1007: 'Invalid data received', - 1008: 'Policy violation', - 1009: 'Message too big', - 1010: 'Extension requested by client is required', - 1011: 'Internal Server Error', - 1015: 'TLS Handshake Failed' -}; - -function validateCloseReason(code) { - if (code < 1000) { - // Status codes in the range 0-999 are not used - return false; - } - if (code >= 1000 && code <= 2999) { - // Codes from 1000 - 2999 are reserved for use by the protocol. Only - // a few codes are defined, all others are currently illegal. - return [1000, 1001, 1002, 1003, 1007, 1008, 1009, 1010, 1011].indexOf(code) !== -1; - } - if (code >= 3000 && code <= 3999) { - // Reserved for use by libraries, frameworks, and applications. - // Should be registered with IANA. Interpretation of these codes is - // undefined by the WebSocket protocol. - return true; - } - if (code >= 4000 && code <= 4999) { - // Reserved for private use. Interpretation of these codes is - // undefined by the WebSocket protocol. - return true; - } - if (code >= 5000) { - return false; - } -} - -util.inherits(WebSocketConnection, EventEmitter); - -WebSocketConnection.prototype._addSocketEventListeners = function() { - this.socket.on('error', this.handleSocketError.bind(this)); - this.socket.on('end', this.handleSocketEnd.bind(this)); - this.socket.on('close', this.handleSocketClose.bind(this)); - this.socket.on('drain', this.handleSocketDrain.bind(this)); - this.socket.on('pause', this.handleSocketPause.bind(this)); - this.socket.on('resume', this.handleSocketResume.bind(this)); - this.socket.on('data', this.handleSocketData.bind(this)); -}; - -// set or reset the keepalive timer when data is received. -WebSocketConnection.prototype.setKeepaliveTimer = function() { - this._debug('setKeepaliveTimer'); - if (!this.config.keepalive || this.config.useNativeKeepalive) { return; } - this.clearKeepaliveTimer(); - this.clearGracePeriodTimer(); - this._keepaliveTimeoutID = setTimeout(this._keepaliveTimerHandler, this.config.keepaliveInterval); -}; - -WebSocketConnection.prototype.clearKeepaliveTimer = function() { - if (this._keepaliveTimeoutID) { - clearTimeout(this._keepaliveTimeoutID); - } -}; - -// No data has been received within config.keepaliveTimeout ms. -WebSocketConnection.prototype.handleKeepaliveTimer = function() { - this._debug('handleKeepaliveTimer'); - this._keepaliveTimeoutID = null; - this.ping(); - - // If we are configured to drop connections if the client doesn't respond - // then set the grace period timer. - if (this.config.dropConnectionOnKeepaliveTimeout) { - this.setGracePeriodTimer(); - } - else { - // Otherwise reset the keepalive timer to send the next ping. - this.setKeepaliveTimer(); - } -}; - -WebSocketConnection.prototype.setGracePeriodTimer = function() { - this._debug('setGracePeriodTimer'); - this.clearGracePeriodTimer(); - this._gracePeriodTimeoutID = setTimeout(this._gracePeriodTimerHandler, this.config.keepaliveGracePeriod); -}; - -WebSocketConnection.prototype.clearGracePeriodTimer = function() { - if (this._gracePeriodTimeoutID) { - clearTimeout(this._gracePeriodTimeoutID); - } -}; - -WebSocketConnection.prototype.handleGracePeriodTimer = function() { - this._debug('handleGracePeriodTimer'); - // If this is called, the client has not responded and is assumed dead. - this._gracePeriodTimeoutID = null; - this.drop(WebSocketConnection.CLOSE_REASON_ABNORMAL, 'Peer not responding.', true); -}; - -WebSocketConnection.prototype.handleSocketData = function(data) { - this._debug('handleSocketData'); - // Reset the keepalive timer when receiving data of any kind. - this.setKeepaliveTimer(); - - // Add received data to our bufferList, which efficiently holds received - // data chunks in a linked list of Buffer objects. - this.bufferList.write(data); - - this.processReceivedData(); -}; - -WebSocketConnection.prototype.processReceivedData = function() { - this._debug('processReceivedData'); - // If we're not connected, we should ignore any data remaining on the buffer. - if (!this.connected) { return; } - - // Receiving/parsing is expected to be halted when paused. - if (this.inputPaused) { return; } - - var frame = this.currentFrame; - - // WebSocketFrame.prototype.addData returns true if all data necessary to - // parse the frame was available. It returns false if we are waiting for - // more data to come in on the wire. - if (!frame.addData(this.bufferList)) { this._debug('-- insufficient data for frame'); return; } - - var self = this; - - // Handle possible parsing errors - if (frame.protocolError) { - // Something bad happened.. get rid of this client. - this._debug('-- protocol error'); - process.nextTick(function() { - self.drop(WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR, frame.dropReason); - }); - return; - } - else if (frame.frameTooLarge) { - this._debug('-- frame too large'); - process.nextTick(function() { - self.drop(WebSocketConnection.CLOSE_REASON_MESSAGE_TOO_BIG, frame.dropReason); - }); - return; - } - - // For now since we don't support extensions, all RSV bits are illegal - if (frame.rsv1 || frame.rsv2 || frame.rsv3) { - this._debug('-- illegal rsv flag'); - process.nextTick(function() { - self.drop(WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR, - 'Unsupported usage of rsv bits without negotiated extension.'); - }); - return; - } - - if (!this.assembleFragments) { - this._debug('-- emitting frame'); - process.nextTick(function() { self.emit('frame', frame); }); - } - - process.nextTick(function() { self.processFrame(frame); }); - - this.currentFrame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); - - // If there's data remaining, schedule additional processing, but yield - // for now so that other connections have a chance to have their data - // processed. We use setImmediate here instead of process.nextTick to - // explicitly indicate that we wish for other I/O to be handled first. - if (this.bufferList.length > 0) { - setImmediateImpl(this.receivedDataHandler); - } -}; - -WebSocketConnection.prototype.handleSocketError = function(error) { - this._debug('handleSocketError: %j', error); - this.closeReasonCode = WebSocketConnection.CLOSE_REASON_ABNORMAL; - this.closeDescription = 'Socket Error: ' + error.syscall + ' ' + error.code; - this.connected = false; - this.state = STATE_CLOSED; - this.fragmentationSize = 0; - if (utils.eventEmitterListenerCount(this, 'error') > 0) { - this.emit('error', error); - } - this.socket.destroy(error); - this._debug.printOutput(); -}; - -WebSocketConnection.prototype.handleSocketEnd = function() { - this._debug('handleSocketEnd: received socket end. state = %s', this.state); - this.receivedEnd = true; - if (this.state === STATE_CLOSED) { - // When using the TLS module, sometimes the socket will emit 'end' - // after it emits 'close'. I don't think that's correct behavior, - // but we should deal with it gracefully by ignoring it. - this._debug(' --- Socket \'end\' after \'close\''); - return; - } - if (this.state !== STATE_PEER_REQUESTED_CLOSE && - this.state !== STATE_ENDING) { - this._debug(' --- UNEXPECTED socket end.'); - this.socket.end(); - } -}; - -WebSocketConnection.prototype.handleSocketClose = function(hadError) { - this._debug('handleSocketClose: received socket close'); - this.socketHadError = hadError; - this.connected = false; - this.state = STATE_CLOSED; - // If closeReasonCode is still set to -1 at this point then we must - // not have received a close frame!! - if (this.closeReasonCode === -1) { - this.closeReasonCode = WebSocketConnection.CLOSE_REASON_ABNORMAL; - this.closeDescription = 'Connection dropped by remote peer.'; - } - this.clearCloseTimer(); - this.clearKeepaliveTimer(); - this.clearGracePeriodTimer(); - if (!this.closeEventEmitted) { - this.closeEventEmitted = true; - this._debug('-- Emitting WebSocketConnection close event'); - this.emit('close', this.closeReasonCode, this.closeDescription); - } -}; - -WebSocketConnection.prototype.handleSocketDrain = function() { - this._debug('handleSocketDrain: socket drain event'); - this.outputBufferFull = false; - this.emit('drain'); -}; - -WebSocketConnection.prototype.handleSocketPause = function() { - this._debug('handleSocketPause: socket pause event'); - this.inputPaused = true; - this.emit('pause'); -}; - -WebSocketConnection.prototype.handleSocketResume = function() { - this._debug('handleSocketResume: socket resume event'); - this.inputPaused = false; - this.emit('resume'); - this.processReceivedData(); -}; - -WebSocketConnection.prototype.pause = function() { - this._debug('pause: pause requested'); - this.socket.pause(); -}; - -WebSocketConnection.prototype.resume = function() { - this._debug('resume: resume requested'); - this.socket.resume(); -}; - -WebSocketConnection.prototype.close = function(reasonCode, description) { - if (this.connected) { - this._debug('close: Initating clean WebSocket close sequence.'); - if ('number' !== typeof reasonCode) { - reasonCode = WebSocketConnection.CLOSE_REASON_NORMAL; - } - if (!validateCloseReason(reasonCode)) { - throw new Error('Close code ' + reasonCode + ' is not valid.'); - } - if ('string' !== typeof description) { - description = WebSocketConnection.CLOSE_DESCRIPTIONS[reasonCode]; - } - this.closeReasonCode = reasonCode; - this.closeDescription = description; - this.setCloseTimer(); - this.sendCloseFrame(this.closeReasonCode, this.closeDescription); - this.state = STATE_ENDING; - this.connected = false; - } -}; - -WebSocketConnection.prototype.drop = function(reasonCode, description, skipCloseFrame) { - this._debug('drop'); - if (typeof(reasonCode) !== 'number') { - reasonCode = WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR; - } - - if (typeof(description) !== 'string') { - // If no description is provided, try to look one up based on the - // specified reasonCode. - description = WebSocketConnection.CLOSE_DESCRIPTIONS[reasonCode]; - } - - this._debug('Forcefully dropping connection. skipCloseFrame: %s, code: %d, description: %s', - skipCloseFrame, reasonCode, description - ); - - this.closeReasonCode = reasonCode; - this.closeDescription = description; - this.frameQueue = []; - this.fragmentationSize = 0; - if (!skipCloseFrame) { - this.sendCloseFrame(reasonCode, description); - } - this.connected = false; - this.state = STATE_CLOSED; - this.clearCloseTimer(); - this.clearKeepaliveTimer(); - this.clearGracePeriodTimer(); - - if (!this.closeEventEmitted) { - this.closeEventEmitted = true; - this._debug('Emitting WebSocketConnection close event'); - this.emit('close', this.closeReasonCode, this.closeDescription); - } - - this._debug('Drop: destroying socket'); - this.socket.destroy(); -}; - -WebSocketConnection.prototype.setCloseTimer = function() { - this._debug('setCloseTimer'); - this.clearCloseTimer(); - this._debug('Setting close timer'); - this.waitingForCloseResponse = true; - this.closeTimer = setTimeout(this._closeTimerHandler, this.closeTimeout); -}; - -WebSocketConnection.prototype.clearCloseTimer = function() { - this._debug('clearCloseTimer'); - if (this.closeTimer) { - this._debug('Clearing close timer'); - clearTimeout(this.closeTimer); - this.waitingForCloseResponse = false; - this.closeTimer = null; - } -}; - -WebSocketConnection.prototype.handleCloseTimer = function() { - this._debug('handleCloseTimer'); - this.closeTimer = null; - if (this.waitingForCloseResponse) { - this._debug('Close response not received from client. Forcing socket end.'); - this.waitingForCloseResponse = false; - this.state = STATE_CLOSED; - this.socket.end(); - } -}; - -WebSocketConnection.prototype.processFrame = function(frame) { - this._debug('processFrame'); - this._debug(' -- frame: %s', frame); - - // Any non-control opcode besides 0x00 (continuation) received in the - // middle of a fragmented message is illegal. - if (this.frameQueue.length !== 0 && (frame.opcode > 0x00 && frame.opcode < 0x08)) { - this.drop(WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR, - 'Illegal frame opcode 0x' + frame.opcode.toString(16) + ' ' + - 'received in middle of fragmented message.'); - return; - } - - switch(frame.opcode) { - case 0x02: // WebSocketFrame.BINARY_FRAME - this._debug('-- Binary Frame'); - if (this.assembleFragments) { - if (frame.fin) { - // Complete single-frame message received - this._debug('---- Emitting \'message\' event'); - this.emit('message', { - type: 'binary', - binaryData: frame.binaryPayload - }); - } - else { - // beginning of a fragmented message - this.frameQueue.push(frame); - this.fragmentationSize = frame.length; - } - } - break; - case 0x01: // WebSocketFrame.TEXT_FRAME - this._debug('-- Text Frame'); - if (this.assembleFragments) { - if (frame.fin) { - if (!Validation.isValidUTF8(frame.binaryPayload)) { - this.drop(WebSocketConnection.CLOSE_REASON_INVALID_DATA, - 'Invalid UTF-8 Data Received'); - return; - } - // Complete single-frame message received - this._debug('---- Emitting \'message\' event'); - this.emit('message', { - type: 'utf8', - utf8Data: frame.binaryPayload.toString('utf8') - }); - } - else { - // beginning of a fragmented message - this.frameQueue.push(frame); - this.fragmentationSize = frame.length; - } - } - break; - case 0x00: // WebSocketFrame.CONTINUATION - this._debug('-- Continuation Frame'); - if (this.assembleFragments) { - if (this.frameQueue.length === 0) { - this.drop(WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR, - 'Unexpected Continuation Frame'); - return; - } - - this.fragmentationSize += frame.length; - - if (this.fragmentationSize > this.maxReceivedMessageSize) { - this.drop(WebSocketConnection.CLOSE_REASON_MESSAGE_TOO_BIG, - 'Maximum message size exceeded.'); - return; - } - - this.frameQueue.push(frame); - - if (frame.fin) { - // end of fragmented message, so we process the whole - // message now. We also have to decode the utf-8 data - // for text frames after combining all the fragments. - var bytesCopied = 0; - var binaryPayload = new Buffer(this.fragmentationSize); - var opcode = this.frameQueue[0].opcode; - this.frameQueue.forEach(function (currentFrame) { - currentFrame.binaryPayload.copy(binaryPayload, bytesCopied); - bytesCopied += currentFrame.binaryPayload.length; - }); - this.frameQueue = []; - this.fragmentationSize = 0; - - switch (opcode) { - case 0x02: // WebSocketOpcode.BINARY_FRAME - this.emit('message', { - type: 'binary', - binaryData: binaryPayload - }); - break; - case 0x01: // WebSocketOpcode.TEXT_FRAME - if (!Validation.isValidUTF8(binaryPayload)) { - this.drop(WebSocketConnection.CLOSE_REASON_INVALID_DATA, - 'Invalid UTF-8 Data Received'); - return; - } - this.emit('message', { - type: 'utf8', - utf8Data: binaryPayload.toString('utf8') - }); - break; - default: - this.drop(WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR, - 'Unexpected first opcode in fragmentation sequence: 0x' + opcode.toString(16)); - return; - } - } - } - break; - case 0x09: // WebSocketFrame.PING - this._debug('-- Ping Frame'); - - if (this._pingListenerCount > 0) { - // logic to emit the ping frame: this is only done when a listener is known to exist - // Expose a function allowing the user to override the default ping() behavior - var cancelled = false; - var cancel = function() { - cancelled = true; - }; - this.emit('ping', cancel, frame.binaryPayload); - - // Only send a pong if the client did not indicate that he would like to cancel - if (!cancelled) { - this.pong(frame.binaryPayload); - } - } - else { - this.pong(frame.binaryPayload); - } - - break; - case 0x0A: // WebSocketFrame.PONG - this._debug('-- Pong Frame'); - this.emit('pong', frame.binaryPayload); - break; - case 0x08: // WebSocketFrame.CONNECTION_CLOSE - this._debug('-- Close Frame'); - if (this.waitingForCloseResponse) { - // Got response to our request to close the connection. - // Close is complete, so we just hang up. - this._debug('---- Got close response from peer. Completing closing handshake.'); - this.clearCloseTimer(); - this.waitingForCloseResponse = false; - this.state = STATE_CLOSED; - this.socket.end(); - return; - } - - this._debug('---- Closing handshake initiated by peer.'); - // Got request from other party to close connection. - // Send back acknowledgement and then hang up. - this.state = STATE_PEER_REQUESTED_CLOSE; - var respondCloseReasonCode; - - // Make sure the close reason provided is legal according to - // the protocol spec. Providing no close status is legal. - // WebSocketFrame sets closeStatus to -1 by default, so if it - // is still -1, then no status was provided. - if (frame.invalidCloseFrameLength) { - this.closeReasonCode = 1005; // 1005 = No reason provided. - respondCloseReasonCode = WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR; - } - else if (frame.closeStatus === -1 || validateCloseReason(frame.closeStatus)) { - this.closeReasonCode = frame.closeStatus; - respondCloseReasonCode = WebSocketConnection.CLOSE_REASON_NORMAL; - } - else { - this.closeReasonCode = frame.closeStatus; - respondCloseReasonCode = WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR; - } - - // If there is a textual description in the close frame, extract it. - if (frame.binaryPayload.length > 1) { - if (!Validation.isValidUTF8(frame.binaryPayload)) { - this.drop(WebSocketConnection.CLOSE_REASON_INVALID_DATA, - 'Invalid UTF-8 Data Received'); - return; - } - this.closeDescription = frame.binaryPayload.toString('utf8'); - } - else { - this.closeDescription = WebSocketConnection.CLOSE_DESCRIPTIONS[this.closeReasonCode]; - } - this._debug( - '------ Remote peer %s - code: %d - %s - close frame payload length: %d', - this.remoteAddress, this.closeReasonCode, - this.closeDescription, frame.length - ); - this._debug('------ responding to remote peer\'s close request.'); - this.sendCloseFrame(respondCloseReasonCode, null); - this.connected = false; - break; - default: - this._debug('-- Unrecognized Opcode %d', frame.opcode); - this.drop(WebSocketConnection.CLOSE_REASON_PROTOCOL_ERROR, - 'Unrecognized Opcode: 0x' + frame.opcode.toString(16)); - break; - } -}; - -WebSocketConnection.prototype.send = function(data, cb) { - this._debug('send'); - if (Buffer.isBuffer(data)) { - this.sendBytes(data, cb); - } - else if (typeof(data['toString']) === 'function') { - this.sendUTF(data, cb); - } - else { - throw new Error('Data provided must either be a Node Buffer or implement toString()'); - } -}; - -WebSocketConnection.prototype.sendUTF = function(data, cb) { - data = new Buffer(data.toString(), 'utf8'); - this._debug('sendUTF: %d bytes', data.length); - var frame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); - frame.opcode = 0x01; // WebSocketOpcode.TEXT_FRAME - frame.binaryPayload = data; - this.fragmentAndSend(frame, cb); -}; - -WebSocketConnection.prototype.sendBytes = function(data, cb) { - this._debug('sendBytes'); - if (!Buffer.isBuffer(data)) { - throw new Error('You must pass a Node Buffer object to WebSocketConnection.prototype.sendBytes()'); - } - var frame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); - frame.opcode = 0x02; // WebSocketOpcode.BINARY_FRAME - frame.binaryPayload = data; - this.fragmentAndSend(frame, cb); -}; - -WebSocketConnection.prototype.ping = function(data) { - this._debug('ping'); - var frame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); - frame.opcode = 0x09; // WebSocketOpcode.PING - frame.fin = true; - if (data) { - if (!Buffer.isBuffer(data)) { - data = new Buffer(data.toString(), 'utf8'); - } - if (data.length > 125) { - this._debug('WebSocket: Data for ping is longer than 125 bytes. Truncating.'); - data = data.slice(0,124); - } - frame.binaryPayload = data; - } - this.sendFrame(frame); -}; - -// Pong frames have to echo back the contents of the data portion of the -// ping frame exactly, byte for byte. -WebSocketConnection.prototype.pong = function(binaryPayload) { - this._debug('pong'); - var frame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); - frame.opcode = 0x0A; // WebSocketOpcode.PONG - if (Buffer.isBuffer(binaryPayload) && binaryPayload.length > 125) { - this._debug('WebSocket: Data for pong is longer than 125 bytes. Truncating.'); - binaryPayload = binaryPayload.slice(0,124); - } - frame.binaryPayload = binaryPayload; - frame.fin = true; - this.sendFrame(frame); -}; - -WebSocketConnection.prototype.fragmentAndSend = function(frame, cb) { - this._debug('fragmentAndSend'); - if (frame.opcode > 0x07) { - throw new Error('You cannot fragment control frames.'); - } - - var threshold = this.config.fragmentationThreshold; - var length = frame.binaryPayload.length; - - // Send immediately if fragmentation is disabled or the message is not - // larger than the fragmentation threshold. - if (!this.config.fragmentOutgoingMessages || (frame.binaryPayload && length <= threshold)) { - frame.fin = true; - this.sendFrame(frame, cb); - return; - } - - var numFragments = Math.ceil(length / threshold); - var sentFragments = 0; - var sentCallback = function fragmentSentCallback(err) { - if (err) { - if (typeof cb === 'function') { - // pass only the first error - cb(err); - cb = null; - } - return; - } - ++sentFragments; - if ((sentFragments === numFragments) && (typeof cb === 'function')) { - cb(); - } - }; - for (var i=1; i <= numFragments; i++) { - var currentFrame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); - - // continuation opcode except for first frame. - currentFrame.opcode = (i === 1) ? frame.opcode : 0x00; - - // fin set on last frame only - currentFrame.fin = (i === numFragments); - - // length is likely to be shorter on the last fragment - var currentLength = (i === numFragments) ? length - (threshold * (i-1)) : threshold; - var sliceStart = threshold * (i-1); - - // Slice the right portion of the original payload - currentFrame.binaryPayload = frame.binaryPayload.slice(sliceStart, sliceStart + currentLength); - - this.sendFrame(currentFrame, sentCallback); - } -}; - -WebSocketConnection.prototype.sendCloseFrame = function(reasonCode, description, cb) { - if (typeof(reasonCode) !== 'number') { - reasonCode = WebSocketConnection.CLOSE_REASON_NORMAL; - } - - this._debug('sendCloseFrame state: %s, reasonCode: %d, description: %s', this.state, reasonCode, description); - - if (this.state !== STATE_OPEN && this.state !== STATE_PEER_REQUESTED_CLOSE) { return; } - - var frame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); - frame.fin = true; - frame.opcode = 0x08; // WebSocketOpcode.CONNECTION_CLOSE - frame.closeStatus = reasonCode; - if (typeof(description) === 'string') { - frame.binaryPayload = new Buffer(description, 'utf8'); - } - - this.sendFrame(frame, cb); - this.socket.end(); -}; - -WebSocketConnection.prototype.sendFrame = function(frame, cb) { - this._debug('sendFrame'); - frame.mask = this.maskOutgoingPackets; - var flushed = this.socket.write(frame.toBuffer(), cb); - this.outputBufferFull = !flushed; - return flushed; -}; - -module.exports = WebSocketConnection; - - - -function instrumentSocketForDebugging(connection, socket) { - /* jshint loopfunc: true */ - if (!connection._debug.enabled) { return; } - - var originalSocketEmit = socket.emit; - socket.emit = function(event) { - connection._debug('||| Socket Event \'%s\'', event); - originalSocketEmit.apply(this, arguments); - }; - - for (var key in socket) { - if ('function' !== typeof(socket[key])) { continue; } - if (['emit'].indexOf(key) !== -1) { continue; } - (function(key) { - var original = socket[key]; - if (key === 'on') { - socket[key] = function proxyMethod__EventEmitter__On() { - connection._debug('||| Socket method called: %s (%s)', key, arguments[0]); - return original.apply(this, arguments); - }; - return; - } - socket[key] = function proxyMethod() { - connection._debug('||| Socket method called: %s', key); - return original.apply(this, arguments); - }; - })(key); - } -} diff --git a/deploy/node_modules/websocket/lib/WebSocketFrame.js b/deploy/node_modules/websocket/lib/WebSocketFrame.js deleted file mode 100644 index 859e879..0000000 --- a/deploy/node_modules/websocket/lib/WebSocketFrame.js +++ /dev/null @@ -1,279 +0,0 @@ -/************************************************************************ - * Copyright 2010-2015 Brian McKelvey. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ***********************************************************************/ - -var bufferUtil = require('./BufferUtil').BufferUtil; - -const DECODE_HEADER = 1; -const WAITING_FOR_16_BIT_LENGTH = 2; -const WAITING_FOR_64_BIT_LENGTH = 3; -const WAITING_FOR_MASK_KEY = 4; -const WAITING_FOR_PAYLOAD = 5; -const COMPLETE = 6; - -// WebSocketConnection will pass shared buffer objects for maskBytes and -// frameHeader into the constructor to avoid tons of small memory allocations -// for each frame we have to parse. This is only used for parsing frames -// we receive off the wire. -function WebSocketFrame(maskBytes, frameHeader, config) { - this.maskBytes = maskBytes; - this.frameHeader = frameHeader; - this.config = config; - this.maxReceivedFrameSize = config.maxReceivedFrameSize; - this.protocolError = false; - this.frameTooLarge = false; - this.invalidCloseFrameLength = false; - this.parseState = DECODE_HEADER; - this.closeStatus = -1; -} - -WebSocketFrame.prototype.addData = function(bufferList) { - if (this.parseState === DECODE_HEADER) { - if (bufferList.length >= 2) { - bufferList.joinInto(this.frameHeader, 0, 0, 2); - bufferList.advance(2); - var firstByte = this.frameHeader[0]; - var secondByte = this.frameHeader[1]; - - this.fin = Boolean(firstByte & 0x80); - this.rsv1 = Boolean(firstByte & 0x40); - this.rsv2 = Boolean(firstByte & 0x20); - this.rsv3 = Boolean(firstByte & 0x10); - this.mask = Boolean(secondByte & 0x80); - - this.opcode = firstByte & 0x0F; - this.length = secondByte & 0x7F; - - // Control frame sanity check - if (this.opcode >= 0x08) { - if (this.length > 125) { - this.protocolError = true; - this.dropReason = 'Illegal control frame longer than 125 bytes.'; - return true; - } - if (!this.fin) { - this.protocolError = true; - this.dropReason = 'Control frames must not be fragmented.'; - return true; - } - } - - if (this.length === 126) { - this.parseState = WAITING_FOR_16_BIT_LENGTH; - } - else if (this.length === 127) { - this.parseState = WAITING_FOR_64_BIT_LENGTH; - } - else { - this.parseState = WAITING_FOR_MASK_KEY; - } - } - } - if (this.parseState === WAITING_FOR_16_BIT_LENGTH) { - if (bufferList.length >= 2) { - bufferList.joinInto(this.frameHeader, 2, 0, 2); - bufferList.advance(2); - this.length = this.frameHeader.readUInt16BE(2, true); - this.parseState = WAITING_FOR_MASK_KEY; - } - } - else if (this.parseState === WAITING_FOR_64_BIT_LENGTH) { - if (bufferList.length >= 8) { - bufferList.joinInto(this.frameHeader, 2, 0, 8); - bufferList.advance(8); - var lengthPair = [ - this.frameHeader.readUInt32BE(2, true), - this.frameHeader.readUInt32BE(2+4, true) - ]; - - if (lengthPair[0] !== 0) { - this.protocolError = true; - this.dropReason = 'Unsupported 64-bit length frame received'; - return true; - } - this.length = lengthPair[1]; - this.parseState = WAITING_FOR_MASK_KEY; - } - } - - if (this.parseState === WAITING_FOR_MASK_KEY) { - if (this.mask) { - if (bufferList.length >= 4) { - bufferList.joinInto(this.maskBytes, 0, 0, 4); - bufferList.advance(4); - this.parseState = WAITING_FOR_PAYLOAD; - } - } - else { - this.parseState = WAITING_FOR_PAYLOAD; - } - } - - if (this.parseState === WAITING_FOR_PAYLOAD) { - if (this.length > this.maxReceivedFrameSize) { - this.frameTooLarge = true; - this.dropReason = 'Frame size of ' + this.length.toString(10) + - ' bytes exceeds maximum accepted frame size'; - return true; - } - - if (this.length === 0) { - this.binaryPayload = new Buffer(0); - this.parseState = COMPLETE; - return true; - } - if (bufferList.length >= this.length) { - this.binaryPayload = bufferList.take(this.length); - bufferList.advance(this.length); - if (this.mask) { - bufferUtil.unmask(this.binaryPayload, this.maskBytes); - // xor(this.binaryPayload, this.maskBytes, 0); - } - - if (this.opcode === 0x08) { // WebSocketOpcode.CONNECTION_CLOSE - if (this.length === 1) { - // Invalid length for a close frame. Must be zero or at least two. - this.binaryPayload = new Buffer(0); - this.invalidCloseFrameLength = true; - } - if (this.length >= 2) { - this.closeStatus = this.binaryPayload.readUInt16BE(0, true); - this.binaryPayload = this.binaryPayload.slice(2); - } - } - - this.parseState = COMPLETE; - return true; - } - } - return false; -}; - -WebSocketFrame.prototype.throwAwayPayload = function(bufferList) { - if (bufferList.length >= this.length) { - bufferList.advance(this.length); - this.parseState = COMPLETE; - return true; - } - return false; -}; - -WebSocketFrame.prototype.toBuffer = function(nullMask) { - var maskKey; - var headerLength = 2; - var data; - var outputPos; - var firstByte = 0x00; - var secondByte = 0x00; - - if (this.fin) { - firstByte |= 0x80; - } - if (this.rsv1) { - firstByte |= 0x40; - } - if (this.rsv2) { - firstByte |= 0x20; - } - if (this.rsv3) { - firstByte |= 0x10; - } - if (this.mask) { - secondByte |= 0x80; - } - - firstByte |= (this.opcode & 0x0F); - - // the close frame is a special case because the close reason is - // prepended to the payload data. - if (this.opcode === 0x08) { - this.length = 2; - if (this.binaryPayload) { - this.length += this.binaryPayload.length; - } - data = new Buffer(this.length); - data.writeUInt16BE(this.closeStatus, 0, true); - if (this.length > 2) { - this.binaryPayload.copy(data, 2); - } - } - else if (this.binaryPayload) { - data = this.binaryPayload; - this.length = data.length; - } - else { - this.length = 0; - } - - if (this.length <= 125) { - // encode the length directly into the two-byte frame header - secondByte |= (this.length & 0x7F); - } - else if (this.length > 125 && this.length <= 0xFFFF) { - // Use 16-bit length - secondByte |= 126; - headerLength += 2; - } - else if (this.length > 0xFFFF) { - // Use 64-bit length - secondByte |= 127; - headerLength += 8; - } - - var output = new Buffer(this.length + headerLength + (this.mask ? 4 : 0)); - - // write the frame header - output[0] = firstByte; - output[1] = secondByte; - - outputPos = 2; - - if (this.length > 125 && this.length <= 0xFFFF) { - // write 16-bit length - output.writeUInt16BE(this.length, outputPos, true); - outputPos += 2; - } - else if (this.length > 0xFFFF) { - // write 64-bit length - output.writeUInt32BE(0x00000000, outputPos, true); - output.writeUInt32BE(this.length, outputPos + 4, true); - outputPos += 8; - } - - if (this.mask) { - maskKey = nullMask ? 0 : (Math.random()*0xFFFFFFFF) | 0; - this.maskBytes.writeUInt32BE(maskKey, 0, true); - - // write the mask key - this.maskBytes.copy(output, outputPos); - outputPos += 4; - - if (data) { - bufferUtil.mask(data, this.maskBytes, output, outputPos, this.length); - } - } - else if (data) { - data.copy(output, outputPos); - } - - return output; -}; - -WebSocketFrame.prototype.toString = function() { - return 'Opcode: ' + this.opcode + ', fin: ' + this.fin + ', length: ' + this.length + ', hasPayload: ' + Boolean(this.binaryPayload) + ', masked: ' + this.mask; -}; - - -module.exports = WebSocketFrame; diff --git a/deploy/node_modules/websocket/lib/WebSocketRequest.js b/deploy/node_modules/websocket/lib/WebSocketRequest.js deleted file mode 100644 index f4d9655..0000000 --- a/deploy/node_modules/websocket/lib/WebSocketRequest.js +++ /dev/null @@ -1,524 +0,0 @@ -/************************************************************************ - * Copyright 2010-2015 Brian McKelvey. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ***********************************************************************/ - -var crypto = require('crypto'); -var util = require('util'); -var url = require('url'); -var EventEmitter = require('events').EventEmitter; -var WebSocketConnection = require('./WebSocketConnection'); - -var headerValueSplitRegExp = /,\s*/; -var headerParamSplitRegExp = /;\s*/; -var headerSanitizeRegExp = /[\r\n]/g; -var xForwardedForSeparatorRegExp = /,\s*/; -var separators = [ - '(', ')', '<', '>', '@', - ',', ';', ':', '\\', '\"', - '/', '[', ']', '?', '=', - '{', '}', ' ', String.fromCharCode(9) -]; -var controlChars = [String.fromCharCode(127) /* DEL */]; -for (var i=0; i < 31; i ++) { - /* US-ASCII Control Characters */ - controlChars.push(String.fromCharCode(i)); -} - -var cookieNameValidateRegEx = /([\x00-\x20\x22\x28\x29\x2c\x2f\x3a-\x3f\x40\x5b-\x5e\x7b\x7d\x7f])/; -var cookieValueValidateRegEx = /[^\x21\x23-\x2b\x2d-\x3a\x3c-\x5b\x5d-\x7e]/; -var cookieValueDQuoteValidateRegEx = /^"[^"]*"$/; -var controlCharsAndSemicolonRegEx = /[\x00-\x20\x3b]/g; - -var cookieSeparatorRegEx = /[;,] */; - -var httpStatusDescriptions = { - 100: 'Continue', - 101: 'Switching Protocols', - 200: 'OK', - 201: 'Created', - 203: 'Non-Authoritative Information', - 204: 'No Content', - 205: 'Reset Content', - 206: 'Partial Content', - 300: 'Multiple Choices', - 301: 'Moved Permanently', - 302: 'Found', - 303: 'See Other', - 304: 'Not Modified', - 305: 'Use Proxy', - 307: 'Temporary Redirect', - 400: 'Bad Request', - 401: 'Unauthorized', - 402: 'Payment Required', - 403: 'Forbidden', - 404: 'Not Found', - 406: 'Not Acceptable', - 407: 'Proxy Authorization Required', - 408: 'Request Timeout', - 409: 'Conflict', - 410: 'Gone', - 411: 'Length Required', - 412: 'Precondition Failed', - 413: 'Request Entity Too Long', - 414: 'Request-URI Too Long', - 415: 'Unsupported Media Type', - 416: 'Requested Range Not Satisfiable', - 417: 'Expectation Failed', - 426: 'Upgrade Required', - 500: 'Internal Server Error', - 501: 'Not Implemented', - 502: 'Bad Gateway', - 503: 'Service Unavailable', - 504: 'Gateway Timeout', - 505: 'HTTP Version Not Supported' -}; - -function WebSocketRequest(socket, httpRequest, serverConfig) { - // Superclass Constructor - EventEmitter.call(this); - - this.socket = socket; - this.httpRequest = httpRequest; - this.resource = httpRequest.url; - this.remoteAddress = socket.remoteAddress; - this.remoteAddresses = [this.remoteAddress]; - this.serverConfig = serverConfig; - - // Watch for the underlying TCP socket closing before we call accept - this._socketIsClosing = false; - this._socketCloseHandler = this._handleSocketCloseBeforeAccept.bind(this); - this.socket.on('end', this._socketCloseHandler); - this.socket.on('close', this._socketCloseHandler); - - this._resolved = false; -} - -util.inherits(WebSocketRequest, EventEmitter); - -WebSocketRequest.prototype.readHandshake = function() { - var self = this; - var request = this.httpRequest; - - // Decode URL - this.resourceURL = url.parse(this.resource, true); - - this.host = request.headers['host']; - if (!this.host) { - throw new Error('Client must provide a Host header.'); - } - - this.key = request.headers['sec-websocket-key']; - if (!this.key) { - throw new Error('Client must provide a value for Sec-WebSocket-Key.'); - } - - this.webSocketVersion = parseInt(request.headers['sec-websocket-version'], 10); - - if (!this.webSocketVersion || isNaN(this.webSocketVersion)) { - throw new Error('Client must provide a value for Sec-WebSocket-Version.'); - } - - switch (this.webSocketVersion) { - case 8: - case 13: - break; - default: - var e = new Error('Unsupported websocket client version: ' + this.webSocketVersion + - 'Only versions 8 and 13 are supported.'); - e.httpCode = 426; - e.headers = { - 'Sec-WebSocket-Version': '13' - }; - throw e; - } - - if (this.webSocketVersion === 13) { - this.origin = request.headers['origin']; - } - else if (this.webSocketVersion === 8) { - this.origin = request.headers['sec-websocket-origin']; - } - - // Protocol is optional. - var protocolString = request.headers['sec-websocket-protocol']; - this.protocolFullCaseMap = {}; - this.requestedProtocols = []; - if (protocolString) { - var requestedProtocolsFullCase = protocolString.split(headerValueSplitRegExp); - requestedProtocolsFullCase.forEach(function(protocol) { - var lcProtocol = protocol.toLocaleLowerCase(); - self.requestedProtocols.push(lcProtocol); - self.protocolFullCaseMap[lcProtocol] = protocol; - }); - } - - if (!this.serverConfig.ignoreXForwardedFor && - request.headers['x-forwarded-for']) { - var immediatePeerIP = this.remoteAddress; - this.remoteAddresses = request.headers['x-forwarded-for'] - .split(xForwardedForSeparatorRegExp); - this.remoteAddresses.push(immediatePeerIP); - this.remoteAddress = this.remoteAddresses[0]; - } - - // Extensions are optional. - var extensionsString = request.headers['sec-websocket-extensions']; - this.requestedExtensions = this.parseExtensions(extensionsString); - - // Cookies are optional - var cookieString = request.headers['cookie']; - this.cookies = this.parseCookies(cookieString); -}; - -WebSocketRequest.prototype.parseExtensions = function(extensionsString) { - if (!extensionsString || extensionsString.length === 0) { - return []; - } - var extensions = extensionsString.toLocaleLowerCase().split(headerValueSplitRegExp); - extensions.forEach(function(extension, index, array) { - var params = extension.split(headerParamSplitRegExp); - var extensionName = params[0]; - var extensionParams = params.slice(1); - extensionParams.forEach(function(rawParam, index, array) { - var arr = rawParam.split('='); - var obj = { - name: arr[0], - value: arr[1] - }; - array.splice(index, 1, obj); - }); - var obj = { - name: extensionName, - params: extensionParams - }; - array.splice(index, 1, obj); - }); - return extensions; -}; - -// This function adapted from node-cookie -// https://github.com/shtylman/node-cookie -WebSocketRequest.prototype.parseCookies = function(str) { - // Sanity Check - if (!str || typeof(str) !== 'string') { - return []; - } - - var cookies = []; - var pairs = str.split(cookieSeparatorRegEx); - - pairs.forEach(function(pair) { - var eq_idx = pair.indexOf('='); - if (eq_idx === -1) { - cookies.push({ - name: pair, - value: null - }); - return; - } - - var key = pair.substr(0, eq_idx).trim(); - var val = pair.substr(++eq_idx, pair.length).trim(); - - // quoted values - if ('"' === val[0]) { - val = val.slice(1, -1); - } - - cookies.push({ - name: key, - value: decodeURIComponent(val) - }); - }); - - return cookies; -}; - -WebSocketRequest.prototype.accept = function(acceptedProtocol, allowedOrigin, cookies) { - this._verifyResolution(); - - // TODO: Handle extensions - - var protocolFullCase; - - if (acceptedProtocol) { - protocolFullCase = this.protocolFullCaseMap[acceptedProtocol.toLocaleLowerCase()]; - if (typeof(protocolFullCase) === 'undefined') { - protocolFullCase = acceptedProtocol; - } - } - else { - protocolFullCase = acceptedProtocol; - } - this.protocolFullCaseMap = null; - - // Create key validation hash - var sha1 = crypto.createHash('sha1'); - sha1.update(this.key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'); - var acceptKey = sha1.digest('base64'); - - var response = 'HTTP/1.1 101 Switching Protocols\r\n' + - 'Upgrade: websocket\r\n' + - 'Connection: Upgrade\r\n' + - 'Sec-WebSocket-Accept: ' + acceptKey + '\r\n'; - - if (protocolFullCase) { - // validate protocol - for (var i=0; i < protocolFullCase.length; i++) { - var charCode = protocolFullCase.charCodeAt(i); - var character = protocolFullCase.charAt(i); - if (charCode < 0x21 || charCode > 0x7E || separators.indexOf(character) !== -1) { - this.reject(500); - throw new Error('Illegal character "' + String.fromCharCode(character) + '" in subprotocol.'); - } - } - if (this.requestedProtocols.indexOf(acceptedProtocol) === -1) { - this.reject(500); - throw new Error('Specified protocol was not requested by the client.'); - } - - protocolFullCase = protocolFullCase.replace(headerSanitizeRegExp, ''); - response += 'Sec-WebSocket-Protocol: ' + protocolFullCase + '\r\n'; - } - this.requestedProtocols = null; - - if (allowedOrigin) { - allowedOrigin = allowedOrigin.replace(headerSanitizeRegExp, ''); - if (this.webSocketVersion === 13) { - response += 'Origin: ' + allowedOrigin + '\r\n'; - } - else if (this.webSocketVersion === 8) { - response += 'Sec-WebSocket-Origin: ' + allowedOrigin + '\r\n'; - } - } - - if (cookies) { - if (!Array.isArray(cookies)) { - this.reject(500); - throw new Error('Value supplied for "cookies" argument must be an array.'); - } - var seenCookies = {}; - cookies.forEach(function(cookie) { - if (!cookie.name || !cookie.value) { - this.reject(500); - throw new Error('Each cookie to set must at least provide a "name" and "value"'); - } - - // Make sure there are no \r\n sequences inserted - cookie.name = cookie.name.replace(controlCharsAndSemicolonRegEx, ''); - cookie.value = cookie.value.replace(controlCharsAndSemicolonRegEx, ''); - - if (seenCookies[cookie.name]) { - this.reject(500); - throw new Error('You may not specify the same cookie name twice.'); - } - seenCookies[cookie.name] = true; - - // token (RFC 2616, Section 2.2) - var invalidChar = cookie.name.match(cookieNameValidateRegEx); - if (invalidChar) { - this.reject(500); - throw new Error('Illegal character ' + invalidChar[0] + ' in cookie name'); - } - - // RFC 6265, Section 4.1.1 - // *cookie-octet / ( DQUOTE *cookie-octet DQUOTE ) | %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E - if (cookie.value.match(cookieValueDQuoteValidateRegEx)) { - invalidChar = cookie.value.slice(1, -1).match(cookieValueValidateRegEx); - } else { - invalidChar = cookie.value.match(cookieValueValidateRegEx); - } - if (invalidChar) { - this.reject(500); - throw new Error('Illegal character ' + invalidChar[0] + ' in cookie value'); - } - - var cookieParts = [cookie.name + '=' + cookie.value]; - - // RFC 6265, Section 4.1.1 - // 'Path=' path-value | - if(cookie.path){ - invalidChar = cookie.path.match(controlCharsAndSemicolonRegEx); - if (invalidChar) { - this.reject(500); - throw new Error('Illegal character ' + invalidChar[0] + ' in cookie path'); - } - cookieParts.push('Path=' + cookie.path); - } - - // RFC 6265, Section 4.1.2.3 - // 'Domain=' subdomain - if (cookie.domain) { - if (typeof(cookie.domain) !== 'string') { - this.reject(500); - throw new Error('Domain must be specified and must be a string.'); - } - invalidChar = cookie.domain.match(controlCharsAndSemicolonRegEx); - if (invalidChar) { - this.reject(500); - throw new Error('Illegal character ' + invalidChar[0] + ' in cookie domain'); - } - cookieParts.push('Domain=' + cookie.domain.toLowerCase()); - } - - // RFC 6265, Section 4.1.1 - //'Expires=' sane-cookie-date | Force Date object requirement by using only epoch - if (cookie.expires) { - if (!(cookie.expires instanceof Date)){ - this.reject(500); - throw new Error('Value supplied for cookie "expires" must be a vaild date object'); - } - cookieParts.push('Expires=' + cookie.expires.toGMTString()); - } - - // RFC 6265, Section 4.1.1 - //'Max-Age=' non-zero-digit *DIGIT - if (cookie.maxage) { - var maxage = cookie.maxage; - if (typeof(maxage) === 'string') { - maxage = parseInt(maxage, 10); - } - if (isNaN(maxage) || maxage <= 0 ) { - this.reject(500); - throw new Error('Value supplied for cookie "maxage" must be a non-zero number'); - } - maxage = Math.round(maxage); - cookieParts.push('Max-Age=' + maxage.toString(10)); - } - - // RFC 6265, Section 4.1.1 - //'Secure;' - if (cookie.secure) { - if (typeof(cookie.secure) !== 'boolean') { - this.reject(500); - throw new Error('Value supplied for cookie "secure" must be of type boolean'); - } - cookieParts.push('Secure'); - } - - // RFC 6265, Section 4.1.1 - //'HttpOnly;' - if (cookie.httponly) { - if (typeof(cookie.httponly) !== 'boolean') { - this.reject(500); - throw new Error('Value supplied for cookie "httponly" must be of type boolean'); - } - cookieParts.push('HttpOnly'); - } - - response += ('Set-Cookie: ' + cookieParts.join(';') + '\r\n'); - }.bind(this)); - } - - // TODO: handle negotiated extensions - // if (negotiatedExtensions) { - // response += 'Sec-WebSocket-Extensions: ' + negotiatedExtensions.join(', ') + '\r\n'; - // } - - // Mark the request resolved now so that the user can't call accept or - // reject a second time. - this._resolved = true; - this.emit('requestResolved', this); - - response += '\r\n'; - - var connection = new WebSocketConnection(this.socket, [], acceptedProtocol, false, this.serverConfig); - connection.webSocketVersion = this.webSocketVersion; - connection.remoteAddress = this.remoteAddress; - connection.remoteAddresses = this.remoteAddresses; - - var self = this; - - if (this._socketIsClosing) { - // Handle case when the client hangs up before we get a chance to - // accept the connection and send our side of the opening handshake. - cleanupFailedConnection(connection); - } - else { - this.socket.write(response, 'ascii', function(error) { - if (error) { - cleanupFailedConnection(connection); - return; - } - - self._removeSocketCloseListeners(); - connection._addSocketEventListeners(); - }); - } - - this.emit('requestAccepted', connection); - return connection; -}; - -WebSocketRequest.prototype.reject = function(status, reason, extraHeaders) { - this._verifyResolution(); - - // Mark the request resolved now so that the user can't call accept or - // reject a second time. - this._resolved = true; - this.emit('requestResolved', this); - - if (typeof(status) !== 'number') { - status = 403; - } - var response = 'HTTP/1.1 ' + status + ' ' + httpStatusDescriptions[status] + '\r\n' + - 'Connection: close\r\n'; - if (reason) { - reason = reason.replace(headerSanitizeRegExp, ''); - response += 'X-WebSocket-Reject-Reason: ' + reason + '\r\n'; - } - - if (extraHeaders) { - for (var key in extraHeaders) { - var sanitizedValue = extraHeaders[key].toString().replace(headerSanitizeRegExp, ''); - var sanitizedKey = key.replace(headerSanitizeRegExp, ''); - response += (sanitizedKey + ': ' + sanitizedValue + '\r\n'); - } - } - - response += '\r\n'; - this.socket.end(response, 'ascii'); - - this.emit('requestRejected', this); -}; - -WebSocketRequest.prototype._handleSocketCloseBeforeAccept = function() { - this._socketIsClosing = true; - this._removeSocketCloseListeners(); -}; - -WebSocketRequest.prototype._removeSocketCloseListeners = function() { - this.socket.removeListener('end', this._socketCloseHandler); - this.socket.removeListener('close', this._socketCloseHandler); -}; - -WebSocketRequest.prototype._verifyResolution = function() { - if (this._resolved) { - throw new Error('WebSocketRequest may only be accepted or rejected one time.'); - } -}; - -function cleanupFailedConnection(connection) { - // Since we have to return a connection object even if the socket is - // already dead in order not to break the API, we schedule a 'close' - // event on the connection object to occur immediately. - process.nextTick(function() { - // WebSocketConnection.CLOSE_REASON_ABNORMAL = 1006 - // Third param: Skip sending the close frame to a dead socket - connection.drop(1006, 'TCP connection lost before handshake completed.', true); - }); -} - -module.exports = WebSocketRequest; diff --git a/deploy/node_modules/websocket/lib/WebSocketRouter.js b/deploy/node_modules/websocket/lib/WebSocketRouter.js deleted file mode 100644 index 35bced9..0000000 --- a/deploy/node_modules/websocket/lib/WebSocketRouter.js +++ /dev/null @@ -1,157 +0,0 @@ -/************************************************************************ - * Copyright 2010-2015 Brian McKelvey. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ***********************************************************************/ - -var extend = require('./utils').extend; -var util = require('util'); -var EventEmitter = require('events').EventEmitter; -var WebSocketRouterRequest = require('./WebSocketRouterRequest'); - -function WebSocketRouter(config) { - // Superclass Constructor - EventEmitter.call(this); - - this.config = { - // The WebSocketServer instance to attach to. - server: null - }; - if (config) { - extend(this.config, config); - } - this.handlers = []; - - this._requestHandler = this.handleRequest.bind(this); - if (this.config.server) { - this.attachServer(this.config.server); - } -} - -util.inherits(WebSocketRouter, EventEmitter); - -WebSocketRouter.prototype.attachServer = function(server) { - if (server) { - this.server = server; - this.server.on('request', this._requestHandler); - } - else { - throw new Error('You must specify a WebSocketServer instance to attach to.'); - } -}; - -WebSocketRouter.prototype.detachServer = function() { - if (this.server) { - this.server.removeListener('request', this._requestHandler); - this.server = null; - } - else { - throw new Error('Cannot detach from server: not attached.'); - } -}; - -WebSocketRouter.prototype.mount = function(path, protocol, callback) { - if (!path) { - throw new Error('You must specify a path for this handler.'); - } - if (!protocol) { - protocol = '____no_protocol____'; - } - if (!callback) { - throw new Error('You must specify a callback for this handler.'); - } - - path = this.pathToRegExp(path); - if (!(path instanceof RegExp)) { - throw new Error('Path must be specified as either a string or a RegExp.'); - } - var pathString = path.toString(); - - // normalize protocol to lower-case - protocol = protocol.toLocaleLowerCase(); - - if (this.findHandlerIndex(pathString, protocol) !== -1) { - throw new Error('You may only mount one handler per path/protocol combination.'); - } - - this.handlers.push({ - 'path': path, - 'pathString': pathString, - 'protocol': protocol, - 'callback': callback - }); -}; -WebSocketRouter.prototype.unmount = function(path, protocol) { - var index = this.findHandlerIndex(this.pathToRegExp(path).toString(), protocol); - if (index !== -1) { - this.handlers.splice(index, 1); - } - else { - throw new Error('Unable to find a route matching the specified path and protocol.'); - } -}; - -WebSocketRouter.prototype.findHandlerIndex = function(pathString, protocol) { - protocol = protocol.toLocaleLowerCase(); - for (var i=0, len=this.handlers.length; i < len; i++) { - var handler = this.handlers[i]; - if (handler.pathString === pathString && handler.protocol === protocol) { - return i; - } - } - return -1; -}; - -WebSocketRouter.prototype.pathToRegExp = function(path) { - if (typeof(path) === 'string') { - if (path === '*') { - path = /^.*$/; - } - else { - path = path.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); - path = new RegExp('^' + path + '$'); - } - } - return path; -}; - -WebSocketRouter.prototype.handleRequest = function(request) { - var requestedProtocols = request.requestedProtocols; - if (requestedProtocols.length === 0) { - requestedProtocols = ['____no_protocol____']; - } - - // Find a handler with the first requested protocol first - for (var i=0; i < requestedProtocols.length; i++) { - var requestedProtocol = requestedProtocols[i].toLocaleLowerCase(); - - // find the first handler that can process this request - for (var j=0, len=this.handlers.length; j < len; j++) { - var handler = this.handlers[j]; - if (handler.path.test(request.resourceURL.pathname)) { - if (requestedProtocol === handler.protocol || - handler.protocol === '*') - { - var routerRequest = new WebSocketRouterRequest(request, requestedProtocol); - handler.callback(routerRequest); - return; - } - } - } - } - - // If we get here we were unable to find a suitable handler. - request.reject(404, 'No handler is available for the given request.'); -}; - -module.exports = WebSocketRouter; diff --git a/deploy/node_modules/websocket/lib/WebSocketRouterRequest.js b/deploy/node_modules/websocket/lib/WebSocketRouterRequest.js deleted file mode 100644 index d3e3745..0000000 --- a/deploy/node_modules/websocket/lib/WebSocketRouterRequest.js +++ /dev/null @@ -1,54 +0,0 @@ -/************************************************************************ - * Copyright 2010-2015 Brian McKelvey. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ***********************************************************************/ - -var util = require('util'); -var EventEmitter = require('events').EventEmitter; - -function WebSocketRouterRequest(webSocketRequest, resolvedProtocol) { - // Superclass Constructor - EventEmitter.call(this); - - this.webSocketRequest = webSocketRequest; - if (resolvedProtocol === '____no_protocol____') { - this.protocol = null; - } - else { - this.protocol = resolvedProtocol; - } - this.origin = webSocketRequest.origin; - this.resource = webSocketRequest.resource; - this.resourceURL = webSocketRequest.resourceURL; - this.httpRequest = webSocketRequest.httpRequest; - this.remoteAddress = webSocketRequest.remoteAddress; - this.webSocketVersion = webSocketRequest.webSocketVersion; - this.requestedExtensions = webSocketRequest.requestedExtensions; - this.cookies = webSocketRequest.cookies; -} - -util.inherits(WebSocketRouterRequest, EventEmitter); - -WebSocketRouterRequest.prototype.accept = function(origin, cookies) { - var connection = this.webSocketRequest.accept(this.protocol, origin, cookies); - this.emit('requestAccepted', connection); - return connection; -}; - -WebSocketRouterRequest.prototype.reject = function(status, reason, extraHeaders) { - this.webSocketRequest.reject(status, reason, extraHeaders); - this.emit('requestRejected', this); -}; - -module.exports = WebSocketRouterRequest; diff --git a/deploy/node_modules/websocket/lib/WebSocketServer.js b/deploy/node_modules/websocket/lib/WebSocketServer.js deleted file mode 100644 index c27d967..0000000 --- a/deploy/node_modules/websocket/lib/WebSocketServer.js +++ /dev/null @@ -1,245 +0,0 @@ -/************************************************************************ - * Copyright 2010-2015 Brian McKelvey. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ***********************************************************************/ - -var extend = require('./utils').extend; -var utils = require('./utils'); -var util = require('util'); -var debug = require('debug')('websocket:server'); -var EventEmitter = require('events').EventEmitter; -var WebSocketRequest = require('./WebSocketRequest'); - -var WebSocketServer = function WebSocketServer(config) { - // Superclass Constructor - EventEmitter.call(this); - - this._handlers = { - upgrade: this.handleUpgrade.bind(this), - requestAccepted: this.handleRequestAccepted.bind(this), - requestResolved: this.handleRequestResolved.bind(this) - }; - this.connections = []; - this.pendingRequests = []; - if (config) { - this.mount(config); - } -}; - -util.inherits(WebSocketServer, EventEmitter); - -WebSocketServer.prototype.mount = function(config) { - this.config = { - // The http server instance to attach to. Required. - httpServer: null, - - // 64KiB max frame size. - maxReceivedFrameSize: 0x10000, - - // 1MiB max message size, only applicable if - // assembleFragments is true - maxReceivedMessageSize: 0x100000, - - // Outgoing messages larger than fragmentationThreshold will be - // split into multiple fragments. - fragmentOutgoingMessages: true, - - // Outgoing frames are fragmented if they exceed this threshold. - // Default is 16KiB - fragmentationThreshold: 0x4000, - - // If true, the server will automatically send a ping to all - // clients every 'keepaliveInterval' milliseconds. The timer is - // reset on any received data from the client. - keepalive: true, - - // The interval to send keepalive pings to connected clients if the - // connection is idle. Any received data will reset the counter. - keepaliveInterval: 20000, - - // If true, the server will consider any connection that has not - // received any data within the amount of time specified by - // 'keepaliveGracePeriod' after a keepalive ping has been sent to - // be dead, and will drop the connection. - // Ignored if keepalive is false. - dropConnectionOnKeepaliveTimeout: true, - - // The amount of time to wait after sending a keepalive ping before - // closing the connection if the connected peer does not respond. - // Ignored if keepalive is false. - keepaliveGracePeriod: 10000, - - // Whether to use native TCP keep-alive instead of WebSockets ping - // and pong packets. Native TCP keep-alive sends smaller packets - // on the wire and so uses bandwidth more efficiently. This may - // be more important when talking to mobile devices. - // If this value is set to true, then these values will be ignored: - // keepaliveGracePeriod - // dropConnectionOnKeepaliveTimeout - useNativeKeepalive: false, - - // If true, fragmented messages will be automatically assembled - // and the full message will be emitted via a 'message' event. - // If false, each frame will be emitted via a 'frame' event and - // the application will be responsible for aggregating multiple - // fragmented frames. Single-frame messages will emit a 'message' - // event in addition to the 'frame' event. - // Most users will want to leave this set to 'true' - assembleFragments: true, - - // If this is true, websocket connections will be accepted - // regardless of the path and protocol specified by the client. - // The protocol accepted will be the first that was requested - // by the client. Clients from any origin will be accepted. - // This should only be used in the simplest of cases. You should - // probably leave this set to 'false' and inspect the request - // object to make sure it's acceptable before accepting it. - autoAcceptConnections: false, - - // Whether or not the X-Forwarded-For header should be respected. - // It's important to set this to 'true' when accepting connections - // from untrusted clients, as a malicious client could spoof its - // IP address by simply setting this header. It's meant to be added - // by a trusted proxy or other intermediary within your own - // infrastructure. - // See: http://en.wikipedia.org/wiki/X-Forwarded-For - ignoreXForwardedFor: false, - - // The Nagle Algorithm makes more efficient use of network resources - // by introducing a small delay before sending small packets so that - // multiple messages can be batched together before going onto the - // wire. This however comes at the cost of latency, so the default - // is to disable it. If you don't need low latency and are streaming - // lots of small messages, you can change this to 'false' - disableNagleAlgorithm: true, - - // The number of milliseconds to wait after sending a close frame - // for an acknowledgement to come back before giving up and just - // closing the socket. - closeTimeout: 5000 - }; - extend(this.config, config); - - if (this.config.httpServer) { - if (!Array.isArray(this.config.httpServer)) { - this.config.httpServer = [this.config.httpServer]; - } - var upgradeHandler = this._handlers.upgrade; - this.config.httpServer.forEach(function(httpServer) { - httpServer.on('upgrade', upgradeHandler); - }); - } - else { - throw new Error('You must specify an httpServer on which to mount the WebSocket server.'); - } -}; - -WebSocketServer.prototype.unmount = function() { - var upgradeHandler = this._handlers.upgrade; - this.config.httpServer.forEach(function(httpServer) { - httpServer.removeListener('upgrade', upgradeHandler); - }); -}; - -WebSocketServer.prototype.closeAllConnections = function() { - this.connections.forEach(function(connection) { - connection.close(); - }); - this.pendingRequests.forEach(function(request) { - process.nextTick(function() { - request.reject(503); // HTTP 503 Service Unavailable - }); - }); -}; - -WebSocketServer.prototype.broadcast = function(data) { - if (Buffer.isBuffer(data)) { - this.broadcastBytes(data); - } - else if (typeof(data.toString) === 'function') { - this.broadcastUTF(data); - } -}; - -WebSocketServer.prototype.broadcastUTF = function(utfData) { - this.connections.forEach(function(connection) { - connection.sendUTF(utfData); - }); -}; - -WebSocketServer.prototype.broadcastBytes = function(binaryData) { - this.connections.forEach(function(connection) { - connection.sendBytes(binaryData); - }); -}; - -WebSocketServer.prototype.shutDown = function() { - this.unmount(); - this.closeAllConnections(); -}; - -WebSocketServer.prototype.handleUpgrade = function(request, socket) { - var wsRequest = new WebSocketRequest(socket, request, this.config); - try { - wsRequest.readHandshake(); - } - catch(e) { - wsRequest.reject( - e.httpCode ? e.httpCode : 400, - e.message, - e.headers - ); - debug('Invalid handshake: %s', e.message); - return; - } - - this.pendingRequests.push(wsRequest); - - wsRequest.once('requestAccepted', this._handlers.requestAccepted); - wsRequest.once('requestResolved', this._handlers.requestResolved); - - if (!this.config.autoAcceptConnections && utils.eventEmitterListenerCount(this, 'request') > 0) { - this.emit('request', wsRequest); - } - else if (this.config.autoAcceptConnections) { - wsRequest.accept(wsRequest.requestedProtocols[0], wsRequest.origin); - } - else { - wsRequest.reject(404, 'No handler is configured to accept the connection.'); - } -}; - -WebSocketServer.prototype.handleRequestAccepted = function(connection) { - var self = this; - connection.once('close', function(closeReason, description) { - self.handleConnectionClose(connection, closeReason, description); - }); - this.connections.push(connection); - this.emit('connect', connection); -}; - -WebSocketServer.prototype.handleConnectionClose = function(connection, closeReason, description) { - var index = this.connections.indexOf(connection); - if (index !== -1) { - this.connections.splice(index, 1); - } - this.emit('close', connection, closeReason, description); -}; - -WebSocketServer.prototype.handleRequestResolved = function(request) { - var index = this.pendingRequests.indexOf(request); - if (index !== -1) { this.pendingRequests.splice(index, 1); } -}; - -module.exports = WebSocketServer; diff --git a/deploy/node_modules/websocket/lib/browser.js b/deploy/node_modules/websocket/lib/browser.js deleted file mode 100644 index 2a653fe..0000000 --- a/deploy/node_modules/websocket/lib/browser.js +++ /dev/null @@ -1,36 +0,0 @@ -var _global = (function() { return this; })(); -var NativeWebSocket = _global.WebSocket || _global.MozWebSocket; -var websocket_version = require('./version'); - - -/** - * Expose a W3C WebSocket class with just one or two arguments. - */ -function W3CWebSocket(uri, protocols) { - var native_instance; - - if (protocols) { - native_instance = new NativeWebSocket(uri, protocols); - } - else { - native_instance = new NativeWebSocket(uri); - } - - /** - * 'native_instance' is an instance of nativeWebSocket (the browser's WebSocket - * class). Since it is an Object it will be returned as it is when creating an - * instance of W3CWebSocket via 'new W3CWebSocket()'. - * - * ECMAScript 5: http://bclary.com/2004/11/07/#a-13.2.2 - */ - return native_instance; -} - - -/** - * Module exports. - */ -module.exports = { - 'w3cwebsocket' : NativeWebSocket ? W3CWebSocket : null, - 'version' : websocket_version -}; diff --git a/deploy/node_modules/websocket/lib/utils.js b/deploy/node_modules/websocket/lib/utils.js deleted file mode 100644 index 6506dc9..0000000 --- a/deploy/node_modules/websocket/lib/utils.js +++ /dev/null @@ -1,60 +0,0 @@ -var noop = exports.noop = function(){}; - -exports.extend = function extend(dest, source) { - for (var prop in source) { - dest[prop] = source[prop]; - } -}; - -exports.eventEmitterListenerCount = - require('events').EventEmitter.listenerCount || - function(emitter, type) { return emitter.listeners(type).length; }; - - - - - -exports.BufferingLogger = function createBufferingLogger(identifier, uniqueID) { - var logFunction = require('debug')(identifier); - if (logFunction.enabled) { - var logger = new BufferingLogger(identifier, uniqueID, logFunction); - var debug = logger.log.bind(logger); - debug.printOutput = logger.printOutput.bind(logger); - debug.enabled = logFunction.enabled; - return debug; - } - logFunction.printOutput = noop; - return logFunction; -}; - -function BufferingLogger(identifier, uniqueID, logFunction) { - this.logFunction = logFunction; - this.identifier = identifier; - this.uniqueID = uniqueID; - this.buffer = []; -} - -BufferingLogger.prototype.log = function() { - this.buffer.push([ new Date(), Array.prototype.slice.call(arguments) ]); - return this; -}; - -BufferingLogger.prototype.clear = function() { - this.buffer = []; - return this; -}; - -BufferingLogger.prototype.printOutput = function(logFunction) { - if (!logFunction) { logFunction = this.logFunction; } - var uniqueID = this.uniqueID; - this.buffer.forEach(function(entry) { - var date = entry[0].toLocaleString(); - var args = entry[1].slice(); - var formatString = args[0]; - if (formatString !== (void 0) && formatString !== null) { - formatString = '%s - %s - ' + formatString.toString(); - args.splice(0, 1, formatString, date, uniqueID); - logFunction.apply(global, args); - } - }); -}; diff --git a/deploy/node_modules/websocket/lib/version.js b/deploy/node_modules/websocket/lib/version.js deleted file mode 100644 index 81f6e78..0000000 --- a/deploy/node_modules/websocket/lib/version.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../package.json').version; diff --git a/deploy/node_modules/websocket/lib/websocket.js b/deploy/node_modules/websocket/lib/websocket.js deleted file mode 100644 index 6242d56..0000000 --- a/deploy/node_modules/websocket/lib/websocket.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - 'server' : require('./WebSocketServer'), - 'client' : require('./WebSocketClient'), - 'router' : require('./WebSocketRouter'), - 'frame' : require('./WebSocketFrame'), - 'request' : require('./WebSocketRequest'), - 'connection' : require('./WebSocketConnection'), - 'w3cwebsocket' : require('./W3CWebSocket'), - 'deprecation' : require('./Deprecation'), - 'version' : require('./version') -}; diff --git a/deploy/node_modules/websocket/package.json b/deploy/node_modules/websocket/package.json deleted file mode 100644 index 1caa16d..0000000 --- a/deploy/node_modules/websocket/package.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "_from": "websocket@~1", - "_id": "websocket@1.0.24", - "_inBundle": false, - "_integrity": "sha1-dJA+dfJUW2suHeFCW8HJBZF6GJA=", - "_location": "/websocket", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "websocket@~1", - "name": "websocket", - "escapedName": "websocket", - "rawSpec": "~1", - "saveSpec": null, - "fetchSpec": "~1" - }, - "_requiredBy": [ - "/" - ], - "_resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.24.tgz", - "_shasum": "74903e75f2545b6b2e1de1425bc1c905917a1890", - "_spec": "websocket@~1", - "_where": "/Users/prophesi/Projects/websocket-kinect/deploy", - "author": { - "name": "Brian McKelvey", - "email": "brian@worlize.com", - "url": "https://www.worlize.com/" - }, - "browser": "lib/browser.js", - "bugs": { - "url": "https://github.com/theturtle32/WebSocket-Node/issues" - }, - "bundleDependencies": false, - "config": { - "verbose": false - }, - "contributors": [ - { - "name": "Iñaki Baz Castillo", - "email": "ibc@aliax.net", - "url": "http://dev.sipdoc.net" - } - ], - "dependencies": { - "debug": "^2.2.0", - "nan": "^2.3.3", - "typedarray-to-buffer": "^3.1.2", - "yaeti": "^0.0.6" - }, - "deprecated": false, - "description": "Websocket Client & Server Library implementing the WebSocket protocol as specified in RFC 6455.", - "devDependencies": { - "buffer-equal": "^1.0.0", - "faucet": "^0.0.1", - "gulp": "git+https://github.com/gulpjs/gulp.git#4.0", - "gulp-jshint": "^2.0.4", - "jshint": "^2.0.0", - "jshint-stylish": "^2.2.1", - "tape": "^4.0.1" - }, - "directories": { - "lib": "./lib" - }, - "engines": { - "node": ">=0.8.0" - }, - "homepage": "https://github.com/theturtle32/WebSocket-Node", - "keywords": [ - "websocket", - "websockets", - "socket", - "networking", - "comet", - "push", - "RFC-6455", - "realtime", - "server", - "client" - ], - "license": "Apache-2.0", - "main": "index", - "name": "websocket", - "repository": { - "type": "git", - "url": "git+https://github.com/theturtle32/WebSocket-Node.git" - }, - "scripts": { - "gulp": "gulp", - "install": "(node-gyp rebuild 2> builderror.log) || (exit 0)", - "test": "faucet test/unit" - }, - "version": "1.0.24" -} diff --git a/deploy/node_modules/websocket/src/bufferutil.cc b/deploy/node_modules/websocket/src/bufferutil.cc deleted file mode 100644 index d2f8d2d..0000000 --- a/deploy/node_modules/websocket/src/bufferutil.cc +++ /dev/null @@ -1,121 +0,0 @@ -/*! - * BufferUtil originally from: - * ws: a node.js websocket client - * Copyright(c) 2015 Einar Otto Stangvik - * MIT Licensed - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "nan.h" - -using namespace v8; -using namespace node; - -class BufferUtil : public ObjectWrap -{ -public: - - static void Initialize(v8::Handle target) - { - Nan::HandleScope scope; - Local t = Nan::New(New); - t->InstanceTemplate()->SetInternalFieldCount(1); - Nan::SetMethod(t, "unmask", BufferUtil::Unmask); - Nan::SetMethod(t, "mask", BufferUtil::Mask); - Nan::SetMethod(t, "merge", BufferUtil::Merge); - Nan::Set(target, Nan::New("BufferUtil").ToLocalChecked(), t->GetFunction()); - } - -protected: - - static NAN_METHOD(New) - { - Nan::HandleScope scope; - BufferUtil* bufferUtil = new BufferUtil(); - bufferUtil->Wrap(info.This()); - info.GetReturnValue().Set(info.This()); - } - - static NAN_METHOD(Merge) - { - Nan::HandleScope scope; - Local bufferObj = info[0]->ToObject(); - char* buffer = Buffer::Data(bufferObj); - Local array = Local::Cast(info[1]); - unsigned int arrayLength = array->Length(); - size_t offset = 0; - unsigned int i; - for (i = 0; i < arrayLength; ++i) { - Local src = array->Get(i)->ToObject(); - size_t length = Buffer::Length(src); - memcpy(buffer + offset, Buffer::Data(src), length); - offset += length; - } - info.GetReturnValue().Set(Nan::True()); - } - - static NAN_METHOD(Unmask) - { - Nan::HandleScope scope; - Local buffer_obj = info[0]->ToObject(); - size_t length = Buffer::Length(buffer_obj); - Local mask_obj = info[1]->ToObject(); - unsigned int *mask = (unsigned int*)Buffer::Data(mask_obj); - unsigned int* from = (unsigned int*)Buffer::Data(buffer_obj); - size_t len32 = length / 4; - unsigned int i; - for (i = 0; i < len32; ++i) *(from + i) ^= *mask; - from += i; - switch (length % 4) { - case 3: *((unsigned char*)from+2) = *((unsigned char*)from+2) ^ ((unsigned char*)mask)[2]; - case 2: *((unsigned char*)from+1) = *((unsigned char*)from+1) ^ ((unsigned char*)mask)[1]; - case 1: *((unsigned char*)from ) = *((unsigned char*)from ) ^ ((unsigned char*)mask)[0]; - case 0:; - } - info.GetReturnValue().Set(Nan::True()); - } - - static NAN_METHOD(Mask) - { - Nan::HandleScope scope; - Local buffer_obj = info[0]->ToObject(); - Local mask_obj = info[1]->ToObject(); - unsigned int *mask = (unsigned int*)Buffer::Data(mask_obj); - Local output_obj = info[2]->ToObject(); - unsigned int dataOffset = info[3]->Int32Value(); - unsigned int length = info[4]->Int32Value(); - unsigned int* to = (unsigned int*)(Buffer::Data(output_obj) + dataOffset); - unsigned int* from = (unsigned int*)Buffer::Data(buffer_obj); - unsigned int len32 = length / 4; - unsigned int i; - for (i = 0; i < len32; ++i) *(to + i) = *(from + i) ^ *mask; - to += i; - from += i; - switch (length % 4) { - case 3: *((unsigned char*)to+2) = *((unsigned char*)from+2) ^ *((unsigned char*)mask+2); - case 2: *((unsigned char*)to+1) = *((unsigned char*)from+1) ^ *((unsigned char*)mask+1); - case 1: *((unsigned char*)to ) = *((unsigned char*)from ) ^ *((unsigned char*)mask); - case 0:; - } - info.GetReturnValue().Set(Nan::True()); - } -}; - -#if !NODE_VERSION_AT_LEAST(0,10,0) -extern "C" -#endif -void init (Handle target) -{ - Nan::HandleScope scope; - BufferUtil::Initialize(target); -} - -NODE_MODULE(bufferutil, init) diff --git a/deploy/node_modules/websocket/src/validation.cc b/deploy/node_modules/websocket/src/validation.cc deleted file mode 100644 index 8e2347e..0000000 --- a/deploy/node_modules/websocket/src/validation.cc +++ /dev/null @@ -1,148 +0,0 @@ -/*! - * UTF-8 Validation Code originally from: - * ws: a node.js websocket client - * Copyright(c) 2015 Einar Otto Stangvik - * MIT Licensed - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "nan.h" - -using namespace v8; -using namespace node; - -#define UNI_SUR_HIGH_START (uint32_t) 0xD800 -#define UNI_SUR_LOW_END (uint32_t) 0xDFFF -#define UNI_REPLACEMENT_CHAR (uint32_t) 0x0000FFFD -#define UNI_MAX_LEGAL_UTF32 (uint32_t) 0x0010FFFF - -static const uint8_t trailingBytesForUTF8[256] = { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 -}; - -static const uint32_t offsetsFromUTF8[6] = { - 0x00000000, 0x00003080, 0x000E2080, - 0x03C82080, 0xFA082080, 0x82082080 -}; - -static int isLegalUTF8(const uint8_t *source, const int length) -{ - uint8_t a; - const uint8_t *srcptr = source+length; - switch (length) { - default: return 0; - /* Everything else falls through when "true"... */ - /* RFC3629 makes 5 & 6 bytes UTF-8 illegal - case 6: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0; - case 5: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0; */ - case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0; - case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0; - case 2: if ((a = (*--srcptr)) > 0xBF) return 0; - switch (*source) { - /* no fall-through in this inner switch */ - case 0xE0: if (a < 0xA0) return 0; break; - case 0xED: if (a > 0x9F) return 0; break; - case 0xF0: if (a < 0x90) return 0; break; - case 0xF4: if (a > 0x8F) return 0; break; - default: if (a < 0x80) return 0; - } - - case 1: if (*source >= 0x80 && *source < 0xC2) return 0; - } - if (*source > 0xF4) return 0; - return 1; -} - -int is_valid_utf8 (size_t len, char *value) -{ - /* is the string valid UTF-8? */ - for (unsigned int i = 0; i < len; i++) { - uint32_t ch = 0; - uint8_t extrabytes = trailingBytesForUTF8[(uint8_t) value[i]]; - - if (extrabytes + i >= len) - return 0; - - if (isLegalUTF8 ((uint8_t *) (value + i), extrabytes + 1) == 0) return 0; - - switch (extrabytes) { - case 5 : ch += (uint8_t) value[i++]; ch <<= 6; - case 4 : ch += (uint8_t) value[i++]; ch <<= 6; - case 3 : ch += (uint8_t) value[i++]; ch <<= 6; - case 2 : ch += (uint8_t) value[i++]; ch <<= 6; - case 1 : ch += (uint8_t) value[i++]; ch <<= 6; - case 0 : ch += (uint8_t) value[i]; - } - - ch -= offsetsFromUTF8[extrabytes]; - - if (ch <= UNI_MAX_LEGAL_UTF32) { - if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) - return 0; - } else { - return 0; - } - } - - return 1; -} - -class Validation : public ObjectWrap -{ -public: - - static void Initialize(v8::Handle target) - { - Nan::HandleScope scope; - Local t = Nan::New(New); - t->InstanceTemplate()->SetInternalFieldCount(1); - Nan::SetMethod(t, "isValidUTF8", Validation::IsValidUTF8); - Nan::Set(target, Nan::New("Validation").ToLocalChecked(), t->GetFunction()); - } - -protected: - - static NAN_METHOD(New) - { - Nan::HandleScope scope; - Validation* validation = new Validation(); - validation->Wrap(info.This()); - info.GetReturnValue().Set(info.This()); - } - - static NAN_METHOD(IsValidUTF8) - { - Nan::HandleScope scope; - if (!Buffer::HasInstance(info[0])) { - return Nan::ThrowTypeError("First argument needs to be a buffer"); - } - Local buffer_obj = info[0]->ToObject(); - char *buffer_data = Buffer::Data(buffer_obj); - size_t buffer_length = Buffer::Length(buffer_obj); - info.GetReturnValue().Set(is_valid_utf8(buffer_length, buffer_data) == 1 ? Nan::True() : Nan::False()); - } -}; -#if !NODE_VERSION_AT_LEAST(0,10,0) -extern "C" -#endif -void init (Handle target) -{ - Nan::HandleScope scope; - Validation::Initialize(target); -} - -NODE_MODULE(validation, init) diff --git a/deploy/node_modules/websocket/vendor/FastBufferList.js b/deploy/node_modules/websocket/vendor/FastBufferList.js deleted file mode 100644 index aabf096..0000000 --- a/deploy/node_modules/websocket/vendor/FastBufferList.js +++ /dev/null @@ -1,193 +0,0 @@ -// This file was copied from https://github.com/substack/node-bufferlist -// and modified to be able to copy bytes from the bufferlist directly into -// a pre-existing fixed-size buffer without an additional memory allocation. - -// bufferlist.js -// Treat a linked list of buffers as a single variable-size buffer. -var Buffer = require('buffer').Buffer; -var EventEmitter = require('events').EventEmitter; - -module.exports = BufferList; -module.exports.BufferList = BufferList; // backwards compatibility - -function BufferList(opts) { - if (!(this instanceof BufferList)) return new BufferList(opts); - EventEmitter.call(this); - var self = this; - - if (typeof(opts) == 'undefined') opts = {}; - - // default encoding to use for take(). Leaving as 'undefined' - // makes take() return a Buffer instead. - self.encoding = opts.encoding; - - // constructor to use for Buffer-esque operations - self.construct = opts.construct || Buffer; - - var head = { next : null, buffer : null }; - var last = { next : null, buffer : null }; - - // length can get negative when advanced past the end - // and this is the desired behavior - var length = 0; - self.__defineGetter__('length', function () { - return length; - }); - - // keep an offset of the head to decide when to head = head.next - var offset = 0; - - // Write to the bufferlist. Emits 'write'. Always returns true. - self.write = function (buf) { - if (!head.buffer) { - head.buffer = buf; - last = head; - } - else { - last.next = { next : null, buffer : buf }; - last = last.next; - } - length += buf.length; - self.emit('write', buf); - return true; - }; - - self.end = function (buf) { - if (Buffer.isBuffer(buf)) self.write(buf); - }; - - // Push buffers to the end of the linked list. (deprecated) - // Return this (self). - self.push = function () { - var args = [].concat.apply([], arguments); - args.forEach(self.write); - return self; - }; - - // For each buffer, perform some action. - // If fn's result is a true value, cut out early. - // Returns this (self). - self.forEach = function (fn) { - if (!head.buffer) return new self.construct(0); - - if (head.buffer.length - offset <= 0) return self; - var firstBuf = head.buffer.slice(offset); - - var b = { buffer : firstBuf, next : head.next }; - - while (b && b.buffer) { - var r = fn(b.buffer); - if (r) break; - b = b.next; - } - - return self; - }; - - // Create a single Buffer out of all the chunks or some subset specified by - // start and one-past the end (like slice) in bytes. - self.join = function (start, end) { - if (!head.buffer) return new self.construct(0); - if (start == undefined) start = 0; - if (end == undefined) end = self.length; - - var big = new self.construct(end - start); - var ix = 0; - self.forEach(function (buffer) { - if (start < (ix + buffer.length) && ix < end) { - // at least partially contained in the range - buffer.copy( - big, - Math.max(0, ix - start), - Math.max(0, start - ix), - Math.min(buffer.length, end - ix) - ); - } - ix += buffer.length; - if (ix > end) return true; // stop processing past end - }); - - return big; - }; - - self.joinInto = function (targetBuffer, targetStart, sourceStart, sourceEnd) { - if (!head.buffer) return new self.construct(0); - if (sourceStart == undefined) sourceStart = 0; - if (sourceEnd == undefined) sourceEnd = self.length; - - var big = targetBuffer; - if (big.length - targetStart < sourceEnd - sourceStart) { - throw new Error("Insufficient space available in target Buffer."); - } - var ix = 0; - self.forEach(function (buffer) { - if (sourceStart < (ix + buffer.length) && ix < sourceEnd) { - // at least partially contained in the range - buffer.copy( - big, - Math.max(targetStart, targetStart + ix - sourceStart), - Math.max(0, sourceStart - ix), - Math.min(buffer.length, sourceEnd - ix) - ); - } - ix += buffer.length; - if (ix > sourceEnd) return true; // stop processing past end - }); - - return big; - }; - - // Advance the buffer stream by n bytes. - // If n the aggregate advance offset passes the end of the buffer list, - // operations such as .take() will return empty strings until enough data is - // pushed. - // Returns this (self). - self.advance = function (n) { - offset += n; - length -= n; - while (head.buffer && offset >= head.buffer.length) { - offset -= head.buffer.length; - head = head.next - ? head.next - : { buffer : null, next : null } - ; - } - if (head.buffer === null) last = { next : null, buffer : null }; - self.emit('advance', n); - return self; - }; - - // Take n bytes from the start of the buffers. - // Returns a string. - // If there are less than n bytes in all the buffers or n is undefined, - // returns the entire concatenated buffer string. - self.take = function (n, encoding) { - if (n == undefined) n = self.length; - else if (typeof n !== 'number') { - encoding = n; - n = self.length; - } - var b = head; - if (!encoding) encoding = self.encoding; - if (encoding) { - var acc = ''; - self.forEach(function (buffer) { - if (n <= 0) return true; - acc += buffer.toString( - encoding, 0, Math.min(n,buffer.length) - ); - n -= buffer.length; - }); - return acc; - } else { - // If no 'encoding' is specified, then return a Buffer. - return self.join(0, n); - } - }; - - // The entire concatenated buffer as a string. - self.toString = function () { - return self.take('binary'); - }; -} -require('util').inherits(BufferList, EventEmitter); diff --git a/deploy/node_modules/yaeti/.jscsrc b/deploy/node_modules/yaeti/.jscsrc deleted file mode 100644 index a37d119..0000000 --- a/deploy/node_modules/yaeti/.jscsrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "preset": "crockford", - "validateIndentation": "\t", - "disallowKeywords": ["with"], - "disallowDanglingUnderscores": null -} diff --git a/deploy/node_modules/yaeti/.jshintrc b/deploy/node_modules/yaeti/.jshintrc deleted file mode 100644 index 1cca0fa..0000000 --- a/deploy/node_modules/yaeti/.jshintrc +++ /dev/null @@ -1,27 +0,0 @@ -{ - "bitwise": false, - "curly": true, - "eqeqeq": true, - "forin": true, - "freeze": true, - "latedef": "function", - "noarg": true, - "nonbsp": true, - "nonew": true, - "plusplus": false, - "undef": true, - "unused": true, - "strict": false, - "maxparams": 6, - "maxdepth": 4, - "maxstatements": false, - "maxlen": 200, - "browser": true, - "browserify": true, - "devel": true, - "jquery": false, - "mocha": true, - "node": false, - "shelljs": false, - "worker": false -} diff --git a/deploy/node_modules/yaeti/.npmignore b/deploy/node_modules/yaeti/.npmignore deleted file mode 100644 index 2ccbe46..0000000 --- a/deploy/node_modules/yaeti/.npmignore +++ /dev/null @@ -1 +0,0 @@ -/node_modules/ diff --git a/deploy/node_modules/yaeti/LICENSE b/deploy/node_modules/yaeti/LICENSE deleted file mode 100644 index a64a412..0000000 --- a/deploy/node_modules/yaeti/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Iñaki Baz Castillo, - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/deploy/node_modules/yaeti/README.md b/deploy/node_modules/yaeti/README.md deleted file mode 100644 index db253a4..0000000 --- a/deploy/node_modules/yaeti/README.md +++ /dev/null @@ -1,98 +0,0 @@ -# yaeti - -Yet Another [EventTarget](https://developer.mozilla.org/es/docs/Web/API/EventTarget) Implementation. - -The library exposes both the [EventTarget](https://developer.mozilla.org/es/docs/Web/API/EventTarget) interface and the [Event](https://developer.mozilla.org/en-US/docs/Web/API/Event) interface. - - -## Installation - -```bash -$ npm install yaeti --save -``` - - -## Usage - -```javascript -var yaeti = require('yaeti'); - - -// Custom class we want to make an EventTarget. -function Foo() { - // Make Foo an EventTarget. - yaeti.EventTarget.call(this); -} - -// Create an instance. -var foo = new Foo(); - -function listener1() { - console.log('listener1'); -} - -function listener2() { - console.log('listener2'); -} - -foo.addEventListener('bar', listener1); -foo.addEventListener('bar', listener2); -foo.removeEventListener('bar', listener1); - -var event = new yaeti.Event('bar'); - -foo.dispatchEvent(event); - - -// Output: -// => "listener2" -``` - - - -## API - - -#### `yaeti.EventTarget` interface - -Implementation of the [EventTarget](https://developer.mozilla.org/es/docs/Web/API/EventTarget) interface. - -* Make a custom class inherit from `EventTarget`: -```javascript -function Foo() { - yaeti.EventTarget.call(this); -} -``` - -* Make an existing object an `EventTarget`: -```javascript -yaeti.EventTarget.call(obj); -``` - -The interface implements the `addEventListener`, `removeEventListener` and `dispatchEvent` methods as defined by the W3C. - - -##### `listeners` read-only property - -Returns an object whose keys are configured event types (String) and whose values are an array of listeners (functions) for those event types. - - -#### `yaeti.Event` interface - -Implementation of the [Event](https://developer.mozilla.org/en-US/docs/Web/API/Event) interface. - -*NOTE:* Just useful in Node (the browser already exposes the native `Event` interface). - -```javascript -var event = new yaeti.Event('bar'); -``` - - -## Author - -[Iñaki Baz Castillo](https://github.com/ibc) - - -## License - -[MIT](./LICENSE) diff --git a/deploy/node_modules/yaeti/gulpfile.js b/deploy/node_modules/yaeti/gulpfile.js deleted file mode 100644 index 294cd9c..0000000 --- a/deploy/node_modules/yaeti/gulpfile.js +++ /dev/null @@ -1,23 +0,0 @@ -var - /** - * Dependencies. - */ - gulp = require('gulp'), - jscs = require('gulp-jscs'), - jshint = require('gulp-jshint'), - stylish = require('gulp-jscs-stylish'); - - -gulp.task('lint', function () { - var src = ['gulpfile.js', 'index.js', 'lib/**/*.js']; - - return gulp.src(src) - .pipe(jshint('.jshintrc')) // Enforce good practics. - .pipe(jscs('.jscsrc')) // Enforce style guide. - .pipe(stylish.combineWithHintResults()) - .pipe(jshint.reporter('jshint-stylish', {verbose: true})) - .pipe(jshint.reporter('fail')); -}); - - -gulp.task('default', gulp.task('lint')); diff --git a/deploy/node_modules/yaeti/index.js b/deploy/node_modules/yaeti/index.js deleted file mode 100644 index b1e6db4..0000000 --- a/deploy/node_modules/yaeti/index.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - EventTarget : require('./lib/EventTarget'), - Event : require('./lib/Event') -}; diff --git a/deploy/node_modules/yaeti/lib/Event.browser.js b/deploy/node_modules/yaeti/lib/Event.browser.js deleted file mode 100644 index 0cd5ea6..0000000 --- a/deploy/node_modules/yaeti/lib/Event.browser.js +++ /dev/null @@ -1,5 +0,0 @@ -/** - * In browsers export the native Event interface. - */ - -module.exports = global.Event; diff --git a/deploy/node_modules/yaeti/lib/Event.js b/deploy/node_modules/yaeti/lib/Event.js deleted file mode 100644 index cd245a2..0000000 --- a/deploy/node_modules/yaeti/lib/Event.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Expose the Event class. - */ -module.exports = _Event; - - -function _Event(type) { - this.type = type; - this.isTrusted = false; - - // Set a flag indicating this is not a DOM Event object - this._yaeti = true; -} diff --git a/deploy/node_modules/yaeti/lib/EventTarget.js b/deploy/node_modules/yaeti/lib/EventTarget.js deleted file mode 100644 index 403c75b..0000000 --- a/deploy/node_modules/yaeti/lib/EventTarget.js +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Expose the _EventTarget class. - */ -module.exports = _EventTarget; - -function _EventTarget() { - // Do nothing if called for a native EventTarget object.. - if (typeof this.addEventListener === 'function') { - return; - } - - this._listeners = {}; - - this.addEventListener = _addEventListener; - this.removeEventListener = _removeEventListener; - this.dispatchEvent = _dispatchEvent; -} - -Object.defineProperties(_EventTarget.prototype, { - listeners: { - get: function () { - return this._listeners; - } - } -}); - -function _addEventListener(type, newListener) { - var - listenersType, - i, listener; - - if (!type || !newListener) { - return; - } - - listenersType = this._listeners[type]; - if (listenersType === undefined) { - this._listeners[type] = listenersType = []; - } - - for (i = 0; !!(listener = listenersType[i]); i++) { - if (listener === newListener) { - return; - } - } - - listenersType.push(newListener); -} - -function _removeEventListener(type, oldListener) { - var - listenersType, - i, listener; - - if (!type || !oldListener) { - return; - } - - listenersType = this._listeners[type]; - if (listenersType === undefined) { - return; - } - - for (i = 0; !!(listener = listenersType[i]); i++) { - if (listener === oldListener) { - listenersType.splice(i, 1); - break; - } - } - - if (listenersType.length === 0) { - delete this._listeners[type]; - } -} - -function _dispatchEvent(event) { - var - type, - listenersType, - dummyListener, - stopImmediatePropagation = false, - i, listener; - - if (!event || typeof event.type !== 'string') { - throw new Error('`event` must have a valid `type` property'); - } - - // Do some stuff to emulate DOM Event behavior (just if this is not a - // DOM Event object) - if (event._yaeti) { - event.target = this; - event.cancelable = true; - } - - // Attempt to override the stopImmediatePropagation() method - try { - event.stopImmediatePropagation = function () { - stopImmediatePropagation = true; - }; - } catch (error) {} - - type = event.type; - listenersType = (this._listeners[type] || []); - - dummyListener = this['on' + type]; - if (typeof dummyListener === 'function') { - dummyListener.call(this, event); - } - - for (i = 0; !!(listener = listenersType[i]); i++) { - if (stopImmediatePropagation) { - break; - } - - listener.call(this, event); - } - - return !event.defaultPrevented; -} diff --git a/deploy/node_modules/yaeti/package.json b/deploy/node_modules/yaeti/package.json deleted file mode 100644 index acdf98f..0000000 --- a/deploy/node_modules/yaeti/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "_from": "yaeti@^0.0.6", - "_id": "yaeti@0.0.6", - "_inBundle": false, - "_integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", - "_location": "/yaeti", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "yaeti@^0.0.6", - "name": "yaeti", - "escapedName": "yaeti", - "rawSpec": "^0.0.6", - "saveSpec": null, - "fetchSpec": "^0.0.6" - }, - "_requiredBy": [ - "/websocket" - ], - "_resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "_shasum": "f26f484d72684cf42bedfb76970aa1608fbf9577", - "_spec": "yaeti@^0.0.6", - "_where": "/Users/prophesi/Projects/websocket-kinect/deploy/node_modules/websocket", - "author": { - "name": "Iñaki Baz Castillo", - "email": "ibc@aliax.net" - }, - "browser": { - "./lib/Event.js": "./lib/Event.browser.js" - }, - "bugs": { - "url": "https://github.com/ibc/yaeti/issues" - }, - "bundleDependencies": false, - "deprecated": false, - "description": "Yet Another EventTarget Implementation", - "devDependencies": { - "gulp": "git+https://github.com/gulpjs/gulp.git#4.0", - "gulp-jscs": "^1.6.0", - "gulp-jscs-stylish": "^1.1.0", - "gulp-jshint": "^1.11.2", - "jshint-stylish": "~1.0.2" - }, - "engines": { - "node": ">=0.10.32" - }, - "homepage": "https://github.com/ibc/yaeti#readme", - "license": "MIT", - "main": "index.js", - "name": "yaeti", - "repository": { - "type": "git", - "url": "git+https://github.com/ibc/yaeti.git" - }, - "version": "0.0.6" -} diff --git a/server/INSTALL.txt b/server/INSTALL.txt index 67b1041..6088d08 100644 --- a/server/INSTALL.txt +++ b/server/INSTALL.txt @@ -12,8 +12,8 @@ sudo easy_install pip ### Mac Sierra may need to use sudo -H pip install [library] sudo pip install cython sudo pip install numpy -sudo pip install autobahn -sudo pip install twisted +sudo pip install autobahn==0.5.14 +sudo pip install twisted==11.0 ### Sierra may also need SSL upgraded, else Twisted raises an error sudo pip install --upgrade pyopenssl sudo pip install service_identity