Вход Регистрация
Файл: Space race/libs/Three.dev.js
Строк: 14355
<?php
// Three.js - http://github.com/mrdoob/three.js
'use strict';
var 
THREE = THREE || {
    
REVISION: "50dev"
};
self.console || (self.console = {
    
info: function() {},
    
log: function() {},
    
debug: function() {},
    
warn: function() {},
    
error: function() {}
});
self.Int32Array || (self.Int32Array = Array, self.Float32Array = Array);
(function() {
    for (var 
a = 0, b = ["ms", "moz", "webkit", "o"], c = 0; c < b.length && !window.requestAnimationFrame; ++c) {
        
window.requestAnimationFrame = window[b[c] + "RequestAnimationFrame"];
        
window.cancelAnimationFrame = window[b[c] + "CancelAnimationFrame"] || window[b[c] + "CancelRequestAnimationFrame"]
    }
    if (!
window.requestAnimationFrame) window.requestAnimationFrame = function(b) {
        var 
c = Date.now(),
            
f = Math.max(0, 16 - (c - a)),
            
g = window.setTimeout(function() {
                
b(c + f)
            }, 
f);
        
a = c + f;
        return 
g
    
};
    if (!
window.cancelAnimationFrame) window.cancelAnimationFrame =
        function(
a) {
            
clearTimeout(a)
        }
})();
THREE.NoShading = 0;
THREE.FlatShading = 1;
THREE.SmoothShading = 2;
THREE.NoColors = 0;
THREE.FaceColors = 1;
THREE.VertexColors = 2;
THREE.NoBlending = 0;
THREE.NormalBlending = 1;
THREE.AdditiveBlending = 2;
THREE.SubtractiveBlending = 3;
THREE.MultiplyBlending = 4;
THREE.CustomBlending = 5;
THREE.AddEquation = 100;
THREE.SubtractEquation = 101;
THREE.ReverseSubtractEquation = 102;
THREE.ZeroFactor = 200;
THREE.OneFactor = 201;
THREE.SrcColorFactor = 202;
THREE.OneMinusSrcColorFactor = 203;
THREE.SrcAlphaFactor = 204;
THREE.OneMinusSrcAlphaFactor = 205;
THREE.DstAlphaFactor = 206;
THREE.OneMinusDstAlphaFactor = 207;
THREE.DstColorFactor = 208;
THREE.OneMinusDstColorFactor = 209;
THREE.SrcAlphaSaturateFactor = 210;
THREE.MultiplyOperation = 0;
THREE.MixOperation = 1;
THREE.UVMapping = function() {};
THREE.CubeReflectionMapping = function() {};
THREE.CubeRefractionMapping = function() {};
THREE.SphericalReflectionMapping = function() {};
THREE.SphericalRefractionMapping = function() {};
THREE.RepeatWrapping = 1E3;
THREE.ClampToEdgeWrapping = 1001;
THREE.MirroredRepeatWrapping = 1002;
THREE.NearestFilter = 1003;
THREE.NearestMipMapNearestFilter = 1004;
THREE.NearestMipMapLinearFilter = 1005;
THREE.LinearFilter = 1006;
THREE.LinearMipMapNearestFilter = 1007;
THREE.LinearMipMapLinearFilter = 1008;
THREE.UnsignedByteType = 1009;
THREE.ByteType = 1010;
THREE.ShortType = 1011;
THREE.UnsignedShortType = 1012;
THREE.IntType = 1013;
THREE.UnsignedIntType = 1014;
THREE.FloatType = 1015;
THREE.UnsignedShort4444Type = 1016;
THREE.UnsignedShort5551Type = 1017;
THREE.UnsignedShort565Type = 1018;
THREE.AlphaFormat = 1019;
THREE.RGBFormat = 1020;
THREE.RGBAFormat = 1021;
THREE.LuminanceFormat = 1022;
THREE.LuminanceAlphaFormat = 1023;
THREE.Clock = function(a) {
    
this.autoStart = a !== void 0 ? a : true;
    
this.elapsedTime = this.oldTime = this.startTime = 0;
    
this.running = false
};
THREE.Clock.prototype.start = function() {
    
this.oldTime = this.startTime = Date.now();
    
this.running = true
};
THREE.Clock.prototype.stop = function() {
    
this.getElapsedTime();
    
this.running = false
};
THREE.Clock.prototype.getElapsedTime = function() {
    return 
this.elapsedTime = this.elapsedTime + this.getDelta()
};
THREE.Clock.prototype.getDelta = function() {
    var 
a = 0;
    
this.autoStart && !this.running && this.start();
    if (
this.running) {
        var 
b = Date.now(),
            
a = 0.0010 * (b - this.oldTime);
        
this.oldTime = b;
        
this.elapsedTime = this.elapsedTime + a
    
}
    return 
a
};
THREE.Color = function(a) {
    
a !== void 0 && this.setHex(a);
    return 
this
};
THREE.Color.prototype = {
    
constructor: THREE.Color,
    
r: 1,
    
g: 1,
    
b: 1,
    
copy: function(a) {
        
this.r = a.r;
        
this.g = a.g;
        
this.b = a.b;
        return 
this
    
},
    
copyGammaToLinear: function(a) {
        
this.r = a.r * a.r;
        
this.g = a.g * a.g;
        
this.b = a.b * a.b;
        return 
this
    
},
    
copyLinearToGamma: function(a) {
        
this.r = Math.sqrt(a.r);
        
this.g = Math.sqrt(a.g);
        
this.b = Math.sqrt(a.b);
        return 
this
    
},
    
convertGammaToLinear: function() {
        var 
a = this.r,
            
b = this.g,
            
c = this.b;
        
this.r = a * a;
        
this.g = b * b;
        
this.b = c * c;
        return 
this
    
},
    
convertLinearToGamma: function() {
        
this.r = Math.sqrt(this.r);
        
this.g = Math.sqrt(this.g);
        
this.b = Math.sqrt(this.b);
        return 
this
    
},
    
setRGB: function(a, b, c) {
        
this.r = a;
        
this.g = b;
        
this.b = c;
        return 
this
    
},
    
setHSV: function(a, b, c) {
        var 
d, e, f;
        if (
c === 0) this.r = this.g = this.b = 0;
        else {
            
d = Math.floor(a * 6);
            
e = a * 6 - d;
            
a = c * (1 - b);
            
f = c * (1 - b * e);
            
b = c * (1 - b * (1 - e));
            if (
d === 0) {
                
this.r = c;
                
this.g = b;
                
this.b = a
            
} else if (d === 1) {
                
this.r = f;
                
this.g = c;
                
this.b = a
            
} else if (d === 2) {
                
this.r = a;
                
this.g = c;
                
this.b = b
            
} else if (d === 3) {
                
this.r = a;
                
this.g = f;
                
this.b = c
            
} else if (d === 4) {
                
this.r = b;
                
this.g = a;
                
this.b = c
            
} else if (d === 5) {
                
this.r = c;
                
this.g = a;
                
this.b = f
            
}
        }
        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
    
},
    
lerpSelf: function(a, b) {
        
this.r = this.r + (a.r - this.r) * b;
        
this.g = this.g + (a.g - this.g) * b;
        
this.b = this.b + (a.b - this.b) * b;
        return 
this
    
},
    
getHex: function() {
        return 
Math.floor(this.r * 255) << 16 ^ Math.floor(this.g * 255) << 8 ^ Math.floor(this.b * 255)
    },
    
getContextStyle: function() {
        return 
"rgb(" + Math.floor(this.r * 255) + "," + Math.floor(this.g * 255) + "," + Math.floor(this.b * 255) + ")"
    
},
    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
    
},
    
add: function(a, b) {
        
this.x = a.x + b.x;
        
this.y = a.y + b.y;
        return 
this
    
},
    
addSelf: function(a) {
        
this.x = this.x + a.x;
        
this.y = 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 = this.x - a.x;
        
this.y = this.y - a.y;
        return 
this
    
},
    
multiplyScalar: function(a) {
        
this.x = this.x * a;
        
this.y = this.y * a;
        return 
this
    
},
    
divideScalar: function(a) {
        if (
a) {
            
this.x =
                
this.x / a;
            
this.y = this.y / a
        
} else 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)
    },
    
lerpSelf: function(a, b) {
        
this.x = this.x + (a.x - this.x) * b;
        
this.y = this.y + (a.y - this.y) * b;
        return 
this
    
},
    
equals: function(a) {
        return 
a.x === this.x && a.y === this.y
    
},
    
isZero: function() {
        return 
this.lengthSq() < 1.0E-4
    
},
    clone: function() {
        return new 
THREE.Vector2(this.x, 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
    
},
    
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 = this.x + a.x;
        
this.y = this.y + a.y;
        
this.z = this.z + a.z;
        return 
this
    
},
    
addScalar: function(a) {
        
this.x = this.x + a;
        
this.y = this.y +
            
a;
        
this.z = 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 = this.x - a.x;
        
this.y = this.y - a.y;
        
this.z = 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 = this.x * a.x;
        
this.y = this.y * a.y;
        
this.z = this.z * a.z;
        return 
this
    
},
    
multiplyScalar: function(a) {
        
this.x = this.x * a;
        
this.y = this.y * a;
        
this.z = this.z * a;
        return 
this
    
},
    
divideSelf: function(a) {
        
this.x = this.x / a.x;
        
this.y =
            
this.y / a.y;
        
this.z = this.z / a.z;
        return 
this
    
},
    
divideScalar: function(a) {
        if (
a) {
            
this.x = this.x / a;
            
this.y = this.y / a;
            
this.z = this.z / a
        
} else 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 
Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z)
    },
    
normalize: function() {
        return 
this.divideScalar(this.length())
    },
    
setLength: function(a) {
        return 
this.normalize().multiplyScalar(a)
    },
    
lerpSelf: function(a, b) {
        
this.x = this.x + (a.x - this.x) * b;
        
this.y = this.y + (a.y - this.y) * b;
        
this.z = this.z + (a.z - this.z) * b;
        return 
this
    
},
    
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()
    },
    
getPositionFromMatrix: function(a) {
        
this.x = a.elements[12];
        
this.y = a.elements[13];
        
this.z = a.elements[14];
        return 
this
    
},
    
setEulerFromRotationMatrix: function(a, b) {
        function 
c(a) {
            return 
Math.min(Math.max(a, -1), 1)
        }
        var 
d = a.elements,
            
e = d[0],
            
f = d[4],
            
g = d[8],
            
h = d[1],
            
i = d[5],
            
j = d[9],
            
l = d[2],
            
m = d[6],
            
d = d[10];
        if (
b === void 0 || b === "XYZ") {
            
this.y = Math.asin(c(g));
            if (
Math.abs(g) < 0.99999) {
                
this.x = Math.atan2(-j, d);
                
this.z = Math.atan2(-f, e)
            } else {
                
this.x = Math.atan2(h, i);
                
this.z = 0
            
}
        } else if (
b === "YXZ") {
            
this.x = Math.asin(-c(j));
            if (
Math.abs(j) <
                
0.99999) {
                
this.y = Math.atan2(g, d);
                
this.z = Math.atan2(h, i)
            } else {
                
this.y = Math.atan2(-l, e);
                
this.z = 0
            
}
        } else if (
b === "ZXY") {
            
this.x = Math.asin(c(m));
            if (
Math.abs(m) < 0.99999) {
                
this.y = Math.atan2(-l, d);
                
this.z = Math.atan2(-f, i)
            } else {
                
this.y = 0;
                
this.z = Math.atan2(g, e)
            }
        } else if (
b === "ZYX") {
            
this.y = Math.asin(-c(l));
            if (
Math.abs(l) < 0.99999) {
                
this.x = Math.atan2(m, d);
                
this.z = Math.atan2(h, e)
            } else {
                
this.x = 0;
                
this.z = Math.atan2(-f, i)
            }
        } else if (
b === "YZX") {
            
this.z = Math.asin(c(h));
            if (
Math.abs(h) < 0.99999) {
                
this.x = Math.atan2(-j, i);
                
this.y = Math.atan2(-l,
                    
e)
            } else {
                
this.x = 0;
                
this.y = Math.atan2(l, d)
            }
        } else if (
b === "XZY") {
            
this.z = Math.asin(-c(f));
            if (
Math.abs(f) < 0.99999) {
                
this.x = Math.atan2(m, i);
                
this.y = Math.atan2(g, e)
            } else {
                
this.x = Math.atan2(-g, d);
                
this.y = 0
            
}
        }
        return 
this
    
},
    
setEulerFromQuaternion: function(a, b) {
        function 
c(a) {
            return 
Math.min(Math.max(a, -1), 1)
        }
        var 
d = a.x * a.x,
            
e = a.y * a.y,
            
f = a.z * a.z,
            
g = a.w * a.w;
        if (
b === void 0 || b === "XYZ") {
            
this.x = Math.atan2(2 * (a.x * a.w - a.y * a.z), g - d - e + f);
            
this.y = Math.asin(c(2 * (a.x * a.z + a.y * a.w)));
            
this.z = Math.atan2(2 * (a.z * a.w - a.x * a.y), g + d - e - f)
        } else if (
b ===
            
"YXZ") {
            
this.x = Math.asin(c(2 * (a.x * a.w - a.y * a.z)));
            
this.y = Math.atan2(2 * (a.x * a.z + a.y * a.w), g - d - e + f);
            
this.z = Math.atan2(2 * (a.x * a.y + a.z * a.w), g - d + e - f)
        } else if (
b === "ZXY") {
            
this.x = Math.asin(c(2 * (a.x * a.w + a.y * a.z)));
            
this.y = Math.atan2(2 * (a.y * a.w - a.z * a.x), g - d - e + f);
            
this.z = Math.atan2(2 * (a.z * a.w - a.x * a.y), g - d + e - f)
        } else if (
b === "ZYX") {
            
this.x = Math.atan2(2 * (a.x * a.w + a.z * a.y), g - d - e + f);
            
this.y = Math.asin(c(2 * (a.y * a.w - a.x * a.z)));
            
this.z = Math.atan2(2 * (a.x * a.y + a.z * a.w), g + d - e - f)
        } else if (
b === "YZX") {
            
this.x = Math.atan2(2 * (a.x * a.w - a.z *
                
a.y), g - d + e - f);
            
this.y = Math.atan2(2 * (a.y * a.w - a.x * a.z), g + d - e - f);
            
this.z = Math.asin(c(2 * (a.x * a.y + a.z * a.w)))
        } else if (
b === "XZY") {
            
this.x = Math.atan2(2 * (a.x * a.w + a.y * a.z), g - d + e - f);
            
this.y = Math.atan2(2 * (a.x * a.z + a.y * a.w), g + d - e - f);
            
this.z = Math.asin(c(2 * (a.z * a.w - a.x * a.y)))
        }
        return 
this
    
},
    
getScaleFromMatrix: function(a) {
        var 
b = this.set(a.elements[0], a.elements[1], a.elements[2]).length(),
            
c = this.set(a.elements[4], a.elements[5], a.elements[6]).length(),
            
a = this.set(a.elements[8], a.elements[9], a.elements[10]).length();
        
this.x =
            
b;
        
this.y = c;
        
this.z = a;
        return 
this
    
},
    
equals: function(a) {
        return 
a.x === this.x && a.y === this.y && a.z === this.z
    
},
    
isZero: function() {
        return 
this.lengthSq() < 1.0E-4
    
},
    clone: function() {
        return new 
THREE.Vector3(this.x, this.y, this.z)
    }
};
THREE.Vector4 = function(a, b, c, d) {
    
this.x = a || 0;
    
this.y = b || 0;
    
this.z = c || 0;
    
this.w = d !== void 0 ? 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 = a.w !== void 0 ? a.w : 1;
        return 
this
    
},
    
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 = this.x + a.x;
        
this.y = this.y + a.y;
        
this.z = this.z + a.z;
        
this.w = 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 =
            
this.x - a.x;
        
this.y = this.y - a.y;
        
this.z = this.z - a.z;
        
this.w = this.w - a.w;
        return 
this
    
},
    
multiplyScalar: function(a) {
        
this.x = this.x * a;
        
this.y = this.y * a;
        
this.z = this.z * a;
        
this.w = this.w * a;
        return 
this
    
},
    
divideScalar: function(a) {
        if (
a) {
            
this.x = this.x / a;
            
this.y = this.y / a;
            
this.z = this.z / a;
            
this.w = this.w / a
        
} else {
            
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 = this.x + (a.x - this.x) * b;
        
this.y = this.y + (a.y - this.y) * b;
        
this.z = this.z + (a.z - this.z) * b;
        
this.w = this.w + (a.w - this.w) * b;
        return 
this
    
},
    clone: function() {
        return new 
THREE.Vector4(this.x, this.y, this.z, this.w)
    },
    
setAxisAngleFromQuaternion: function(a) {
        
this.w = 2 * Math.acos(a.w);
        var 
b = Math.sqrt(1 - a.w * a.w);
        if (
b < 1.0E-4) {
            
this.x = 1;
            
this.z = this.y = 0
        
} else {
            
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,
            
e = a[0];
        
d = a[4];
        var 
f = a[8],
            
g = a[1],
            
h = a[5],
            
i = a[9];
        
c = a[2];
        
b = a[6];
        var 
j = a[10];
        if (
Math.abs(d - g) < 0.01 && Math.abs(f - c) < 0.01 && Math.abs(i - b) < 0.01) {
            if (
Math.abs(d + g) < 0.1 && Math.abs(f + c) < 0.1 && Math.abs(i + b) < 0.1 && Math.abs(e + h + j - 3) < 0.1) {
                
this.set(1, 0, 0, 0);
                return 
this
            
}
            
a = Math.PI;
            
e = (e + 1) / 2;
            
h = (h + 1) / 2;
            
j = (j + 1) / 2;
            
d = (d + g) / 4;
            
f = (f + c) / 4;
            
i = (i + b) / 4;
            if (
e > h && e > j)
                if (
e < 0.01) {
                    
b = 0;
                    
d = c = 0.707106781
                
} else {
                    
b = Math.sqrt(e);
                    
c = d / b;
                    
d = f / b
                
} else if (h >
                
j)
                if (
h < 0.01) {
                    
b = 0.707106781;
                    
c = 0;
                    
d = 0.707106781
                
} else {
                    
c = Math.sqrt(h);
                    
b = d / c;
                    
d = i / c
                
} else if (j < 0.01) {
                
c = b = 0.707106781;
                
d = 0
            
} else {
                
d = Math.sqrt(j);
                
b = f / d;
                
c = i / d
            
}
            
this.set(b, c, d, a);
            return 
this
        
}
        
a = Math.sqrt((b - i) * (b - i) + (f - c) * (f - c) + (g - d) * (g - d));
        
Math.abs(a) < 0.0010 && (a = 1);
        
this.x = (b - i) / a;
        
this.y = (f - c) / a;
        
this.z = (g - d) / a;
        
this.w = Math.acos((e + h + j - 1) / 2);
        return 
this
    
}
};
THREE.EventTarget = function() {
    var 
a = {};
    
this.addEventListener = function(b, c) {
        
a[b] === void 0 && (a[b] = []);
        
a[b].indexOf(c) === -1 && a[b].push(c)
    };
    
this.dispatchEvent = function(b) {
        for (var 
c in a[b.type]) a[b.type][c](b)
    };
    
this.removeEventListener = function(b, c) {
        var 
d = a[b].indexOf(c);
        
d !== -1 && a[b].splice(d, 1)
    }
};
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 = this.planes,
        
c = a.elements,
        
a = c[0],
        
d = c[1],
        
e = c[2],
        
f = c[3],
        
g = c[4],
        
h = c[5],
        
i = c[6],
        
j = c[7],
        
l = c[8],
        
m = c[9],
        
n = c[10],
        
p = c[11],
        
r = c[12],
        
o = c[13],
        
q = c[14],
        
c = c[15];
    
b[0].set(f - a, j - g, p - l, c - r);
    
b[1].set(f + a, j + g, p + l, c + r);
    
b[2].set(f + d, j + h, p + m, c + o);
    
b[3].set(f - d, j - h, p - m, c - o);
    
b[4].set(f - e, j - i, p - n, c - q);
    
b[5].set(f + e, j + i, p + n, c + q);
    for (
d = 0; d < 6; d++) {
        
a = b[d];
        
a.divideScalar(Math.sqrt(a.x * a.x + a.y * a.y + a.z * a.z))
    }
};
THREE.Frustum.prototype.contains = function(a) {
    for (var 
b = 0, c = this.planes, b = a.matrixWorld, d = b.elements, a = -a.geometry.boundingSphere.radius * b.getMaxScaleOnAxis(), e = 0; e < 6; e++) {
        
b = c[e].x * d[12] + c[e].y * d[13] + c[e].z * d[14] + c[e].w;
        if (
b <= a) return false
    
}
    return 
true
};
THREE.Frustum.__v1 = new THREE.Vector3;
THREE.Ray = function(a, b, c, d) {
    
this.origin = a || new THREE.Vector3;
    
this.direction = b || new THREE.Vector3;
    
this.near = c || 0;
    
this.far = d || Infinity;
    var 
e = new THREE.Vector3,
        
f = new THREE.Vector3,
        
g = new THREE.Vector3,
        
h = new THREE.Vector3,
        
i = new THREE.Vector3,
        
j = new THREE.Vector3,
        
l = new THREE.Vector3,
        
m = new THREE.Vector3,
        
n = new THREE.Vector3,
        
p = function(a, b) {
            return 
a.distance - b.distance
        
},
        
r = new THREE.Vector3,
        
o = new THREE.Vector3,
        
q = new THREE.Vector3,
        
s, w, t, v = function(a, b, c) {
            
r.sub(c, a);
            
s = r.dot(b);
            
w = o.add(a, q.copy(b).multiplyScalar(s));
            return 
t = c.distanceTo(w)
        },
        
x, C, D, z, u, G, J, M, O = function(a, b, c, d) {
            
r.sub(d, b);
            
o.sub(c, b);
            
q.sub(a, b);
            
x = r.dot(r);
            
C = r.dot(o);
            
D = r.dot(q);
            
z = o.dot(o);
            
u = o.dot(q);
            
G = 1 / (x * z - C * C);
            
J = (z * D - C * u) * G;
            
M = (x * u - C * D) * G;
            return 
J >= 0 && M >= 0 && J + M < 1
        
},
        
X = 1.0E-4;
    
this.setPrecision = function(a) {
        
X = a
    
};
    
this.intersectObject = function(a, b) {
        var 
c, d = [];
        if (
b === true)
            for (var 
o = 0, r = a.children.length; o < r; o++) Array.prototype.push.apply(d, this.intersectObject(a.children[o], b));
        if (
a instanceof THREE.Particle) {
            
t = v(this.origin, this.direction, a.matrixWorld.getPosition());
            if (
t > a.scale.x) return [];
            
c = {
                
distance: t,
                
point: a.position,
                
face: null,
                
object: a
            
};
            
d.push(c)
        } else if (
a instanceof THREE.Mesh) {
            
o = THREE.Frustum.__v1.set(a.matrixWorld.getColumnX().length(), a.matrixWorld.getColumnY().length(), a.matrixWorld.getColumnZ().length());
            
o = a.geometry.boundingSphere.radius * Math.max(o.x, Math.max(o.y, o.z));
            
t = v(this.origin, this.direction, a.matrixWorld.getPosition());
            if (
t > o) return d;
            var 
q, s, u = a.geometry,
                
w = u.vertices,
                
x;
            
a.matrixRotationWorld.extractRotation(a.matrixWorld);
            
o = 0;
            for (
r = u.faces.length; o <
                
r; o++) {
                
c = u.faces[o];
                
i.copy(this.origin);
                
j.copy(this.direction);
                
x = a.matrixWorld;
                
l = x.multiplyVector3(l.copy(c.centroid)).subSelf(i);
                
m = a.matrixRotationWorld.multiplyVector3(m.copy(c.normal));
                
q = j.dot(m);
                if (!(
Math.abs(q) < X)) {
                    
s = m.dot(l) / q;
                    if (!(
s < 0) && (a.doubleSided || (a.flipSided ? q > 0 : q < 0))) {
                        
n.add(i, j.multiplyScalar(s));
                        
t = i.distanceTo(n);
                        if (!(
t < this.near) && !(t > this.far))
                            if (
c instanceof THREE.Face3) {
                                
e = x.multiplyVector3(e.copy(w[c.a]));
                                
f = x.multiplyVector3(f.copy(w[c.b]));
                                
g = x.multiplyVector3(g.copy(w[c.c]));
                                if (
O(n, e, f, g)) {
                                    
c = {
                                        
distance: t,
                                        
point: n.clone(),
                                        
face: c,
                                        
object: a
                                    
};
                                    
d.push(c)
                                }
                            } else if (
c instanceof THREE.Face4) {
                            
e = x.multiplyVector3(e.copy(w[c.a]));
                            
f = x.multiplyVector3(f.copy(w[c.b]));
                            
g = x.multiplyVector3(g.copy(w[c.c]));
                            
h = x.multiplyVector3(h.copy(w[c.d]));
                            if (
O(n, e, f, h) || O(n, f, g, h)) {
                                
c = {
                                    
distance: t,
                                    
point: n.clone(),
                                    
face: c,
                                    
object: a
                                
};
                                
d.push(c)
                            }
                        }
                    }
                }
            }
        }
        
d.sort(p);
        return 
d
    
};
    
this.intersectObjects = function(a, b) {
        for (var 
c = [], d = 0, e = a.length; d < e; d++) Array.prototype.push.apply(c, this.intersectObject(a[d], b));
        
c.sort(p);
        return 
c
    
}
};
THREE.Rectangle = function() {
    function 
a() {
        
f = d - b;
        
g = e - c
    
}
    var 
b = 0,
        
c = 0,
        
d = 0,
        
e = 0,
        
f = 0,
        
g = 0,
        
h = true;
    
this.getX = function() {
        return 
b
    
};
    
this.getY = function() {
        return 
c
    
};
    
this.getWidth = function() {
        return 
f
    
};
    
this.getHeight = function() {
        return 
g
    
};
    
this.getLeft = function() {
        return 
b
    
};
    
this.getTop = function() {
        return 
c
    
};
    
this.getRight = function() {
        return 
d
    
};
    
this.getBottom = function() {
        return 
e
    
};
    
this.set = function(f, g, l, m) {
        
h = false;
        
b = f;
        
c = g;
        
d = l;
        
e = m;
        
a()
    };
    
this.addPoint = function(f, g) {
        if (
h === true) {
            
h = false;
            
b = f;
            
c = g;
            
d = f;
            
e = g
        
} else {
            
b = b < f ? b : f;
            
c = c < g ? c :
                
g;
            
d = d > f ? d : f;
            
e = e > g ? e : g
        
}
        
a()
    };
    
this.add3Points = function(f, g, l, m, n, p) {
        if (
h === true) {
            
h = false;
            
b = f < l ? f < n ? f : n : l < n ? l : n;
            
c = g < m ? g < p ? g : p : m < p ? m : p;
            
d = f > l ? f > n ? f : n : l > n ? l : n;
            
e = g > m ? g > p ? g : p : m > p ? m : p
        
} else {
            
b = f < l ? f < n ? f < b ? f : b : n < b ? n : b : l < n ? l < b ? l : b : n < b ? n : b;
            
c = g < m ? g < p ? g < c ? g : c : p < c ? p : c : m < p ? m < c ? m : c : p < c ? p : c;
            
d = f > l ? f > n ? f > d ? f : d : n > d ? n : d : l > n ? l > d ? l : d : n > d ? n : d;
            
e = g > m ? g > p ? g > e ? g : e : p > e ? p : e : m > p ? m > e ? m : e : p > e ? p : e
        
}
        
a()
    };
    
this.addRectangle = function(f) {
        if (
h === true) {
            
h = false;
            
b = f.getLeft();
            
c = f.getTop();
            
d = f.getRight();
            
e = f.getBottom()
        } else {
            
b = b < f.getLeft() ? b : f.getLeft();
            
c = c < f.getTop() ? c : f.getTop();
            
d = d > f.getRight() ? d : f.getRight();
            
e = e > f.getBottom() ? e : f.getBottom()
        }
        
a()
    };
    
this.inflate = function(f) {
        
b = b - f;
        
c = c - f;
        
d = d + f;
        
e = e + f;
        
a()
    };
    
this.minSelf = function(f) {
        
b = b > f.getLeft() ? b : f.getLeft();
        
c = c > f.getTop() ? c : f.getTop();
        
d = d < f.getRight() ? d : f.getRight();
        
e = e < f.getBottom() ? e : f.getBottom();
        
a()
    };
    
this.intersects = function(a) {
        return 
d < a.getLeft() || b > a.getRight() || e < a.getTop() || c > a.getBottom() ? false : true
    
};
    
this.empty = function() {
        
h = true;
        
e = d = c = b = 0;
        
a()
    };
    
this.isEmpty = function() {
        return 
h
    
}
};
THREE.Math = {
    
clamp: function(a, b, c) {
        return 
a < b ? b : a > c ? c : a
    
},
    
clampBottom: function(a, b) {
        return 
a < b ? b : a
    
},
    
mapLinear: function(a, b, c, d, e) {
        return 
d + (a - b) * (e - d) / (c - b)
    },
    
random16: function() {
        return (
65280 * Math.random() + 255 * Math.random()) / 65535
    
},
    
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 * (0.5 - Math.random())
    },
    
sign: function(a) {
        return 
a < 0 ? -1 : a > 0 ? 1 : 0
    
}
};
THREE.Matrix3 = function() {
    
this.elements = new Float32Array(9)
};
THREE.Matrix3.prototype = {
    
constructor: THREE.Matrix3,
    
getInverse: function(a) {
        var 
b = a.elements,
            
a = b[10] * b[5] - b[6] * b[9],
            
c = -b[10] * b[1] + b[2] * b[9],
            
d = b[6] * b[1] - b[2] * b[5],
            
e = -b[10] * b[4] + b[6] * b[8],
            
f = b[10] * b[0] - b[2] * b[8],
            
g = -b[6] * b[0] + b[2] * b[4],
            
h = b[9] * b[4] - b[5] * b[8],
            
i = -b[9] * b[0] + b[1] * b[8],
            
j = b[5] * b[0] - b[1] * b[4],
            
b = b[0] * a + b[1] * e + b[2] * h;
        
b === 0;
        var 
b = 1 / b,
            
l = this.elements;
        
l[0] = b * a;
        
l[1] = b * c;
        
l[2] = b * d;
        
l[3] = b * e;
        
l[4] = b * f;
        
l[5] = b * g;
        
l[6] = b * h;
        
l[7] = b * i;
        
l[8] = b * j;
        return 
this
    
},
    
transpose: function() {
        var 
a, b = this.elements;
        
a = b[1];
        
b[1] = b[3];
        
b[3] = a;
        
a = b[2];
        
b[2] = b[6];
        
b[6] = a;
        
a = b[5];
        
b[5] = b[7];
        
b[7] = a;
        return 
this
    
},
    
transposeIntoArray: function(a) {
        var 
b = this.m;
        
a[0] = b[0];
        
a[1] = b[3];
        
a[2] = b[6];
        
a[3] = b[1];
        
a[4] = b[4];
        
a[5] = b[7];
        
a[6] = b[2];
        
a[7] = b[5];
        
a[8] = b[8];
        return 
this
    
}
};
THREE.Matrix4 = function(a, b, c, d, e, f, g, h, i, j, l, m, n, p, r, o) {
    
this.elements = new Float32Array(16);
    
this.set(a !== void 0 ? a : 1, b || 0, c || 0, d || 0, e || 0, f !== void 0 ? f : 1, g || 0, h || 0, i || 0, j || 0, l !== void 0 ? l : 1, m || 0, n || 0, p || 0, r || 0, o !== void 0 ? o : 1)
};
THREE.Matrix4.prototype = {
    
constructor: THREE.Matrix4,
    
set: function(a, b, c, d, e, f, g, h, i, j, l, m, n, p, r, o) {
        var 
q = this.elements;
        
q[0] = a;
        
q[4] = b;
        
q[8] = c;
        
q[12] = d;
        
q[1] = e;
        
q[5] = f;
        
q[9] = g;
        
q[13] = h;
        
q[2] = i;
        
q[6] = j;
        
q[10] = l;
        
q[14] = m;
        
q[3] = n;
        
q[7] = p;
        
q[11] = r;
        
q[15] = o;
        return 
this
    
},
    
identity: function() {
        
this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
        return 
this
    
},
    
copy: function(a) {
        
a = a.elements;
        
this.set(a[0], a[4], a[8], a[12], a[1], a[5], a[9], a[13], a[2], a[6], a[10], a[14], a[3], a[7], a[11], a[15]);
        return 
this
    
},
    
lookAt: function(a, b, c) {
        var 
d = this.elements,
            
e = THREE.Matrix4.__v1,
            
f = THREE.Matrix4.__v2,
            
g = THREE.Matrix4.__v3;
        
g.sub(a, b).normalize();
        if (
g.length() === 0) g.z = 1;
        
e.cross(c, g).normalize();
        if (
e.length() === 0) {
            
g.x = g.x + 1.0E-4;
            
e.cross(c, g).normalize()
        }
        
f.cross(g, e);
        
d[0] = e.x;
        
d[4] = f.x;
        
d[8] = g.x;
        
d[1] = e.y;
        
d[5] = f.y;
        
d[9] = g.y;
        
d[2] = e.z;
        
d[6] = f.z;
        
d[10] = g.z;
        return 
this
    
},
    
multiply: function(a, b) {
        var 
c = a.elements,
            
d = b.elements,
            
e = this.elements,
            
f = c[0],
            
g = c[4],
            
h = c[8],
            
i = c[12],
            
j = c[1],
            
l = c[5],
            
m = c[9],
            
n = c[13],
            
p = c[2],
            
r = c[6],
            
o = c[10],
            
q = c[14],
            
s = c[3],
            
w = c[7],
            
t = c[11],
            
c = c[15],
            
v = d[0],
            
x = d[4],
            
C = d[8],
            
D = d[12],
            
z = d[1],
            
u = d[5],
            
G = d[9],
            
J = d[13],
            
M = d[2],
            
O = d[6],
            
X = d[10],
            
B = d[14],
            
F = d[3],
            
Q = d[7],
            
E = d[11],
            
d = d[15];
        
e[0] = f * v + g * z + h * M + i * F;
        
e[4] = f * x + g * u + h * O + i * Q;
        
e[8] = f * C + g * G + h * X + i * E;
        
e[12] = f * D + g * J + h * B + i * d;
        
e[1] = j * v + l * z + m * M + n * F;
        
e[5] = j * x + l * u + m * O + n * Q;
        
e[9] = j * C + l * G + m * X + n * E;
        
e[13] = j * D + l * J + m * B + n * d;
        
e[2] = p * v + r * z + o * M + q * F;
        
e[6] = p * x + r * u + o * O + q * Q;
        
e[10] = p * C + r * G + o * X + q * E;
        
e[14] = p * D + r * J + o * B + q * d;
        
e[3] = s * v + w * z + t * M + c * F;
        
e[7] = s * x + w * u + t * O + c * Q;
        
e[11] = s * C + w * G + t * X + c * E;
        
e[15] = s * D + w * J + t * B + c * d;
        return 
this
    
},
    
multiplySelf: function(a) {
        return 
this.multiply(this,
            
a)
    },
    
multiplyToArray: function(a, b, c) {
        var 
d = this.elements;
        
this.multiply(a, b);
        
c[0] = d[0];
        
c[1] = d[1];
        
c[2] = d[2];
        
c[3] = d[3];
        
c[4] = d[4];
        
c[5] = d[5];
        
c[6] = d[6];
        
c[7] = d[7];
        
c[8] = d[8];
        
c[9] = d[9];
        
c[10] = d[10];
        
c[11] = d[11];
        
c[12] = d[12];
        
c[13] = d[13];
        
c[14] = d[14];
        
c[15] = d[15];
        return 
this
    
},
    
multiplyScalar: function(a) {
        var 
b = this.elements;
        
b[0] = b[0] * a;
        
b[4] = b[4] * a;
        
b[8] = b[8] * a;
        
b[12] = b[12] * a;
        
b[1] = b[1] * a;
        
b[5] = b[5] * a;
        
b[9] = b[9] * a;
        
b[13] = b[13] * a;
        
b[2] = b[2] * a;
        
b[6] = b[6] * a;
        
b[10] = b[10] * a;
        
b[14] = b[14] * a;
        
b[3] = b[3] * a;
        
b[7] = b[7] * a;
        
b[11] = b[11] * a;
        
b[15] =
            
b[15] * a;
        return 
this
    
},
    
multiplyVector3: function(a) {
        var 
b = this.elements,
            
c = a.x,
            
d = a.y,
            
e = a.z,
            
f = 1 / (b[3] * c + b[7] * d + b[11] * e + b[15]);
        
a.x = (b[0] * c + b[4] * d + b[8] * e + b[12]) * f;
        
a.y = (b[1] * c + b[5] * d + b[9] * e + b[13]) * f;
        
a.z = (b[2] * c + b[6] * d + b[10] * e + b[14]) * f;
        return 
a
    
},
    
multiplyVector4: function(a) {
        var 
b = this.elements,
            
c = a.x,
            
d = a.y,
            
e = a.z,
            
f = a.w;
        
a.x = b[0] * c + b[4] * d + b[8] * e + b[12] * f;
        
a.y = b[1] * c + b[5] * d + b[9] * e + b[13] * f;
        
a.z = b[2] * c + b[6] * d + b[10] * e + b[14] * f;
        
a.w = b[3] * c + b[7] * d + b[11] * e + b[15] * f;
        return 
a
    
},
    
multiplyVector3Array: function(a) {
        for (var 
b = THREE.Matrix4.__v1,
                
c = 0, d = a.length; c < d; c = c + 3) {
            
b.x = a[c];
            
b.y = a[c + 1];
            
b.z = a[c + 2];
            
this.multiplyVector3(b);
            
a[c] = b.x;
            
a[c + 1] = b.y;
            
a[c + 2] = b.z
        
}
        return 
a
    
},
    
rotateAxis: function(a) {
        var 
b = this.elements,
            
c = a.x,
            
d = a.y,
            
e = a.z;
        
a.x = c * b[0] + d * b[4] + e * b[8];
        
a.y = c * b[1] + d * b[5] + e * b[9];
        
a.z = c * b[2] + d * b[6] + e * b[10];
        
a.normalize();
        return 
a
    
},
    
crossVector: function(a) {
        var 
b = this.elements,
            
c = new THREE.Vector4;
        
c.x = b[0] * a.x + b[4] * a.y + b[8] * a.z + b[12] * a.w;
        
c.y = b[1] * a.x + b[5] * a.y + b[9] * a.z + b[13] * a.w;
        
c.z = b[2] * a.x + b[6] * a.y + b[10] * a.z + b[14] * a.w;
        
c.w = a.w ? b[3] * a.x + b[7] * a.y + b[11] *
            
a.z + b[15] * a.w : 1;
        return 
c
    
},
    
determinant: function() {
        var 
a = this.elements,
            
b = a[0],
            
c = a[4],
            
d = a[8],
            
e = a[12],
            
f = a[1],
            
g = a[5],
            
h = a[9],
            
i = a[13],
            
j = a[2],
            
l = a[6],
            
m = a[10],
            
n = a[14],
            
p = a[3],
            
r = a[7],
            
o = a[11],
            
a = a[15];
        return 
e * h * l * p - d * i * l * p - e * g * m * p + c * i * m * p + d * g * n * p - c * h * n * p - e * h * j * r + d * i * j * r + e * f * m * r - b * i * m * r - d * f * n * r + b * h * n * r + e * g * j * o - c * i * j * o - e * f * l * o + b * i * l * o + c * f * n * o - b * g * n * o - d * g * j * a + c * h * j * a + d * f * l * a - b * h * l * a - c * f * m * a + b * g * m * a
    
},
    
transpose: function() {
        var 
a = this.elements,
            
b;
        
b = a[1];
        
a[1] = a[4];
        
a[4] = b;
        
b = a[2];
        
a[2] = a[8];
        
a[8] = b;
        
b = a[6];
        
a[6] = a[9];
        
a[9] = b;
        
b = a[3];
        
a[3] = a[12];
        
a[12] = b;
        
b = a[7];
        
a[7] = a[13];
        
a[13] = b;
        
b = a[11];
        
a[11] = a[14];
        
a[14] = b;
        return 
this
    
},
    
flattenToArray: function(a) {
        var 
b = this.elements;
        
a[0] = b[0];
        
a[1] = b[1];
        
a[2] = b[2];
        
a[3] = b[3];
        
a[4] = b[4];
        
a[5] = b[5];
        
a[6] = b[6];
        
a[7] = b[7];
        
a[8] = b[8];
        
a[9] = b[9];
        
a[10] = b[10];
        
a[11] = b[11];
        
a[12] = b[12];
        
a[13] = b[13];
        
a[14] = b[14];
        
a[15] = b[15];
        return 
a
    
},
    
flattenToArrayOffset: function(a, b) {
        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
    
},
    
getPosition: function() {
        var 
a = this.elements;
        return 
THREE.Matrix4.__v1.set(a[12], a[13], a[14])
    },
    
setPosition: function(a) {
        var 
b = this.elements;
        
b[12] = a.x;
        
b[13] = a.y;
        
b[14] = a.z;
        return 
this
    
},
    
getColumnX: function() {
        var 
a = this.elements;
        return 
THREE.Matrix4.__v1.set(a[0], a[1], a[2])
    },
    
getColumnY: function() {
        var 
a = this.elements;
        return 
THREE.Matrix4.__v1.set(a[4], a[5], a[6])
    },
    
getColumnZ: function() {
        var 
a = this.elements;
        return 
THREE.Matrix4.__v1.set(a[8],
            
a[9], a[10])
    },
    
getInverse: function(a) {
        var 
b = this.elements,
            
c = a.elements,
            
d = c[0],
            
e = c[4],
            
f = c[8],
            
g = c[12],
            
h = c[1],
            
i = c[5],
            
j = c[9],
            
l = c[13],
            
m = c[2],
            
n = c[6],
            
p = c[10],
            
r = c[14],
            
o = c[3],
            
q = c[7],
            
s = c[11],
            
c = c[15];
        
b[0] = j * r * q - l * p * q + l * n * s - i * r * s - j * n * c + i * p * c;
        
b[4] = g * p * q - f * r * q - g * n * s + e * r * s + f * n * c - e * p * c;
        
b[8] = f * l * q - g * j * q + g * i * s - e * l * s - f * i * c + e * j * c;
        
b[12] = g * j * n - f * l * n - g * i * p + e * l * p + f * i * r - e * j * r;
        
b[1] = l * p * o - j * r * o - l * m * s + h * r * s + j * m * c - h * p * c;
        
b[5] = f * r * o - g * p * o + g * m * s - d * r * s - f * m * c + d * p * c;
        
b[9] = g * j * o - f * l * o - g * h * s + d * l * s + f * h * c - d * j * c;
        
b[13] = f * l * m - g * j * m + g * h * p - d *
            
l * p - f * h * r + d * j * r;
        
b[2] = i * r * o - l * n * o + l * m * q - h * r * q - i * m * c + h * n * c;
        
b[6] = g * n * o - e * r * o - g * m * q + d * r * q + e * m * c - d * n * c;
        
b[10] = e * l * o - g * i * o + g * h * q - d * l * q - e * h * c + d * i * c;
        
b[14] = g * i * m - e * l * m - g * h * n + d * l * n + e * h * r - d * i * r;
        
b[3] = j * n * o - i * p * o - j * m * q + h * p * q + i * m * s - h * n * s;
        
b[7] = e * p * o - f * n * o + f * m * q - d * p * q - e * m * s + d * n * s;
        
b[11] = f * i * o - e * j * o - f * h * q + d * j * q + e * h * s - d * i * s;
        
b[15] = e * j * m - f * i * m + f * h * n - d * j * n - e * h * p + d * i * p;
        
this.multiplyScalar(1 / a.determinant());
        return 
this
    
},
    
setRotationFromEuler: function(a, b) {
        var 
c = this.elements,
            
d = a.x,
            
e = a.y,
            
f = a.z,
            
g = Math.cos(d),
            
d = Math.sin(d),
            
h = Math.cos(e),
            
e = Math.sin(e),
            
i = Math.cos(f),
            
f = Math.sin(f);
        if (
b === void 0 || b === "XYZ") {
            var 
j = g * i,
                
l = g * f,
                
m = d * i,
                
n = d * f;
            
c[0] = h * i;
            
c[4] = -h * f;
            
c[8] = e;
            
c[1] = l + m * e;
            
c[5] = j - n * e;
            
c[9] = -d * h;
            
c[2] = n - j * e;
            
c[6] = m + l * e;
            
c[10] = g * h
        
} else if (b === "YXZ") {
            
j = h * i;
            
l = h * f;
            
m = e * i;
            
n = e * f;
            
c[0] = j + n * d;
            
c[4] = m * d - l;
            
c[8] = g * e;
            
c[1] = g * f;
            
c[5] = g * i;
            
c[9] = -d;
            
c[2] = l * d - m;
            
c[6] = n + j * d;
            
c[10] = g * h
        
} else if (b === "ZXY") {
            
j = h * i;
            
l = h * f;
            
m = e * i;
            
n = e * f;
            
c[0] = j - n * d;
            
c[4] = -g * f;
            
c[8] = m + l * d;
            
c[1] = l + m * d;
            
c[5] = g * i;
            
c[9] = n - j * d;
            
c[2] = -g * e;
            
c[6] = d;
            
c[10] = g * h
        
} else if (b === "ZYX") {
            
j = g * i;
            
l = g * f;
            
m = d * i;
            
n = d * f;
            
c[0] = h * i;
            
c[4] = m * e - l;
            
c[8] = j * e + n;
            
c[1] = h * f;
            
c[5] = n * e + j;
            
c[9] = l * e - m;
            
c[2] = -e;
            
c[6] = d * h;
            
c[10] = g * h
        
} else if (b === "YZX") {
            
j = g * h;
            
l = g * e;
            
m = d * h;
            
n = d * e;
            
c[0] = h * i;
            
c[4] = n - j * f;
            
c[8] = m * f + l;
            
c[1] = f;
            
c[5] = g * i;
            
c[9] = -d * i;
            
c[2] = -e * i;
            
c[6] = l * f + m;
            
c[10] = j - n * f
        
} else if (b === "XZY") {
            
j = g * h;
            
l = g * e;
            
m = d * h;
            
n = d * e;
            
c[0] = h * i;
            
c[4] = -f;
            
c[8] = e * i;
            
c[1] = j * f + n;
            
c[5] = g * i;
            
c[9] = l * f - m;
            
c[2] = m * f - l;
            
c[6] = d * i;
            
c[10] = n * f + j
        
}
        return 
this
    
},
    
setRotationFromQuaternion: function(a) {
        var 
b = this.elements,
            
c = a.x,
            
d = a.y,
            
e = a.z,
            
f = a.w,
            
g = c + c,
            
h = d + d,
            
i = e + e,
            
a = c * g,
            
j = c * h,
            
c = c * i,
            
l = d * h,
            
d = d *
            
i,
            
e = e * i,
            
g = f * g,
            
h = f * h,
            
f = f * i;
        
b[0] = 1 - (l + e);
        
b[4] = j - f;
        
b[8] = c + h;
        
b[1] = j + f;
        
b[5] = 1 - (a + e);
        
b[9] = d - g;
        
b[2] = c - h;
        
b[6] = d + g;
        
b[10] = 1 - (a + l);
        return 
this
    
},
    
compose: function(a, b, c) {
        var 
d = this.elements,
            
e = THREE.Matrix4.__m1,
            
f = THREE.Matrix4.__m2;
        
e.identity();
        
e.setRotationFromQuaternion(b);
        
f.makeScale(c.x, c.y, c.z);
        
this.multiply(e, f);
        
d[12] = a.x;
        
d[13] = a.y;
        
d[14] = a.z;
        return 
this
    
},
    
decompose: function(a, b, c) {
        var 
d = this.elements,
            
e = THREE.Matrix4.__v1,
            
f = THREE.Matrix4.__v2,
            
g = THREE.Matrix4.__v3;
        
e.set(d[0], d[1], d[2]);
        
f.set(d[4], d[5], d[6]);
        
g.set(d[8], d[9], d[10]);
        
a = a instanceof THREE.Vector3 ? a : new THREE.Vector3;
        
b = b instanceof THREE.Quaternion ? b : new THREE.Quaternion;
        
c = c instanceof THREE.Vector3 ? c : new THREE.Vector3;
        
c.x = e.length();
        
c.y = f.length();
        
c.z = g.length();
        
a.x = d[12];
        
a.y = d[13];
        
a.z = d[14];
        
d = THREE.Matrix4.__m1;
        
d.copy(this);
        
d.elements[0] = d.elements[0] / c.x;
        
d.elements[1] = d.elements[1] / c.x;
        
d.elements[2] = d.elements[2] / c.x;
        
d.elements[4] = d.elements[4] / c.y;
        
d.elements[5] = d.elements[5] / c.y;
        
d.elements[6] = d.elements[6] / c.y;
        
d.elements[8] = d.elements[8] /
            
c.z;
        
d.elements[9] = d.elements[9] / c.z;
        
d.elements[10] = d.elements[10] / c.z;
        
b.setFromRotationMatrix(d);
        return [
a, b, c]
    },
    
extractPosition: function(a) {
        var 
b = this.elements,
            
a = a.elements;
        
b[12] = a[12];
        
b[13] = a[13];
        
b[14] = a[14];
        return 
this
    
},
    
extractRotation: function(a) {
        var 
b = this.elements,
            
a = a.elements,
            
c = THREE.Matrix4.__v1,
            
d = 1 / c.set(a[0], a[1], a[2]).length(),
            
e = 1 / c.set(a[4], a[5], a[6]).length(),
            
c = 1 / c.set(a[8], a[9], a[10]).length();
        
b[0] = a[0] * d;
        
b[1] = a[1] * d;
        
b[2] = a[2] * d;
        
b[4] = a[4] * e;
        
b[5] = a[5] * e;
        
b[6] = a[6] * e;
        
b[8] = a[8] * c;
        
b[9] = a[9] *
            
c;
        
b[10] = a[10] * c;
        return 
this
    
},
    
translate: function(a) {
        var 
b = this.elements,
            
c = a.x,
            
d = a.y,
            
a = a.z;
        
b[12] = b[0] * c + b[4] * d + b[8] * a + b[12];
        
b[13] = b[1] * c + b[5] * d + b[9] * a + b[13];
        
b[14] = b[2] * c + b[6] * d + b[10] * a + b[14];
        
b[15] = b[3] * c + b[7] * d + b[11] * a + b[15];
        return 
this
    
},
    
rotateX: function(a) {
        var 
b = this.elements,
            
c = b[4],
            
d = b[5],
            
e = b[6],
            
f = b[7],
            
g = b[8],
            
h = b[9],
            
i = b[10],
            
j = b[11],
            
l = Math.cos(a),
            
a = Math.sin(a);
        
b[4] = l * c + a * g;
        
b[5] = l * d + a * h;
        
b[6] = l * e + a * i;
        
b[7] = l * f + a * j;
        
b[8] = l * g - a * c;
        
b[9] = l * h - a * d;
        
b[10] = l * i - a * e;
        
b[11] = l * j - a * f;
        return 
this
    
},
    
rotateY: function(a) {
        var 
b =
            
this.elements,
            
c = b[0],
            
d = b[1],
            
e = b[2],
            
f = b[3],
            
g = b[8],
            
h = b[9],
            
i = b[10],
            
j = b[11],
            
l = Math.cos(a),
            
a = Math.sin(a);
        
b[0] = l * c - a * g;
        
b[1] = l * d - a * h;
        
b[2] = l * e - a * i;
        
b[3] = l * f - a * j;
        
b[8] = l * g + a * c;
        
b[9] = l * h + a * d;
        
b[10] = l * i + a * e;
        
b[11] = l * j + a * f;
        return 
this
    
},
    
rotateZ: function(a) {
        var 
b = this.elements,
            
c = b[0],
            
d = b[1],
            
e = b[2],
            
f = b[3],
            
g = b[4],
            
h = b[5],
            
i = b[6],
            
j = b[7],
            
l = Math.cos(a),
            
a = Math.sin(a);
        
b[0] = l * c + a * g;
        
b[1] = l * d + a * h;
        
b[2] = l * e + a * i;
        
b[3] = l * f + a * j;
        
b[4] = l * g - a * c;
        
b[5] = l * h - a * d;
        
b[6] = l * i - a * e;
        
b[7] = l * j - a * f;
        return 
this
    
},
    
rotateByAxis: function(a, b) {
        var 
c = this.elements;
        if (
a.x === 1 && a.y === 0 && a.z === 0) return this.rotateX(b);
        if (
a.x === 0 && a.y === 1 && a.z === 0) return this.rotateY(b);
        if (
a.x === 0 && a.y === 0 && a.z === 1) return this.rotateZ(b);
        var 
d = a.x,
            
e = a.y,
            
f = a.z,
            
g = Math.sqrt(d * d + e * e + f * f),
            
d = d / g,
            
e = e / g,
            
f = f / g,
            
g = d * d,
            
h = e * e,
            
i = f * f,
            
j = Math.cos(b),
            
l = Math.sin(b),
            
m = 1 - j,
            
n = d * e * m,
            
p = d * f * m,
            
m = e * f * m,
            
d = d * l,
            
r = e * l,
            
l = f * l,
            
f = g + (1 - g) * j,
            
g = n + l,
            
e = p - r,
            
n = n - l,
            
h = h + (1 - h) * j,
            
l = m + d,
            
p = p + r,
            
m = m - d,
            
i = i + (1 - i) * j,
            
j = c[0],
            
d = c[1],
            
r = c[2],
            
o = c[3],
            
q = c[4],
            
s = c[5],
            
w = c[6],
            
t = c[7],
            
v = c[8],
            
x = c[9],
            
C = c[10],
            
D = c[11];
        
c[0] = f * j + g * q + e * v;
        
c[1] = f * d + g *
            
s + e * x;
        
c[2] = f * r + g * w + e * C;
        
c[3] = f * o + g * t + e * D;
        
c[4] = n * j + h * q + l * v;
        
c[5] = n * d + h * s + l * x;
        
c[6] = n * r + h * w + l * C;
        
c[7] = n * o + h * t + l * D;
        
c[8] = p * j + m * q + i * v;
        
c[9] = p * d + m * s + i * x;
        
c[10] = p * r + m * w + i * C;
        
c[11] = p * o + m * t + i * D;
        return 
this
    
},
    
scale: function(a) {
        var 
b = this.elements,
            
c = a.x,
            
d = a.y,
            
a = a.z;
        
b[0] = b[0] * c;
        
b[4] = b[4] * d;
        
b[8] = b[8] * a;
        
b[1] = b[1] * c;
        
b[5] = b[5] * d;
        
b[9] = b[9] * a;
        
b[2] = b[2] * c;
        
b[6] = b[6] * d;
        
b[10] = b[10] * a;
        
b[3] = b[3] * c;
        
b[7] = b[7] * d;
        
b[11] = b[11] * a;
        return 
this
    
},
    
getMaxScaleOnAxis: function() {
        var 
a = this.elements;
        return 
Math.sqrt(Math.max(a[0] * a[0] + a[1] * a[1] +
            
a[2] * a[2], Math.max(a[4] * a[4] + a[5] * a[5] + a[6] * a[6], a[8] * a[8] + a[9] * a[9] + a[10] * a[10])))
    },
    
makeTranslation: function(a, b, c) {
        
this.set(1, 0, 0, a, 0, 1, 0, b, 0, 0, 1, c, 0, 0, 0, 1);
        return 
this
    
},
    
makeRotationX: function(a) {
        var 
b = Math.cos(a),
            
a = Math.sin(a);
        
this.set(1, 0, 0, 0, 0, b, -a, 0, 0, a, b, 0, 0, 0, 0, 1);
        return 
this
    
},
    
makeRotationY: function(a) {
        var 
b = Math.cos(a),
            
a = Math.sin(a);
        
this.set(b, 0, a, 0, 0, 1, 0, 0, -a, 0, b, 0, 0, 0, 0, 1);
        return 
this
    
},
    
makeRotationZ: function(a) {
        var 
b = Math.cos(a),
            
a = Math.sin(a);
        
this.set(b, -a, 0, 0, a, b, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
        return 
this
    
},
    
makeRotationAxis: function(a, b) {
        var 
c = Math.cos(b),
            
d = Math.sin(b),
            
e = 1 - c,
            
f = a.x,
            
g = a.y,
            
h = a.z,
            
i = e * f,
            
j = e * g;
        
this.set(i * f + c, i * g - d * h, i * h + d * g, 0, i * g + d * h, j * g + c, j * h - d * f, 0, i * h - d * g, j * h + d * f, e * h * h + c, 0, 0, 0, 0, 1);
        return 
this
    
},
    
makeScale: function(a, b, c) {
        
this.set(a, 0, 0, 0, 0, b, 0, 0, 0, 0, c, 0, 0, 0, 0, 1);
        return 
this
    
},
    
makeFrustum: function(a, b, c, d, e, f) {
        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 / (d - c);
        
g[9] = (d + c) / (d - c);
        
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
    
},
    
makePerspective: function(a, b, c, d) {
        var 
a = c * Math.tan(a * Math.PI / 360),
            
e = -a;
        return 
this.makeFrustum(e * b, a * b, e, a, c, d)
    },
    
makeOrthographic: function(a, b, c, d, e, f) {
        var 
g = this.elements,
            
h = b - a,
            
i = c - d,
            
j = f - e;
        
g[0] = 2 / h;
        
g[4] = 0;
        
g[8] = 0;
        
g[12] = -((b + a) / h);
        
g[1] = 0;
        
g[5] = 2 / i;
        
g[9] = 0;
        
g[13] = -((c + d) / i);
        
g[2] = 0;
        
g[6] = 0;
        
g[10] = -2 / j;
        
g[14] = -((f + e) / j);
        
g[3] = 0;
        
g[7] = 0;
        
g[11] = 0;
        
g[15] = 1;
        return 
this
    
},
    clone: function() {
        var 
a = this.elements;
        return new 
THREE.Matrix4(a[0], a[4], a[8], a[12], a[1], a[5], a[9], a[13], a[2],
            
a[6], a[10], a[14], a[3], a[7], a[11], a[15])
    }
};
THREE.Matrix4.__v1 = new THREE.Vector3;
THREE.Matrix4.__v2 = new THREE.Vector3;
THREE.Matrix4.__v3 = new THREE.Vector3;
THREE.Matrix4.__m1 = new THREE.Matrix4;
THREE.Matrix4.__m2 = new THREE.Matrix4;
THREE.Object3D = function() {
    
this.id = THREE.Object3DCount++;
    
this.name = "";
    
this.parent = void 0;
    
this.children = [];
    
this.up = new THREE.Vector3(0, 1, 0);
    
this.position = new THREE.Vector3;
    
this.rotation = new THREE.Vector3;
    
this.eulerOrder = "XYZ";
    
this.scale = new THREE.Vector3(1, 1, 1);
    
this.flipSided = this.doubleSided = false;
    
this.renderDepth = null;
    
this.rotationAutoUpdate = true;
    
this.matrix = new THREE.Matrix4;
    
this.matrixWorld = new THREE.Matrix4;
    
this.matrixRotationWorld = new THREE.Matrix4;
    
this.matrixWorldNeedsUpdate = this.matrixAutoUpdate =
        
true;
    
this.quaternion = new THREE.Quaternion;
    
this.useQuaternion = false;
    
this.boundRadius = 0;
    
this.boundRadiusScale = 1;
    
this.visible = true;
    
this.receiveShadow = this.castShadow = false;
    
this.frustumCulled = true;
    
this._vector = new THREE.Vector3
};
THREE.Object3D.prototype = {
    
constructor: THREE.Object3D,
    
applyMatrix: function(a) {
        
this.matrix.multiply(a, this.matrix);
        
this.scale.getScaleFromMatrix(this.matrix);
        
this.rotation.setEulerFromRotationMatrix((new THREE.Matrix4).extractRotation(this.matrix), this.eulerOrder);
        
this.position.getPositionFromMatrix(this.matrix)
    },
    
translate: function(a, b) {
        
this.matrix.rotateAxis(b);
        
this.position.addSelf(b.multiplyScalar(a))
    },
    
translateX: function(a) {
        
this.translate(a, this._vector.set(1, 0, 0))
    },
    
translateY: function(a) {
        
this.translate(a,
            
this._vector.set(0, 1, 0))
    },
    
translateZ: function(a) {
        
this.translate(a, this._vector.set(0, 0, 1))
    },
    
lookAt: function(a) {
        
this.matrix.lookAt(a, this.position, this.up);
        
this.rotationAutoUpdate && this.rotation.setEulerFromRotationMatrix(this.matrix, this.eulerOrder)
    },
    
add: function(a) {
        if (
a === this) console.warn("THREE.Object3D.add: An object can't be added as a child of itself.");
        else if (
a instanceof THREE.Object3D) {
            
a.parent !== void 0 && a.parent.remove(a);
            
a.parent = this;
            
this.children.push(a);
            for (var 
b = this; b.parent !== void 0;) b =
                
b.parent;
            
b !== void 0 && b instanceof THREE.Scene && b.__addObject(a)
        }
    },
    
remove: function(a) {
        var 
b = this.children.indexOf(a);
        if (
b !== -1) {
            
a.parent = void 0;
            
this.children.splice(b, 1);
            for (
b = this; b.parent !== void 0;) b = b.parent;
            
b !== void 0 && b instanceof THREE.Scene && b.__removeObject(a)
        }
    },
    
getChildByName: function(a, b) {
        var 
c, d, e;
        
c = 0;
        for (
d = this.children.length; c < d; c++) {
            
e = this.children[c];
            if (
e.name === a) return e;
            if (
b) {
                
e = e.getChildByName(a, b);
                if (
e !== void 0) return e
            
}
        }
    },
    
updateMatrix: function() {
        
this.matrix.setPosition(this.position);
        
this.useQuaternion === true ? this.matrix.setRotationFromQuaternion(this.quaternion) : this.matrix.setRotationFromEuler(this.rotation, this.eulerOrder);
        if (
this.scale.x !== 1 || this.scale.y !== 1 || this.scale.z !== 1) {
            
this.matrix.scale(this.scale);
            
this.boundRadiusScale = Math.max(this.scale.x, Math.max(this.scale.y, this.scale.z))
        }
        
this.matrixWorldNeedsUpdate = true
    
},
    
updateMatrixWorld: function(a) {
        
this.matrixAutoUpdate === true && this.updateMatrix();
        if (
this.matrixWorldNeedsUpdate === true || a === true) {
            
this.parent !== void 0 ? this.matrixWorld.multiply(this.parent.matrixWorld,
                
this.matrix) : this.matrixWorld.copy(this.matrix);
            
this.matrixWorldNeedsUpdate = false;
            
a = true
        
}
        for (var 
b = 0, c = this.children.length; b < c; b++) this.children[b].updateMatrixWorld(a)
    },
    
worldToLocal: function(a) {
        return 
THREE.Object3D.__m1.getInverse(this.matrixWorld).multiplyVector3(a)
    },
    
localToWorld: function(a) {
        return 
this.matrixWorld.multiplyVector3(a)
    }
};
THREE.Object3D.__m1 = new THREE.Matrix4;
THREE.Object3DCount = 0;
THREE.Projector = function() {
    function 
a(a, c) {
        
g = 0;
        
C.objects.length = 0;
        
C.sprites.length = 0;
        
C.lights.length = 0;
        var 
e = function(a) {
            if (
a.visible !== false) {
                if ((
a instanceof THREE.Mesh || a instanceof THREE.Line) && (a.frustumCulled === false || J.contains(a) === true)) {
                    
D.copy(a.matrixWorld.getPosition());
                    
u.multiplyVector3(D);
                    
f = b();
                    
f.object = a;
                    
f.z = D.z;
                    
C.objects.push(f)
                } else if (
a instanceof THREE.Sprite || a instanceof THREE.Particle) {
                    
D.copy(a.matrixWorld.getPosition());
                    
u.multiplyVector3(D);
                    
f = b();
                    
f.object = a;
                    
f.z = D.z;
                    
C.sprites.push(f)
                } else 
a instanceof
                
THREE.Light && C.lights.push(a);
                for (var 
c = 0, d = a.children.length; c < d; c++) e(a.children[c])
            }
        };
        
e(a);
        
c === true && C.objects.sort(d);
        return 
C
    
}

    function 
b() {
        var 
a;
        if (
g === h.length) {
            
a = new THREE.RenderableObject;
            
h.push(a)
        } else 
a = h[g];
        
g++;
        return 
a
    
}

    function 
c() {
        var 
a;
        if (
j === l.length) {
            
a = new THREE.RenderableVertex;
            
l.push(a)
        } else 
a = l[j];
        
j++;
        return 
a
    
}

    function 
d(a, b) {
        return 
b.z - a.z
    
}

    function 
e(a, b) {
        var 
c = 0,
            
d = 1,
            
f = a.z + a.w,
            
e = b.z + b.w,
            
g = -a.z + a.w,
            
h = -b.z + b.w;
        if (
f >= 0 && e >= 0 && g >= 0 && h >= 0) return true;
        if (
f < 0 && e < 0 || g < 0 && h < 0) return false;
        
f < 0 ? c = Math.max(c, f / (f - e)) : e < 0 && (d = Math.min(d, f / (f - e)));
        
g < 0 ? c = Math.max(c, g / (g - h)) : h < 0 && (d = Math.min(d, g / (g - h)));
        if (
d < c) return false;
        
a.lerpSelf(b, c);
        
b.lerpSelf(a, 1 - d);
        return 
true
    
}
    var 
f, g, h = [],
        
i, j, l = [],
        
m, n, p = [],
        
r, o = [],
        
q, s, w = [],
        
t, v, x = [],
        
C = {
            
objects: [],
            
sprites: [],
            
lights: [],
            
elements: []
        },
        
D = new THREE.Vector3,
        
z = new THREE.Vector4,
        
u = new THREE.Matrix4,
        
G = new THREE.Matrix4,
        
J = new THREE.Frustum,
        
M = new THREE.Vector4,
        
O = new THREE.Vector4;
    
this.projectVector = function(a, b) {
        
b.matrixWorldInverse.getInverse(b.matrixWorld);
        
u.multiply(b.projectionMatrix,
            
b.matrixWorldInverse);
        
u.multiplyVector3(a);
        return 
a
    
};
    
this.unprojectVector = function(a, b) {
        
b.projectionMatrixInverse.getInverse(b.projectionMatrix);
        
u.multiply(b.matrixWorld, b.projectionMatrixInverse);
        
u.multiplyVector3(a);
        return 
a
    
};
    
this.pickingRay = function(a, b) {
        var 
c;
        
a.z = -1;
        
c = new THREE.Vector3(a.x, a.y, 1);
        
this.unprojectVector(a, b);
        
this.unprojectVector(c, b);
        
c.subSelf(a).normalize();
        return new 
THREE.Ray(a, c)
    };
    
this.projectScene = function(b, f, g) {
        var 
h = f.near,
            
E = f.far,
            
D = false,
            
T, N, W, ba, H, ca, ia, S, R, P, U, fa, ma, Ga,
            
na;
        
v = s = r = n = 0;
        
C.elements.length = 0;
        if (
f.parent === void 0) {
            
console.warn("DEPRECATED: Camera hasn't been added to a Scene. Adding it...");
            
b.add(f)
        }
        
b.updateMatrixWorld();
        
f.matrixWorldInverse.getInverse(f.matrixWorld);
        
u.multiply(f.projectionMatrix, f.matrixWorldInverse);
        
J.setFromMatrix(u);
        
C = a(b, false);
        
b = 0;
        for (
T = C.objects.length; b < T; b++) {
            
R = C.objects[b].object;
            
P = R.matrixWorld;
            
j = 0;
            if (
R instanceof THREE.Mesh) {
                
U = R.geometry;
                
fa = R.geometry.materials;
                
ba = U.vertices;
                
ma = U.faces;
                
Ga = U.faceVertexUvs;
                
U = R.matrixRotationWorld.extractRotation(P);
                
N = 0;
                for (
W = ba.length; N < W; N++) {
                    
i = c();
                    
i.positionWorld.copy(ba[N]);
                    
P.multiplyVector3(i.positionWorld);
                    
i.positionScreen.copy(i.positionWorld);
                    
u.multiplyVector4(i.positionScreen);
                    
i.positionScreen.x = i.positionScreen.x / i.positionScreen.w;
                    
i.positionScreen.y = i.positionScreen.y / i.positionScreen.w;
                    
i.visible = i.positionScreen.z > h && i.positionScreen.z < E
                
}
                
ba = 0;
                for (
N = ma.length; ba < N; ba++) {
                    
W = ma[ba];
                    if (
W instanceof THREE.Face3) {
                        
H = l[W.a];
                        
ca = l[W.b];
                        
ia = l[W.c];
                        if (
H.visible === true && ca.visible === true && ia.visible === true) {
                            
D = (ia.positionScreen.x -
                                
H.positionScreen.x) * (ca.positionScreen.y - H.positionScreen.y) - (ia.positionScreen.y - H.positionScreen.y) * (ca.positionScreen.x - H.positionScreen.x) < 0;
                            if (
R.doubleSided === true || D !== R.flipSided) {
                                
S = void 0;
                                if (
n === p.length) {
                                    
S = new THREE.RenderableFace3;
                                    
p.push(S)
                                } else 
S = p[n];
                                
n++;
                                
m = S;
                                
m.v1.copy(H);
                                
m.v2.copy(ca);
                                
m.v3.copy(ia)
                            } else continue
                        } else continue
                    } else if (
W instanceof THREE.Face4) {
                        
H = l[W.a];
                        
ca = l[W.b];
                        
ia = l[W.c];
                        
S = l[W.d];
                        if (
H.visible === true && ca.visible === true && ia.visible === true && S.visible === true) {
                            
D = (S.positionScreen.x -
                                
H.positionScreen.x) * (ca.positionScreen.y - H.positionScreen.y) - (S.positionScreen.y - H.positionScreen.y) * (ca.positionScreen.x - H.positionScreen.x) < 0 || (ca.positionScreen.x - ia.positionScreen.x) * (S.positionScreen.y - ia.positionScreen.y) - (ca.positionScreen.y - ia.positionScreen.y) * (S.positionScreen.x - ia.positionScreen.x) < 0;
                            if (
R.doubleSided === true || D !== R.flipSided) {
                                
na = void 0;
                                if (
r === o.length) {
                                    
na = new THREE.RenderableFace4;
                                    
o.push(na)
                                } else 
na = o[r];
                                
r++;
                                
m = na;
                                
m.v1.copy(H);
                                
m.v2.copy(ca);
                                
m.v3.copy(ia);
                                
m.v4.copy(S)
                            } else continue
                        } else continue
                    }
                    
m.normalWorld.copy(W.normal);
                    
D === false && (R.flipSided === true || R.doubleSided === true) && m.normalWorld.negate();
                    
U.multiplyVector3(m.normalWorld);
                    
m.centroidWorld.copy(W.centroid);
                    
P.multiplyVector3(m.centroidWorld);
                    
m.centroidScreen.copy(m.centroidWorld);
                    
u.multiplyVector3(m.centroidScreen);
                    
ia = W.vertexNormals;
                    
H = 0;
                    for (
ca = ia.length; H < ca; H++) {
                        
S = m.vertexNormalsWorld[H];
                        
S.copy(ia[H]);
                        
D === false && (R.flipSided === true || R.doubleSided === true) && S.negate();
                        
U.multiplyVector3(S)
                    }
                    
H = 0;
                    for (
ca = Ga.length; H < ca; H++) {
                        
na = Ga[H][ba];
                        if (
na !== void 0) {
                            
ia = 0;
                            for (
S =
                                
na.length; ia < S; ia++) m.uvs[H][ia] = na[ia]
                        }
                    }
                    
m.material = R.material;
                    
m.faceMaterial = W.materialIndex !== null ? fa[W.materialIndex] : null;
                    
m.z = m.centroidScreen.z;
                    
C.elements.push(m)
                }
            } else if (
R instanceof THREE.Line) {
                
G.multiply(u, P);
                
ba = R.geometry.vertices;
                
H = c();
                
H.positionScreen.copy(ba[0]);
                
G.multiplyVector4(H.positionScreen);
                
P = R.type === THREE.LinePieces ? 2 : 1;
                
N = 1;
                for (
W = ba.length; N < W; N++) {
                    
H = c();
                    
H.positionScreen.copy(ba[N]);
                    
G.multiplyVector4(H.positionScreen);
                    if (!((
N + 1) % P > 0)) {
                        
ca = l[j - 2];
                        
M.copy(H.positionScreen);
                        
O.copy(ca.positionScreen);
                        if (
e(M, O) === true) {
                            
M.multiplyScalar(1 / M.w);
                            
O.multiplyScalar(1 / O.w);
                            
fa = void 0;
                            if (
s === w.length) {
                                
fa = new THREE.RenderableLine;
                                
w.push(fa)
                            } else 
fa = w[s];
                            
s++;
                            
q = fa;
                            
q.v1.positionScreen.copy(M);
                            
q.v2.positionScreen.copy(O);
                            
q.z = Math.max(M.z, O.z);
                            
q.material = R.material;
                            
C.elements.push(q)
                        }
                    }
                }
            }
        }
        
b = 0;
        for (
T = C.sprites.length; b < T; b++) {
            
R = C.sprites[b].object;
            
P = R.matrixWorld;
            if (
R instanceof THREE.Particle) {
                
z.set(P.elements[12], P.elements[13], P.elements[14], 1);
                
u.multiplyVector4(z);
                
z.z = z.z / z.w;
                if (
z.z > 0 && z.z < 1) {
                    
h = void 0;
                    if (
v ===
                        
x.length) {
                        
h = new THREE.RenderableParticle;
                        
x.push(h)
                    } else 
h = x[v];
                    
v++;
                    
t = h;
                    
t.x = z.x / z.w;
                    
t.y = z.y / z.w;
                    
t.z = z.z;
                    
t.rotation = R.rotation.z;
                    
t.scale.x = R.scale.x * Math.abs(t.x - (z.x + f.projectionMatrix.elements[0]) / (z.w + f.projectionMatrix.elements[12]));
                    
t.scale.y = R.scale.y * Math.abs(t.y - (z.y + f.projectionMatrix.elements[5]) / (z.w + f.projectionMatrix.elements[13]));
                    
t.material = R.material;
                    
C.elements.push(t)
                }
            }
        }
        
g && C.elements.sort(d);
        return 
C
    
}
};
THREE.Quaternion = function(a, b, c, d) {
    
this.x = a || 0;
    
this.y = b || 0;
    
this.z = c || 0;
    
this.w = d !== void 0 ? 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, b) {
        var 
c = Math.cos(a.x / 2),
            
d = Math.cos(a.y / 2),
            
e = Math.cos(a.z / 2),
            
f = Math.sin(a.x / 2),
            
g = Math.sin(a.y / 2),
            
h = Math.sin(a.z / 2);
        if (
b === void 0 || b === "XYZ") {
            
this.x = f * d * e + c * g * h;
            
this.y = c * g * e - f * d * h;
            
this.z = c * d * h + f * g * e;
            
this.w = c * d * e - f * g * h
        
} else if (b === "YXZ") {
            
this.x = f * d * e + c * g * h;
            
this.y = c * g * e - f * d * h;
            
this.z =
                
c * d * h - f * g * e;
            
this.w = c * d * e + f * g * h
        
} else if (b === "ZXY") {
            
this.x = f * d * e - c * g * h;
            
this.y = c * g * e + f * d * h;
            
this.z = c * d * h + f * g * e;
            
this.w = c * d * e - f * g * h
        
} else if (b === "ZYX") {
            
this.x = f * d * e - c * g * h;
            
this.y = c * g * e + f * d * h;
            
this.z = c * d * h - f * g * e;
            
this.w = c * d * e + f * g * h
        
} else if (b === "YZX") {
            
this.x = f * d * e + c * g * h;
            
this.y = c * g * e + f * d * h;
            
this.z = c * d * h - f * g * e;
            
this.w = c * d * e - f * g * h
        
} else if (b === "XZY") {
            
this.x = f * d * e - c * g * h;
            
this.y = c * g * e - f * d * h;
            
this.z = c * d * h + f * g * e;
            
this.w = c * d * e + f * g * h
        
}
        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 = a.elements,
            
c = b[0],
            
a = b[4],
            
d = b[8],
            
e = b[1],
            
f = b[5],
            
g = b[9],
            
h = b[2],
            
i = b[6],
            
b = b[10],
            
j = c + f + b;
        if (
j > 0) {
            
c = 0.5 / Math.sqrt(j + 1);
            
this.w = 0.25 / c;
            
this.x = (i - g) * c;
            
this.y = (d - h) * c;
            
this.z = (e - a) * c
        
} else if (c > f && c > b) {
            
c = 2 * Math.sqrt(1 + c - f - b);
            
this.w = (i - g) / c;
            
this.x = 0.25 * c;
            
this.y = (a + e) / c;
            
this.z = (d + h) / c
        
} else if (f > b) {
            
c = 2 * Math.sqrt(1 + f - c - b);
            
this.w = (d - h) / c;
            
this.x = (a + e) / c;
            
this.y = 0.25 * c;
            
this.z = (g + i) / c
        
} else {
            
c = 2 * Math.sqrt(1 + b - c - f);
            
this.w = (e - a) / c;
            
this.x =
                (
d + h) / c;
            
this.y = (g + i) / c;
            
this.z = 0.25 * c
        
}
        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 = this.x * -1;
        
this.y = this.y * -1;
        
this.z = 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);
        if (
a === 0) this.w = this.z = this.y = this.x = 0;
        else {
            
a = 1 / a;
            
this.x = this.x * a;
            
this.y =
                
this.y * a;
            
this.z = this.z * a;
            
this.w = this.w * a
        
}
        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
    
},
    
multiplySelf: function(a) {
        var 
b = this.x,
            
c = this.y,
            
d = this.z,
            
e = this.w,
            
f = a.x,
            
g = a.y,
            
h = a.z,
            
a = a.w;
        
this.x = b * a + e * f + c * h - d * g;
        
this.y = c * a + e * g + d * f - b * h;
        
this.z = d * a + e * h + b * g - c * f;
        
this.w = e * a - b * f - c * g - d * h;
        return 
this
    
},
    
multiplyVector3: function(a, b) {
        
b || (b = a);
        var 
c = a.x,
            
d = a.y,
            
e = a.z,
            
f = this.x,
            
g = this.y,
            
h = this.z,
            
i = this.w,
            
j = i * c + g * e - h * d,
            
l = i * d + h * c - f * e,
            
m = i * e + f * d - g * c,
            
c = -f * c - g * d - h * e;
        
b.x = j * i + c * -f + l * -h - m * -g;
        
b.y = l * i + c * -g + m * -f - j * -h;
        
b.z = m * i + c * -h + j * -g - l * -f;
        return 
b
    
},
    
slerpSelf: function(a, b) {
        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;
        if (
g < 0) {
            
this.w = -a.w;
            
this.x = -a.x;
            
this.y = -a.y;
            
this.z = -a.z;
            
g = -g
        
} else this.copy(a);
        if (
g >= 1) {
            
this.w = f;
            
this.x = c;
            
this.y = d;
            
this.z = e;
            return 
this
        
}
        var 
h = Math.acos(g),
            
i = Math.sqrt(1 - g * g);
        if (
Math.abs(i) < 0.0010) {
            
this.w = 0.5 * (f + this.w);
            
this.x = 0.5 * (c + this.x);
            
this.y = 0.5 * (d + this.y);
            
this.z = 0.5 * (e + this.z);
            return 
this
        
}
        
g = Math.sin((1 - b) * h) / i;
        
h = Math.sin(b * h) / i;
        
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;
        return 
this
    
},
    clone: function() {
        return new 
THREE.Quaternion(this.x, this.y, this.z, this.w)
    }
};
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;
    if (
e < 0) {
        
c.w = -b.w;
        
c.x = -b.x;
        
c.y = -b.y;
        
c.z = -b.z;
        
e = -e
    
} else c.copy(b);
    if (
Math.abs(e) >= 1) {
        
c.w = a.w;
        
c.x = a.x;
        
c.y = a.y;
        
c.z = a.z;
        return 
c
    
}
    var 
b = Math.acos(e),
        
f = Math.sqrt(1 - e * e);
    if (
Math.abs(f) < 0.0010) {
        
c.w = 0.5 * (a.w + c.w);
        
c.x = 0.5 * (a.x + c.x);
        
c.y = 0.5 * (a.y + c.y);
        
c.z = 0.5 * (a.z + c.z);
        return 
c
    
}
    
e = Math.sin((1 - d) * b) / f;
    
d = Math.sin(d * b) / f;
    
c.w = a.w * e + c.w * d;
    
c.x = a.x * e + c.x * d;
    
c.y = a.y * e + c.y * d;
    
c.z = a.z * e + c.z * d;
    return 
c
};
THREE.Vertex = function(a) {
    
console.warn("THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.");
    return 
a
};
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.Face3.prototype = {
    
constructor: THREE.Face3,
    clone: function() {
        var 
a = new THREE.Face3(this.a, this.b, this.c);
        
a.normal.copy(this.normal);
        
a.color.copy(this.color);
        
a.centroid.copy(this.centroid);
        
a.materialIndex = this.materialIndex;
        var 
b, c;
        
b = 0;
        for (
c = this.vertexNormals.length; b < c; b++) a.vertexNormals[b] = this.vertexNormals[b].clone();
        
b = 0;
        for (
c = this.vertexColors.length; b < c; b++) a.vertexColors[b] = this.vertexColors[b].clone();
        
b = 0;
        for (
c = this.vertexTangents.length; b < c; b++) a.vertexTangents[b] = this.vertexTangents[b].clone();
        return 
a
    
}
};
THREE.Face4 = function(a, b, c, d, e, f, g) {
    
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 = g;
    
this.centroid = new THREE.Vector3
};
THREE.Face4.prototype = {
    
constructor: THREE.Face4,
    clone: function() {
        var 
a = new THREE.Face4(this.a, this.b, this.c, this.d);
        
a.normal.copy(this.normal);
        
a.color.copy(this.color);
        
a.centroid.copy(this.centroid);
        
a.materialIndex = this.materialIndex;
        var 
b, c;
        
b = 0;
        for (
c = this.vertexNormals.length; b < c; b++) a.vertexNormals[b] = this.vertexNormals[b].clone();
        
b = 0;
        for (
c = this.vertexColors.length; b < c; b++) a.vertexColors[b] = this.vertexColors[b].clone();
        
b = 0;
        for (
c = this.vertexTangents.length; b < c; b++) a.vertexTangents[b] = this.vertexTangents[b].clone();
        return 
a
    
}
};
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
    
},
    
lerpSelf: function(a, b) {
        
this.u = this.u + (a.u - this.u) * b;
        
this.v = this.v + (a.v - this.v) * b;
        return 
this
    
},
    clone: function() {
        return new 
THREE.UV(this.u, this.v)
    }
};
THREE.Geometry = function() {
    
this.id = THREE.GeometryCount++;
    
this.name = "";
    
this.vertices = [];
    
this.colors = [];
    
this.materials = [];
    
this.faces = [];
    
this.faceUvs = [
        []
    ];
    
this.faceVertexUvs = [
        []
    ];
    
this.morphTargets = [];
    
this.morphColors = [];
    
this.morphNormals = [];
    
this.skinWeights = [];
    
this.skinIndices = [];
    
this.boundingSphere = this.boundingBox = null;
    
this.dynamic = this.hasTangents = false
};
THREE.Geometry.prototype = {
    
constructor: THREE.Geometry,
    
applyMatrix: function(a) {
        var 
b = new THREE.Matrix4;
        
b.extractRotation(a);
        for (var 
c = 0, d = this.vertices.length; c < d; c++) a.multiplyVector3(this.vertices[c]);
        
c = 0;
        for (
d = this.faces.length; c < d; c++) {
            var 
e = this.faces[c];
            
b.multiplyVector3(e.normal);
            for (var 
f = 0, g = e.vertexNormals.length; f < g; f++) b.multiplyVector3(e.vertexNormals[f]);
            
a.multiplyVector3(e.centroid)
        }
    },
    
computeCentroids: function() {
        var 
a, b, c;
        
a = 0;
        for (
b = this.faces.length; a < b; a++) {
            
c = this.faces[a];
            
c.centroid.set(0,
                
0, 0);
            if (
c instanceof THREE.Face3) {
                
c.centroid.addSelf(this.vertices[c.a]);
                
c.centroid.addSelf(this.vertices[c.b]);
                
c.centroid.addSelf(this.vertices[c.c]);
                
c.centroid.divideScalar(3)
            } else if (
c instanceof THREE.Face4) {
                
c.centroid.addSelf(this.vertices[c.a]);
                
c.centroid.addSelf(this.vertices[c.b]);
                
c.centroid.addSelf(this.vertices[c.c]);
                
c.centroid.addSelf(this.vertices[c.d]);
                
c.centroid.divideScalar(4)
            }
        }
    },
    
computeFaceNormals: function() {
        var 
a, b, c, d, e, f, g = new THREE.Vector3,
            
h = new THREE.Vector3;
        
a = 0;
        for (
b = this.faces.length; a <
            
b; a++) {
            
c = this.faces[a];
            
d = this.vertices[c.a];
            
e = this.vertices[c.b];
            
f = this.vertices[c.c];
            
g.sub(f, e);
            
h.sub(d, e);
            
g.crossSelf(h);
            
g.isZero() || g.normalize();
            
c.normal.copy(g)
        }
    },
    
computeVertexNormals: function() {
        var 
a, b, c, d;
        if (
this.__tmpVertices === void 0) {
            
d = this.__tmpVertices = Array(this.vertices.length);
            
a = 0;
            for (
b = this.vertices.length; a < b; a++) d[a] = new THREE.Vector3;
            
a = 0;
            for (
b = this.faces.length; a < b; a++) {
                
c = this.faces[a];
                if (
c instanceof THREE.Face3) c.vertexNormals = [new THREE.Vector3, new THREE.Vector3, new THREE.Vector3];
                else if (
c instanceof THREE.Face4) c.vertexNormals = [new THREE.Vector3, new THREE.Vector3, new THREE.Vector3, new THREE.Vector3]
            }
        } else {
            
d = this.__tmpVertices;
            
a = 0;
            for (
b = this.vertices.length; a < b; a++) d[a].set(0, 0, 0)
        }
        
a = 0;
        for (
b = this.faces.length; a < b; a++) {
            
c = this.faces[a];
            if (
c instanceof THREE.Face3) {
                
d[c.a].addSelf(c.normal);
                
d[c.b].addSelf(c.normal);
                
d[c.c].addSelf(c.normal)
            } else if (
c instanceof THREE.Face4) {
                
d[c.a].addSelf(c.normal);
                
d[c.b].addSelf(c.normal);
                
d[c.c].addSelf(c.normal);
                
d[c.d].addSelf(c.normal)
            }
        }
        
a = 0;
        for (
b = this.vertices.length; a < b; a++) d[a].normalize();
        
a = 0;
        for (
b = this.faces.length; a < b; a++) {
            
c = this.faces[a];
            if (
c instanceof THREE.Face3) {
                
c.vertexNormals[0].copy(d[c.a]);
                
c.vertexNormals[1].copy(d[c.b]);
                
c.vertexNormals[2].copy(d[c.c])
            } else if (
c instanceof THREE.Face4) {
                
c.vertexNormals[0].copy(d[c.a]);
                
c.vertexNormals[1].copy(d[c.b]);
                
c.vertexNormals[2].copy(d[c.c]);
                
c.vertexNormals[3].copy(d[c.d])
            }
        }
    },
    
computeMorphNormals: function() {
        var 
a, b, c, d, e;
        
c = 0;
        for (
d = this.faces.length; c < d; c++) {
            
e = this.faces[c];
            
e.__originalFaceNormal ?
                
e.__originalFaceNormal.copy(e.normal) : e.__originalFaceNormal = e.normal.clone();
            if (!
e.__originalVertexNormals) e.__originalVertexNormals = [];
            
a = 0;
            for (
b = e.vertexNormals.length; a < b; a++) e.__originalVertexNormals[a] ? e.__originalVertexNormals[a].copy(e.vertexNormals[a]) : e.__originalVertexNormals[a] = e.vertexNormals[a].clone()
        }
        var 
f = new THREE.Geometry;
        
f.faces = this.faces;
        
a = 0;
        for (
b = this.morphTargets.length; a < b; a++) {
            if (!
this.morphNormals[a]) {
                
this.morphNormals[a] = {};
                
this.morphNormals[a].faceNormals = [];
                
this.morphNormals[a].vertexNormals = [];
                var 
g = this.morphNormals[a].faceNormals,
                    
h = this.morphNormals[a].vertexNormals,
                    
i, j;
                
c = 0;
                for (
d = this.faces.length; c < d; c++) {
                    
e = this.faces[c];
                    
i = new THREE.Vector3;
                    
j = e instanceof THREE.Face3 ? {
                        
a: new THREE.Vector3,
                        
b: new THREE.Vector3,
                        
c: new THREE.Vector3
                    
} : {
                        
a: new THREE.Vector3,
                        
b: new THREE.Vector3,
                        
c: new THREE.Vector3,
                        
d: new THREE.Vector3
                    
};
                    
g.push(i);
                    
h.push(j)
                }
            }
            
g = this.morphNormals[a];
            
f.vertices = this.morphTargets[a].vertices;
            
f.computeFaceNormals();
            
f.computeVertexNormals();
            
c = 0;
            for (
d = this.faces.length; c < d; c++) {
                
e = this.faces[c];
                
i = g.faceNormals[c];
                
j = g.vertexNormals[c];
                
i.copy(e.normal);
                if (
e instanceof THREE.Face3) {
                    
j.a.copy(e.vertexNormals[0]);
                    
j.b.copy(e.vertexNormals[1]);
                    
j.c.copy(e.vertexNormals[2])
                } else {
                    
j.a.copy(e.vertexNormals[0]);
                    
j.b.copy(e.vertexNormals[1]);
                    
j.c.copy(e.vertexNormals[2]);
                    
j.d.copy(e.vertexNormals[3])
                }
            }
        }
        
c = 0;
        for (
d = this.faces.length; c < d; c++) {
            
e = this.faces[c];
            
e.normal = e.__originalFaceNormal;
            
e.vertexNormals = e.__originalVertexNormals
        
}
    },
    
computeTangents: function() {
        function 
a(a, b, c, d, f, e, z) {
            
h = a.vertices[b];
            
i = a.vertices[c];
            
j = a.vertices[d];
            
l = g[f];
            
m = g[e];
            
n = g[z];
            
p = i.x - h.x;
            
r = j.x - h.x;
            
o = i.y - h.y;
            
q = j.y - h.y;
            
s = i.z - h.z;
            
w = j.z - h.z;
            
t = m.u - l.u;
            
v = n.u - l.u;
            
x = m.v - l.v;
            
C = n.v - l.v;
            
D = 1 / (t * C - v * x);
            
J.set((C * p - x * r) * D, (C * o - x * q) * D, (C * s - x * w) * D);
            
M.set((t * r - v * p) * D, (t * q - v * o) * D, (t * w - v * s) * D);
            
u[b].addSelf(J);
            
u[c].addSelf(J);
            
u[d].addSelf(J);
            
G[b].addSelf(M);
            
G[c].addSelf(M);
            
G[d].addSelf(M)
        }
        var 
b, c, d, e, f, g, h, i, j, l, m, n, p, r, o, q, s, w, t, v, x, C, D, z, u = [],
            
G = [],
            
J = new THREE.Vector3,
            
M = new THREE.Vector3,
            
O = new THREE.Vector3,
            
X = new THREE.Vector3,
            
B = new THREE.Vector3;
        
b = 0;
        for (
c =
            
this.vertices.length; b < c; b++) {
            
u[b] = new THREE.Vector3;
            
G[b] = new THREE.Vector3
        
}
        
b = 0;
        for (
c = this.faces.length; b < c; b++) {
            
f = this.faces[b];
            
g = this.faceVertexUvs[0][b];
            if (
f instanceof THREE.Face3) a(this, f.a, f.b, f.c, 0, 1, 2);
            else if (
f instanceof THREE.Face4) {
                
a(this, f.a, f.b, f.d, 0, 1, 3);
                
a(this, f.b, f.c, f.d, 1, 2, 3)
            }
        }
        var 
F = ["a", "b", "c", "d"];
        
b = 0;
        for (
c = this.faces.length; b < c; b++) {
            
f = this.faces[b];
            for (
d = 0; d < f.vertexNormals.length; d++) {
                
B.copy(f.vertexNormals[d]);
                
e = f[F[d]];
                
z = u[e];
                
O.copy(z);
                
O.subSelf(B.multiplyScalar(B.dot(z))).normalize();
                
X.cross(f.vertexNormals[d], z);
                
e = X.dot(G[e]);
                
e = e < 0 ? -1 : 1;
                
f.vertexTangents[d] = new THREE.Vector4(O.x, O.y, O.z, e)
            }
        }
        
this.hasTangents = true
    
},
    
computeBoundingBox: function() {
        if (!
this.boundingBox) this.boundingBox = {
            
min: new THREE.Vector3,
            
max: new THREE.Vector3
        
};
        if (
this.vertices.length > 0) {
            var 
a;
            
a = this.vertices[0];
            
this.boundingBox.min.copy(a);
            
this.boundingBox.max.copy(a);
            for (var 
b = this.boundingBox.min, c = this.boundingBox.max, d = 1, e = this.vertices.length; d < e; d++) {
                
a = this.vertices[d];
                if (
a.x < b.x) b.x = a.x;
                else if (
a.x > c.x) c.x =
                    
a.x;
                if (
a.y < b.y) b.y = a.y;
                else if (
a.y > c.y) c.y = a.y;
                if (
a.z < b.z) b.z = a.z;
                else if (
a.z > c.z) c.z = a.z
            
}
        } else {
            
this.boundingBox.min.set(0, 0, 0);
            
this.boundingBox.max.set(0, 0, 0)
        }
    },
    
computeBoundingSphere: function() {
        if (!
this.boundingSphere) this.boundingSphere = {
            
radius: 0
        
};
        for (var 
a, b = 0, c = 0, d = this.vertices.length; c < d; c++) {
            
a = this.vertices[c].length();
            
a > b && (b = a)
        }
        
this.boundingSphere.radius = b
    
},
    
mergeVertices: function() {
        var 
a = {},
            
b = [],
            
c = [],
            
d, e = Math.pow(10, 4),
            
f, g, h, i;
        
f = 0;
        for (
g = this.vertices.length; f < g; f++) {
            
d = this.vertices[f];
            
d = [Math.round(d.x * e), Math.round(d.y * e), Math.round(d.z * e)].join("_");
            if (
a[d] === void 0) {
                
a[d] = f;
                
b.push(this.vertices[f]);
                
c[f] = b.length - 1
            
} else c[f] = c[a[d]]
        }
        
f = 0;
        for (
g = this.faces.length; f < g; f++) {
            
a = this.faces[f];
            if (
a instanceof THREE.Face3) {
                
a.a = c[a.a];
                
a.b = c[a.b];
                
a.c = c[a.c]
            } else if (
a instanceof THREE.Face4) {
                
a.a = c[a.a];
                
a.b = c[a.b];
                
a.c = c[a.c];
                
a.d = c[a.d];
                
d = [a.a, a.b, a.c, a.d];
                for (
e = 3; e > 0; e--)
                    if (
d.indexOf(a["abcd" [e]]) !== e) {
                        
d.splice(e, 1);
                        
this.faces[f] = new THREE.Face3(d[0], d[1], d[2], a.normal, a.color, a.materialIndex);
                        
d = 0;
                        for (
h = this.faceVertexUvs.length; d < h; d++)(i = this.faceVertexUvs[d][f]) && i.splice(e, 1);
                        
this.faces[f].vertexColors = a.vertexColors;
                        break
                    }
            }
        }
        
c = this.vertices.length - b.length;
        
this.vertices = b;
        return 
c
    
}
};
THREE.GeometryCount = 0;
THREE.Spline = function(a) {
    function 
b(a, b, c, d, f, e, g) {
        
a = (c - a) * 0.5;
        
d = (d - b) * 0.5;
        return (
2 * (b - c) + a + d) * g + (-3 * (b - c) - 2 * a - d) * e + a * f + b
    
}
    
this.points = a;
    var 
c = [],
        
d = {
            
x: 0,
            
y: 0,
            
z: 0
        
},
        
e, f, g, h, i, j, l, m, n;
    
this.initFromArray = function(a) {
        
this.points = [];
        for (var 
b = 0; b < a.length; b++) this.points[b] = {
            
x: a[b][0],
            
y: a[b][1],
            
z: a[b][2]
        }
    };
    
this.getPoint = function(a) {
        
e = (this.points.length - 1) * a;
        
f = Math.floor(e);
        
g = e - f;
        
c[0] = f === 0 ? f : f - 1;
        
c[1] = f;
        
c[2] = f > this.points.length - 2 ? this.points.length - 1 : f + 1;
        
c[3] = f > this.points.length - 3 ? this.points.length - 1 :
            
f + 2;
        
j = this.points[c[0]];
        
l = this.points[c[1]];
        
m = this.points[c[2]];
        
n = this.points[c[3]];
        
h = g * g;
        
i = g * h;
        
d.x = b(j.x, l.x, m.x, n.x, g, h, i);
        
d.y = b(j.y, l.y, m.y, n.y, g, h, i);
        
d.z = b(j.z, l.z, m.z, n.z, g, h, i);
        return 
d
    
};
    
this.getControlPointsArray = function() {
        var 
a, b, c = this.points.length,
            
d = [];
        for (
a = 0; a < c; a++) {
            
b = this.points[a];
            
d[a] = [b.x, b.y, b.z]
        }
        return 
d
    
};
    
this.getLength = function(a) {
        var 
b, c, d, f = b = b = 0,
            
e = new THREE.Vector3,
            
g = new THREE.Vector3,
            
h = [],
            
i = 0;
        
h[0] = 0;
        
a || (a = 100);
        
c = this.points.length * a;
        
e.copy(this.points[0]);
        for (
a = 1; a < c; a++) {
            
b =
                
a / c;
            
d = this.getPoint(b);
            
g.copy(d);
            
i = i + g.distanceTo(e);
            
e.copy(d);
            
b = (this.points.length - 1) * b;
            
b = Math.floor(b);
            if (
b != f) {
                
h[b] = i;
                
f = b
            
}
        }
        
h[h.length] = i;
        return {
            
chunks: h,
            
total: i
        
}
    };
    
this.reparametrizeByArcLength = function(a) {
        var 
b, c, d, f, e, g, h = [],
            
i = new THREE.Vector3,
            
j = this.getLength();
        
h.push(i.copy(this.points[0]).clone());
        for (
b = 1; b < this.points.length; b++) {
            
c = j.chunks[b] - j.chunks[b - 1];
            
g = Math.ceil(a * c / j.total);
            
f = (b - 1) / (this.points.length - 1);
            
e = b / (this.points.length - 1);
            for (
c = 1; c < g - 1; c++) {
                
d = f + c * (1 / g) * (e - f);
                
d = this.getPoint(d);
                
h.push(i.copy(d).clone())
            }
            
h.push(i.copy(this.points[b]).clone())
        }
        
this.points = h
    
}
};
THREE.Camera = function() {
    
THREE.Object3D.call(this);
    
this.matrixWorldInverse = new THREE.Matrix4;
    
this.projectionMatrix = new THREE.Matrix4;
    
this.projectionMatrixInverse = new THREE.Matrix4
};
THREE.Camera.prototype = Object.create(THREE.Object3D.prototype);
THREE.Camera.prototype.lookAt = function(a) {
    
this.matrix.lookAt(this.position, a, this.up);
    
this.rotationAutoUpdate === true && this.rotation.setEulerFromRotationMatrix(this.matrix, this.eulerOrder)
};
THREE.OrthographicCamera = function(a, b, c, d, e, f) {
    
THREE.Camera.call(this);
    
this.left = a;
    
this.right = b;
    
this.top = c;
    
this.bottom = d;
    
this.near = e !== void 0 ? e : 0.1;
    
this.far = f !== void 0 ? f : 2E3;
    
this.updateProjectionMatrix()
};
THREE.OrthographicCamera.prototype = Object.create(THREE.Camera.prototype);
THREE.OrthographicCamera.prototype.updateProjectionMatrix = function() {
    
this.projectionMatrix.makeOrthographic(this.left, this.right, this.top, this.bottom, this.near, this.far)
};
THREE.PerspectiveCamera = function(a, b, c, d) {
    
THREE.Camera.call(this);
    
this.fov = a !== void 0 ? a : 50;
    
this.aspect = b !== void 0 ? b : 1;
    
this.near = c !== void 0 ? c : 0.1;
    
this.far = d !== void 0 ? d : 2E3;
    
this.updateProjectionMatrix()
};
THREE.PerspectiveCamera.prototype = Object.create(THREE.Camera.prototype);
THREE.PerspectiveCamera.prototype.setLens = function(a, b) {
    
this.fov = 2 * Math.atan((b !== void 0 ? b : 24) / (a * 2)) * (180 / Math.PI);
    
this.updateProjectionMatrix()
};
THREE.PerspectiveCamera.prototype.setViewOffset = function(a, b, c, d, e, f) {
    
this.fullWidth = a;
    
this.fullHeight = b;
    
this.x = c;
    
this.y = d;
    
this.width = e;
    
this.height = f;
    
this.updateProjectionMatrix()
};
THREE.PerspectiveCamera.prototype.updateProjectionMatrix = function() {
    if (
this.fullWidth) {
        var 
a = this.fullWidth / this.fullHeight,
            
b = Math.tan(this.fov * Math.PI / 360) * this.near,
            
c = -b,
            
d = a * c,
            
a = Math.abs(a * b - d),
            
c = Math.abs(b - c);
        
this.projectionMatrix.makeFrustum(d + this.x * a / this.fullWidth, d + (this.x + this.width) * a / this.fullWidth, b - (this.y + this.height) * c / this.fullHeight, b - this.y * c / this.fullHeight, this.near, this.far)
    } else 
this.projectionMatrix.makePerspective(this.fov, this.aspect, this.near, this.far)
};
THREE.Light = function(a) {
    
THREE.Object3D.call(this);
    
this.color = new THREE.Color(a)
};
THREE.Light.prototype = Object.create(THREE.Object3D.prototype);
THREE.AmbientLight = function(a) {
    
THREE.Light.call(this, a)
};
THREE.AmbientLight.prototype = Object.create(THREE.Light.prototype);
THREE.DirectionalLight = function(a, b, c) {
    
THREE.Light.call(this, a);
    
this.position = new THREE.Vector3(0, 1, 0);
    
this.target = new THREE.Object3D;
    
this.intensity = b !== void 0 ? b : 1;
    
this.distance = c !== void 0 ? c : 0;
    
this.onlyShadow = this.castShadow = false;
    
this.shadowCameraNear = 50;
    
this.shadowCameraFar = 5E3;
    
this.shadowCameraLeft = -500;
    
this.shadowCameraTop = this.shadowCameraRight = 500;
    
this.shadowCameraBottom = -500;
    
this.shadowCameraVisible = false;
    
this.shadowBias = 0;
    
this.shadowDarkness = 0.5;
    
this.shadowMapHeight = this.shadowMapWidth = 512;
    
this.shadowCascade = false;
    
this.shadowCascadeOffset = new THREE.Vector3(0, 0, -1E3);
    
this.shadowCascadeCount = 2;
    
this.shadowCascadeBias = [0, 0, 0];
    
this.shadowCascadeWidth = [512, 512, 512];
    
this.shadowCascadeHeight = [512, 512, 512];
    
this.shadowCascadeNearZ = [-1, 0.99, 0.998];
    
this.shadowCascadeFarZ = [0.99, 0.998, 1];
    
this.shadowCascadeArray = [];
    
this.shadowMatrix = this.shadowCamera = this.shadowMapSize = this.shadowMap = null
};
THREE.DirectionalLight.prototype = Object.create(THREE.Light.prototype);
THREE.PointLight = function(a, b, c) {
    
THREE.Light.call(this, a);
    
this.position = new THREE.Vector3(0, 0, 0);
    
this.intensity = b !== void 0 ? b : 1;
    
this.distance = c !== void 0 ? c : 0
};
THREE.PointLight.prototype = Object.create(THREE.Light.prototype);
THREE.SpotLight = function(a, b, c, d, e) {
    
THREE.Light.call(this, a);
    
this.position = new THREE.Vector3(0, 1, 0);
    
this.target = new THREE.Object3D;
    
this.intensity = b !== void 0 ? b : 1;
    
this.distance = c !== void 0 ? c : 0;
    
this.angle = d !== void 0 ? d : Math.PI / 2;
    
this.exponent = e !== void 0 ? e : 10;
    
this.onlyShadow = this.castShadow = false;
    
this.shadowCameraNear = 50;
    
this.shadowCameraFar = 5E3;
    
this.shadowCameraFov = 50;
    
this.shadowCameraVisible = false;
    
this.shadowBias = 0;
    
this.shadowDarkness = 0.5;
    
this.shadowMapHeight = this.shadowMapWidth = 512;
    
this.shadowMatrix =
        
this.shadowCamera = this.shadowMapSize = this.shadowMap = null
};
THREE.SpotLight.prototype = Object.create(THREE.Light.prototype);
THREE.Loader = function(a) {
    
this.statusDomElement = (this.showStatus = a) ? THREE.Loader.prototype.addStatusElement() : null;
    
this.onLoadStart = function() {};
    
this.onLoadProgress = function() {};
    
this.onLoadComplete = function() {}
};
THREE.Loader.prototype = {
    
constructor: THREE.Loader,
    
crossOrigin: "anonymous",
    
addStatusElement: function() {
        var 
a = document.createElement("div");
        
a.style.position = "absolute";
        
a.style.right = "0px";
        
a.style.top = "0px";
        
a.style.fontSize = "0.8em";
        
a.style.textAlign = "left";
        
a.style.background = "rgba(0,0,0,0.25)";
        
a.style.color = "#fff";
        
a.style.width = "120px";
        
a.style.padding = "0.5em 0.5em 0.5em 0.5em";
        
a.style.zIndex = 1E3;
        
a.innerHTML = "Loading ...";
        return 
a
    
},
    
updateProgress: function(a) {
        var 
b = "Loaded ",
            
b = a.total ? b + ((100 * a.loaded /
                
a.total).toFixed(0) + "%") : b + ((a.loaded / 1E3).toFixed(2) + " KB");
        
this.statusDomElement.innerHTML = b
    
},
    
extractUrlBase: function(a) {
        
a = a.split("/");
        
a.pop();
        return (
a.length < 1 ? "." : a.join("/")) + "/"
    
},
    
initMaterials: function(a, b, c) {
        
a.materials = [];
        for (var 
d = 0; d < b.length; ++d) a.materials[d] = THREE.Loader.prototype.createMaterial(b[d], c)
    },
    
hasNormals: function(a) {
        var 
b, c, d = a.materials.length;
        for (
c = 0; c < d; c++) {
            
b = a.materials[c];
            if (
b instanceof THREE.ShaderMaterial) return true
        
}
        return 
false
    
},
    
createMaterial: function(a, b) {
        function 
c(a) {
            
a =
                
Math.log(a) / Math.LN2;
            return 
Math.floor(a) == a
        
}

        function 
d(a) {
            
a = Math.log(a) / Math.LN2;
            return 
Math.pow(2, Math.round(a))
        }

        function 
e(a, b) {
            var 
f = new Image;
            
f.onload = function() {
                if (!
c(this.width) || !c(this.height)) {
                    var 
b = d(this.width),
                        
f = d(this.height);
                    
a.image.width = b;
                    
a.image.height = f;
                    
a.image.getContext("2d").drawImage(this, 0, 0, b, f)
                } else 
a.image = this;
                
a.needsUpdate = true
            
};
            
f.crossOrigin = h.crossOrigin;
            
f.src = b
        
}

        function 
f(a, c, d, f, g, h) {
            var 
i = document.createElement("canvas");
            
a[c] = new THREE.Texture(i);
            
a[c].sourceFile =
                
d;
            if (
f) {
                
a[c].repeat.set(f[0], f[1]);
                if (
f[0] != 1) a[c].wrapS = THREE.RepeatWrapping;
                if (
f[1] != 1) a[c].wrapT = THREE.RepeatWrapping
            
}
            
g && a[c].offset.set(g[0], g[1]);
            if (
h) {
                
f = {
                    
repeat: THREE.RepeatWrapping,
                    
mirror: THREE.MirroredRepeatWrapping
                
};
                if (
f[h[0]] !== void 0) a[c].wrapS = f[h[0]];
                if (
f[h[1]] !== void 0) a[c].wrapT = f[h[1]]
            }
            
e(a[c], b + "/" + d)
        }

        function 
g(a) {
            return (
a[0] * 255 << 16) + (a[1] * 255 << 8) + a[2] * 255
        
}
        var 
h = this,
            
i = "MeshLambertMaterial",
            
j = {
                
color: 15658734,
                
opacity: 1,
                
map: null,
                
lightMap: null,
                
normalMap: null,
                
wireframe: a.wireframe
            
};
        if (
a.shading) {
            var 
l = a.shading.toLowerCase();
            
l === "phong" ? i = "MeshPhongMaterial" : l === "basic" && (i = "MeshBasicMaterial")
        }
        if (
a.blending !== void 0 && THREE[a.blending] !== void 0) j.blending = THREE[a.blending];
        if (
a.transparent !== void 0 || a.opacity < 1) j.transparent = a.transparent;
        if (
a.depthTest !== void 0) j.depthTest = a.depthTest;
        if (
a.depthWrite !== void 0) j.depthWrite = a.depthWrite;
        if (
a.vertexColors !== void 0)
            if (
a.vertexColors == "face") j.vertexColors = THREE.FaceColors;
            else if (
a.vertexColors) j.vertexColors = THREE.VertexColors;
        if (
a.colorDiffuse) j.color = g(a.colorDiffuse);
        else if (
a.DbgColor) j.color = a.DbgColor;
        if (
a.colorSpecular) j.specular = g(a.colorSpecular);
        if (
a.colorAmbient) j.ambient = g(a.colorAmbient);
        if (
a.transparency) j.opacity = a.transparency;
        if (
a.specularCoef) j.shininess = a.specularCoef;
        
a.mapDiffuse && b && f(j, "map", a.mapDiffuse, a.mapDiffuseRepeat, a.mapDiffuseOffset, a.mapDiffuseWrap);
        
a.mapLight && b && f(j, "lightMap", a.mapLight, a.mapLightRepeat, a.mapLightOffset, a.mapLightWrap);
        
a.mapNormal && b && f(j, "normalMap", a.mapNormal, a.mapNormalRepeat,
            
a.mapNormalOffset, a.mapNormalWrap);
        
a.mapSpecular && b && f(j, "specularMap", a.mapSpecular, a.mapSpecularRepeat, a.mapSpecularOffset, a.mapSpecularWrap);
        if (
a.mapNormal) {
            
i = THREE.ShaderUtils.lib.normal;
            
l = THREE.UniformsUtils.clone(i.uniforms);
            
l.tNormal.texture = j.normalMap;
            if (
a.mapNormalFactor) l.uNormalScale.value = a.mapNormalFactor;
            if (
j.map) {
                
l.tDiffuse.texture = j.map;
                
l.enableDiffuse.value = true
            
}
            if (
j.specularMap) {
                
l.tSpecular.texture = j.specularMap;
                
l.enableSpecular.value = true
            
}
            if (
j.lightMap) {
                
l.tAO.texture = j.lightMap;
                
l.enableAO.value = true
            
}
            
l.uDiffuseColor.value.setHex(j.color);
            
l.uSpecularColor.value.setHex(j.specular);
            
l.uAmbientColor.value.setHex(j.ambient);
            
l.uShininess.value = j.shininess;
            if (
j.opacity !== void 0) l.uOpacity.value = j.opacity;
            
j = new THREE.ShaderMaterial({
                
fragmentShader: i.fragmentShader,
                
vertexShader: i.vertexShader,
                
uniforms: l,
                
lights: true,
                
fog: true
            
})
        } else 
j = new THREE[i](j);
        if (
a.DbgName !== void 0) j.name = a.DbgName;
        return 
j
    
}
};
THREE.BinaryLoader = function(a) {
    
THREE.Loader.call(this, a)
};
THREE.BinaryLoader.prototype = Object.create(THREE.Loader.prototype);
THREE.BinaryLoader.prototype.load = function(a, b, c, d) {
    var 
c = c ? c : this.extractUrlBase(a),
        
d = d ? d : this.extractUrlBase(a),
        
e = this.showProgress ? THREE.Loader.prototype.updateProgress : null;
    
this.onLoadStart();
    
this.loadAjaxJSON(this, a, b, c, d, e)
};
THREE.BinaryLoader.prototype.loadAjaxJSON = function(a, b, c, d, e, f) {
    var 
g = new XMLHttpRequest;
    
g.onreadystatechange = function() {
        if (
g.readyState == 4)
            if (
g.status == 200 || g.status == 0) {
                var 
h = JSON.parse(g.responseText);
                
a.loadAjaxBuffers(h, c, e, d, f)
            } else 
console.error("THREE.BinaryLoader: Couldn't load [" + b + "] [" + g.status + "]")
    };
    
g.open("GET", b, true);
    
g.overrideMimeType && g.overrideMimeType("text/plain; charset=x-user-defined");
    
g.setRequestHeader("Content-Type", "text/plain");
    
g.send(null)
};
THREE.BinaryLoader.prototype.loadAjaxBuffers = function(a, b, c, d, e) {
    var 
f = new XMLHttpRequest,
        
g = c + "/" + a.buffers,
        
h = 0;
    
f.onreadystatechange = function() {
        if (
f.readyState == 4) f.status == 200 || f.status == 0 ? THREE.BinaryLoader.prototype.createBinModel(f.response, b, d, a.materials) : console.error("THREE.BinaryLoader: Couldn't load [" + g + "] [" + f.status + "]");
        else if (
f.readyState == 3) {
            if (
e) {
                
h == 0 && (h = f.getResponseHeader("Content-Length"));
                
e({
                    
total: h,
                    
loaded: f.responseText.length
                
})
            }
        } else 
f.readyState == 2 && (h = f.getResponseHeader("Content-Length"))
    };
    
f.open("GET", g, true);
    
f.responseType = "arraybuffer";
    
f.send(null)
};
THREE.BinaryLoader.prototype.createBinModel = function(a, b, c, d) {
    var 
e = function(b) {
        var 
c, e, i, j, l, m, n, p, r, o, q, s, w, t, v;

        function 
x(a) {
            return 
a % 4 ? 4 - a % 4 : 0
        
}

        function 
C(a, b) {
            return (new 
Uint8Array(a, b, 1))[0]
        }

        function 
D(a, b) {
            return (new 
Uint32Array(a, b, 1))[0]
        }

        function 
z(b, c) {
            var 
d, f, e, g, h, i, j, l, m = new Uint32Array(a, c, 3 * b);
            for (
d = 0; d < b; d++) {
                
f = m[d * 3];
                
e = m[d * 3 + 1];
                
g = m[d * 3 + 2];
                
h = Q[f * 2];
                
f = Q[f * 2 + 1];
                
i = Q[e * 2];
                
j = Q[e * 2 + 1];
                
e = Q[g * 2];
                
l = Q[g * 2 + 1];
                
g = X.faceVertexUvs[0];
                var 
n = [];
                
n.push(new THREE.UV(h, f));
                
n.push(new THREE.UV(i, j));
                
n.push(new THREE.UV(e,
                    
l));
                
g.push(n)
            }
        }

        function 
u(b, c) {
            var 
d, f, e, g, h, i, j, l, m, n, o = new Uint32Array(a, c, 4 * b);
            for (
d = 0; d < b; d++) {
                
f = o[d * 4];
                
e = o[d * 4 + 1];
                
g = o[d * 4 + 2];
                
h = o[d * 4 + 3];
                
i = Q[f * 2];
                
f = Q[f * 2 + 1];
                
j = Q[e * 2];
                
m = Q[e * 2 + 1];
                
l = Q[g * 2];
                
n = Q[g * 2 + 1];
                
g = Q[h * 2];
                
e = Q[h * 2 + 1];
                
h = X.faceVertexUvs[0];
                var 
p = [];
                
p.push(new THREE.UV(i, f));
                
p.push(new THREE.UV(j, m));
                
p.push(new THREE.UV(l, n));
                
p.push(new THREE.UV(g, e));
                
h.push(p)
            }
        }

        function 
G(b, c, d) {
            for (var 
f, e, g, h, c = new Uint32Array(a, c, 3 * b), i = new Uint16Array(a, d, b), d = 0; d < b; d++) {
                
f = c[d * 3];
                
e = c[d * 3 + 1];
                
g = c[d * 3 + 2];
                
h = i[d];
                
X.faces.push(new THREE.Face3(f, e, g, null, null, h))
            }
        }

        function 
J(b, c, d) {
            for (var 
f, e, g, h, i, c = new Uint32Array(a, c, 4 * b), j = new Uint16Array(a, d, b), d = 0; d < b; d++) {
                
f = c[d * 4];
                
e = c[d * 4 + 1];
                
g = c[d * 4 + 2];
                
h = c[d * 4 + 3];
                
i = j[d];
                
X.faces.push(new THREE.Face4(f, e, g, h, null, null, i))
            }
        }

        function 
M(b, c, d, f) {
            for (var 
e, g, h, i, j, l, m, c = new Uint32Array(a, c, 3 * b), d = new Uint32Array(a, d, 3 * b), n = new Uint16Array(a, f, b), f = 0; f < b; f++) {
                
e = c[f * 3];
                
g = c[f * 3 + 1];
                
h = c[f * 3 + 2];
                
j = d[f * 3];
                
l = d[f * 3 + 1];
                
m = d[f * 3 + 2];
                
i = n[f];
                var 
o = F[l * 3],
                    
p = F[l * 3 + 1];
                
l = F[l * 3 + 2];
                var 
r = F[m * 3],
                    
q = F[m * 3 + 1];
                
m = F[m * 3 + 2];
                
X.faces.push(new THREE.Face3(e, g, h, [new THREE.Vector3(F[j * 3], F[j * 3 + 1], F[j * 3 + 2]), new THREE.Vector3(o, p, l), new THREE.Vector3(r, q, m)], null, i))
            }
        }

        function 
O(b, c, d, f) {
            for (var 
e, g, h, i, j, l, m, n, o, c = new Uint32Array(a, c, 4 * b), d = new Uint32Array(a, d, 4 * b), p = new Uint16Array(a, f, b), f = 0; f < b; f++) {
                
e = c[f * 4];
                
g = c[f * 4 + 1];
                
h = c[f * 4 + 2];
                
i = c[f * 4 + 3];
                
l = d[f * 4];
                
m = d[f * 4 + 1];
                
n = d[f * 4 + 2];
                
o = d[f * 4 + 3];
                
j = p[f];
                var 
r = F[m * 3],
                    
q = F[m * 3 + 1];
                
m = F[m * 3 + 2];
                var 
s = F[n * 3],
                    
u = F[n * 3 + 1];
                
n = F[n * 3 + 2];
                var 
t = F[o * 3],
                    
v = F[o * 3 + 1];
                
o = F[o * 3 + 2];
                
X.faces.push(new THREE.Face4(e,
                    
g, h, i, [new THREE.Vector3(F[l * 3], F[l * 3 + 1], F[l * 3 + 2]), new THREE.Vector3(r, q, m), new THREE.Vector3(s, u, n), new THREE.Vector3(t, v, o)], null, j))
            }
        }
        var 
X = this,
            
B = 0,
            
F = [],
            
Q = [],
            
E, aa, T;
        
THREE.Geometry.call(this);
        
THREE.Loader.prototype.initMaterials(X, d, b);
        (function(
a, b, c) {
            for (var 
a = new Uint8Array(a, b, c), d = "", f = 0; f < c; f++) d = d + String.fromCharCode(a[b + f]);
            return 
d
        
})(a, B, 12);
        
c = C(a, B + 12);
        
C(a, B + 13);
        
C(a, B + 14);
        
C(a, B + 15);
        
e = C(a, B + 16);
        
i = C(a, B + 17);
        
j = C(a, B + 18);
        
l = C(a, B + 19);
        
m = D(a, B + 20);
        
n = D(a, B + 20 + 4);
        
p = D(a, B + 20 + 8);
        
b = D(a, B + 20 + 12);
        
r = D(a, B + 20 + 16);
        
o = D(a, B + 20 + 20);
        
q = D(a, B + 20 + 24);
        
s = D(a, B + 20 + 28);
        
w = D(a, B + 20 + 32);
        
t = D(a, B + 20 + 36);
        
v = D(a, B + 20 + 40);
        
B = B + c;
        
c = e * 3 + l;
        
T = e * 4 + l;
        
E = b * c;
        
aa = r * (c + i * 3);
        
e = o * (c + j * 3);
        
l = q * (c + i * 3 + j * 3);
        
c = s * T;
        
i = w * (T + i * 4);
        
j = t * (T + j * 4);
        
B = B + function(b) {
            var 
b = new Float32Array(a, b, m * 3),
                
c, d, f, e;
            for (
c = 0; c < m; c++) {
                
d = b[c * 3];
                
f = b[c * 3 + 1];
                
e = b[c * 3 + 2];
                
X.vertices.push(new THREE.Vector3(d, f, e))
            }
            return 
m * 3 * Float32Array.BYTES_PER_ELEMENT
        
}(B);
        
B = B + function(b) {
            if (
n) {
                var 
b = new Int8Array(a, b, n * 3),
                    
c, d, f, e;
                for (
c = 0; c < n; c++) {
                    
d = b[c * 3];
                    
f = b[c * 3 + 1];
                    
e = b[c * 3 + 2];
                    
F.push(d / 127, f / 127, e / 127)
                }
            }
            return 
n * 3 * Int8Array.BYTES_PER_ELEMENT
        
}(B);
        
B = B + x(n * 3);
        
B = B + function(b) {
            if (
p) {
                var 
b = new Float32Array(a, b, p * 2),
                    
c, d, f;
                for (
c = 0; c < p; c++) {
                    
d = b[c * 2];
                    
f = b[c * 2 + 1];
                    
Q.push(d, f)
                }
            }
            return 
p * 2 * Float32Array.BYTES_PER_ELEMENT
        
}(B);
        
E = B + E + x(b * 2);
        
aa = E + aa + x(r * 2);
        
e = aa + e + x(o * 2);
        
l = e + l + x(q * 2);
        
c = l + c + x(s * 2);
        
i = c + i + x(w * 2);
        
j = i + j + x(t * 2);
        (function(
a) {
            if (
o) {
                var 
b = a + o * Uint32Array.BYTES_PER_ELEMENT * 3;
                
G(o, a, b + o * Uint32Array.BYTES_PER_ELEMENT * 3);
                
z(o, b)
            }
        })(
aa);
        (function(
a) {
            if (
q) {
                var 
b = a + q * Uint32Array.BYTES_PER_ELEMENT *
                    
3,
                    
c = b + q * Uint32Array.BYTES_PER_ELEMENT * 3;
                
M(q, a, b, c + q * Uint32Array.BYTES_PER_ELEMENT * 3);
                
z(q, c)
            }
        })(
e);
        (function(
a) {
            if (
t) {
                var 
b = a + t * Uint32Array.BYTES_PER_ELEMENT * 4;
                
J(t, a, b + t * Uint32Array.BYTES_PER_ELEMENT * 4);
                
u(t, b)
            }
        })(
i);
        (function(
a) {
            if (
v) {
                var 
b = a + v * Uint32Array.BYTES_PER_ELEMENT * 4,
                    
c = b + v * Uint32Array.BYTES_PER_ELEMENT * 4;
                
O(v, a, b, c + v * Uint32Array.BYTES_PER_ELEMENT * 4);
                
u(v, c)
            }
        })(
j);
        
b && G(b, B, B + b * Uint32Array.BYTES_PER_ELEMENT * 3);
        (function(
a) {
            if (
r) {
                var 
b = a + r * Uint32Array.BYTES_PER_ELEMENT * 3;
                
M(r, a, b, b + r * Uint32Array.BYTES_PER_ELEMENT *
                    
3)
            }
        })(
E);
        
s && J(s, l, l + s * Uint32Array.BYTES_PER_ELEMENT * 4);
        (function(
a) {
            if (
w) {
                var 
b = a + w * Uint32Array.BYTES_PER_ELEMENT * 4;
                
O(w, a, b, b + w * Uint32Array.BYTES_PER_ELEMENT * 4)
            }
        })(
c);
        
this.computeCentroids();
        
this.computeFaceNormals();
        
THREE.Loader.prototype.hasNormals(this) && this.computeTangents()
    };
    
e.prototype = Object.create(THREE.Geometry.prototype);
    
b(new e(c))
};
THREE.ImageLoader = function() {
    
THREE.EventTarget.call(this);
    
this.crossOrigin = null
};
THREE.ImageLoader.prototype = {
    
constructor: THREE.ImageLoader,
    
load: function(a) {
        var 
b = this,
            
c = new Image;
        
c.addEventListener("load", function() {
            
b.dispatchEvent({
                
type: "load",
                
content: c
            
})
        }, 
false);
        
c.addEventListener("error", function() {
            
b.dispatchEvent({
                
type: "error",
                
message: "Couldn't load URL [" + a + "]"
            
})
        }, 
false);
        if (
b.crossOrigin) c.crossOrigin = b.crossOrigin;
        
c.src = a
    
}
};
THREE.JSONLoader = function(a) {
    
THREE.Loader.call(this, a)
};
THREE.JSONLoader.prototype = Object.create(THREE.Loader.prototype);
THREE.JSONLoader.prototype.load = function(a, b, c) {
    
c = c ? c : this.extractUrlBase(a);
    
this.onLoadStart();
    
this.loadAjaxJSON(this, a, b, c)
};
THREE.JSONLoader.prototype.loadAjaxJSON = function(a, b, c, d, e) {
    var 
f = new XMLHttpRequest,
        
g = 0;
    
f.onreadystatechange = function() {
        if (
f.readyState === f.DONE)
            if (
f.status === 200 || f.status === 0) {
                if (
f.responseText) {
                    var 
h = JSON.parse(f.responseText);
                    
a.createModel(h, c, d)
                } else 
console.warn("THREE.JSONLoader: [" + b + "] seems to be unreachable or file there is empty");
                
a.onLoadComplete()
            } else 
console.error("THREE.JSONLoader: Couldn't load [" + b + "] [" + f.status + "]");
        else if (
f.readyState === f.LOADING) {
            if (
e) {
                
g === 0 && (g = f.getResponseHeader("Content-Length"));
                
e({
                    
total: g,
                    
loaded: f.responseText.length
                
})
            }
        } else 
f.readyState === f.HEADERS_RECEIVED && (g = f.getResponseHeader("Content-Length"))
    };
    
f.open("GET", b, true);
    
f.overrideMimeType && f.overrideMimeType("text/plain; charset=x-user-defined");
    
f.setRequestHeader("Content-Type", "text/plain");
    
f.send(null)
};
THREE.JSONLoader.prototype.createModel = function(a, b, c) {
    var 
d = new THREE.Geometry,
        
e = a.scale !== void 0 ? 1 / a.scale : 1;
    
this.initMaterials(d, a.materials, c);
    (function(
b) {
        var 
c, e, i, j, l, m, n, p, r, o, q, s, w, t, v = a.faces;
        
m = a.vertices;
        var 
x = a.normals,
            
C = a.colors,
            
D = 0;
        for (
c = 0; c < a.uvs.length; c++) a.uvs[c].length && D++;
        for (
c = 0; c < D; c++) {
            
d.faceUvs[c] = [];
            
d.faceVertexUvs[c] = []
        }
        
j = 0;
        for (
l = m.length; j < l;) {
            
n = new THREE.Vector3;
            
n.x = m[j++] * b;
            
n.y = m[j++] * b;
            
n.z = m[j++] * b;
            
d.vertices.push(n)
        }
        
j = 0;
        for (
l = v.length; j < l;) {
            
b = v[j++];
            
m = b & 1;
            
i = b & 2;
            
c = b &
                
4;
            
e = b & 8;
            
p = b & 16;
            
n = b & 32;
            
o = b & 64;
            
b = b & 128;
            if (
m) {
                
q = new THREE.Face4;
                
q.a = v[j++];
                
q.b = v[j++];
                
q.c = v[j++];
                
q.d = v[j++];
                
m = 4
            
} else {
                
q = new THREE.Face3;
                
q.a = v[j++];
                
q.b = v[j++];
                
q.c = v[j++];
                
m = 3
            
}
            if (
i) {
                
i = v[j++];
                
q.materialIndex = i
            
}
            
i = d.faces.length;
            if (
c)
                for (
c = 0; c < D; c++) {
                    
s = a.uvs[c];
                    
r = v[j++];
                    
t = s[r * 2];
                    
r = s[r * 2 + 1];
                    
d.faceUvs[c][i] = new THREE.UV(t, r)
                }
            if (
e)
                for (
c = 0; c < D; c++) {
                    
s = a.uvs[c];
                    
w = [];
                    for (
e = 0; e < m; e++) {
                        
r = v[j++];
                        
t = s[r * 2];
                        
r = s[r * 2 + 1];
                        
w[e] = new THREE.UV(t, r)
                    }
                    
d.faceVertexUvs[c][i] = w
                
}
            if (
p) {
                
p = v[j++] * 3;
                
e = new THREE.Vector3;
                
e.x = x[p++];
                
e.y = x[p++];
                
e.z = x[p];
                
q.normal = e
            
}
            if (
n)
                for (
c = 0; c < m; c++) {
                    
p = v[j++] * 3;
                    
e = new THREE.Vector3;
                    
e.x = x[p++];
                    
e.y = x[p++];
                    
e.z = x[p];
                    
q.vertexNormals.push(e)
                }
            if (
o) {
                
n = v[j++];
                
n = new THREE.Color(C[n]);
                
q.color = n
            
}
            if (
b)
                for (
c = 0; c < m; c++) {
                    
n = v[j++];
                    
n = new THREE.Color(C[n]);
                    
q.vertexColors.push(n)
                }
            
d.faces.push(q)
        }
    })(
e);
    (function() {
        var 
b, c, e, i;
        if (
a.skinWeights) {
            
b = 0;
            for (
c = a.skinWeights.length; b < c; b = b + 2) {
                
e = a.skinWeights[b];
                
i = a.skinWeights[b + 1];
                
d.skinWeights.push(new THREE.Vector4(e, i, 0, 0))
            }
        }
        if (
a.skinIndices) {
            
b = 0;
            for (
c = a.skinIndices.length; b < c; b =
                
b + 2) {
                
e = a.skinIndices[b];
                
i = a.skinIndices[b + 1];
                
d.skinIndices.push(new THREE.Vector4(e, i, 0, 0))
            }
        }
        
d.bones = a.bones;
        
d.animation = a.animation
    
})();
    (function(
b) {
        if (
a.morphTargets !== void 0) {
            var 
c, e, i, j, l, m;
            
c = 0;
            for (
e = a.morphTargets.length; c < e; c++) {
                
d.morphTargets[c] = {};
                
d.morphTargets[c].name = a.morphTargets[c].name;
                
d.morphTargets[c].vertices = [];
                
l = d.morphTargets[c].vertices;
                
m = a.morphTargets[c].vertices;
                
i = 0;
                for (
j = m.length; i < j; i = i + 3) {
                    var 
n = new THREE.Vector3;
                    
n.x = m[i] * b;
                    
n.y = m[i + 1] * b;
                    
n.z = m[i + 2] * b;
                    
l.push(n)
                }
            }
        }
        if (
a.morphColors !==
            
void 0) {
            
c = 0;
            for (
e = a.morphColors.length; c < e; c++) {
                
d.morphColors[c] = {};
                
d.morphColors[c].name = a.morphColors[c].name;
                
d.morphColors[c].colors = [];
                
j = d.morphColors[c].colors;
                
l = a.morphColors[c].colors;
                
b = 0;
                for (
i = l.length; b < i; b = b + 3) {
                    
m = new THREE.Color(16755200);
                    
m.setRGB(l[b], l[b + 1], l[b + 2]);
                    
j.push(m)
                }
            }
        }
    })(
e);
    
d.computeCentroids();
    
d.computeFaceNormals();
    
this.hasNormals(d) && d.computeTangents();
    
b(d)
};
THREE.GeometryLoader = function() {
    
THREE.EventTarget.call(this);
    
this.path = this.crossOrigin = null
};
THREE.GeometryLoader.prototype = {
    
constructor: THREE.GeometryLoader,
    
load: function(a) {
        var 
b = this,
            
c = null;
        if (
b.path === null) {
            var 
d = a.split("/");
            
d.pop();
            
b.path = d.length < 1 ? "." : d.join("/")
        }
        
d = new XMLHttpRequest;
        
d.addEventListener("load", function(d) {
            
d.target.responseText ? c = b.parse(JSON.parse(d.target.responseText), e) : b.dispatchEvent({
                
type: "error",
                
message: "Invalid file [" + a + "]"
            
})
        }, 
false);
        
d.addEventListener("error", function() {
            
b.dispatchEvent({
                
type: "error",
                
message: "Couldn't load URL [" + a + "]"
            
})
        }, 
false);
        
d.open("GET",
            
a, true);
        
d.send(null);
        var 
e = new THREE.LoadingMonitor;
        
e.addEventListener("load", function() {
            
b.dispatchEvent({
                
type: "load",
                
content: c
            
})
        });
        
e.add(d)
    },
    
parse: function(a, b) {
        var 
c = this,
            
d = new THREE.Geometry,
            
e = a.scale !== void 0 ? 1 / a.scale : 1;
        if (
a.materials) {
            
d.materials = [];
            for (var 
f = 0; f < a.materials.length; ++f) {
                var 
g = a.materials[f],
                    
h = function(a) {
                        
a = Math.log(a) / Math.LN2;
                        return 
Math.floor(a) == a
                    
},
                    
i = function(a) {
                        
a = Math.log(a) / Math.LN2;
                        return 
Math.pow(2, Math.round(a))
                    },
                    
j = function(a, d, e, f, g, j) {
                        
a[d] = new THREE.Texture;
                        
a[d].sourceFile =
                            
e;
                        if (
f) {
                            
a[d].repeat.set(f[0], f[1]);
                            if (
f[0] != 1) a[d].wrapS = THREE.RepeatWrapping;
                            if (
f[1] != 1) a[d].wrapT = THREE.RepeatWrapping
                        
}
                        
g && a[d].offset.set(g[0], g[1]);
                        if (
j) {
                            
f = {
                                
repeat: THREE.RepeatWrapping,
                                
mirror: THREE.MirroredRepeatWrapping
                            
};
                            if (
f[j[0]] !== void 0) a[d].wrapS = f[j[0]];
                            if (
f[j[1]] !== void 0) a[d].wrapT = f[j[1]]
                        }
                        var 
l = a[d],
                            
a = new THREE.ImageLoader;
                        
a.addEventListener("load", function(a) {
                            
a = a.content;
                            if (!
h(a.width) || !h(a.height)) {
                                var 
b = i(a.width),
                                    
c = i(a.height);
                                
l.image = document.createElement("canvas");
                                
l.image.width =
                                    
b;
                                
l.image.height = c;
                                
l.image.getContext("2d").drawImage(a, 0, 0, b, c)
                            } else 
l.image = a;
                            
l.needsUpdate = true
                        
});
                        
a.crossOrigin = c.crossOrigin;
                        
a.load(c.path + "/" + e);
                        
b && b.add(a)
                    },
                    
l = function(a) {
                        return (
a[0] * 255 << 16) + (a[1] * 255 << 8) + a[2] * 255
                    
},
                    
m = "MeshLambertMaterial",
                    
n = {
                        
color: 15658734,
                        
opacity: 1,
                        
map: null,
                        
lightMap: null,
                        
normalMap: null,
                        
wireframe: g.wireframe
                    
};
                if (
g.shading) {
                    var 
p = g.shading.toLowerCase();
                    
p === "phong" ? m = "MeshPhongMaterial" : p === "basic" && (m = "MeshBasicMaterial")
                }
                if (
g.blending !== void 0 && THREE[g.blending] !== void 0) n.blending =
                    
THREE[g.blending];
                if (
g.transparent !== void 0 || g.opacity < 1) n.transparent = g.transparent;
                if (
g.depthTest !== void 0) n.depthTest = g.depthTest;
                if (
g.depthWrite !== void 0) n.depthWrite = g.depthWrite;
                if (
g.vertexColors !== void 0)
                    if (
g.vertexColors == "face") n.vertexColors = THREE.FaceColors;
                    else if (
g.vertexColors) n.vertexColors = THREE.VertexColors;
                if (
g.colorDiffuse) n.color = l(g.colorDiffuse);
                else if (
g.DbgColor) n.color = g.DbgColor;
                if (
g.colorSpecular) n.specular = l(g.colorSpecular);
                if (
g.colorAmbient) n.ambient = l(g.colorAmbient);
                if (
g.transparency) n.opacity = g.transparency;
                if (
g.specularCoef) n.shininess = g.specularCoef;
                
g.mapDiffuse && j(n, "map", g.mapDiffuse, g.mapDiffuseRepeat, g.mapDiffuseOffset, g.mapDiffuseWrap);
                
g.mapLight && j(n, "lightMap", g.mapLight, g.mapLightRepeat, g.mapLightOffset, g.mapLightWrap);
                
g.mapNormal && j(n, "normalMap", g.mapNormal, g.mapNormalRepeat, g.mapNormalOffset, g.mapNormalWrap);
                
g.mapSpecular && j(n, "specularMap", g.mapSpecular, g.mapSpecularRepeat, g.mapSpecularOffset, g.mapSpecularWrap);
                if (
g.mapNormal) {
                    
j = THREE.ShaderUtils.lib.normal;
                    
l = THREE.UniformsUtils.clone(j.uniforms);
                    
l.tNormal.texture = n.normalMap;
                    if (
g.mapNormalFactor) l.uNormalScale.value = g.mapNormalFactor;
                    if (
n.map) {
                        
l.tDiffuse.texture = n.map;
                        
l.enableDiffuse.value = true
                    
}
                    if (
n.specularMap) {
                        
l.tSpecular.texture = n.specularMap;
                        
l.enableSpecular.value = true
                    
}
                    if (
n.lightMap) {
                        
l.tAO.texture = n.lightMap;
                        
l.enableAO.value = true
                    
}
                    
l.uDiffuseColor.value.setHex(n.color);
                    
l.uSpecularColor.value.setHex(n.specular);
                    
l.uAmbientColor.value.setHex(n.ambient);
                    
l.uShininess.value = n.shininess;
                    if (
n.opacity !== void 0) l.uOpacity.value =
                        
n.opacity;
                    
n = new THREE.ShaderMaterial({
                        
fragmentShader: j.fragmentShader,
                        
vertexShader: j.vertexShader,
                        
uniforms: l,
                        
lights: true,
                        
fog: true
                    
})
                } else 
n = new THREE[m](n);
                if (
g.DbgName !== void 0) n.name = g.DbgName;
                
d.materials[f] = n
            
}
        }
        var 
g = a.faces,
            
r = a.vertices,
            
n = a.normals,
            
j = a.colors,
            
l = 0;
        if (
a.uvs)
            for (
f = 0; f < a.uvs.length; f++) a.uvs[f].length && l++;
        for (
f = 0; f < l; f++) {
            
d.faceUvs[f] = [];
            
d.faceVertexUvs[f] = []
        }
        
m = 0;
        for (
p = r.length; m < p;) {
            var 
o = new THREE.Vector3;
            
o.x = r[m++] * e;
            
o.y = r[m++] * e;
            
o.z = r[m++] * e;
            
d.vertices.push(o)
        }
        
m = 0;
        for (
p = g.length; m <
            
p;) {
            var 
q = g[m++],
                
s = q & 2,
                
f = q & 4,
                
w = q & 8,
                
t = q & 16,
                
r = q & 32,
                
v = q & 64,
                
o = q & 128;
            if (
q & 1) {
                
q = new THREE.Face4;
                
q.a = g[m++];
                
q.b = g[m++];
                
q.c = g[m++];
                
q.d = g[m++];
                var 
x = 4
            
} else {
                
q = new THREE.Face3;
                
q.a = g[m++];
                
q.b = g[m++];
                
q.c = g[m++];
                
x = 3
            
}
            if (
s) {
                
s = g[m++];
                
q.materialIndex = s
            
}
            var 
C = d.faces.length;
            if (
f)
                for (
f = 0; f < l; f++) {
                    var 
D = a.uvs[f],
                        
s = g[m++],
                        
z = D[s * 2],
                        
s = D[s * 2 + 1];
                    
d.faceUvs[f][C] = new THREE.UV(z, s)
                }
            if (
w)
                for (
f = 0; f < l; f++) {
                    for (var 
D = a.uvs[f], w = [], u = 0; u < x; u++) {
                        
s = g[m++];
                        
z = D[s * 2];
                        
s = D[s * 2 + 1];
                        
w[u] = new THREE.UV(z, s)
                    }
                    
d.faceVertexUvs[f][C] = w
                
}
            if (
t) {
                
t = g[m++] *
                    
3;
                
s = new THREE.Vector3;
                
s.x = n[t++];
                
s.y = n[t++];
                
s.z = n[t];
                
q.normal = s
            
}
            if (
r)
                for (
f = 0; f < x; f++) {
                    
t = g[m++] * 3;
                    
s = new THREE.Vector3;
                    
s.x = n[t++];
                    
s.y = n[t++];
                    
s.z = n[t];
                    
q.vertexNormals.push(s)
                }
            if (
v) {
                
r = g[m++];
                
q.color = new THREE.Color(j[r])
            }
            if (
o)
                for (
f = 0; f < x; f++) {
                    
r = g[m++];
                    
q.vertexColors.push(new THREE.Color(j[r]))
                }
            
d.faces.push(q)
        }
        if (
a.skinWeights) {
            
f = 0;
            for (
g = a.skinWeights.length; f < g; f = f + 2) d.skinWeights.push(new THREE.Vector4(a.skinWeights[f], a.skinWeights[f + 1], 0, 0))
        }
        if (
a.skinIndices) {
            
f = 0;
            for (
g = a.skinIndices.length; f < g; f = f +
                
2) {
                
n = 0;
                
d.skinIndices.push(new THREE.Vector4(a.skinIndices[f], a.skinIndices[f + 1], n, 0))
            }
        }
        
d.bones = a.bones;
        
d.animation = a.animation;
        if (
a.morphTargets) {
            
f = 0;
            for (
g = a.morphTargets.length; f < g; f++) {
                
d.morphTargets[f] = {};
                
d.morphTargets[f].name = a.morphTargets[f].name;
                
d.morphTargets[f].vertices = [];
                
n = d.morphTargets[f].vertices;
                
j = a.morphTargets[f].vertices;
                
s = 0;
                for (
l = j.length; s < l; s = s + 3) {
                    
o = new THREE.Vector3;
                    
o.x = j[s] * e;
                    
o.y = j[s + 1] * e;
                    
o.z = j[s + 2] * e;
                    
n.push(o)
                }
            }
        }
        if (
a.morphColors) {
            
f = 0;
            for (
g = a.morphColors.length; f < g; f++) {
                
d.morphColors[f] = {};
                
d.morphColors[f].name = a.morphColors[f].name;
                
d.morphColors[f].colors = [];
                
e = d.morphColors[f].colors;
                
j = a.morphColors[f].colors;
                
n = 0;
                for (
l = j.length; n < l; n = n + 3) {
                    
m = new THREE.Color(16755200);
                    
m.setRGB(j[n], j[n + 1], j[n + 2]);
                    
e.push(m)
                }
            }
        }
        
d.computeCentroids();
        
d.computeFaceNormals();
        return 
d
    
}
};
THREE.SceneLoader = function() {
    
this.onLoadStart = function() {};
    
this.onLoadProgress = function() {};
    
this.onLoadComplete = function() {};
    
this.callbackSync = function() {};
    
this.callbackProgress = function() {}
};
THREE.SceneLoader.prototype.constructor = THREE.SceneLoader;
THREE.SceneLoader.prototype.load = function(a, b) {
    var 
c = this,
        
d = new XMLHttpRequest;
    
d.onreadystatechange = function() {
        if (
d.readyState === 4)
            if (
d.status === 200 || d.status === 0) {
                var 
e = JSON.parse(d.responseText);
                
c.createScene(e, b, a)
            } else 
console.error("THREE.SceneLoader: Couldn't load [" + a + "] [" + d.status + "]")
    };
    
d.open("GET", a, true);
    
d.overrideMimeType && d.overrideMimeType("text/plain; charset=x-user-defined");
    
d.setRequestHeader("Content-Type", "text/plain");
    
d.send(null)
};
THREE.SceneLoader.prototype.createScene = function(a, b, c) {
    function 
d(a, b) {
        return 
b == "relativeToHTML" ? a : j + "/" + a
    
}

    function 
e() {
        var 
a;
        for (
n in B.objects)
            if (!
N.objects[n]) {
                
s = B.objects[n];
                if (
s.geometry !== void 0) {
                    if (
J = N.geometries[s.geometry]) {
                        
a = false;
                        
M = N.materials[s.materials[0]];
                        (
a = M instanceof THREE.ShaderMaterial) && J.computeTangents();
                        
x = s.position;
                        
C = s.rotation;
                        
D = s.quaternion;
                        
z = s.scale;
                        
w = s.matrix;
                        
D = 0;
                        
s.materials.length == 0 && (M = new THREE.MeshFaceMaterial);
                        
s.materials.length > 1 && (M = new THREE.MeshFaceMaterial);
                        
a = new THREE.Mesh(J, M);
                        
a.name = n;
                        if (
w) {
                            
a.matrixAutoUpdate = false;
                            
a.matrix.set(w[0], w[1], w[2], w[3], w[4], w[5], w[6], w[7], w[8], w[9], w[10], w[11], w[12], w[13], w[14], w[15])
                        } else {
                            
a.position.set(x[0], x[1], x[2]);
                            if (
D) {
                                
a.quaternion.set(D[0], D[1], D[2], D[3]);
                                
a.useQuaternion = true
                            
} else a.rotation.set(C[0], C[1], C[2]);
                            
a.scale.set(z[0], z[1], z[2])
                        }
                        
a.visible = s.visible;
                        
a.doubleSided = s.doubleSided;
                        
a.castShadow = s.castShadow;
                        
a.receiveShadow = s.receiveShadow;
                        
N.scene.add(a);
                        
N.objects[n] = a
                    
}
                } else {
                    
x = s.position;
                    
C = s.rotation;
                    
D = s.quaternion;
                    
z = s.scale;
                    
D = 0;
                    
a = new THREE.Object3D;
                    
a.name = n;
                    
a.position.set(x[0], x[1], x[2]);
                    if (
D) {
                        
a.quaternion.set(D[0], D[1], D[2], D[3]);
                        
a.useQuaternion = true
                    
} else a.rotation.set(C[0], C[1], C[2]);
                    
a.scale.set(z[0], z[1], z[2]);
                    
a.visible = s.visible !== void 0 ? s.visible : false;
                    
N.scene.add(a);
                    
N.objects[n] = a;
                    
N.empties[n] = a
                
}
            }
    }

    function 
f(a) {
        return function(
b) {
            
N.geometries[a] = b;
            
e();
            
Q = Q - 1;
            
i.onLoadComplete();
            
h()
        }
    }

    function 
g(a) {
        return function(
b) {
            
N.geometries[a] = b
        
}
    }

    function 
h() {
        
i.callbackProgress({
            
totalModels: aa,
            
totalTextures: T,
            
loadedModels: aa -
                
Q,
            
loadedTextures: T - E
        
}, N);
        
i.onLoadProgress();
        
Q === 0 && E === 0 && b(N)
    }
    var 
i = this,
        
j = THREE.Loader.prototype.extractUrlBase(c),
        
l, m, n, p, r, o, q, s, w, t, v, x, C, D, z, u, G, J, M, O, X, B, F, Q, E, aa, T, N;
    
B = a;
    
c = new THREE.BinaryLoader;
    
F = new THREE.JSONLoader;
    
E = Q = 0;
    
N = {
        
scene: new THREE.Scene,
        
geometries: {},
        
materials: {},
        
textures: {},
        
objects: {},
        
cameras: {},
        
lights: {},
        
fogs: {},
        
empties: {}
    };
    if (
B.transform) {
        
a = B.transform.position;
        
t = B.transform.rotation;
        
u = B.transform.scale;
        
a && N.scene.position.set(a[0], a[1], a[2]);
        
t && N.scene.rotation.set(t[0], t[1],
            
t[2]);
        
u && N.scene.scale.set(u[0], u[1], u[2]);
        if (
a || t || u) {
            
N.scene.updateMatrix();
            
N.scene.updateMatrixWorld()
        }
    }
    
a = function(a) {
        return function() {
            
E = E - a;
            
h();
            
i.onLoadComplete()
        }
    };
    for (
r in B.cameras) {
        
u = B.cameras[r];
        
u.type === "perspective" ? O = new THREE.PerspectiveCamera(u.fov, u.aspect, u.near, u.far) : u.type === "ortho" && (O = new THREE.OrthographicCamera(u.left, u.right, u.top, u.bottom, u.near, u.far));
        
x = u.position;
        
t = u.target;
        
u = u.up;
        
O.position.set(x[0], x[1], x[2]);
        
O.target = new THREE.Vector3(t[0], t[1], t[2]);
        
u && O.up.set(u[0],
            
u[1], u[2]);
        
N.cameras[r] = O
    
}
    for (
p in B.lights) {
        
t = B.lights[p];
        
r = t.color !== void 0 ? t.color : 16777215;
        
O = t.intensity !== void 0 ? t.intensity : 1;
        if (
t.type === "directional") {
            
x = t.direction;
            
v = new THREE.DirectionalLight(r, O);
            
v.position.set(x[0], x[1], x[2]);
            
v.position.normalize()
        } else if (
t.type === "point") {
            
x = t.position;
            
v = t.distance;
            
v = new THREE.PointLight(r, O, v);
            
v.position.set(x[0], x[1], x[2])
        } else 
t.type === "ambient" && (v = new THREE.AmbientLight(r));
        
N.scene.add(v);
        
N.lights[p] = v
    
}
    for (
o in B.fogs) {
        
p = B.fogs[o];
        
p.type === "linear" ?
            
X = new THREE.Fog(0, p.near, p.far) : p.type === "exp2" && (X = new THREE.FogExp2(0, p.density));
        
u = p.color;
        
X.color.setRGB(u[0], u[1], u[2]);
        
N.fogs[o] = X
    
}
    if (
N.cameras && B.defaults.camera) N.currentCamera = N.cameras[B.defaults.camera];
    if (
N.fogs && B.defaults.fog) N.scene.fog = N.fogs[B.defaults.fog];
    
u = B.defaults.bgcolor;
    
N.bgColor = new THREE.Color;
    
N.bgColor.setRGB(u[0], u[1], u[2]);
    
N.bgColorAlpha = B.defaults.bgalpha;
    for (
l in B.geometries) {
        
o = B.geometries[l];
        if (
o.type == "bin_mesh" || o.type == "ascii_mesh") {
            
Q = Q + 1;
            
i.onLoadStart()
        }
    }
    
aa =
        
Q;
    for (
l in B.geometries) {
        
o = B.geometries[l];
        if (
o.type === "cube") {
            
J = new THREE.CubeGeometry(o.width, o.height, o.depth, o.segmentsWidth, o.segmentsHeight, o.segmentsDepth, null, o.flipped, o.sides);
            
N.geometries[l] = J
        
} else if (o.type === "plane") {
            
J = new THREE.PlaneGeometry(o.width, o.height, o.segmentsWidth, o.segmentsHeight);
            
N.geometries[l] = J
        
} else if (o.type === "sphere") {
            
J = new THREE.SphereGeometry(o.radius, o.segmentsWidth, o.segmentsHeight);
            
N.geometries[l] = J
        
} else if (o.type === "cylinder") {
            
J = new THREE.CylinderGeometry(o.topRad,
                
o.botRad, o.height, o.radSegs, o.heightSegs);
            
N.geometries[l] = J
        
} else if (o.type === "torus") {
            
J = new THREE.TorusGeometry(o.radius, o.tube, o.segmentsR, o.segmentsT);
            
N.geometries[l] = J
        
} else if (o.type === "icosahedron") {
            
J = new THREE.IcosahedronGeometry(o.radius, o.subdivisions);
            
N.geometries[l] = J
        
} else if (o.type === "bin_mesh") c.load(d(o.url, B.urlBaseType), f(l));
        else if (
o.type === "ascii_mesh") F.load(d(o.url, B.urlBaseType), f(l));
        else if (
o.type === "embedded_mesh") {
            
o = B.embeds[o.id];
            
o.metadata = B.metadata;
            
o && F.createModel(o, g(l),
                
"")
        }
    }
    for (
q in B.textures) {
        
l = B.textures[q];
        if (
l.url instanceof Array) {
            
E = E + l.url.length;
            for (
o = 0; o < l.url.length; o++) i.onLoadStart()
        } else {
            
E = E + 1;
            
i.onLoadStart()
        }
    }
    
T = E;
    for (
q in B.textures) {
        
l = B.textures[q];
        if (
l.mapping !== void 0 && THREE[l.mapping] !== void 0) l.mapping = new THREE[l.mapping];
        if (
l.url instanceof Array) {
            
o = l.url.length;
            
X = [];
            for (
c = 0; c < o; c++) X[c] = d(l.url[c], B.urlBaseType);
            
o = THREE.ImageUtils.loadTextureCube(X, l.mapping, a(o))
        } else {
            
o = THREE.ImageUtils.loadTexture(d(l.url, B.urlBaseType), l.mapping, a(1));
            if (
THREE[l.minFilter] !==
                
void 0) o.minFilter = THREE[l.minFilter];
            if (
THREE[l.magFilter] !== void 0) o.magFilter = THREE[l.magFilter];
            if (
l.repeat) {
                
o.repeat.set(l.repeat[0], l.repeat[1]);
                if (
l.repeat[0] !== 1) o.wrapS = THREE.RepeatWrapping;
                if (
l.repeat[1] !== 1) o.wrapT = THREE.RepeatWrapping
            
}
            
l.offset && o.offset.set(l.offset[0], l.offset[1]);
            if (
l.wrap) {
                
X = {
                    
repeat: THREE.RepeatWrapping,
                    
mirror: THREE.MirroredRepeatWrapping
                
};
                if (
X[l.wrap[0]] !== void 0) o.wrapS = X[l.wrap[0]];
                if (
X[l.wrap[1]] !== void 0) o.wrapT = X[l.wrap[1]]
            }
        }
        
N.textures[q] = o
    
}
    for (
m in B.materials) {
        
w =
            
B.materials[m];
        for (
G in w.parameters)
            if (
G === "envMap" || G === "map" || G === "lightMap") w.parameters[G] = N.textures[w.parameters[G]];
            else if (
G === "shading") w.parameters[G] = w.parameters[G] == "flat" ? THREE.FlatShading : THREE.SmoothShading;
        else if (
G === "blending") w.parameters[G] = w.parameters[G] in THREE ? THREE[w.parameters[G]] : THREE.NormalBlending;
        else if (
G === "combine") w.parameters[G] = w.parameters[G] == "MixOperation" ? THREE.MixOperation : THREE.MultiplyOperation;
        else if (
G === "vertexColors")
            if (
w.parameters[G] == "face") w.parameters[G] =
                
THREE.FaceColors;
            else if (
w.parameters[G]) w.parameters[G] = THREE.VertexColors;
        if (
w.parameters.opacity !== void 0 && w.parameters.opacity < 1) w.parameters.transparent = true;
        if (
w.parameters.normalMap) {
            
q = THREE.ShaderUtils.lib.normal;
            
a = THREE.UniformsUtils.clone(q.uniforms);
            
l = w.parameters.color;
            
o = w.parameters.specular;
            
X = w.parameters.ambient;
            
c = w.parameters.shininess;
            
a.tNormal.texture = N.textures[w.parameters.normalMap];
            if (
w.parameters.normalMapFactor) a.uNormalScale.value = w.parameters.normalMapFactor;
            if (
w.parameters.map) {
                
a.tDiffuse.texture =
                    
w.parameters.map;
                
a.enableDiffuse.value = true
            
}
            if (
w.parameters.lightMap) {
                
a.tAO.texture = w.parameters.lightMap;
                
a.enableAO.value = true
            
}
            if (
w.parameters.specularMap) {
                
a.tSpecular.texture = N.textures[w.parameters.specularMap];
                
a.enableSpecular.value = true
            
}
            
a.uDiffuseColor.value.setHex(l);
            
a.uSpecularColor.value.setHex(o);
            
a.uAmbientColor.value.setHex(X);
            
a.uShininess.value = c;
            if (
w.parameters.opacity) a.uOpacity.value = w.parameters.opacity;
            
M = new THREE.ShaderMaterial({
                
fragmentShader: q.fragmentShader,
                
vertexShader: q.vertexShader,
                
uniforms: a,
                
lights: true,
                
fog: true
            
})
        } else 
M = new THREE[w.type](w.parameters);
        
N.materials[m] = M
    
}
    
e();
    
i.callbackSync(N);
    
h()
};
THREE.TextureLoader = function() {
    
THREE.EventTarget.call(this);
    
this.crossOrigin = null
};
THREE.TextureLoader.prototype = {
    
constructor: THREE.TextureLoader,
    
load: function(a) {
        var 
b = this,
            
c = new Image;
        
c.addEventListener("load", function() {
            var 
a = new THREE.Texture(c);
            
a.needsUpdate = true;
            
b.dispatchEvent({
                
type: "load",
                
content: a
            
})
        }, 
false);
        
c.addEventListener("error", function() {
            
b.dispatchEvent({
                
type: "error",
                
message: "Couldn't load URL [" + a + "]"
            
})
        }, 
false);
        if (
b.crossOrigin) c.crossOrigin = b.crossOrigin;
        
c.src = a
    
}
};
THREE.Material = function(a) {
    
a = a || {};
    
this.id = THREE.MaterialCount++;
    
this.name = "";
    
this.opacity = a.opacity !== void 0 ? a.opacity : 1;
    
this.transparent = a.transparent !== void 0 ? a.transparent : false;
    
this.blending = a.blending !== void 0 ? a.blending : THREE.NormalBlending;
    
this.blendSrc = a.blendSrc !== void 0 ? a.blendSrc : THREE.SrcAlphaFactor;
    
this.blendDst = a.blendDst !== void 0 ? a.blendDst : THREE.OneMinusSrcAlphaFactor;
    
this.blendEquation = a.blendEquation !== void 0 ? a.blendEquation : THREE.AddEquation;
    
this.depthTest = a.depthTest !== void 0 ?
        
a.depthTest : true;
    
this.depthWrite = a.depthWrite !== void 0 ? a.depthWrite : true;
    
this.polygonOffset = a.polygonOffset !== void 0 ? a.polygonOffset : false;
    
this.polygonOffsetFactor = a.polygonOffsetFactor !== void 0 ? a.polygonOffsetFactor : 0;
    
this.polygonOffsetUnits = a.polygonOffsetUnits !== void 0 ? a.polygonOffsetUnits : 0;
    
this.alphaTest = a.alphaTest !== void 0 ? a.alphaTest : 0;
    
this.overdraw = a.overdraw !== void 0 ? a.overdraw : false;
    
this.needsUpdate = this.visible = true
};
THREE.MaterialCount = 0;
THREE.LineBasicMaterial = function(a) {
    
THREE.Material.call(this, a);
    
a = a || {};
    
this.color = a.color !== void 0 ? new THREE.Color(a.color) : new THREE.Color(16777215);
    
this.linewidth = a.linewidth !== void 0 ? a.linewidth : 1;
    
this.linecap = a.linecap !== void 0 ? a.linecap : "round";
    
this.linejoin = a.linejoin !== void 0 ? a.linejoin : "round";
    
this.vertexColors = a.vertexColors ? a.vertexColors : false;
    
this.fog = a.fog !== void 0 ? a.fog : true
};
THREE.LineBasicMaterial.prototype = Object.create(THREE.Material.prototype);
THREE.MeshBasicMaterial = function(a) {
    
THREE.Material.call(this, a);
    
a = a || {};
    
this.color = a.color !== void 0 ? new THREE.Color(a.color) : new THREE.Color(16777215);
    
this.map = a.map !== void 0 ? a.map : null;
    
this.lightMap = a.lightMap !== void 0 ? a.lightMap : null;
    
this.envMap = a.envMap !== void 0 ? a.envMap : null;
    
this.combine = a.combine !== void 0 ? a.combine : THREE.MultiplyOperation;
    
this.reflectivity = a.reflectivity !== void 0 ? a.reflectivity : 1;
    
this.refractionRatio = a.refractionRatio !== void 0 ? a.refractionRatio : 0.98;
    
this.fog = a.fog !== void 0 ? a.fog :
        
true;
    
this.shading = a.shading !== void 0 ? a.shading : THREE.SmoothShading;
    
this.wireframe = a.wireframe !== void 0 ? a.wireframe : false;
    
this.wireframeLinewidth = a.wireframeLinewidth !== void 0 ? a.wireframeLinewidth : 1;
    
this.wireframeLinecap = a.wireframeLinecap !== void 0 ? a.wireframeLinecap : "round";
    
this.wireframeLinejoin = a.wireframeLinejoin !== void 0 ? a.wireframeLinejoin : "round";
    
this.vertexColors = a.vertexColors !== void 0 ? a.vertexColors : THREE.NoColors;
    
this.skinning = a.skinning !== void 0 ? a.skinning : false;
    
this.morphTargets = a.morphTargets !==
        
void 0 ? a.morphTargets : false
};
THREE.MeshBasicMaterial.prototype = Object.create(THREE.Material.prototype);
THREE.MeshLambertMaterial = function(a) {
    
THREE.Material.call(this, a);
    
a = a || {};
    
this.color = a.color !== void 0 ? new THREE.Color(a.color) : new THREE.Color(16777215);
    
this.ambient = a.ambient !== void 0 ? new THREE.Color(a.ambient) : new THREE.Color(16777215);
    
this.emissive = a.emissive !== void 0 ? new THREE.Color(a.emissive) : new THREE.Color(0);
    
this.wrapAround = a.wrapAround !== void 0 ? a.wrapAround : false;
    
this.wrapRGB = new THREE.Vector3(1, 1, 1);
    
this.map = a.map !== void 0 ? a.map : null;
    
this.lightMap = a.lightMap !== void 0 ? a.lightMap : null;
    
this.envMap =
        
a.envMap !== void 0 ? a.envMap : null;
    
this.combine = a.combine !== void 0 ? a.combine : THREE.MultiplyOperation;
    
this.reflectivity = a.reflectivity !== void 0 ? a.reflectivity : 1;
    
this.refractionRatio = a.refractionRatio !== void 0 ? a.refractionRatio : 0.98;
    
this.fog = a.fog !== void 0 ? a.fog : true;
    
this.shading = a.shading !== void 0 ? a.shading : THREE.SmoothShading;
    
this.wireframe = a.wireframe !== void 0 ? a.wireframe : false;
    
this.wireframeLinewidth = a.wireframeLinewidth !== void 0 ? a.wireframeLinewidth : 1;
    
this.wireframeLinecap = a.wireframeLinecap !== void 0 ?
        
a.wireframeLinecap : "round";
    
this.wireframeLinejoin = a.wireframeLinejoin !== void 0 ? a.wireframeLinejoin : "round";
    
this.vertexColors = a.vertexColors !== void 0 ? a.vertexColors : THREE.NoColors;
    
this.skinning = a.skinning !== void 0 ? a.skinning : false;
    
this.morphTargets = a.morphTargets !== void 0 ? a.morphTargets : false;
    
this.morphNormals = a.morphNormals !== void 0 ? a.morphNormals : false
};
THREE.MeshLambertMaterial.prototype = Object.create(THREE.Material.prototype);
THREE.MeshPhongMaterial = function(a) {
    
THREE.Material.call(this, a);
    
a = a || {};
    
this.color = a.color !== void 0 ? new THREE.Color(a.color) : new THREE.Color(16777215);
    
this.ambient = a.ambient !== void 0 ? new THREE.Color(a.ambient) : new THREE.Color(16777215);
    
this.emissive = a.emissive !== void 0 ? new THREE.Color(a.emissive) : new THREE.Color(0);
    
this.specular = a.specular !== void 0 ? new THREE.Color(a.specular) : new THREE.Color(1118481);
    
this.shininess = a.shininess !== void 0 ? a.shininess : 30;
    
this.metal = a.metal !== void 0 ? a.metal : false;
    
this.perPixel =
        
a.perPixel !== void 0 ? a.perPixel : false;
    
this.wrapAround = a.wrapAround !== void 0 ? a.wrapAround : false;
    
this.wrapRGB = new THREE.Vector3(1, 1, 1);
    
this.map = a.map !== void 0 ? a.map : null;
    
this.lightMap = a.lightMap !== void 0 ? a.lightMap : null;
    
this.envMap = a.envMap !== void 0 ? a.envMap : null;
    
this.combine = a.combine !== void 0 ? a.combine : THREE.MultiplyOperation;
    
this.reflectivity = a.reflectivity !== void 0 ? a.reflectivity : 1;
    
this.refractionRatio = a.refractionRatio !== void 0 ? a.refractionRatio : 0.98;
    
this.fog = a.fog !== void 0 ? a.fog : true;
    
this.shading =
        
a.shading !== void 0 ? a.shading : THREE.SmoothShading;
    
this.wireframe = a.wireframe !== void 0 ? a.wireframe : false;
    
this.wireframeLinewidth = a.wireframeLinewidth !== void 0 ? a.wireframeLinewidth : 1;
    
this.wireframeLinecap = a.wireframeLinecap !== void 0 ? a.wireframeLinecap : "round";
    
this.wireframeLinejoin = a.wireframeLinejoin !== void 0 ? a.wireframeLinejoin : "round";
    
this.vertexColors = a.vertexColors !== void 0 ? a.vertexColors : THREE.NoColors;
    
this.skinning = a.skinning !== void 0 ? a.skinning : false;
    
this.morphTargets = a.morphTargets !== void 0 ?
        
a.morphTargets : false;
    
this.morphNormals = a.morphNormals !== void 0 ? a.morphNormals : false
};
THREE.MeshPhongMaterial.prototype = Object.create(THREE.Material.prototype);
THREE.MeshDepthMaterial = function(a) {
    
THREE.Material.call(this, a);
    
a = a || {};
    
this.shading = a.shading !== void 0 ? a.shading : THREE.SmoothShading;
    
this.wireframe = a.wireframe !== void 0 ? a.wireframe : false;
    
this.wireframeLinewidth = a.wireframeLinewidth !== void 0 ? a.wireframeLinewidth : 1
};
THREE.MeshDepthMaterial.prototype = Object.create(THREE.Material.prototype);
THREE.MeshNormalMaterial = function(a) {
    
THREE.Material.call(this, a);
    
a = a || {};
    
this.shading = a.shading ? a.shading : THREE.FlatShading;
    
this.wireframe = a.wireframe ? a.wireframe : false;
    
this.wireframeLinewidth = a.wireframeLinewidth ? a.wireframeLinewidth : 1
};
THREE.MeshNormalMaterial.prototype = Object.create(THREE.Material.prototype);
THREE.MeshFaceMaterial = function() {};
THREE.ParticleBasicMaterial = function(a) {
    
THREE.Material.call(this, a);
    
a = a || {};
    
this.color = a.color !== void 0 ? new THREE.Color(a.color) : new THREE.Color(16777215);
    
this.map = a.map !== void 0 ? a.map : null;
    
this.size = a.size !== void 0 ? a.size : 1;
    
this.sizeAttenuation = a.sizeAttenuation !== void 0 ? a.sizeAttenuation : true;
    
this.vertexColors = a.vertexColors !== void 0 ? a.vertexColors : false;
    
this.fog = a.fog !== void 0 ? a.fog : true
};
THREE.ParticleBasicMaterial.prototype = Object.create(THREE.Material.prototype);
THREE.ParticleCanvasMaterial = function(a) {
    
THREE.Material.call(this, a);
    
a = a || {};
    
this.color = a.color !== void 0 ? new THREE.Color(a.color) : new THREE.Color(16777215);
    
this.program = a.program !== void 0 ? a.program : function() {}
};
THREE.ParticleCanvasMaterial.prototype = Object.create(THREE.Material.prototype);
THREE.ParticleDOMMaterial = function(a) {
    
THREE.Material.call(this);
    
this.domElement = a
};
THREE.ShaderMaterial = function(a) {
    
THREE.Material.call(this, a);
    
a = a || {};
    
this.fragmentShader = a.fragmentShader !== void 0 ? a.fragmentShader : "void main() {}";
    
this.vertexShader = a.vertexShader !== void 0 ? a.vertexShader : "void main() {}";
    
this.uniforms = a.uniforms !== void 0 ? a.uniforms : {};
    
this.attributes = a.attributes;
    
this.shading = a.shading !== void 0 ? a.shading : THREE.SmoothShading;
    
this.wireframe = a.wireframe !== void 0 ? a.wireframe : false;
    
this.wireframeLinewidth = a.wireframeLinewidth !== void 0 ? a.wireframeLinewidth : 1;
    
this.fog =
        
a.fog !== void 0 ? a.fog : false;
    
this.lights = a.lights !== void 0 ? a.lights : false;
    
this.vertexColors = a.vertexColors !== void 0 ? a.vertexColors : THREE.NoColors;
    
this.skinning = a.skinning !== void 0 ? a.skinning : false;
    
this.morphTargets = a.morphTargets !== void 0 ? a.morphTargets : false;
    
this.morphNormals = a.morphNormals !== void 0 ? a.morphNormals : false
};
THREE.ShaderMaterial.prototype = Object.create(THREE.Material.prototype);
THREE.Texture = function(a, b, c, d, e, f, g, h, i) {
    
this.id = THREE.TextureCount++;
    
this.image = a;
    
this.mapping = b !== void 0 ? b : new THREE.UVMapping;
    
this.wrapS = c !== void 0 ? c : THREE.ClampToEdgeWrapping;
    
this.wrapT = d !== void 0 ? d : THREE.ClampToEdgeWrapping;
    
this.magFilter = e !== void 0 ? e : THREE.LinearFilter;
    
this.minFilter = f !== void 0 ? f : THREE.LinearMipMapLinearFilter;
    
this.anisotropy = i !== void 0 ? i : 1;
    
this.format = g !== void 0 ? g : THREE.RGBAFormat;
    
this.type = h !== void 0 ? h : THREE.UnsignedByteType;
    
this.offset = new THREE.Vector2(0, 0);
    
this.repeat =
        new 
THREE.Vector2(1, 1);
    
this.generateMipmaps = true;
    
this.premultiplyAlpha = false;
    
this.flipY = true;
    
this.needsUpdate = false;
    
this.onUpdate = null
};
THREE.Texture.prototype = {
    
constructor: THREE.Texture,
    clone: function() {
        var 
a = new THREE.Texture(this.image, this.mapping, this.wrapS, this.wrapT, this.magFilter, this.minFilter, this.format, this.type, this.anisotropy);
        
a.offset.copy(this.offset);
        
a.repeat.copy(this.repeat);
        
a.generateMipmaps = this.generateMipmaps;
        
a.premultiplyAlpha = this.premultiplyAlpha;
        
a.flipY = this.flipY;
        return 
a
    
}
};
THREE.TextureCount = 0;
THREE.DataTexture = function(a, b, c, d, e, f, g, h, i, j) {
    
THREE.Texture.call(this, null, f, g, h, i, j, d, e);
    
this.image = {
        
data: a,
        
width: b,
        
height: c
    
}
};
THREE.DataTexture.prototype = Object.create(THREE.Texture.prototype);
THREE.DataTexture.prototype.clone = function() {
    var 
a = new THREE.DataTexture(this.image.data, this.image.width, this.image.height, this.format, this.type, this.mapping, this.wrapS, this.wrapT, this.magFilter, this.minFilter);
    
a.offset.copy(this.offset);
    
a.repeat.copy(this.repeat);
    return 
a
};
THREE.Particle = function(a) {
    
THREE.Object3D.call(this);
    
this.material = a
};
THREE.Particle.prototype = Object.create(THREE.Object3D.prototype);
THREE.ParticleSystem = function(a, b) {
    
THREE.Object3D.call(this);
    
this.geometry = a;
    
this.material = b !== void 0 ? b : new THREE.ParticleBasicMaterial({
        
color: Math.random() * 16777215
    
});
    
this.sortParticles = false;
    if (
this.geometry) {
        
this.geometry.boundingSphere || this.geometry.computeBoundingSphere();
        
this.boundRadius = a.boundingSphere.radius
    
}
    
this.frustumCulled = false
};
THREE.ParticleSystem.prototype = Object.create(THREE.Object3D.prototype);
THREE.Line = function(a, b, c) {
    
THREE.Object3D.call(this);
    
this.geometry = a;
    
this.material = b !== void 0 ? b : new THREE.LineBasicMaterial({
        
color: Math.random() * 16777215
    
});
    
this.type = c !== void 0 ? c : THREE.LineStrip;
    
this.geometry && (this.geometry.boundingSphere || this.geometry.computeBoundingSphere())
};
THREE.LineStrip = 0;
THREE.LinePieces = 1;
THREE.Line.prototype = Object.create(THREE.Object3D.prototype);
THREE.Mesh = function(a, b) {
    
THREE.Object3D.call(this);
    
this.geometry = a;
    
this.material = b !== void 0 ? b : new THREE.MeshBasicMaterial({
        
color: Math.random() * 16777215,
        
wireframe: true
    
});
    if (
this.geometry) {
        
this.geometry.boundingSphere || this.geometry.computeBoundingSphere();
        
this.boundRadius = a.boundingSphere.radius;
        if (
this.geometry.morphTargets.length) {
            
this.morphTargetBase = -1;
            
this.morphTargetForcedOrder = [];
            
this.morphTargetInfluences = [];
            
this.morphTargetDictionary = {};
            for (var 
c = 0; c < this.geometry.morphTargets.length; c++) {
                
this.morphTargetInfluences.push(0);
                
this.morphTargetDictionary[this.geometry.morphTargets[c].name] = c
            
}
        }
    }
};
THREE.Mesh.prototype = Object.create(THREE.Object3D.prototype);
THREE.Mesh.prototype.getMorphTargetIndexByName = function(a) {
    if (
this.morphTargetDictionary[a] !== void 0) return this.morphTargetDictionary[a];
    
console.log("THREE.Mesh.getMorphTargetIndexByName: morph target " + a + " does not exist. Returning 0.");
    return 
0
};
THREE.Bone = function(a) {
    
THREE.Object3D.call(this);
    
this.skin = a;
    
this.skinMatrix = new THREE.Matrix4
};
THREE.Bone.prototype = Object.create(THREE.Object3D.prototype);
THREE.Bone.prototype.update = function(a, b) {
    
this.matrixAutoUpdate && (b = b | this.updateMatrix());
    if (
b || this.matrixWorldNeedsUpdate) {
        
a ? this.skinMatrix.multiply(a, this.matrix) : this.skinMatrix.copy(this.matrix);
        
this.matrixWorldNeedsUpdate = false;
        
b = true
    
}
    var 
c, d = this.children.length;
    for (
c = 0; c < d; c++) this.children[c].update(this.skinMatrix, b)
};
THREE.SkinnedMesh = function(a, b, c) {
    
THREE.Mesh.call(this, a, b);
    
this.useVertexTexture = c !== void 0 ? c : true;
    
this.identityMatrix = new THREE.Matrix4;
    
this.bones = [];
    
this.boneMatrices = [];
    var 
d, e, f;
    if (
this.geometry.bones !== void 0) {
        for (
a = 0; a < this.geometry.bones.length; a++) {
            
c = this.geometry.bones[a];
            
d = c.pos;
            
e = c.rotq;
            
f = c.scl;
            
b = this.addBone();
            
b.name = c.name;
            
b.position.set(d[0], d[1], d[2]);
            
b.quaternion.set(e[0], e[1], e[2], e[3]);
            
b.useQuaternion = true;
            
f !== void 0 ? b.scale.set(f[0], f[1], f[2]) : b.scale.set(1, 1, 1)
        }
        for (
a = 0; a < this.bones.length; a++) {
            
c =
                
this.geometry.bones[a];
            
b = this.bones[a];
            
c.parent === -1 ? this.add(b) : this.bones[c.parent].add(b)
        }
        
a = this.bones.length;
        if (
this.useVertexTexture) {
            
this.boneTextureHeight = this.boneTextureWidth = a = a > 256 ? 64 : a > 64 ? 32 : a > 16 ? 16 : 8;
            
this.boneMatrices = new Float32Array(this.boneTextureWidth * this.boneTextureHeight * 4);
            
this.boneTexture = new THREE.DataTexture(this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, THREE.RGBAFormat, THREE.FloatType);
            
this.boneTexture.minFilter = THREE.NearestFilter;
            
this.boneTexture.magFilter =
                
THREE.NearestFilter;
            
this.boneTexture.generateMipmaps = false;
            
this.boneTexture.flipY = false
        
} else this.boneMatrices = new Float32Array(16 * a);
        
this.pose()
    }
};
THREE.SkinnedMesh.prototype = Object.create(THREE.Mesh.prototype);
THREE.SkinnedMesh.prototype.addBone = function(a) {
    
a === void 0 && (a = new THREE.Bone(this));
    
this.bones.push(a);
    return 
a
};
THREE.SkinnedMesh.prototype.updateMatrixWorld = function(a) {
    
this.matrixAutoUpdate && this.updateMatrix();
    if (
this.matrixWorldNeedsUpdate || a) {
        
this.parent ? this.matrixWorld.multiply(this.parent.matrixWorld, this.matrix) : this.matrixWorld.copy(this.matrix);
        
this.matrixWorldNeedsUpdate = false
    
}
    for (var 
a = 0, b = this.children.length; a < b; a++) {
        var 
c = this.children[a];
        
c instanceof THREE.Bone ? c.update(this.identityMatrix, false) : c.updateMatrixWorld(true)
    }
    for (var 
b = this.bones.length, c = this.bones, d = this.boneMatrices, a = 0; a < b; a++) c[a].skinMatrix.flattenToArrayOffset(d,
        
a * 16);
    if (
this.useVertexTexture) this.boneTexture.needsUpdate = true
};
THREE.SkinnedMesh.prototype.pose = function() {
    
this.updateMatrixWorld(true);
    for (var 
a, b = [], c = 0; c < this.bones.length; c++) {
        
a = this.bones[c];
        var 
d = new THREE.Matrix4;
        
d.getInverse(a.skinMatrix);
        
b.push(d);
        
a.skinMatrix.flattenToArrayOffset(this.boneMatrices, c * 16)
    }
    if (
this.geometry.skinVerticesA === void 0) {
        
this.geometry.skinVerticesA = [];
        
this.geometry.skinVerticesB = [];
        for (
a = 0; a < this.geometry.skinIndices.length; a++) {
            var 
c = this.geometry.vertices[a],
                
e = this.geometry.skinIndices[a].x,
                
f = this.geometry.skinIndices[a].y,
                
d = new THREE.Vector3(c.x, c.y, c.z);
            
this.geometry.skinVerticesA.push(b[e].multiplyVector3(d));
            
d = new THREE.Vector3(c.x, c.y, c.z);
            
this.geometry.skinVerticesB.push(b[f].multiplyVector3(d));
            if (
this.geometry.skinWeights[a].x + this.geometry.skinWeights[a].y !== 1) {
                
c = (1 - (this.geometry.skinWeights[a].x + this.geometry.skinWeights[a].y)) * 0.5;
                
this.geometry.skinWeights[a].x = this.geometry.skinWeights[a].x + c;
                
this.geometry.skinWeights[a].y = this.geometry.skinWeights[a].y + c
            
}
        }
    }
};
THREE.MorphAnimMesh = function(a, b) {
    
THREE.Mesh.call(this, a, b);
    
this.duration = 1E3;
    
this.mirroredLoop = false;
    
this.currentKeyframe = this.lastKeyframe = this.time = 0;
    
this.direction = 1;
    
this.directionBackwards = false;
    
this.setFrameRange(0, this.geometry.morphTargets.length - 1)
};
THREE.MorphAnimMesh.prototype = Object.create(THREE.Mesh.prototype);
THREE.MorphAnimMesh.prototype.setFrameRange = function(a, b) {
    
this.startKeyframe = a;
    
this.endKeyframe = b;
    
this.length = this.endKeyframe - this.startKeyframe + 1
};
THREE.MorphAnimMesh.prototype.setDirectionForward = function() {
    
this.direction = 1;
    
this.directionBackwards = false
};
THREE.MorphAnimMesh.prototype.setDirectionBackward = function() {
    
this.direction = -1;
    
this.directionBackwards = true
};
THREE.MorphAnimMesh.prototype.parseAnimations = function() {
    var 
a = this.geometry;
    if (!
a.animations) a.animations = {};
    for (var 
b, c = a.animations, d = /([a-z]+)(d+)/, e = 0, f = a.morphTargets.length; e < f; e++) {
        var 
g = a.morphTargets[e].name.match(d);
        if (
g && g.length > 1) {
            
g = g[1];
            
c[g] || (c[g] = {
                
start: Infinity,
                
end: -Infinity
            
});
            var 
h = c[g];
            if (
e < h.start) h.start = e;
            if (
e > h.end) h.end = e;
            
b || (b = g)
        }
    }
    
a.firstAnimation = b
};
THREE.MorphAnimMesh.prototype.setAnimationLabel = function(a, b, c) {
    if (!
this.geometry.animations) this.geometry.animations = {};
    
this.geometry.animations[a] = {
        
start: b,
        
end: c
    
}
};
THREE.MorphAnimMesh.prototype.playAnimation = function(a, b) {
    var 
c = this.geometry.animations[a];
    if (
c) {
        
this.setFrameRange(c.start, c.end);
        
this.duration = 1E3 * ((c.end - c.start) / b);
        
this.time = 0
    
} else console.warn("animation[" + a + "] undefined")
};
THREE.MorphAnimMesh.prototype.updateAnimation = function(a) {
    var 
b = this.duration / this.length;
    
this.time = this.time + this.direction * a;
    if (
this.mirroredLoop) {
        if (
this.time > this.duration || this.time < 0) {
            
this.direction = this.direction * -1;
            if (
this.time > this.duration) {
                
this.time = this.duration;
                
this.directionBackwards = true
            
}
            if (
this.time < 0) {
                
this.time = 0;
                
this.directionBackwards = false
            
}
        }
    } else {
        
this.time = this.time % this.duration;
        if (
this.time < 0) this.time = this.time + this.duration
    
}
    
a = this.startKeyframe + THREE.Math.clamp(Math.floor(this.time /
        
b), 0, this.length - 1);
    if (
a !== this.currentKeyframe) {
        
this.morphTargetInfluences[this.lastKeyframe] = 0;
        
this.morphTargetInfluences[this.currentKeyframe] = 1;
        
this.morphTargetInfluences[a] = 0;
        
this.lastKeyframe = this.currentKeyframe;
        
this.currentKeyframe = a
    
}
    
b = this.time % b / b;
    
this.directionBackwards && (b = 1 - b);
    
this.morphTargetInfluences[this.currentKeyframe] = b;
    
this.morphTargetInfluences[this.lastKeyframe] = 1 - b
};
THREE.Ribbon = function(a, b) {
    
THREE.Object3D.call(this);
    
this.geometry = a;
    
this.material = b
};
THREE.Ribbon.prototype = Object.create(THREE.Object3D.prototype);
THREE.LOD = function() {
    
THREE.Object3D.call(this);
    
this.LODs = []
};
THREE.LOD.prototype = Object.create(THREE.Object3D.prototype);
THREE.LOD.prototype.addLevel = function(a, b) {
    
b === void 0 && (b = 0);
    for (var 
b = Math.abs(b), c = 0; c < this.LODs.length; c++)
        if (
b < this.LODs[c].visibleAtDistance) break;
    
this.LODs.splice(c, 0, {
        
visibleAtDistance: b,
        
object3D: a
    
});
    
this.add(a)
};
THREE.LOD.prototype.update = function(a) {
    if (
this.LODs.length > 1) {
        
a.matrixWorldInverse.getInverse(a.matrixWorld);
        
a = a.matrixWorldInverse;
        
a = -(a.elements[2] * this.matrixWorld.elements[12] + a.elements[6] * this.matrixWorld.elements[13] + a.elements[10] * this.matrixWorld.elements[14] + a.elements[14]);
        
this.LODs[0].object3D.visible = true;
        for (var 
b = 1; b < this.LODs.length; b++)
            if (
a >= this.LODs[b].visibleAtDistance) {
                
this.LODs[b - 1].object3D.visible = false;
                
this.LODs[b].object3D.visible = true
            
} else break;
        for (; 
b < this.LODs.length; b++) this.LODs[b].object3D.visible =
            
false
    
}
};
THREE.Sprite = function(a) {
    
THREE.Object3D.call(this);
    
this.color = a.color !== void 0 ? new THREE.Color(a.color) : new THREE.Color(16777215);
    
this.map = a.map !== void 0 ? a.map : new THREE.Texture;
    
this.blending = a.blending !== void 0 ? a.blending : THREE.NormalBlending;
    
this.blendSrc = a.blendSrc !== void 0 ? a.blendSrc : THREE.SrcAlphaFactor;
    
this.blendDst = a.blendDst !== void 0 ? a.blendDst : THREE.OneMinusSrcAlphaFactor;
    
this.blendEquation = a.blendEquation !== void 0 ? a.blendEquation : THREE.AddEquation;
    
this.useScreenCoordinates = a.useScreenCoordinates !== void 0 ?
        
a.useScreenCoordinates : true;
    
this.mergeWith3D = a.mergeWith3D !== void 0 ? a.mergeWith3D : !this.useScreenCoordinates;
    
this.affectedByDistance = a.affectedByDistance !== void 0 ? a.affectedByDistance : !this.useScreenCoordinates;
    
this.scaleByViewport = a.scaleByViewport !== void 0 ? a.scaleByViewport : !this.affectedByDistance;
    
this.alignment = a.alignment instanceof THREE.Vector2 ? a.alignment : THREE.SpriteAlignment.center;
    
this.rotation3d = this.rotation;
    
this.rotation = 0;
    
this.opacity = 1;
    
this.uvOffset = new THREE.Vector2(0, 0);
    
this.uvScale =
        new 
THREE.Vector2(1, 1)
};
THREE.Sprite.prototype = Object.create(THREE.Object3D.prototype);
THREE.Sprite.prototype.updateMatrix = function() {
    
this.matrix.setPosition(this.position);
    
this.rotation3d.set(0, 0, this.rotation);
    
this.matrix.setRotationFromEuler(this.rotation3d);
    if (
this.scale.x !== 1 || this.scale.y !== 1) {
        
this.matrix.scale(this.scale);
        
this.boundRadiusScale = Math.max(this.scale.x, this.scale.y)
    }
    
this.matrixWorldNeedsUpdate = true
};
THREE.SpriteAlignment = {};
THREE.SpriteAlignment.topLeft = new THREE.Vector2(1, -1);
THREE.SpriteAlignment.topCenter = new THREE.Vector2(0, -1);
THREE.SpriteAlignment.topRight = new THREE.Vector2(-1, -1);
THREE.SpriteAlignment.centerLeft = new THREE.Vector2(1, 0);
THREE.SpriteAlignment.center = new THREE.Vector2(0, 0);
THREE.SpriteAlignment.centerRight = new THREE.Vector2(-1, 0);
THREE.SpriteAlignment.bottomLeft = new THREE.Vector2(1, 1);
THREE.SpriteAlignment.bottomCenter = new THREE.Vector2(0, 1);
THREE.SpriteAlignment.bottomRight = new THREE.Vector2(-1, 1);
THREE.Scene = function() {
    
THREE.Object3D.call(this);
    
this.overrideMaterial = this.fog = null;
    
this.matrixAutoUpdate = false;
    
this.__objects = [];
    
this.__lights = [];
    
this.__objectsAdded = [];
    
this.__objectsRemoved = []
};
THREE.Scene.prototype = Object.create(THREE.Object3D.prototype);
THREE.Scene.prototype.__addObject = function(a) {
    if (
a instanceof THREE.Light) {
        
this.__lights.indexOf(a) === -1 && this.__lights.push(a);
        
a.target && a.target.parent === void 0 && this.add(a.target)
    } else if (!(
a instanceof THREE.Camera || a instanceof THREE.Bone) && this.__objects.indexOf(a) === -1) {
        
this.__objects.push(a);
        
this.__objectsAdded.push(a);
        var 
b = this.__objectsRemoved.indexOf(a);
        
b !== -1 && this.__objectsRemoved.splice(b, 1)
    }
    for (
b = 0; b < a.children.length; b++) this.__addObject(a.children[b])
};
THREE.Scene.prototype.__removeObject = function(a) {
    if (
a instanceof THREE.Light) {
        var 
b = this.__lights.indexOf(a);
        
b !== -1 && this.__lights.splice(b, 1)
    } else if (!(
a instanceof THREE.Camera)) {
        
b = this.__objects.indexOf(a);
        if (
b !== -1) {
            
this.__objects.splice(b, 1);
            
this.__objectsRemoved.push(a);
            
b = this.__objectsAdded.indexOf(a);
            
b !== -1 && this.__objectsAdded.splice(b, 1)
        }
    }
    for (
b = 0; b < a.children.length; b++) this.__removeObject(a.children[b])
};
THREE.Fog = function(a, b, c) {
    
this.color = new THREE.Color(a);
    
this.near = b !== void 0 ? b : 1;
    
this.far = c !== void 0 ? c : 1E3
};
THREE.FogExp2 = function(a, b) {
    
this.color = new THREE.Color(a);
    
this.density = b !== void 0 ? b : 2.5E-4
};
THREE.CanvasRenderer = function(a) {
    function 
b(a) {
        if (
w !== a) w = o.globalAlpha = a
    
}

    function 
c(a) {
        if (
t !== a) {
            if (
a === THREE.NormalBlending) o.globalCompositeOperation = "source-over";
            else if (
a === THREE.AdditiveBlending) o.globalCompositeOperation = "lighter";
            else if (
a === THREE.SubtractiveBlending) o.globalCompositeOperation = "darker";
            
t = a
        
}
    }

    function 
d(a) {
        if (
v !== a) v = o.strokeStyle = a
    
}

    function 
e(a) {
        if (
x !== a) x = o.fillStyle = a
    
}
    
console.log("THREE.CanvasRenderer", THREE.REVISION);
    var 
a = a || {},
        
f = this,
        
g, h, i, j = new THREE.Projector,
        
l = a.canvas !==
        
void 0 ? a.canvas : document.createElement("canvas"),
        
m, n, p, r, o = l.getContext("2d"),
        
q = new THREE.Color(0),
        
s = 0,
        
w = 1,
        
t = 0,
        
v = null,
        
x = null,
        
C = null,
        
D = null,
        
z = null,
        
u, G, J, M, O = new THREE.RenderableVertex,
        
X = new THREE.RenderableVertex,
        
B, F, Q, E, aa, T, N, W, ba, H, ca, ia, S = new THREE.Color,
        
R = new THREE.Color,
        
P = new THREE.Color,
        
U = new THREE.Color,
        
fa = new THREE.Color,
        
ma = [],
        
Ga = [],
        
na, Oa, Pa, bb, nb, gb, Ob, ob, kb, ec, Ua = new THREE.Rectangle,
        
Da = new THREE.Rectangle,
        
Aa = new THREE.Rectangle,
        
hb = false,
        
qa = new THREE.Color,
        
Fa = new THREE.Color,
        
Ra = new THREE.Color,
        
sa = new THREE.Vector3,
        
k, Ya, Gb, Va, pb, cb, a = 16;
    
k = document.createElement("canvas");
    
k.width = k.height = 2;
    
Ya = k.getContext("2d");
    
Ya.fillStyle = "rgba(0,0,0,1)";
    
Ya.fillRect(0, 0, 2, 2);
    
Gb = Ya.getImageData(0, 0, 2, 2);
    
Va = Gb.data;
    
pb = document.createElement("canvas");
    
pb.width = pb.height = a;
    
cb = pb.getContext("2d");
    
cb.translate(-a / 2, -a / 2);
    
cb.scale(a, a);
    
a--;
    
this.domElement = l;
    
this.sortElements = this.sortObjects = this.autoClear = true;
    
this.info = {
        
render: {
            
vertices: 0,
            
faces: 0
        
}
    };
    
this.setSize = function(a, b) {
        
m = a;
        
n = b;
        
p = Math.floor(m / 2);
        
r = Math.floor(n /
            
2);
        
l.width = m;
        
l.height = n;
        
Ua.set(-p, -r, p, r);
        
Da.set(-p, -r, p, r);
        
w = 1;
        
t = 0;
        
z = D = C = x = v = null
    
};
    
this.setClearColor = function(a, b) {
        
q.copy(a);
        
s = b !== void 0 ? b : 1;
        
Da.set(-p, -r, p, r)
    };
    
this.setClearColorHex = function(a, b) {
        
q.setHex(a);
        
s = b !== void 0 ? b : 1;
        
Da.set(-p, -r, p, r)
    };
    
this.clear = function() {
        
o.setTransform(1, 0, 0, -1, p, r);
        if (
Da.isEmpty() === false) {
            
Da.minSelf(Ua);
            
Da.inflate(2);
            
s < 1 && o.clearRect(Math.floor(Da.getX()), Math.floor(Da.getY()), Math.floor(Da.getWidth()), Math.floor(Da.getHeight()));
            if (
s > 0) {
                
c(THREE.NormalBlending);
                
b(1);
                
e("rgba(" + Math.floor(q.r * 255) + "," + Math.floor(q.g * 255) + "," + Math.floor(q.b * 255) + "," + s + ")");
                
o.fillRect(Math.floor(Da.getX()), Math.floor(Da.getY()), Math.floor(Da.getWidth()), Math.floor(Da.getHeight()))
            }
            
Da.empty()
        }
    };
    
this.render = function(a, l) {
        function 
m(a) {
            var 
b, c, d, e;
            
qa.setRGB(0, 0, 0);
            
Fa.setRGB(0, 0, 0);
            
Ra.setRGB(0, 0, 0);
            
b = 0;
            for (
c = a.length; b < c; b++) {
                
d = a[b];
                
e = d.color;
                if (
d instanceof THREE.AmbientLight) {
                    
qa.r = qa.r + e.r;
                    
qa.g = qa.g + e.g;
                    
qa.b = qa.b + e.b
                
} else if (d instanceof THREE.DirectionalLight) {
                    
Fa.r = Fa.r + e.r;
                    
Fa.g =
                        
Fa.g + e.g;
                    
Fa.b = Fa.b + e.b
                
} else if (d instanceof THREE.PointLight) {
                    
Ra.r = Ra.r + e.r;
                    
Ra.g = Ra.g + e.g;
                    
Ra.b = Ra.b + e.b
                
}
            }
        }

        function 
n(a, b, c, d) {
            var 
e, f, g, h, k, i;
            
e = 0;
            for (
f = a.length; e < f; e++) {
                
g = a[e];
                
h = g.color;
                if (
g instanceof THREE.DirectionalLight) {
                    
k = g.matrixWorld.getPosition();
                    
i = c.dot(k);
                    if (!(
i <= 0)) {
                        
i = i * g.intensity;
                        
d.r = d.r + h.r * i;
                        
d.g = d.g + h.g * i;
                        
d.b = d.b + h.b * i
                    
}
                } else if (
g instanceof THREE.PointLight) {
                    
k = g.matrixWorld.getPosition();
                    
i = c.dot(sa.sub(k, b).normalize());
                    if (!(
i <= 0)) {
                        
i = i * (g.distance == 0 ? 1 : 1 - Math.min(b.distanceTo(k) /
                            
g.distance, 1));
                        if (
i != 0) {
                            
i = i * g.intensity;
                            
d.r = d.r + h.r * i;
                            
d.g = d.g + h.g * i;
                            
d.b = d.b + h.b * i
                        
}
                    }
                }
            }
        }

        function 
q(a, f, g) {
            
b(g.opacity);
            
c(g.blending);
            var 
h, k, i, j, l, m;
            if (
g instanceof THREE.ParticleBasicMaterial) {
                if (
g.map !== null) {
                    
j = g.map.image;
                    
l = j.width >> 1;
                    
m = j.height >> 1;
                    
g = f.scale.x * p;
                    
i = f.scale.y * r;
                    
h = g * l;
                    
k = i * m;
                    
Aa.set(a.x - h, a.y - k, a.x + h, a.y + k);
                    if (
Ua.intersects(Aa) !== false) {
                        
o.save();
                        
o.translate(a.x, a.y);
                        
o.rotate(-f.rotation);
                        
o.scale(g, -i);
                        
o.translate(-l, -m);
                        
o.drawImage(j, 0, 0);
                        
o.restore()
                    }
                }
            } else if (
g instanceof THREE.ParticleCanvasMaterial) {
                
h =
                    
f.scale.x * p;
                
k = f.scale.y * r;
                
Aa.set(a.x - h, a.y - k, a.x + h, a.y + k);
                if (
Ua.intersects(Aa) !== false) {
                    
d(g.color.getContextStyle());
                    
e(g.color.getContextStyle());
                    
o.save();
                    
o.translate(a.x, a.y);
                    
o.rotate(-f.rotation);
                    
o.scale(h, k);
                    
g.program(o);
                    
o.restore()
                }
            }
        }

        function 
s(a, e, f, g) {
            
b(g.opacity);
            
c(g.blending);
            
o.beginPath();
            
o.moveTo(a.positionScreen.x, a.positionScreen.y);
            
o.lineTo(e.positionScreen.x, e.positionScreen.y);
            
o.closePath();
            if (
g instanceof THREE.LineBasicMaterial) {
                
a = g.linewidth;
                if (
C !== a) C = o.lineWidth = a;
                
a = g.linecap;
                if (
D !== a) D = o.lineCap = a;
                
a = g.linejoin;
                if (
z !== a) z = o.lineJoin = a;
                
d(g.color.getContextStyle());
                
o.stroke();
                
Aa.inflate(g.linewidth * 2)
            }
        }

        function 
t(a, d, e, g, h, k, j, m) {
            
f.info.render.vertices = f.info.render.vertices + 3;
            
f.info.render.faces++;
            
b(m.opacity);
            
c(m.blending);
            
B = a.positionScreen.x;
            
F = a.positionScreen.y;
            
Q = d.positionScreen.x;
            
E = d.positionScreen.y;
            
aa = e.positionScreen.x;
            
T = e.positionScreen.y;
            
w(B, F, Q, E, aa, T);
            if (
m instanceof THREE.MeshBasicMaterial)
                if (
m.map !== null) {
                    if (
m.map.mapping instanceof THREE.UVMapping) {
                        
bb = j.uvs[0];
                        
kd(B, F, Q, E, aa, T, bb[g].u, bb[g].v, bb[h].u, bb[h].v, bb[k].u, bb[k].v, m.map)
                    }
                } else if (
m.envMap !== null) {
                if (
m.envMap.mapping instanceof THREE.SphericalReflectionMapping) {
                    
a = l.matrixWorldInverse;
                    
sa.copy(j.vertexNormalsWorld[g]);
                    
nb = (sa.x * a.elements[0] + sa.y * a.elements[4] + sa.z * a.elements[8]) * 0.5 + 0.5;
                    
gb = (sa.x * a.elements[1] + sa.y * a.elements[5] + sa.z * a.elements[9]) * 0.5 + 0.5;
                    
sa.copy(j.vertexNormalsWorld[h]);
                    
Ob = (sa.x * a.elements[0] + sa.y * a.elements[4] + sa.z * a.elements[8]) * 0.5 + 0.5;
                    
ob = (sa.x * a.elements[1] + sa.y * a.elements[5] +
                        
sa.z * a.elements[9]) * 0.5 + 0.5;
                    
sa.copy(j.vertexNormalsWorld[k]);
                    
kb = (sa.x * a.elements[0] + sa.y * a.elements[4] + sa.z * a.elements[8]) * 0.5 + 0.5;
                    
ec = (sa.x * a.elements[1] + sa.y * a.elements[5] + sa.z * a.elements[9]) * 0.5 + 0.5;
                    
kd(B, F, Q, E, aa, T, nb, gb, Ob, ob, kb, ec, m.envMap)
                }
            } else 
m.wireframe === true ? Pb(m.color, m.wireframeLinewidth, m.wireframeLinecap, m.wireframeLinejoin) : Hb(m.color);
            else if (
m instanceof THREE.MeshLambertMaterial)
                if (
hb === true)
                    if (
m.wireframe === false && m.shading == THREE.SmoothShading && j.vertexNormalsWorld.length == 3) {
                        
R.r =
                            
P.r = U.r = qa.r;
                        
R.g = P.g = U.g = qa.g;
                        
R.b = P.b = U.b = qa.b;
                        
n(i, j.v1.positionWorld, j.vertexNormalsWorld[0], R);
                        
n(i, j.v2.positionWorld, j.vertexNormalsWorld[1], P);
                        
n(i, j.v3.positionWorld, j.vertexNormalsWorld[2], U);
                        
R.r = Math.max(0, Math.min(m.color.r * R.r, 1));
                        
R.g = Math.max(0, Math.min(m.color.g * R.g, 1));
                        
R.b = Math.max(0, Math.min(m.color.b * R.b, 1));
                        
P.r = Math.max(0, Math.min(m.color.r * P.r, 1));
                        
P.g = Math.max(0, Math.min(m.color.g * P.g, 1));
                        
P.b = Math.max(0, Math.min(m.color.b * P.b, 1));
                        
U.r = Math.max(0, Math.min(m.color.r * U.r, 1));
                        
U.g = Math.max(0,
                            
Math.min(m.color.g * U.g, 1));
                        
U.b = Math.max(0, Math.min(m.color.b * U.b, 1));
                        
fa.r = (P.r + U.r) * 0.5;
                        
fa.g = (P.g + U.g) * 0.5;
                        
fa.b = (P.b + U.b) * 0.5;
                        
Pa = Ic(R, P, U, fa);
                        
mc(B, F, Q, E, aa, T, 0, 0, 1, 0, 0, 1, Pa)
                    } else {
                        
S.r = qa.r;
                        
S.g = qa.g;
                        
S.b = qa.b;
                        
n(i, j.centroidWorld, j.normalWorld, S);
                        
S.r = Math.max(0, Math.min(m.color.r * S.r, 1));
                        
S.g = Math.max(0, Math.min(m.color.g * S.g, 1));
                        
S.b = Math.max(0, Math.min(m.color.b * S.b, 1));
                        
m.wireframe === true ? Pb(S, m.wireframeLinewidth, m.wireframeLinecap, m.wireframeLinejoin) : Hb(S)
                    } else 
m.wireframe === true ? Pb(m.color, m.wireframeLinewidth,
                
m.wireframeLinecap, m.wireframeLinejoin) : Hb(m.color);
            else if (
m instanceof THREE.MeshDepthMaterial) {
                
na = l.near;
                
Oa = l.far;
                
R.r = R.g = R.b = 1 - gc(a.positionScreen.z, na, Oa);
                
P.r = P.g = P.b = 1 - gc(d.positionScreen.z, na, Oa);
                
U.r = U.g = U.b = 1 - gc(e.positionScreen.z, na, Oa);
                
fa.r = (P.r + U.r) * 0.5;
                
fa.g = (P.g + U.g) * 0.5;
                
fa.b = (P.b + U.b) * 0.5;
                
Pa = Ic(R, P, U, fa);
                
mc(B, F, Q, E, aa, T, 0, 0, 1, 0, 0, 1, Pa)
            } else if (
m instanceof THREE.MeshNormalMaterial) {
                
S.r = nc(j.normalWorld.x);
                
S.g = nc(j.normalWorld.y);
                
S.b = nc(j.normalWorld.z);
                
m.wireframe === true ? Pb(S, m.wireframeLinewidth,
                    
m.wireframeLinecap, m.wireframeLinejoin) : Hb(S)
            }
        }

        function 
v(a, d, e, g, h, k, j, m, o) {
            
f.info.render.vertices = f.info.render.vertices + 4;
            
f.info.render.faces++;
            
b(m.opacity);
            
c(m.blending);
            if (
m.map !== void 0 && m.map !== null || m.envMap !== void 0 && m.envMap !== null) {
                
t(a, d, g, 0, 1, 3, j, m, o);
                
t(h, e, k, 1, 2, 3, j, m, o)
            } else {
                
B = a.positionScreen.x;
                
F = a.positionScreen.y;
                
Q = d.positionScreen.x;
                
E = d.positionScreen.y;
                
aa = e.positionScreen.x;
                
T = e.positionScreen.y;
                
N = g.positionScreen.x;
                
W = g.positionScreen.y;
                
ba = h.positionScreen.x;
                
H = h.positionScreen.y;
                
ca = k.positionScreen.x;
                
ia = k.positionScreen.y;
                if (
m instanceof THREE.MeshBasicMaterial) {
                    
x(B, F, Q, E, aa, T, N, W);
                    
m.wireframe === true ? Pb(m.color, m.wireframeLinewidth, m.wireframeLinecap, m.wireframeLinejoin) : Hb(m.color)
                } else if (
m instanceof THREE.MeshLambertMaterial)
                    if (
hb === true)
                        if (!
m.wireframe && m.shading == THREE.SmoothShading && j.vertexNormalsWorld.length == 4) {
                            
R.r = P.r = U.r = fa.r = qa.r;
                            
R.g = P.g = U.g = fa.g = qa.g;
                            
R.b = P.b = U.b = fa.b = qa.b;
                            
n(i, j.v1.positionWorld, j.vertexNormalsWorld[0], R);
                            
n(i, j.v2.positionWorld, j.vertexNormalsWorld[1],
                                
P);
                            
n(i, j.v4.positionWorld, j.vertexNormalsWorld[3], U);
                            
n(i, j.v3.positionWorld, j.vertexNormalsWorld[2], fa);
                            
R.r = Math.max(0, Math.min(m.color.r * R.r, 1));
                            
R.g = Math.max(0, Math.min(m.color.g * R.g, 1));
                            
R.b = Math.max(0, Math.min(m.color.b * R.b, 1));
                            
P.r = Math.max(0, Math.min(m.color.r * P.r, 1));
                            
P.g = Math.max(0, Math.min(m.color.g * P.g, 1));
                            
P.b = Math.max(0, Math.min(m.color.b * P.b, 1));
                            
U.r = Math.max(0, Math.min(m.color.r * U.r, 1));
                            
U.g = Math.max(0, Math.min(m.color.g * U.g, 1));
                            
U.b = Math.max(0, Math.min(m.color.b * U.b, 1));
                            
fa.r = Math.max(0, Math.min(m.color.r *
                                
fa.r, 1));
                            
fa.g = Math.max(0, Math.min(m.color.g * fa.g, 1));
                            
fa.b = Math.max(0, Math.min(m.color.b * fa.b, 1));
                            
Pa = Ic(R, P, U, fa);
                            
w(B, F, Q, E, N, W);
                            
mc(B, F, Q, E, N, W, 0, 0, 1, 0, 0, 1, Pa);
                            
w(ba, H, aa, T, ca, ia);
                            
mc(ba, H, aa, T, ca, ia, 1, 0, 1, 1, 0, 1, Pa)
                        } else {
                            
S.r = qa.r;
                            
S.g = qa.g;
                            
S.b = qa.b;
                            
n(i, j.centroidWorld, j.normalWorld, S);
                            
S.r = Math.max(0, Math.min(m.color.r * S.r, 1));
                            
S.g = Math.max(0, Math.min(m.color.g * S.g, 1));
                            
S.b = Math.max(0, Math.min(m.color.b * S.b, 1));
                            
x(B, F, Q, E, aa, T, N, W);
                            
m.wireframe === true ? Pb(S, m.wireframeLinewidth, m.wireframeLinecap, m.wireframeLinejoin) :
                                
Hb(S)
                        } else {
                    
x(B, F, Q, E, aa, T, N, W);
                    
m.wireframe === true ? Pb(m.color, m.wireframeLinewidth, m.wireframeLinecap, m.wireframeLinejoin) : Hb(m.color)
                } else if (
m instanceof THREE.MeshNormalMaterial) {
                    
S.r = nc(j.normalWorld.x);
                    
S.g = nc(j.normalWorld.y);
                    
S.b = nc(j.normalWorld.z);
                    
x(B, F, Q, E, aa, T, N, W);
                    
m.wireframe === true ? Pb(S, m.wireframeLinewidth, m.wireframeLinecap, m.wireframeLinejoin) : Hb(S)
                } else if (
m instanceof THREE.MeshDepthMaterial) {
                    
na = l.near;
                    
Oa = l.far;
                    
R.r = R.g = R.b = 1 - gc(a.positionScreen.z, na, Oa);
                    
P.r = P.g = P.b = 1 - gc(d.positionScreen.z,
                        
na, Oa);
                    
U.r = U.g = U.b = 1 - gc(g.positionScreen.z, na, Oa);
                    
fa.r = fa.g = fa.b = 1 - gc(e.positionScreen.z, na, Oa);
                    
Pa = Ic(R, P, U, fa);
                    
w(B, F, Q, E, N, W);
                    
mc(B, F, Q, E, N, W, 0, 0, 1, 0, 0, 1, Pa);
                    
w(ba, H, aa, T, ca, ia);
                    
mc(ba, H, aa, T, ca, ia, 1, 0, 1, 1, 0, 1, Pa)
                }
            }
        }

        function 
w(a, b, c, d, e, f) {
            
o.beginPath();
            
o.moveTo(a, b);
            
o.lineTo(c, d);
            
o.lineTo(e, f);
            
o.lineTo(a, b)
        }

        function 
x(a, b, c, d, e, f, g, h) {
            
o.beginPath();
            
o.moveTo(a, b);
            
o.lineTo(c, d);
            
o.lineTo(e, f);
            
o.lineTo(g, h);
            
o.lineTo(a, b)
        }

        function 
Pb(a, b, c, e) {
            if (
C !== b) C = o.lineWidth = b;
            if (
D !== c) D = o.lineCap = c;
            if (
z !== e) z = o.lineJoin =
                
e;
            
d(a.getContextStyle());
            
o.stroke();
            
Aa.inflate(b * 2)
        }

        function 
Hb(a) {
            
e(a.getContextStyle());
            
o.fill()
        }

        function 
kd(a, b, c, d, f, g, h, k, i, j, m, l, n) {
            if (!(
n.image === void 0 || n.image.width === 0)) {
                if (
n.needsUpdate === true || ma[n.id] === void 0) {
                    var 
p = n.wrapS == THREE.RepeatWrapping,
                        
fc = n.wrapT == THREE.RepeatWrapping;
                    
ma[n.id] = o.createPattern(n.image, p === true && fc === true ? "repeat" : p === true && fc === false ? "repeat-x" : p === false && fc === true ? "repeat-y" : "no-repeat");
                    
n.needsUpdate = false
                
}
                
e(ma[n.id]);
                var 
p = n.offset.x / n.repeat.x,
                    
fc = n.offset.y /
                    
n.repeat.y,
                    
r = n.image.width * n.repeat.x,
                    
q = n.image.height * n.repeat.y,
                    
h = (h + p) * r,
                    
k = (1 - k + fc) * q,
                    
c = c - a,
                    
d = d - b,
                    
f = f - a,
                    
g = g - b,
                    
i = (i + p) * r - h,
                    
j = (1 - j + fc) * q - k,
                    
m = (m + p) * r - h,
                    
l = (1 - l + fc) * q - k,
                    
p = i * l - m * j;
                if (
p === 0) {
                    if (
Ga[n.id] === void 0) {
                        
b = document.createElement("canvas");
                        
b.width = n.image.width;
                        
b.height = n.image.height;
                        
b = b.getContext("2d");
                        
b.drawImage(n.image, 0, 0);
                        
Ga[n.id] = b.getImageData(0, 0, n.image.width, n.image.height).data
                    
}
                    
b = Ga[n.id];
                    
h = (Math.floor(h) + Math.floor(k) * n.image.width) * 4;
                    
S.setRGB(b[h] / 255, b[h + 1] / 255, b[h + 2] / 255);
                    
Hb(S)
                } else {
                    
p =
                        
1 / p;
                    
n = (l * c - j * f) * p;
                    
j = (l * d - j * g) * p;
                    
c = (i * f - m * c) * p;
                    
d = (i * g - m * d) * p;
                    
a = a - n * h - c * k;
                    
h = b - j * h - d * k;
                    
o.save();
                    
o.transform(n, j, c, d, a, h);
                    
o.fill();
                    
o.restore()
                }
            }
        }

        function 
mc(a, b, c, d, e, f, g, h, k, i, j, m, l) {
            var 
n, p;
            
n = l.width - 1;
            
p = l.height - 1;
            
g = g * n;
            
h = h * p;
            
c = c - a;
            
d = d - b;
            
e = e - a;
            
f = f - b;
            
k = k * n - g;
            
i = i * p - h;
            
j = j * n - g;
            
m = m * p - h;
            
p = 1 / (k * m - j * i);
            
n = (m * c - i * e) * p;
            
i = (m * d - i * f) * p;
            
c = (k * e - j * c) * p;
            
d = (k * f - j * d) * p;
            
a = a - n * g - c * h;
            
b = b - i * g - d * h;
            
o.save();
            
o.transform(n, i, c, d, a, b);
            
o.clip();
            
o.drawImage(l, 0, 0);
            
o.restore()
        }

        function 
Ic(a, b, c, d) {
            var 
e = ~~(a.r * 255),
                
f = ~~(a.g * 255),
                
a = ~~(a.b * 255),
                
g = ~~(b.r * 255),
                
h = ~~(b.g * 255),
                
b = ~~(b.b * 255),
                
i = ~~(c.r * 255),
                
j = ~~(c.g * 255),
                
c = ~~(c.b * 255),
                
m = ~~(d.r * 255),
                
l = ~~(d.g * 255),
                
d = ~~(d.b * 255);
            
Va[0] = e < 0 ? 0 : e > 255 ? 255 : e;
            
Va[1] = f < 0 ? 0 : f > 255 ? 255 : f;
            
Va[2] = a < 0 ? 0 : a > 255 ? 255 : a;
            
Va[4] = g < 0 ? 0 : g > 255 ? 255 : g;
            
Va[5] = h < 0 ? 0 : h > 255 ? 255 : h;
            
Va[6] = b < 0 ? 0 : b > 255 ? 255 : b;
            
Va[8] = i < 0 ? 0 : i > 255 ? 255 : i;
            
Va[9] = j < 0 ? 0 : j > 255 ? 255 : j;
            
Va[10] = c < 0 ? 0 : c > 255 ? 255 : c;
            
Va[12] = m < 0 ? 0 : m > 255 ? 255 : m;
            
Va[13] = l < 0 ? 0 : l > 255 ? 255 : l;
            
Va[14] = d < 0 ? 0 : d > 255 ? 255 : d;
            
Ya.putImageData(Gb, 0, 0);
            
cb.drawImage(k, 0, 0);
            return 
pb
        
}

        function 
gc(a, b,
            
c) {
            
a = (a - b) / (c - b);
            return 
a * a * (3 - 2 * a)
        }

        function 
nc(a) {
            
a = (a + 1) * 0.5;
            return 
a < 0 ? 0 : a > 1 ? 1 : a
        
}

        function 
Qb(a, b) {
            var 
c = b.x - a.x,
                
d = b.y - a.y,
                
e = c * c + d * d;
            if (
e !== 0) {
                
e = 1 / Math.sqrt(e);
                
c = c * e;
                
d = d * e;
                
b.x = b.x + c;
                
b.y = b.y + d;
                
a.x = a.x - c;
                
a.y = a.y - d
            
}
        }
        var 
Jc, ld, Ma, ib;
        
this.autoClear === true ? this.clear() : o.setTransform(1, 0, 0, -1, p, r);
        
f.info.render.vertices = 0;
        
f.info.render.faces = 0;
        
g = j.projectScene(a, l, this.sortElements);
        
h = g.elements;
        
i = g.lights;
        
hb = i.length > 0;
        
hb === true && m(i);
        
Jc = 0;
        for (
ld = h.length; Jc < ld; Jc++) {
            
Ma = h[Jc];
            
ib = Ma.material;
            
ib = ib instanceof
            
THREE.MeshFaceMaterial ? Ma.faceMaterial : ib;
            if (!(
ib === void 0 || ib.visible === false)) {
                
Aa.empty();
                if (
Ma instanceof THREE.RenderableParticle) {
                    
u = Ma;
                    
u.x = u.x * p;
                    
u.y = u.y * r;
                    
q(u, Ma, ib, a)
                } else if (
Ma instanceof THREE.RenderableLine) {
                    
u = Ma.v1;
                    
G = Ma.v2;
                    
u.positionScreen.x = u.positionScreen.x * p;
                    
u.positionScreen.y = u.positionScreen.y * r;
                    
G.positionScreen.x = G.positionScreen.x * p;
                    
G.positionScreen.y = G.positionScreen.y * r;
                    
Aa.addPoint(u.positionScreen.x, u.positionScreen.y);
                    
Aa.addPoint(G.positionScreen.x, G.positionScreen.y);
                    
Ua.intersects(Aa) ===
                        
true && s(u, G, Ma, ib, a)
                } else if (
Ma instanceof THREE.RenderableFace3) {
                    
u = Ma.v1;
                    
G = Ma.v2;
                    
J = Ma.v3;
                    
u.positionScreen.x = u.positionScreen.x * p;
                    
u.positionScreen.y = u.positionScreen.y * r;
                    
G.positionScreen.x = G.positionScreen.x * p;
                    
G.positionScreen.y = G.positionScreen.y * r;
                    
J.positionScreen.x = J.positionScreen.x * p;
                    
J.positionScreen.y = J.positionScreen.y * r;
                    if (
ib.overdraw === true) {
                        
Qb(u.positionScreen, G.positionScreen);
                        
Qb(G.positionScreen, J.positionScreen);
                        
Qb(J.positionScreen, u.positionScreen)
                    }
                    
Aa.add3Points(u.positionScreen.x, u.positionScreen.y,
                        
G.positionScreen.x, G.positionScreen.y, J.positionScreen.x, J.positionScreen.y);
                    
Ua.intersects(Aa) === true && t(u, G, J, 0, 1, 2, Ma, ib, a)
                } else if (
Ma instanceof THREE.RenderableFace4) {
                    
u = Ma.v1;
                    
G = Ma.v2;
                    
J = Ma.v3;
                    
M = Ma.v4;
                    
u.positionScreen.x = u.positionScreen.x * p;
                    
u.positionScreen.y = u.positionScreen.y * r;
                    
G.positionScreen.x = G.positionScreen.x * p;
                    
G.positionScreen.y = G.positionScreen.y * r;
                    
J.positionScreen.x = J.positionScreen.x * p;
                    
J.positionScreen.y = J.positionScreen.y * r;
                    
M.positionScreen.x = M.positionScreen.x * p;
                    
M.positionScreen.y =
                        
M.positionScreen.y * r;
                    
O.positionScreen.copy(G.positionScreen);
                    
X.positionScreen.copy(M.positionScreen);
                    if (
ib.overdraw === true) {
                        
Qb(u.positionScreen, G.positionScreen);
                        
Qb(G.positionScreen, M.positionScreen);
                        
Qb(M.positionScreen, u.positionScreen);
                        
Qb(J.positionScreen, O.positionScreen);
                        
Qb(J.positionScreen, X.positionScreen)
                    }
                    
Aa.addPoint(u.positionScreen.x, u.positionScreen.y);
                    
Aa.addPoint(G.positionScreen.x, G.positionScreen.y);
                    
Aa.addPoint(J.positionScreen.x, J.positionScreen.y);
                    
Aa.addPoint(M.positionScreen.x, M.positionScreen.y);
                    
Ua.intersects(Aa) === true && v(u, G, J, M, O, X, Ma, ib, a)
                }
                
Da.addRectangle(Aa)
            }
        }
        
o.setTransform(1, 0, 0, 1, 0, 0)
    }
};
THREE.ShaderChunk = {
    
fog_pars_fragment: "#ifdef USE_FOGnuniform vec3 fogColor;n#ifdef FOG_EXP2nuniform float fogDensity;n#elsenuniform float fogNear;nuniform float fogFar;n#endifn#endif",
    
fog_fragment: "#ifdef USE_FOGnfloat depth = gl_FragCoord.z / gl_FragCoord.w;n#ifdef FOG_EXP2nconst float LOG2 = 1.442695;nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );n#elsenfloat fogFactor = smoothstep( fogNear, fogFar, depth );n#endifngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );n#endif",
    
envmap_pars_fragment: "#ifdef USE_ENVMAPnvarying vec3 vReflect;nuniform float reflectivity;nuniform samplerCube envMap;nuniform float flipEnvMap;nuniform int combine;n#endif",
    
envmap_fragment: "#ifdef USE_ENVMAPn#ifdef DOUBLE_SIDEDnfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * vReflect.x, vReflect.yz ) );n#elsenvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * vReflect.x, vReflect.yz ) );n#endifn#ifdef GAMMA_INPUTncubeColor.xyz *= cubeColor.xyz;n#endifnif ( combine == 1 ) {ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity );n} else {ngl_FragColor.xyz = gl_FragColor.xyz * cubeColor.xyz;n}n#endif",
    
envmap_pars_vertex: "#ifdef USE_ENVMAPnvarying vec3 vReflect;nuniform float refractionRatio;nuniform bool useRefract;n#endif",
    
envmap_vertex: "#ifdef USE_ENVMAPnvec4 mPosition = objectMatrix * vec4( position, 1.0 );nvec3 nWorld = mat3( objectMatrix[ 0 ].xyz, objectMatrix[ 1 ].xyz, objectMatrix[ 2 ].xyz ) * normal;nif ( useRefract ) {nvReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refractionRatio );n} else {nvReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );n}n#endif",
    
map_particle_pars_fragment: "#ifdef USE_MAPnuniform sampler2D map;n#endif",
    
map_particle_fragment: "#ifdef USE_MAPngl_FragColor = gl_FragColor * texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );n#endif",
    
map_pars_vertex: "#ifdef USE_MAPnvarying vec2 vUv;nuniform vec4 offsetRepeat;n#endif",
    
map_pars_fragment: "#ifdef USE_MAPnvarying vec2 vUv;nuniform sampler2D map;n#endif",
    
map_vertex: "#ifdef USE_MAPnvUv = uv * offsetRepeat.zw + offsetRepeat.xy;n#endif",
    
map_fragment: "#ifdef USE_MAPn#ifdef GAMMA_INPUTnvec4 texelColor = texture2D( map, vUv );ntexelColor.xyz *= texelColor.xyz;ngl_FragColor = gl_FragColor * texelColor;n#elsengl_FragColor = gl_FragColor * texture2D( map, vUv );n#endifn#endif",
    
lightmap_pars_fragment: "#ifdef USE_LIGHTMAPnvarying vec2 vUv2;nuniform sampler2D lightMap;n#endif",
    
lightmap_pars_vertex: "#ifdef USE_LIGHTMAPnvarying vec2 vUv2;n#endif",
    
lightmap_fragment: "#ifdef USE_LIGHTMAPngl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );n#endif",
    
lightmap_vertex: "#ifdef USE_LIGHTMAPnvUv2 = uv2;n#endif",
    
lights_lambert_pars_vertex: "uniform vec3 ambient;nuniform vec3 diffuse;nuniform vec3 emissive;nuniform vec3 ambientLightColor;n#if MAX_DIR_LIGHTS > 0nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];n#endifn#if MAX_POINT_LIGHTS > 0nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];n#endifn#if MAX_SPOT_LIGHTS > 0nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];n#endifn#ifdef WRAP_AROUNDnuniform vec3 wrapRGB;n#endif",
    
lights_lambert_vertex: "vLightFront = vec3( 0.0 );n#ifdef DOUBLE_SIDEDnvLightBack = vec3( 0.0 );n#endifntransformedNormal = normalize( transformedNormal );n#if MAX_DIR_LIGHTS > 0nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );nvec3 dirVector = normalize( lDirection.xyz );nfloat dotProduct = dot( transformedNormal, dirVector );nvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );n#ifdef DOUBLE_SIDEDnvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );n#ifdef WRAP_AROUNDnvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );n#endifn#endifn#ifdef WRAP_AROUNDnvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );ndirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );n#ifdef DOUBLE_SIDEDndirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );n#endifn#endifnvLightFront += directionalLightColor[ i ] * directionalLightWeighting;n#ifdef DOUBLE_SIDEDnvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;n#endifn}n#endifn#if MAX_POINT_LIGHTS > 0nfor( 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 );nfloat dotProduct = dot( transformedNormal, lVector );nvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );n#ifdef DOUBLE_SIDEDnvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );n#ifdef WRAP_AROUNDnvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );n#endifn#endifn#ifdef WRAP_AROUNDnvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );npointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );n#ifdef DOUBLE_SIDEDnpointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );n#endifn#endifnvLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;n#ifdef DOUBLE_SIDEDnvLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;n#endifn}n#endifn#if MAX_SPOT_LIGHTS > 0nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );nvec3 lVector = lPosition.xyz - mvPosition.xyz;nlVector = normalize( lVector );nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - mPosition.xyz ) );nif ( spotEffect > spotLightAngle[ i ] ) {nspotEffect = pow( spotEffect, spotLightExponent[ i ] );nfloat lDistance = 1.0;nif ( spotLightDistance[ i ] > 0.0 )nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );nfloat dotProduct = dot( transformedNormal, lVector );nvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );n#ifdef DOUBLE_SIDEDnvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );n#ifdef WRAP_AROUNDnvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );n#endifn#endifn#ifdef WRAP_AROUNDnvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );nspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );n#ifdef DOUBLE_SIDEDnspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );n#endifn#endifnvLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;n#ifdef DOUBLE_SIDEDnvLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;n#endifn}n}n#endifnvLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;n#ifdef DOUBLE_SIDEDnvLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;n#endif",
    
lights_phong_pars_vertex: "#ifndef PHONG_PER_PIXELn#if MAX_POINT_LIGHTS > 0nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];n#endifn#if MAX_SPOT_LIGHTS > 0nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];n#endifn#endifn#if MAX_SPOT_LIGHTS > 0nvarying vec3 vWorldPosition;n#endif",
    
lights_phong_vertex: "#ifndef PHONG_PER_PIXELn#if MAX_POINT_LIGHTS > 0nfor( 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#endifn#if MAX_SPOT_LIGHTS > 0nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );nvec3 lVector = lPosition.xyz - mvPosition.xyz;nfloat lDistance = 1.0;nif ( spotLightDistance[ i ] > 0.0 )nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );nvSpotLight[ i ] = vec4( lVector, lDistance );n}n#endifn#endifn#if MAX_SPOT_LIGHTS > 0nvWorldPosition = mPosition.xyz;n#endif",
    
lights_phong_pars_fragment: "uniform vec3 ambientLightColor;n#if MAX_DIR_LIGHTS > 0nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];n#endifn#if MAX_POINT_LIGHTS > 0nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];n#ifdef PHONG_PER_PIXELnuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];n#elsenvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];n#endifn#endifn#if MAX_SPOT_LIGHTS > 0nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];n#ifdef PHONG_PER_PIXELnuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];n#elsenvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];n#endifnvarying vec3 vWorldPosition;n#endifn#ifdef WRAP_AROUNDnuniform vec3 wrapRGB;n#endifnvarying vec3 vViewPosition;nvarying vec3 vNormal;",
    
lights_phong_fragment: "vec3 normal = normalize( vNormal );nvec3 viewPosition = normalize( vViewPosition );n#ifdef DOUBLE_SIDEDnnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );n#endifn#if MAX_POINT_LIGHTS > 0nvec3 pointDiffuse  = vec3( 0.0 );nvec3 pointSpecular = vec3( 0.0 );nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {n#ifdef PHONG_PER_PIXELnvec4 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#elsenvec3 lVector = normalize( vPointLight[ i ].xyz );nfloat lDistance = vPointLight[ i ].w;n#endifnfloat dotProduct = dot( normal, lVector );n#ifdef WRAP_AROUNDnfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );nfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );n#elsenfloat pointDiffuseWeight = max( dotProduct, 0.0 );n#endifnpointDiffuse  += 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_SHADINGnfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;n#elsenpointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;n#endifn}n#endifn#if MAX_SPOT_LIGHTS > 0nvec3 spotDiffuse  = vec3( 0.0 );nvec3 spotSpecular = vec3( 0.0 );nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {n#ifdef PHONG_PER_PIXELnvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );nvec3 lVector = lPosition.xyz + vViewPosition.xyz;nfloat lDistance = 1.0;nif ( spotLightDistance[ i ] > 0.0 )nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );nlVector = normalize( lVector );n#elsenvec3 lVector = normalize( vSpotLight[ i ].xyz );nfloat lDistance = vSpotLight[ i ].w;n#endifnfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );nif ( spotEffect > spotLightAngle[ i ] ) {nspotEffect = pow( spotEffect, spotLightExponent[ i ] );nfloat dotProduct = dot( normal, lVector );n#ifdef WRAP_AROUNDnfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );nfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );n#elsenfloat spotDiffuseWeight = max( dotProduct, 0.0 );n#endifnspotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;nvec3 spotHalfVector = normalize( lVector + viewPosition );nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );nfloat spotSpecularWeight = max( pow( spotDotNormalHalf, shininess ), 0.0 );n#ifdef PHYSICALLY_BASED_SHADINGnfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;n#elsenspotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;n#endifn}n}n#endifn#if MAX_DIR_LIGHTS > 0nvec3 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 );nfloat dotProduct = dot( normal, dirVector );n#ifdef WRAP_AROUNDnfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );nfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );n#elsenfloat dirDiffuseWeight = max( dotProduct, 0.0 );n#endifndirDiffuse  += 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_SHADINGnfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;n#elsendirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;n#endifn}n#endifnvec3 totalDiffuse = vec3( 0.0 );nvec3 totalSpecular = vec3( 0.0 );n#if MAX_DIR_LIGHTS > 0ntotalDiffuse += dirDiffuse;ntotalSpecular += dirSpecular;n#endifn#if MAX_POINT_LIGHTS > 0ntotalDiffuse += pointDiffuse;ntotalSpecular += pointSpecular;n#endifn#if MAX_SPOT_LIGHTS > 0ntotalDiffuse += spotDiffuse;ntotalSpecular += spotSpecular;n#endifn#ifdef METALngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );n#elsengl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;n#endif",
    
color_pars_fragment: "#ifdef USE_COLORnvarying vec3 vColor;n#endif",
    
color_fragment: "#ifdef USE_COLORngl_FragColor = gl_FragColor * vec4( vColor, opacity );n#endif",
    
color_pars_vertex: "#ifdef USE_COLORnvarying vec3 vColor;n#endif",
    
color_vertex: "#ifdef USE_COLORn#ifdef GAMMA_INPUTnvColor = color * color;n#elsenvColor = color;n#endifn#endif",
    
skinning_pars_vertex: "#ifdef USE_SKINNINGn#ifdef BONE_TEXTUREnuniform sampler2D boneTexture;nmat4 getBoneMatrix( const in float i ) {nfloat j = i * 4.0;nfloat x = mod( j, N_BONE_PIXEL_X );nfloat y = floor( j / N_BONE_PIXEL_X );nconst float dx = 1.0 / N_BONE_PIXEL_X;nconst float dy = 1.0 / N_BONE_PIXEL_Y;ny = dy * ( y + 0.5 );nvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );nvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );nvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );nvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );nmat4 bone = mat4( v1, v2, v3, v4 );nreturn bone;n}n#elsenuniform mat4 boneGlobalMatrices[ MAX_BONES ];nmat4 getBoneMatrix( const in float i ) {nmat4 bone = boneGlobalMatrices[ int(i) ];nreturn bone;n}n#endifn#endif",
    
skinbase_vertex: "#ifdef USE_SKINNINGnmat4 boneMatX = getBoneMatrix( skinIndex.x );nmat4 boneMatY = getBoneMatrix( skinIndex.y );n#endif",
    
skinning_vertex: "#ifdef USE_SKINNINGnvec4 skinned  = boneMatX * skinVertexA * skinWeight.x;nskinned t  += boneMatY * skinVertexB * skinWeight.y;ngl_Position  = projectionMatrix * modelViewMatrix * skinned;n#endif",
    
morphtarget_pars_vertex: "#ifdef USE_MORPHTARGETSn#ifndef USE_MORPHNORMALSnuniform float morphTargetInfluences[ 8 ];n#elsenuniform float morphTargetInfluences[ 4 ];n#endifn#endif",
    
morphtarget_vertex: "#ifdef USE_MORPHTARGETSnvec3 morphed = vec3( 0.0 );nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];n#ifndef USE_MORPHNORMALSnmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];n#endifnmorphed += position;ngl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );n#endif",
    
default_vertex: "#ifndef USE_MORPHTARGETSn#ifndef USE_SKINNINGngl_Position = projectionMatrix * mvPosition;n#endifn#endif",
    
morphnormal_vertex: "#ifdef USE_MORPHNORMALSnvec3 morphedNormal = vec3( 0.0 );nmorphedNormal +=  ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];nmorphedNormal +=  ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];nmorphedNormal +=  ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];nmorphedNormal +=  ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];nmorphedNormal += normal;n#endif",
    
skinnormal_vertex: "#ifdef USE_SKINNINGnmat4 skinMatrix = skinWeight.x * boneMatX;nskinMatrix t+= skinWeight.y * boneMatY;nvec4 skinnedNormal = skinMatrix * vec4( normal, 0.0 );n#endif",
    
defaultnormal_vertex: "vec3 transformedNormal;n#ifdef USE_SKINNINGntransformedNormal = skinnedNormal.xyz;n#endifn#ifdef USE_MORPHNORMALSntransformedNormal = morphedNormal;n#endifn#ifndef USE_MORPHNORMALSn#ifndef USE_SKINNINGntransformedNormal = normal;n#endifn#endifntransformedNormal = normalMatrix * transformedNormal;",
    
shadowmap_pars_fragment: "#ifdef USE_SHADOWMAPnuniform 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_SHADOWMAPn#ifdef SHADOWMAP_DEBUGnvec3 frustumColors[3];nfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );nfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );nfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );n#endifn#ifdef SHADOWMAP_CASCADEnint inFrustumCount = 0;n#endifnfloat fDepth;nvec3 shadowColor = vec3( 1.0 );nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;nbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );nbool inFrustum = all( inFrustumVec );n#ifdef SHADOWMAP_CASCADEninFrustumCount += int( inFrustum );nbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );n#elsenbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );n#endifnbool frustumTest = all( frustumTestVec );nif ( frustumTest ) {nshadowCoord.z += shadowBias[ i ];n#ifdef SHADOWMAP_SOFTnfloat 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#elsenvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );nfloat fDepth = unpackDepth( rgbaDepth );nif ( fDepth < shadowCoord.z )nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );n#endifn}n#ifdef SHADOWMAP_DEBUGn#ifdef SHADOWMAP_CASCADEnif ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];n#elsenif ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];n#endifn#endifn}n#ifdef GAMMA_OUTPUTnshadowColor *= shadowColor;n#endifngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;n#endif",
    
shadowmap_pars_vertex: "#ifdef USE_SHADOWMAPnvarying vec4 vShadowCoord[ MAX_SHADOWS ];nuniform mat4 shadowMatrix[ MAX_SHADOWS ];n#endif",
    
shadowmap_vertex: "#ifdef USE_SHADOWMAPnvec4 transformedPosition;n#ifdef USE_MORPHTARGETSntransformedPosition = objectMatrix * vec4( morphed, 1.0 );n#elsen#ifdef USE_SKINNINGntransformedPosition = objectMatrix * skinned;n#elsentransformedPosition = objectMatrix * vec4( position, 1.0 );n#endifn#endifnfor( int i = 0; i < MAX_SHADOWS; i ++ ) {nvShadowCoord[ i ] = shadowMatrix[ i ] * transformedPosition;n}n#endif",
    
alphatest_fragment: "#ifdef ALPHATESTnif ( gl_FragColor.a < ALPHATEST ) discard;n#endif",
    
linear_to_gamma_fragment: "#ifdef GAMMA_OUTPUTngl_FragColor.xyz = sqrt( gl_FragColor.xyz );n#endif"
};
THREE.UniformsUtils = {
    
merge: function(a) {
        var 
b, c, d, e = {};
        for (
b = 0; b < a.length; b++) {
            
d = this.clone(a[b]);
            for (
c in d) e[c] = d[c]
        }
        return 
e
    
},
    clone: function(
a) {
        var 
b, c, d, e = {};
        for (
b in a) {
            
e[b] = {};
            for (
c in a[b]) {
                
d = a[b][c];
                
e[b][c] = d instanceof THREE.Color || d instanceof THREE.Vector2 || d instanceof THREE.Vector3 || d instanceof THREE.Vector4 || d instanceof THREE.Matrix4 || d instanceof THREE.Texture ? d.clone() : d instanceof Array ? d.slice() : d
            
}
        }
        return 
e
    
}
};
THREE.UniformsLib = {
    
common: {
        
diffuse: {
            
type: "c",
            
value: new THREE.Color(15658734)
        },
        
opacity: {
            
type: "f",
            
value: 1
        
},
        
map: {
            
type: "t",
            
value: 0,
            
texture: null
        
},
        
offsetRepeat: {
            
type: "v4",
            
value: new THREE.Vector4(0, 0, 1, 1)
        },
        
lightMap: {
            
type: "t",
            
value: 2,
            
texture: null
        
},
        
envMap: {
            
type: "t",
            
value: 1,
            
texture: null
        
},
        
flipEnvMap: {
            
type: "f",
            
value: -1
        
},
        
useRefract: {
            
type: "i",
            
value: 0
        
},
        
reflectivity: {
            
type: "f",
            
value: 1
        
},
        
refractionRatio: {
            
type: "f",
            
value: 0.98
        
},
        
combine: {
            
type: "i",
            
value: 0
        
},
        
morphTargetInfluences: {
            
type: "f",
            
value: 0
        
}
    },
    
fog: {
        
fogDensity: {
            
type: "f",
            
value: 2.5E-4
        
},
        
fogNear: {
            
type: "f",
            
value: 1
        
},
        
fogFar: {
            
type: "f",
            
value: 2E3
        
},
        
fogColor: {
            
type: "c",
            
value: new THREE.Color(16777215)
        }
    },
    
lights: {
        
ambientLightColor: {
            
type: "fv",
            
value: []
        },
        
directionalLightDirection: {
            
type: "fv",
            
value: []
        },
        
directionalLightColor: {
            
type: "fv",
            
value: []
        },
        
pointLightColor: {
            
type: "fv",
            
value: []
        },
        
pointLightPosition: {
            
type: "fv",
            
value: []
        },
        
pointLightDistance: {
            
type: "fv1",
            
value: []
        },
        
spotLightColor: {
            
type: "fv",
            
value: []
        },
        
spotLightPosition: {
            
type: "fv",
            
value: []
        },
        
spotLightDirection: {
            
type: "fv",
            
value: []
        },
        
spotLightDistance: {
            
type: "fv1",
            
value: []
        },
        
spotLightAngle: {
            
type: "fv1",
            
value: []
        },
        
spotLightExponent: {
            
type: "fv1",
            
value: []
        }
    },
    
particle: {
        
psColor: {
            
type: "c",
            
value: new THREE.Color(15658734)
        },
        
opacity: {
            
type: "f",
            
value: 1
        
},
        
size: {
            
type: "f",
            
value: 1
        
},
        
scale: {
            
type: "f",
            
value: 1
        
},
        
map: {
            
type: "t",
            
value: 0,
            
texture: null
        
},
        
fogDensity: {
            
type: "f",
            
value: 2.5E-4
        
},
        
fogNear: {
            
type: "f",
            
value: 1
        
},
        
fogFar: {
            
type: "f",
            
value: 2E3
        
},
        
fogColor: {
            
type: "c",
            
value: new THREE.Color(16777215)
        }
    },
    
shadowmap: {
        
shadowMap: {
            
type: "tv",
            
value: 6,
            
texture: []
        },
        
shadowMapSize: {
            
type: "v2v",
            
value: []
        },
        
shadowBias: {
            
type: "fv1",
            
value: []
        },
        
shadowDarkness: {
            
type: "fv1",
            
value: []
        },
        
shadowMatrix: {
            
type: "m4v",
            
value: []
        }
    }
};
THREE.ShaderLib = {
    
depth: {
        
uniforms: {
            
mNear: {
                
type: "f",
                
value: 1
            
},
            
mFar: {
                
type: "f",
                
value: 2E3
            
},
            
opacity: {
                
type: "f",
                
value: 1
            
}
        },
        
vertexShader: "void main() {ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );n}",
        
fragmentShader: "uniform float mNear;nuniform float mFar;nuniform float opacity;nvoid main() {nfloat depth = gl_FragCoord.z / gl_FragCoord.w;nfloat color = 1.0 - smoothstep( mNear, mFar, depth );ngl_FragColor = vec4( vec3( color ), opacity );n}"
    
},
    
normal: {
        
uniforms: {
            
opacity: {
                
type: "f",
                
value: 1
            
}
        },
        
vertexShader: "varying vec3 vNormal;nvoid main() {nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );nvNormal = normalMatrix * normal;ngl_Position = projectionMatrix * mvPosition;n}",
        
fragmentShader: "uniform float opacity;nvarying vec3 vNormal;nvoid main() {ngl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );n}"
    
},
    
basic: {
        
uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common, THREE.UniformsLib.fog, THREE.UniformsLib.shadowmap]),
        
vertexShader: [THREE.ShaderChunk.map_pars_vertex,
            
THREE.ShaderChunk.lightmap_pars_vertex, THREE.ShaderChunk.envmap_pars_vertex, THREE.ShaderChunk.color_pars_vertex, THREE.ShaderChunk.skinning_pars_vertex, THREE.ShaderChunk.morphtarget_pars_vertex, THREE.ShaderChunk.shadowmap_pars_vertex, "void main() {nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", THREE.ShaderChunk.map_vertex, THREE.ShaderChunk.lightmap_vertex, THREE.ShaderChunk.envmap_vertex, THREE.ShaderChunk.color_vertex, THREE.ShaderChunk.skinbase_vertex, THREE.ShaderChunk.skinning_vertex,
            
THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.default_vertex, THREE.ShaderChunk.shadowmap_vertex, "}"
        
].join("n"),
        
fragmentShader: ["uniform vec3 diffuse;nuniform float opacity;", THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk.map_pars_fragment, THREE.ShaderChunk.lightmap_pars_fragment, THREE.ShaderChunk.envmap_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, THREE.ShaderChunk.shadowmap_pars_fragment, "void main() {ngl_FragColor = vec4( diffuse, opacity );", THREE.ShaderChunk.map_fragment,
            
THREE.ShaderChunk.alphatest_fragment, THREE.ShaderChunk.lightmap_fragment, THREE.ShaderChunk.color_fragment, THREE.ShaderChunk.envmap_fragment, THREE.ShaderChunk.shadowmap_fragment, THREE.ShaderChunk.linear_to_gamma_fragment, THREE.ShaderChunk.fog_fragment, "}"
        
].join("n")
    },
    
lambert: {
        
uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common, THREE.UniformsLib.fog, THREE.UniformsLib.lights, THREE.UniformsLib.shadowmap, {
            
ambient: {
                
type: "c",
                
value: new THREE.Color(16777215)
            },
            
emissive: {
                
type: "c",
                
value: new THREE.Color(0)
            },
            
wrapRGB: {
                
type: "v3",
                
value: new THREE.Vector3(1, 1, 1)
            }
        }]),
        
vertexShader: ["varying vec3 vLightFront;n#ifdef DOUBLE_SIDEDnvarying vec3 vLightBack;n#endif", THREE.ShaderChunk.map_pars_vertex, THREE.ShaderChunk.lightmap_pars_vertex, THREE.ShaderChunk.envmap_pars_vertex, THREE.ShaderChunk.lights_lambert_pars_vertex, THREE.ShaderChunk.color_pars_vertex, THREE.ShaderChunk.skinning_pars_vertex, THREE.ShaderChunk.morphtarget_pars_vertex, THREE.ShaderChunk.shadowmap_pars_vertex, "void main() {nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
            
THREE.ShaderChunk.map_vertex, THREE.ShaderChunk.lightmap_vertex, THREE.ShaderChunk.envmap_vertex, THREE.ShaderChunk.color_vertex, THREE.ShaderChunk.morphnormal_vertex, THREE.ShaderChunk.skinbase_vertex, THREE.ShaderChunk.skinnormal_vertex, THREE.ShaderChunk.defaultnormal_vertex, "#ifndef USE_ENVMAPnvec4 mPosition = objectMatrix * vec4( position, 1.0 );n#endif", THREE.ShaderChunk.lights_lambert_vertex, THREE.ShaderChunk.skinning_vertex, THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.default_vertex,
            
THREE.ShaderChunk.shadowmap_vertex, "}"
        
].join("n"),
        
fragmentShader: ["uniform float opacity;nvarying vec3 vLightFront;n#ifdef DOUBLE_SIDEDnvarying vec3 vLightBack;n#endif", THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk.map_pars_fragment, THREE.ShaderChunk.lightmap_pars_fragment, THREE.ShaderChunk.envmap_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, THREE.ShaderChunk.shadowmap_pars_fragment, "void main() {ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );", THREE.ShaderChunk.map_fragment, THREE.ShaderChunk.alphatest_fragment,
            
"#ifdef DOUBLE_SIDEDnif ( gl_FrontFacing )ngl_FragColor.xyz *= vLightFront;nelsengl_FragColor.xyz *= vLightBack;n#elsengl_FragColor.xyz *= vLightFront;n#endif", THREE.ShaderChunk.lightmap_fragment, THREE.ShaderChunk.color_fragment, THREE.ShaderChunk.envmap_fragment, THREE.ShaderChunk.shadowmap_fragment, THREE.ShaderChunk.linear_to_gamma_fragment, THREE.ShaderChunk.fog_fragment, "}"
        
].join("n")
    },
    
phong: {
        
uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common, THREE.UniformsLib.fog, THREE.UniformsLib.lights,
            
THREE.UniformsLib.shadowmap, {
                
ambient: {
                    
type: "c",
                    
value: new THREE.Color(16777215)
                },
                
emissive: {
                    
type: "c",
                    
value: new THREE.Color(0)
                },
                
specular: {
                    
type: "c",
                    
value: new THREE.Color(1118481)
                },
                
shininess: {
                    
type: "f",
                    
value: 30
                
},
                
wrapRGB: {
                    
type: "v3",
                    
value: new THREE.Vector3(1, 1, 1)
                }
            }
        ]),
        
vertexShader: ["varying vec3 vViewPosition;nvarying vec3 vNormal;", THREE.ShaderChunk.map_pars_vertex, THREE.ShaderChunk.lightmap_pars_vertex, THREE.ShaderChunk.envmap_pars_vertex, THREE.ShaderChunk.lights_phong_pars_vertex, THREE.ShaderChunk.color_pars_vertex,
            
THREE.ShaderChunk.skinning_pars_vertex, THREE.ShaderChunk.morphtarget_pars_vertex, THREE.ShaderChunk.shadowmap_pars_vertex, "void main() {nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", THREE.ShaderChunk.map_vertex, THREE.ShaderChunk.lightmap_vertex, THREE.ShaderChunk.envmap_vertex, THREE.ShaderChunk.color_vertex, "#ifndef USE_ENVMAPnvec4 mPosition = objectMatrix * vec4( position, 1.0 );n#endifnvViewPosition = -mvPosition.xyz;", THREE.ShaderChunk.morphnormal_vertex, THREE.ShaderChunk.skinbase_vertex,
            
THREE.ShaderChunk.skinnormal_vertex, THREE.ShaderChunk.defaultnormal_vertex, "vNormal = transformedNormal;", THREE.ShaderChunk.lights_phong_vertex, THREE.ShaderChunk.skinning_vertex, THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.default_vertex, THREE.ShaderChunk.shadowmap_vertex, "}"
        
].join("n"),
        
fragmentShader: ["uniform vec3 diffuse;nuniform float opacity;nuniform vec3 ambient;nuniform vec3 emissive;nuniform vec3 specular;nuniform float shininess;", THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk.map_pars_fragment,
            
THREE.ShaderChunk.lightmap_pars_fragment, THREE.ShaderChunk.envmap_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, THREE.ShaderChunk.lights_phong_pars_fragment, THREE.ShaderChunk.shadowmap_pars_fragment, "void main() {ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );", THREE.ShaderChunk.map_fragment, THREE.ShaderChunk.alphatest_fragment, THREE.ShaderChunk.lights_phong_fragment, THREE.ShaderChunk.lightmap_fragment, THREE.ShaderChunk.color_fragment, THREE.ShaderChunk.envmap_fragment, THREE.ShaderChunk.shadowmap_fragment,
            
THREE.ShaderChunk.linear_to_gamma_fragment, THREE.ShaderChunk.fog_fragment, "}"
        
].join("n")
    },
    
particle_basic: {
        
uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.particle, THREE.UniformsLib.shadowmap]),
        
vertexShader: ["uniform float size;nuniform float scale;", THREE.ShaderChunk.color_pars_vertex, THREE.ShaderChunk.shadowmap_pars_vertex, "void main() {", THREE.ShaderChunk.color_vertex, "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );n#ifdef USE_SIZEATTENUATIONngl_PointSize = size * ( scale / length( mvPosition.xyz ) );n#elsengl_PointSize = size;n#endifngl_Position = projectionMatrix * mvPosition;",
            
THREE.ShaderChunk.shadowmap_vertex, "}"
        
].join("n"),
        
fragmentShader: ["uniform vec3 psColor;nuniform float opacity;", THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk.map_particle_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, THREE.ShaderChunk.shadowmap_pars_fragment, "void main() {ngl_FragColor = vec4( psColor, opacity );", THREE.ShaderChunk.map_particle_fragment, THREE.ShaderChunk.alphatest_fragment, THREE.ShaderChunk.color_fragment, THREE.ShaderChunk.shadowmap_fragment, THREE.ShaderChunk.fog_fragment,
            
"}"
        
].join("n")
    },
    
depthRGBA: {
        
uniforms: {},
        
vertexShader: [THREE.ShaderChunk.skinning_pars_vertex, THREE.ShaderChunk.morphtarget_pars_vertex, "void main() {nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", THREE.ShaderChunk.skinbase_vertex, THREE.ShaderChunk.skinning_vertex, THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.default_vertex, "}"].join("n"),
        
fragmentShader: "vec4 pack_depth( const in float depth ) {nconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );nconst vec4 bit_mask  = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );nvec4 res = fract( depth * bit_shift );nres -= res.xxyz * bit_mask;nreturn res;n}nvoid main() {ngl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );n}"
    
}
};
THREE.WebGLRenderer = function(a) {
    function 
b(a, b) {
        var 
c = a.vertices.length,
            
d = b.material;
        if (
d.attributes) {
            if (
a.__webglCustomAttributesList === void 0) a.__webglCustomAttributesList = [];
            for (var 
e in d.attributes) {
                var 
f = d.attributes[e];
                if (!
f.__webglInitialized || f.createUniqueBuffers) {
                    
f.__webglInitialized = true;
                    var 
g = 1;
                    
f.type === "v2" ? g = 2 : f.type === "v3" ? g = 3 : f.type === "v4" ? g = 4 : f.type === "c" && (g = 3);
                    
f.size = g;
                    
f.array = new Float32Array(c * g);
                    
f.buffer = k.createBuffer();
                    
f.buffer.belongsToAttribute = e;
                    
f.needsUpdate = true
                
}
                
a.__webglCustomAttributesList.push(f)
            }
        }
    }

    function 
c(a, b) {
        if (
a.material && !(a.material instanceof THREE.MeshFaceMaterial)) return a.material;
        if (
b.materialIndex >= 0) return a.geometry.materials[b.materialIndex]
    }

    function 
d(a) {
        return 
a instanceof THREE.MeshBasicMaterial && !a.envMap || a instanceof THREE.MeshDepthMaterial ? false : a && a.shading !== void 0 && a.shading === THREE.SmoothShading ? THREE.SmoothShading : THREE.FlatShading
    
}

    function 
e(a) {
        return 
a.map || a.lightMap || a instanceof THREE.ShaderMaterial ? true : false
    
}

    function 
f(a, b, c) {
        var 
d, e, f, g, h = a.vertices;
        
g = h.length;
        var 
i = a.colors,
            
j = i.length,
            
m = a.__vertexArray,
            
l = a.__colorArray,
            
n = a.__sortArray,
            
o = a.verticesNeedUpdate,
            
p = a.colorsNeedUpdate,
            
r = a.__webglCustomAttributesList;
        if (
c.sortParticles) {
            
hb.copy(Aa);
            
hb.multiplySelf(c.matrixWorld);
            for (
d = 0; d < g; d++) {
                
e = h[d];
                
qa.copy(e);
                
hb.multiplyVector3(qa);
                
n[d] = [qa.z, d]
            }
            
n.sort(function(a, b) {
                return 
b[0] - a[0]
            });
            for (
d = 0; d < g; d++) {
                
e = h[n[d][1]];
                
f = d * 3;
                
m[f] = e.x;
                
m[f + 1] = e.y;
                
m[f + 2] = e.z
            
}
            for (
d = 0; d < j; d++) {
                
f = d * 3;
                
e = i[n[d][1]];
                
l[f] = e.r;
                
l[f + 1] = e.g;
                
l[f + 2] = e.b
            
}
            if (
r) {
                
i = 0;
                for (
j = r.length; i < j; i++) {
                    
h = r[i];
                    if (
h.boundTo === void 0 || h.boundTo === "vertices") {
                        
f = 0;
                        
e = h.value.length;
                        if (
h.size === 1)
                            for (
d = 0; d < e; d++) {
                                
g = n[d][1];
                                
h.array[d] = h.value[g]
                            } else if (
h.size === 2)
                                for (
d = 0; d < e; d++) {
                                    
g = n[d][1];
                                    
g = h.value[g];
                                    
h.array[f] = g.x;
                                    
h.array[f + 1] = g.y;
                                    
f = f + 2
                                
} else if (h.size === 3)
                                    if (
h.type === "c")
                                        for (
d = 0; d < e; d++) {
                                            
g = n[d][1];
                                            
g = h.value[g];
                                            
h.array[f] = g.r;
                                            
h.array[f + 1] = g.g;
                                            
h.array[f + 2] = g.b;
                                            
f = f + 3
                                        
} else
                                            for (
d = 0; d < e; d++) {
                                                
g = n[d][1];
                                                
g = h.value[g];
                                                
h.array[f] = g.x;
                                                
h.array[f + 1] = g.y;
                                                
h.array[f + 2] = g.z;
                                                
f = f + 3
                                            
} else if (h.size === 4)
                                                for (
d = 0; d < e; d++) {
                                                    
g = n[d][1];
                                                    
g = h.value[g];
                                                    
h.array[f] = g.x;
                                                    
h.array[f + 1] = g.y;
                                                    
h.array[f + 2] = g.z;
                                                    
h.array[f + 3] = g.w;
                                                    
f = f + 4
                                                
}
                    }
                }
            }
        } else {
            if (
o)
                for (
d = 0; d < g; d++) {
                    
e = h[d];
                    
f = d * 3;
                    
m[f] = e.x;
                    
m[f + 1] = e.y;
                    
m[f + 2] = e.z
                
}
            if (
p)
                for (
d = 0; d < j; d++) {
                    
e = i[d];
                    
f = d * 3;
                    
l[f] = e.r;
                    
l[f + 1] = e.g;
                    
l[f + 2] = e.b
                
}
            if (
r) {
                
i = 0;
                for (
j = r.length; i < j; i++) {
                    
h = r[i];
                    if (
h.needsUpdate && (h.boundTo === void 0 || h.boundTo === "vertices")) {
                        
e = h.value.length;
                        
f = 0;
                        if (
h.size === 1)
                            for (
d = 0; d < e; d++) h.array[d] = h.value[d];
                        else if (
h.size === 2)
                            for (
d = 0; d < e; d++) {
                                
g = h.value[d];
                                
h.array[f] = g.x;
                                
h.array[f + 1] = g.y;
                                
f = f + 2
                            
} else if (h.size ===
                                
3)
                                if (
h.type === "c")
                                    for (
d = 0; d < e; d++) {
                                        
g = h.value[d];
                                        
h.array[f] = g.r;
                                        
h.array[f + 1] = g.g;
                                        
h.array[f + 2] = g.b;
                                        
f = f + 3
                                    
} else
                                        for (
d = 0; d < e; d++) {
                                            
g = h.value[d];
                                            
h.array[f] = g.x;
                                            
h.array[f + 1] = g.y;
                                            
h.array[f + 2] = g.z;
                                            
f = f + 3
                                        
} else if (h.size === 4)
                                            for (
d = 0; d < e; d++) {
                                                
g = h.value[d];
                                                
h.array[f] = g.x;
                                                
h.array[f + 1] = g.y;
                                                
h.array[f + 2] = g.z;
                                                
h.array[f + 3] = g.w;
                                                
f = f + 4
                                            
}
                    }
                }
            }
        }
        if (
o || c.sortParticles) {
            
k.bindBuffer(k.ARRAY_BUFFER, a.__webglVertexBuffer);
            
k.bufferData(k.ARRAY_BUFFER, m, b)
        }
        if (
p || c.sortParticles) {
            
k.bindBuffer(k.ARRAY_BUFFER, a.__webglColorBuffer);
            
k.bufferData(k.ARRAY_BUFFER,
                
l, b)
        }
        if (
r) {
            
i = 0;
            for (
j = r.length; i < j; i++) {
                
h = r[i];
                if (
h.needsUpdate || c.sortParticles) {
                    
k.bindBuffer(k.ARRAY_BUFFER, h.buffer);
                    
k.bufferData(k.ARRAY_BUFFER, h.array, b)
                }
            }
        }
    }

    function 
g(a, b) {
        return 
b.z - a.z
    
}

    function 
h(a, b) {
        return 
b[1] - a[1]
    }

    function 
i(a, b, c) {
        if (
a.length)
            for (var 
d = 0, f = a.length; d < f; d++) {
                
ca = N = null;
                
ba = H = R = S = na = Ga = P = -1;
                
Ra = true;
                
a[d].render(b, c, ec, Ua);
                
ca = N = null;
                
ba = H = R = S = na = Ga = P = -1;
                
Ra = true
            
}
    }

    function 
j(a, b, c, d, f, e, g, h) {
        var 
i, k, j, m;
        if (
b) {
            
k = a.length - 1;
            
m = b = -1
        
} else {
            
k = 0;
            
b = a.length;
            
m = 1
        
}
        for (var 
l = k; l !== b; l = l + m) {
            
i =
                
a[l];
            if (
i.render) {
                
k = i.object;
                
j = i.buffer;
                if (
h) i = h;
                else {
                    
i = i[c];
                    if (!
i) continue;
                    
g && E.setBlending(i.blending, i.blendEquation, i.blendSrc, i.blendDst);
                    
E.setDepthTest(i.depthTest);
                    
E.setDepthWrite(i.depthWrite);
                    
w(i.polygonOffset, i.polygonOffsetFactor, i.polygonOffsetUnits)
                }
                
E.setObjectFaces(k);
                
j instanceof THREE.BufferGeometry ? E.renderBufferDirect(d, f, e, i, j, k) : E.renderBuffer(d, f, e, i, j, k)
            }
        }
    }

    function 
l(a, b, c, d, f, e, g) {
        for (var 
h, i, k = 0, j = a.length; k < j; k++) {
            
h = a[k];
            
i = h.object;
            if (
i.visible) {
                if (
g) h = g;
                else {
                    
h = h[b];
                    if (!
h) continue;
                    
e && E.setBlending(h.blending, h.blendEquation, h.blendSrc, h.blendDst);
                    
E.setDepthTest(h.depthTest);
                    
E.setDepthWrite(h.depthWrite);
                    
w(h.polygonOffset, h.polygonOffsetFactor, h.polygonOffsetUnits)
                }
                
E.renderImmediateObject(c, d, f, h, i)
            }
        }
    }

    function 
m(a, b, c) {
        
a.push({
            
buffer: b,
            
object: c,
            
opaque: null,
            
transparent: null
        
})
    }

    function 
n(a) {
        for (var 
b in a.attributes)
            if (
a.attributes[b].needsUpdate) return true;
        return 
false
    
}

    function 
p(a) {
        for (var 
b in a.attributes) a.attributes[b].needsUpdate = false
    
}

    function 
r(a, b) {
        for (var 
c = a.length -
                
1; c >= 0; c--) a[c].object === b && a.splice(c, 1)
    }

    function 
o(a, b) {
        for (var 
c = a.length - 1; c >= 0; c--) a[c] === b && a.splice(c, 1)
    }

    function 
q(a, b, c, d, f) {
        if (
d.needsUpdate) {
            
d.program && E.deallocateMaterial(d);
            
E.initMaterial(d, b, c, f);
            
d.needsUpdate = false
        
}
        if (
d.morphTargets && !f.__webglMorphTargetInfluences) f.__webglMorphTargetInfluences = new Float32Array(E.maxMorphTargets);
        var 
e = false,
            
g = d.program,
            
h = g.uniforms,
            
i = d.uniforms;
        if (
g !== N) {
            
k.useProgram(g);
            
N = g;
            
e = true
        
}
        if (
d.id !== ba) {
            
ba = d.id;
            
e = true
        
}
        if (
e || a !== ca) {
            
k.uniformMatrix4fv(h.projectionMatrix,
                
false, a._projectionMatrixArray);
            
a !== ca && (ca = a)
        }
        if (
e) {
            if (
c && d.fog) {
                
i.fogColor.value = c.color;
                if (
c instanceof THREE.Fog) {
                    
i.fogNear.value = c.near;
                    
i.fogFar.value = c.far
                
} else if (c instanceof THREE.FogExp2) i.fogDensity.value = c.density
            
}
            if (
d instanceof THREE.MeshPhongMaterial || d instanceof THREE.MeshLambertMaterial || d.lights) {
                if (
Ra) {
                    for (var 
j, m = 0, l = 0, n = 0, o, p, r, q = sa, s = q.directional.colors, u = q.directional.positions, t = q.point.colors, w = q.point.positions, x = q.point.distances, C = q.spot.colors, B = q.spot.positions, H = q.spot.distances,
                            
R = q.spot.directions, G = q.spot.angles, J = q.spot.exponents, F = 0, M = 0, U = 0, P = r = 0, c = P = 0, e = b.length; c < e; c++) {
                        
j = b[c];
                        if (!
j.onlyShadow && j.visible) {
                            
o = j.color;
                            
p = j.intensity;
                            
r = j.distance;
                            if (
j instanceof THREE.AmbientLight)
                                if (
E.gammaInput) {
                                    
m = m + o.r * o.r;
                                    
l = l + o.g * o.g;
                                    
n = n + o.b * o.b
                                
} else {
                                    
m = m + o.r;
                                    
l = l + o.g;
                                    
n = n + o.b
                                
} else if (j instanceof THREE.DirectionalLight) {
                                
r = F * 3;
                                if (
E.gammaInput) {
                                    
s[r] = o.r * o.r * p * p;
                                    
s[r + 1] = o.g * o.g * p * p;
                                    
s[r + 2] = o.b * o.b * p * p
                                
} else {
                                    
s[r] = o.r * p;
                                    
s[r + 1] = o.g * p;
                                    
s[r + 2] = o.b * p
                                
}
                                
Fa.copy(j.matrixWorld.getPosition());
                                
Fa.subSelf(j.target.matrixWorld.getPosition());
                                
Fa.normalize();
                                
u[r] = Fa.x;
                                
u[r + 1] = Fa.y;
                                
u[r + 2] = Fa.z;
                                
F = F + 1
                            
} else if (j instanceof THREE.PointLight) {
                                
P = M * 3;
                                if (
E.gammaInput) {
                                    
t[P] = o.r * o.r * p * p;
                                    
t[P + 1] = o.g * o.g * p * p;
                                    
t[P + 2] = o.b * o.b * p * p
                                
} else {
                                    
t[P] = o.r * p;
                                    
t[P + 1] = o.g * p;
                                    
t[P + 2] = o.b * p
                                
}
                                
o = j.matrixWorld.getPosition();
                                
w[P] = o.x;
                                
w[P + 1] = o.y;
                                
w[P + 2] = o.z;
                                
x[M] = r;
                                
M = M + 1
                            
} else if (j instanceof THREE.SpotLight) {
                                
P = U * 3;
                                if (
E.gammaInput) {
                                    
C[P] = o.r * o.r * p * p;
                                    
C[P + 1] = o.g * o.g * p * p;
                                    
C[P + 2] = o.b * o.b * p * p
                                
} else {
                                    
C[P] = o.r * p;
                                    
C[P + 1] = o.g * p;
                                    
C[P + 2] = o.b * p
                                
}
                                
o = j.matrixWorld.getPosition();
                                
B[P] = o.x;
                                
B[P + 1] = o.y;
                                
B[P + 2] =
                                    
o.z;
                                
H[U] = r;
                                
Fa.copy(o);
                                
Fa.subSelf(j.target.matrixWorld.getPosition());
                                
Fa.normalize();
                                
R[P] = Fa.x;
                                
R[P + 1] = Fa.y;
                                
R[P + 2] = Fa.z;
                                
G[U] = Math.cos(j.angle);
                                
J[U] = j.exponent;
                                
U = U + 1
                            
}
                        }
                    }
                    
c = F * 3;
                    for (
e = s.length; c < e; c++) s[c] = 0;
                    
c = M * 3;
                    for (
e = t.length; c < e; c++) t[c] = 0;
                    
c = U * 3;
                    for (
e = C.length; c < e; c++) C[c] = 0;
                    
q.directional.length = F;
                    
q.point.length = M;
                    
q.spot.length = U;
                    
q.ambient[0] = m;
                    
q.ambient[1] = l;
                    
q.ambient[2] = n;
                    
Ra = false
                
}
                
c = sa;
                
i.ambientLightColor.value = c.ambient;
                
i.directionalLightColor.value = c.directional.colors;
                
i.directionalLightDirection.value =
                    
c.directional.positions;
                
i.pointLightColor.value = c.point.colors;
                
i.pointLightPosition.value = c.point.positions;
                
i.pointLightDistance.value = c.point.distances;
                
i.spotLightColor.value = c.spot.colors;
                
i.spotLightPosition.value = c.spot.positions;
                
i.spotLightDistance.value = c.spot.distances;
                
i.spotLightDirection.value = c.spot.directions;
                
i.spotLightAngle.value = c.spot.angles;
                
i.spotLightExponent.value = c.spot.exponents
            
}
            if (
d instanceof THREE.MeshBasicMaterial || d instanceof THREE.MeshLambertMaterial || d instanceof THREE.MeshPhongMaterial) {
                
i.opacity.value =
                    
d.opacity;
                
E.gammaInput ? i.diffuse.value.copyGammaToLinear(d.color) : i.diffuse.value = d.color;
                (
i.map.texture = d.map) && i.offsetRepeat.value.set(d.map.offset.x, d.map.offset.y, d.map.repeat.x, d.map.repeat.y);
                
i.lightMap.texture = d.lightMap;
                
i.envMap.texture = d.envMap;
                
i.flipEnvMap.value = d.envMap instanceof THREE.WebGLRenderTargetCube ? 1 : -1;
                
i.reflectivity.value = d.reflectivity;
                
i.refractionRatio.value = d.refractionRatio;
                
i.combine.value = d.combine;
                
i.useRefract.value = d.envMap && d.envMap.mapping instanceof THREE.CubeRefractionMapping
            
}
            if (
d instanceof THREE.LineBasicMaterial) {
                
i.diffuse.value = d.color;
                
i.opacity.value = d.opacity
            
} else if (d instanceof THREE.ParticleBasicMaterial) {
                
i.psColor.value = d.color;
                
i.opacity.value = d.opacity;
                
i.size.value = d.size;
                
i.scale.value = z.height / 2;
                
i.map.texture = d.map
            
} else if (d instanceof THREE.MeshPhongMaterial) {
                
i.shininess.value = d.shininess;
                if (
E.gammaInput) {
                    
i.ambient.value.copyGammaToLinear(d.ambient);
                    
i.emissive.value.copyGammaToLinear(d.emissive);
                    
i.specular.value.copyGammaToLinear(d.specular)
                } else {
                    
i.ambient.value = d.ambient;
                    
i.emissive.value = d.emissive;
                    
i.specular.value = d.specular
                
}
                
d.wrapAround && i.wrapRGB.value.copy(d.wrapRGB)
            } else if (
d instanceof THREE.MeshLambertMaterial) {
                if (
E.gammaInput) {
                    
i.ambient.value.copyGammaToLinear(d.ambient);
                    
i.emissive.value.copyGammaToLinear(d.emissive)
                } else {
                    
i.ambient.value = d.ambient;
                    
i.emissive.value = d.emissive
                
}
                
d.wrapAround && i.wrapRGB.value.copy(d.wrapRGB)
            } else if (
d instanceof THREE.MeshDepthMaterial) {
                
i.mNear.value = a.near;
                
i.mFar.value = a.far;
                
i.opacity.value = d.opacity
            
} else if (d instanceof THREE.MeshNormalMaterial) i.opacity.value =
                
d.opacity;
            if (
f.receiveShadow && !d._shadowPass && i.shadowMatrix) {
                
e = c = 0;
                for (
j = b.length; e < j; e++) {
                    
m = b[e];
                    if (
m.castShadow && (m instanceof THREE.SpotLight || m instanceof THREE.DirectionalLight && !m.shadowCascade)) {
                        
i.shadowMap.texture[c] = m.shadowMap;
                        
i.shadowMapSize.value[c] = m.shadowMapSize;
                        
i.shadowMatrix.value[c] = m.shadowMatrix;
                        
i.shadowDarkness.value[c] = m.shadowDarkness;
                        
i.shadowBias.value[c] = m.shadowBias;
                        
c++
                    }
                }
            }
            
b = d.uniformsList;
            
i = 0;
            for (
c = b.length; i < c; i++)
                if (
m = g.uniforms[b[i][1]]) {
                    
e = b[i][0];
                    
l = e.type;
                    
j = e.value;
                    if (
l === "i") k.uniform1i(m, j);
                    else if (
l === "f") k.uniform1f(m, j);
                    else if (
l === "v2") k.uniform2f(m, j.x, j.y);
                    else if (
l === "v3") k.uniform3f(m, j.x, j.y, j.z);
                    else if (
l === "v4") k.uniform4f(m, j.x, j.y, j.z, j.w);
                    else if (
l === "c") k.uniform3f(m, j.r, j.g, j.b);
                    else if (
l === "iv1") k.uniform1iv(m, j);
                    else if (
l === "iv") k.uniform3iv(m, j);
                    else if (
l === "fv1") k.uniform1fv(m, j);
                    else if (
l === "fv") k.uniform3fv(m, j);
                    else if (
l === "v2v") {
                        if (
e._array === void 0) e._array = new Float32Array(2 * j.length);
                        
l = 0;
                        for (
n = j.length; l < n; l++) {
                            
q = l * 2;
                            
e._array[q] =
                                
j[l].x;
                            
e._array[q + 1] = j[l].y
                        
}
                        
k.uniform2fv(m, e._array)
                    } else if (
l === "v3v") {
                        if (
e._array === void 0) e._array = new Float32Array(3 * j.length);
                        
l = 0;
                        for (
n = j.length; l < n; l++) {
                            
q = l * 3;
                            
e._array[q] = j[l].x;
                            
e._array[q + 1] = j[l].y;
                            
e._array[q + 2] = j[l].z
                        
}
                        
k.uniform3fv(m, e._array)
                    } else if (
l === "v4v") {
                        if (
e._array === void 0) e._array = new Float32Array(4 * j.length);
                        
l = 0;
                        for (
n = j.length; l < n; l++) {
                            
q = l * 4;
                            
e._array[q] = j[l].x;
                            
e._array[q + 1] = j[l].y;
                            
e._array[q + 2] = j[l].z;
                            
e._array[q + 3] = j[l].w
                        
}
                        
k.uniform4fv(m, e._array)
                    } else if (
l === "m4") {
                        if (
e._array ===
                            
void 0) e._array = new Float32Array(16);
                        
j.flattenToArray(e._array);
                        
k.uniformMatrix4fv(m, false, e._array)
                    } else if (
l === "m4v") {
                        if (
e._array === void 0) e._array = new Float32Array(16 * j.length);
                        
l = 0;
                        for (
n = j.length; l < n; l++) j[l].flattenToArrayOffset(e._array, l * 16);
                        
k.uniformMatrix4fv(m, false, e._array)
                    } else if (
l === "t") {
                        
k.uniform1i(m, j);
                        if (
m = e.texture)
                            if (
m.image instanceof Array && m.image.length === 6) {
                                
e = m;
                                if (
e.image.length === 6)
                                    if (
e.needsUpdate) {
                                        if (!
e.image.__webglTextureCube) e.image.__webglTextureCube = k.createTexture();
                                        
k.activeTexture(k.TEXTURE0 + j);
                                        
k.bindTexture(k.TEXTURE_CUBE_MAP, e.image.__webglTextureCube);
                                        
k.pixelStorei(k.UNPACK_FLIP_Y_WEBGL, e.flipY);
                                        
j = [];
                                        for (
m = 0; m < 6; m++) {
                                            
l = j;
                                            
n = m;
                                            if (
E.autoScaleCubemaps) {
                                                
q = e.image[m];
                                                
u = Va;
                                                if (!(
q.width <= u && q.height <= u)) {
                                                    
t = Math.max(q.width, q.height);
                                                    
s = Math.floor(q.width * u / t);
                                                    
u = Math.floor(q.height * u / t);
                                                    
t = document.createElement("canvas");
                                                    
t.width = s;
                                                    
t.height = u;
                                                    
t.getContext("2d").drawImage(q, 0, 0, q.width, q.height, 0, 0, s, u);
                                                    
q = t
                                                
}
                                            } else 
q = e.image[m];
                                            
l[n] = q
                                        
}
                                        
m = j[0];
                                        
l = (m.width & m.width - 1) === 0 &&
                                            (
m.height & m.height - 1) === 0;
                                        
n = D(e.format);
                                        
q = D(e.type);
                                        
v(k.TEXTURE_CUBE_MAP, e, l);
                                        for (
m = 0; m < 6; m++) k.texImage2D(k.TEXTURE_CUBE_MAP_POSITIVE_X + m, 0, n, n, q, j[m]);
                                        
e.generateMipmaps && l && k.generateMipmap(k.TEXTURE_CUBE_MAP);
                                        
e.needsUpdate = false;
                                        if (
e.onUpdate) e.onUpdate()
                                    } else {
                                        
k.activeTexture(k.TEXTURE0 + j);
                                        
k.bindTexture(k.TEXTURE_CUBE_MAP, e.image.__webglTextureCube)
                                    }
                            } else if (
m instanceof THREE.WebGLRenderTargetCube) {
                            
e = m;
                            
k.activeTexture(k.TEXTURE0 + j);
                            
k.bindTexture(k.TEXTURE_CUBE_MAP, e.__webglTexture)
                        } else 
E.setTexture(m,
                            
j)
                    } else if (
l === "tv") {
                        if (
e._array === void 0) {
                            
e._array = [];
                            
l = 0;
                            for (
n = e.texture.length; l < n; l++) e._array[l] = j + l
                        
}
                        
k.uniform1iv(m, e._array);
                        
l = 0;
                        for (
n = e.texture.length; l < n; l++)(m = e.texture[l]) && E.setTexture(m, e._array[l])
                    }
                }
            if ((
d instanceof THREE.ShaderMaterial || d instanceof THREE.MeshPhongMaterial || d.envMap) && h.cameraPosition !== null) {
                
b = a.matrixWorld.getPosition();
                
k.uniform3f(h.cameraPosition, b.x, b.y, b.z)
            }(
d instanceof THREE.MeshPhongMaterial || d instanceof THREE.MeshLambertMaterial || d instanceof THREE.ShaderMaterial ||
                
d.skinning) && h.viewMatrix !== null && k.uniformMatrix4fv(h.viewMatrix, false, a._viewMatrixArray)
        }
        if (
d.skinning)
            if (
dc && f.useVertexTexture) {
                if (
h.boneTexture !== null) {
                    
k.uniform1i(h.boneTexture, 12);
                    
E.setTexture(f.boneTexture, 12)
                }
            } else 
h.boneGlobalMatrices !== null && k.uniformMatrix4fv(h.boneGlobalMatrices, false, f.boneMatrices);
        
k.uniformMatrix4fv(h.modelViewMatrix, false, f._modelViewMatrix.elements);
        
h.normalMatrix && k.uniformMatrix3fv(h.normalMatrix, false, f._normalMatrix.elements);
        
h.objectMatrix !== null && k.uniformMatrix4fv(h.objectMatrix,
            
false, f.matrixWorld.elements);
        return 
g
    
}

    function 
s(a, b) {
        
a._modelViewMatrix.multiply(b.matrixWorldInverse, a.matrixWorld);
        
a._normalMatrix.getInverse(a._modelViewMatrix);
        
a._normalMatrix.transpose()
    }

    function 
w(a, b, c) {
        if (
Oa !== a) {
            
a ? k.enable(k.POLYGON_OFFSET_FILL) : k.disable(k.POLYGON_OFFSET_FILL);
            
Oa = a
        
}
        if (
a && (Pa !== b || bb !== c)) {
            
k.polygonOffset(b, c);
            
Pa = b;
            
bb = c
        
}
    }

    function 
t(a, b) {
        var 
c;
        
a === "fragment" ? c = k.createShader(k.FRAGMENT_SHADER) : a === "vertex" && (c = k.createShader(k.VERTEX_SHADER));
        
k.shaderSource(c, b);
        
k.compileShader(c);
        if (!
k.getShaderParameter(c, k.COMPILE_STATUS)) {
            
console.error(k.getShaderInfoLog(c));
            
console.error(b);
            return 
null
        
}
        return 
c
    
}

    function 
v(a, b, c) {
        if (
c) {
            
k.texParameteri(a, k.TEXTURE_WRAP_S, D(b.wrapS));
            
k.texParameteri(a, k.TEXTURE_WRAP_T, D(b.wrapT));
            
k.texParameteri(a, k.TEXTURE_MAG_FILTER, D(b.magFilter));
            
k.texParameteri(a, k.TEXTURE_MIN_FILTER, D(b.minFilter))
        } else {
            
k.texParameteri(a, k.TEXTURE_WRAP_S, k.CLAMP_TO_EDGE);
            
k.texParameteri(a, k.TEXTURE_WRAP_T, k.CLAMP_TO_EDGE);
            
k.texParameteri(a, k.TEXTURE_MAG_FILTER, C(b.magFilter));
            
k.texParameteri(a, k.TEXTURE_MIN_FILTER, C(b.minFilter))
        }
        if (
Ya && b.type !== THREE.FloatType && (b.anisotropy > 1 || b.__oldAnisotropy)) {
            
k.texParameterf(a, Ya.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(b.anisotropy, pb));
            
b.__oldAnisotropy = b.anisotropy
        
}
    }

    function 
x(a, b) {
        
k.bindRenderbuffer(k.RENDERBUFFER, a);
        if (
b.depthBuffer && !b.stencilBuffer) {
            
k.renderbufferStorage(k.RENDERBUFFER, k.DEPTH_COMPONENT16, b.width, b.height);
            
k.framebufferRenderbuffer(k.FRAMEBUFFER, k.DEPTH_ATTACHMENT, k.RENDERBUFFER, a)
        } else if (
b.depthBuffer && b.stencilBuffer) {
            
k.renderbufferStorage(k.RENDERBUFFER,
                
k.DEPTH_STENCIL, b.width, b.height);
            
k.framebufferRenderbuffer(k.FRAMEBUFFER, k.DEPTH_STENCIL_ATTACHMENT, k.RENDERBUFFER, a)
        } else 
k.renderbufferStorage(k.RENDERBUFFER, k.RGBA4, b.width, b.height)
    }

    function 
C(a) {
        return 
a === THREE.NearestFilter || a === THREE.NearestMipMapNearestFilter || a === THREE.NearestMipMapLinearFilter ? k.NEAREST : k.LINEAR
    
}

    function 
D(a) {
        return 
a === THREE.RepeatWrapping ? k.REPEAT : a === THREE.ClampToEdgeWrapping ? k.CLAMP_TO_EDGE : a === THREE.MirroredRepeatWrapping ? k.MIRRORED_REPEAT : a === THREE.NearestFilter ?
            
k.NEAREST : a === THREE.NearestMipMapNearestFilter ? k.NEAREST_MIPMAP_NEAREST : a === THREE.NearestMipMapLinearFilter ? k.NEAREST_MIPMAP_LINEAR : a === THREE.LinearFilter ? k.LINEAR : a === THREE.LinearMipMapNearestFilter ? k.LINEAR_MIPMAP_NEAREST : a === THREE.LinearMipMapLinearFilter ? k.LINEAR_MIPMAP_LINEAR : a === THREE.UnsignedByteType ? k.UNSIGNED_BYTE : a === THREE.UnsignedShort4444Type ? k.UNSIGNED_SHORT_4_4_4_4 : a === THREE.UnsignedShort5551Type ? k.UNSIGNED_SHORT_5_5_5_1 : a === THREE.UnsignedShort565Type ? k.UNSIGNED_SHORT_5_6_5 : a === THREE.ByteType ?
            
k.BYTE : a === THREE.ShortType ? k.SHORT : a === THREE.UnsignedShortType ? k.UNSIGNED_SHORT : a === THREE.IntType ? k.INT : a === THREE.UnsignedIntType ? k.UNSIGNED_INT : a === THREE.FloatType ? k.FLOAT : a === THREE.AlphaFormat ? k.ALPHA : a === THREE.RGBFormat ? k.RGB : a === THREE.RGBAFormat ? k.RGBA : a === THREE.LuminanceFormat ? k.LUMINANCE : a === THREE.LuminanceAlphaFormat ? k.LUMINANCE_ALPHA : a === THREE.AddEquation ? k.FUNC_ADD : a === THREE.SubtractEquation ? k.FUNC_SUBTRACT : a === THREE.ReverseSubtractEquation ? k.FUNC_REVERSE_SUBTRACT : a === THREE.ZeroFactor ? k.ZERO :
            
a === THREE.OneFactor ? k.ONE : a === THREE.SrcColorFactor ? k.SRC_COLOR : a === THREE.OneMinusSrcColorFactor ? k.ONE_MINUS_SRC_COLOR : a === THREE.SrcAlphaFactor ? k.SRC_ALPHA : a === THREE.OneMinusSrcAlphaFactor ? k.ONE_MINUS_SRC_ALPHA : a === THREE.DstAlphaFactor ? k.DST_ALPHA : a === THREE.OneMinusDstAlphaFactor ? k.ONE_MINUS_DST_ALPHA : a === THREE.DstColorFactor ? k.DST_COLOR : a === THREE.OneMinusDstColorFactor ? k.ONE_MINUS_DST_COLOR : a === THREE.SrcAlphaSaturateFactor ? k.SRC_ALPHA_SATURATE : 0
    
}
    
console.log("THREE.WebGLRenderer", THREE.REVISION);
    var 
a =
        
a || {},
        
z = a.canvas !== void 0 ? a.canvas : document.createElement("canvas"),
        
u = a.precision !== void 0 ? a.precision : "highp",
        
G = a.alpha !== void 0 ? a.alpha : true,
        
J = a.premultipliedAlpha !== void 0 ? a.premultipliedAlpha : true,
        
M = a.antialias !== void 0 ? a.antialias : false,
        
O = a.stencil !== void 0 ? a.stencil : true,
        
X = a.preserveDrawingBuffer !== void 0 ? a.preserveDrawingBuffer : false,
        
B = a.clearColor !== void 0 ? new THREE.Color(a.clearColor) : new THREE.Color(0),
        
F = a.clearAlpha !== void 0 ? a.clearAlpha : 0,
        
Q = a.maxLights !== void 0 ? a.maxLights : 4;
    
this.domElement =
        
z;
    
this.context = null;
    
this.autoUpdateScene = this.autoUpdateObjects = this.sortObjects = this.autoClearStencil = this.autoClearDepth = this.autoClearColor = this.autoClear = true;
    
this.shadowMapEnabled = this.physicallyBasedShading = this.gammaOutput = this.gammaInput = false;
    
this.shadowMapCullFrontFaces = this.shadowMapSoft = this.shadowMapAutoUpdate = true;
    
this.shadowMapCascade = this.shadowMapDebug = false;
    
this.maxMorphTargets = 8;
    
this.maxMorphNormals = 4;
    
this.autoScaleCubemaps = true;
    
this.renderPluginsPre = [];
    
this.renderPluginsPost = [];
    
this.info = {
        
memory: {
            
programs: 0,
            
geometries: 0,
            
textures: 0
        
},
        
render: {
            
calls: 0,
            
vertices: 0,
            
faces: 0,
            
points: 0
        
}
    };
    var 
E = this,
        
aa = [],
        
T = 0,
        
N = null,
        
W = null,
        
ba = -1,
        
H = null,
        
ca = null,
        
ia = 0,
        
S = -1,
        
R = -1,
        
P = -1,
        
U = -1,
        
fa = -1,
        
ma = -1,
        
Ga = -1,
        
na = -1,
        
Oa = null,
        
Pa = null,
        
bb = null,
        
nb = null,
        
gb = 0,
        
Ob = 0,
        
ob = 0,
        
kb = 0,
        
ec = 0,
        
Ua = 0,
        
Da = new THREE.Frustum,
        
Aa = new THREE.Matrix4,
        
hb = new THREE.Matrix4,
        
qa = new THREE.Vector4,
        
Fa = new THREE.Vector3,
        
Ra = true,
        
sa = {
            
ambient: [0, 0, 0],
            
directional: {
                
length: 0,
                
colors: [],
                
positions: []
            },
            
point: {
                
length: 0,
                
colors: [],
                
positions: [],
                
distances: []
            },
            
spot: {
                
length: 0,
                
colors: [],
                
positions: [],
                
distances: [],
                
directions: [],
                
angles: [],
                
exponents: []
            }
        },
        
k, Ya;
    try {
        if (!(
k = z.getContext("experimental-webgl", {
                
alpha: G,
                
premultipliedAlpha: J,
                
antialias: M,
                
stencil: O,
                
preserveDrawingBuffer: X
            
}))) throw "Error creating WebGL context.";
    } catch (
Gb) {
        
console.error(Gb)
    }
    
a = k.getExtension("OES_texture_float");
    
G = k.getExtension("OES_standard_derivatives");
    
Ya = k.getExtension("EXT_texture_filter_anisotropic") || k.getExtension("MOZ_EXT_texture_filter_anisotropic") || k.getExtension("WEBKIT_EXT_texture_filter_anisotropic");
    
a || console.log("THREE.WebGLRenderer: Float textures not supported.");
    
G || console.log("THREE.WebGLRenderer: Standard derivatives not supported.");
    
Ya || console.log("THREE.WebGLRenderer: Anisotropic texture filtering not supported.");
    
k.clearColor(0, 0, 0, 1);
    
k.clearDepth(1);
    
k.clearStencil(0);
    
k.enable(k.DEPTH_TEST);
    
k.depthFunc(k.LEQUAL);
    
k.frontFace(k.CCW);
    
k.cullFace(k.BACK);
    
k.enable(k.CULL_FACE);
    
k.enable(k.BLEND);
    
k.blendEquation(k.FUNC_ADD);
    
k.blendFunc(k.SRC_ALPHA, k.ONE_MINUS_SRC_ALPHA);
    
k.clearColor(B.r, B.g,
        
B.b, F);
    
this.context = k;
    
G = k.getParameter(k.MAX_VERTEX_TEXTURE_IMAGE_UNITS);
    
k.getParameter(k.MAX_TEXTURE_SIZE);
    var 
Va = k.getParameter(k.MAX_CUBE_MAP_TEXTURE_SIZE),
        
pb = Ya ? k.getParameter(Ya.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0,
        
cb = G > 0,
        
dc = cb && a;
    
this.getContext = function() {
        return 
k
    
};
    
this.supportsVertexTextures = function() {
        return 
cb
    
};
    
this.getMaxAnisotropy = function() {
        return 
pb
    
};
    
this.setSize = function(a, b) {
        
z.width = a;
        
z.height = b;
        
this.setViewport(0, 0, z.width, z.height)
    };
    
this.setViewport = function(a, b, c, d) {
        
gb = a !== void 0 ?
            
a : 0;
        
Ob = b !== void 0 ? b : 0;
        
ob = c !== void 0 ? c : z.width;
        
kb = d !== void 0 ? d : z.height;
        
k.viewport(gb, Ob, ob, kb)
    };
    
this.setScissor = function(a, b, c, d) {
        
k.scissor(a, b, c, d)
    };
    
this.enableScissorTest = function(a) {
        
a ? k.enable(k.SCISSOR_TEST) : k.disable(k.SCISSOR_TEST)
    };
    
this.setClearColorHex = function(a, b) {
        
B.setHex(a);
        
F = b;
        
k.clearColor(B.r, B.g, B.b, F)
    };
    
this.setClearColor = function(a, b) {
        
B.copy(a);
        
F = b;
        
k.clearColor(B.r, B.g, B.b, F)
    };
    
this.getClearColor = function() {
        return 
B
    
};
    
this.getClearAlpha = function() {
        return 
F
    
};
    
this.clear = function(a, b, c) {
        var 
d =
            
0;
        if (
a === void 0 || a) d = d | k.COLOR_BUFFER_BIT;
        if (
b === void 0 || b) d = d | k.DEPTH_BUFFER_BIT;
        if (
c === void 0 || c) d = d | k.STENCIL_BUFFER_BIT;
        
k.clear(d)
    };
    
this.clearTarget = function(a, b, c, d) {
        
this.setRenderTarget(a);
        
this.clear(b, c, d)
    };
    
this.addPostPlugin = function(a) {
        
a.init(this);
        
this.renderPluginsPost.push(a)
    };
    
this.addPrePlugin = function(a) {
        
a.init(this);
        
this.renderPluginsPre.push(a)
    };
    
this.deallocateObject = function(a) {
        if (
a.__webglInit) {
            
a.__webglInit = false;
            
delete a._modelViewMatrix;
            
delete a._normalMatrix;
            
delete a._normalMatrixArray;
            
delete a._modelViewMatrixArray;
            
delete a._objectMatrixArray;
            if (
a instanceof THREE.Mesh)
                for (var 
b in a.geometry.geometryGroups) {
                    var 
c = a.geometry.geometryGroups[b];
                    
k.deleteBuffer(c.__webglVertexBuffer);
                    
k.deleteBuffer(c.__webglNormalBuffer);
                    
k.deleteBuffer(c.__webglTangentBuffer);
                    
k.deleteBuffer(c.__webglColorBuffer);
                    
k.deleteBuffer(c.__webglUVBuffer);
                    
k.deleteBuffer(c.__webglUV2Buffer);
                    
k.deleteBuffer(c.__webglSkinVertexABuffer);
                    
k.deleteBuffer(c.__webglSkinVertexBBuffer);
                    
k.deleteBuffer(c.__webglSkinIndicesBuffer);
                    
k.deleteBuffer(c.__webglSkinWeightsBuffer);
                    
k.deleteBuffer(c.__webglFaceBuffer);
                    
k.deleteBuffer(c.__webglLineBuffer);
                    var 
d = void 0,
                        
e = void 0;
                    if (
c.numMorphTargets) {
                        
d = 0;
                        for (
e = c.numMorphTargets; d < e; d++) k.deleteBuffer(c.__webglMorphTargetsBuffers[d])
                    }
                    if (
c.numMorphNormals) {
                        
d = 0;
                        for (
e = c.numMorphNormals; d < e; d++) k.deleteBuffer(c.__webglMorphNormalsBuffers[d])
                    }
                    if (
c.__webglCustomAttributesList) {
                        
d = void 0;
                        for (
d in c.__webglCustomAttributesList) k.deleteBuffer(c.__webglCustomAttributesList[d].buffer)
                    }
                    
E.info.memory.geometries--
                } else if (
a instanceof THREE.Ribbon) {
                    
a = a.geometry;
                    
k.deleteBuffer(a.__webglVertexBuffer);
                    
k.deleteBuffer(a.__webglColorBuffer);
                    
E.info.memory.geometries--
                } else if (
a instanceof THREE.Line) {
                
a = a.geometry;
                
k.deleteBuffer(a.__webglVertexBuffer);
                
k.deleteBuffer(a.__webglColorBuffer);
                
E.info.memory.geometries--
            } else if (
a instanceof THREE.ParticleSystem) {
                
a = a.geometry;
                
k.deleteBuffer(a.__webglVertexBuffer);
                
k.deleteBuffer(a.__webglColorBuffer);
                
E.info.memory.geometries--
            }
        }
    };
    
this.deallocateTexture = function(a) {
        if (
a.__webglInit) {
            
a.__webglInit =
                
false;
            
k.deleteTexture(a.__webglTexture);
            
E.info.memory.textures--
        }
    };
    
this.deallocateRenderTarget = function(a) {
        if (
a && a.__webglTexture) {
            
k.deleteTexture(a.__webglTexture);
            if (
a instanceof THREE.WebGLRenderTargetCube)
                for (var 
b = 0; b < 6; b++) {
                    
k.deleteFramebuffer(a.__webglFramebuffer[b]);
                    
k.deleteRenderbuffer(a.__webglRenderbuffer[b])
                } else {
                    
k.deleteFramebuffer(a.__webglFramebuffer);
                    
k.deleteRenderbuffer(a.__webglRenderbuffer)
                }
        }
    };
    
this.deallocateMaterial = function(a) {
        var 
b = a.program;
        if (
b) {
            
a.program = void 0;
            var 
c, d, e =
                
false,
                
a = 0;
            for (
c = aa.length; a < c; a++) {
                
d = aa[a];
                if (
d.program === b) {
                    
d.usedTimes--;
                    
d.usedTimes === 0 && (e = true);
                    break
                }
            }
            if (
e) {
                
e = [];
                
a = 0;
                for (
c = aa.length; a < c; a++) {
                    
d = aa[a];
                    
d.program !== b && e.push(d)
                }
                
aa = e;
                
k.deleteProgram(b);
                
E.info.memory.programs--
            }
        }
    };
    
this.updateShadowMap = function(a, b) {
        
N = null;
        
ba = H = na = Ga = P = -1;
        
Ra = true;
        
R = S = -1;
        
this.shadowMapPlugin.update(a, b)
    };
    
this.renderBufferImmediate = function(a, b, c) {
        if (
a.hasPositions && !a.__webglVertexBuffer) a.__webglVertexBuffer = k.createBuffer();
        if (
a.hasNormals && !a.__webglNormalBuffer) a.__webglNormalBuffer =
            
k.createBuffer();
        if (
a.hasUvs && !a.__webglUvBuffer) a.__webglUvBuffer = k.createBuffer();
        if (
a.hasColors && !a.__webglColorBuffer) a.__webglColorBuffer = k.createBuffer();
        if (
a.hasPositions) {
            
k.bindBuffer(k.ARRAY_BUFFER, a.__webglVertexBuffer);
            
k.bufferData(k.ARRAY_BUFFER, a.positionArray, k.DYNAMIC_DRAW);
            
k.enableVertexAttribArray(b.attributes.position);
            
k.vertexAttribPointer(b.attributes.position, 3, k.FLOAT, false, 0, 0)
        }
        if (
a.hasNormals) {
            
k.bindBuffer(k.ARRAY_BUFFER, a.__webglNormalBuffer);
            if (
c.shading === THREE.FlatShading) {
                var 
d,
                    
e, f, g, h, i, j, m, l, n, o, p = a.count * 3;
                for (
o = 0; o < p; o = o + 9) {
                    
n = a.normalArray;
                    
d = n[o];
                    
e = n[o + 1];
                    
f = n[o + 2];
                    
g = n[o + 3];
                    
i = n[o + 4];
                    
m = n[o + 5];
                    
h = n[o + 6];
                    
j = n[o + 7];
                    
l = n[o + 8];
                    
d = (d + g + h) / 3;
                    
e = (e + i + j) / 3;
                    
f = (f + m + l) / 3;
                    
n[o] = d;
                    
n[o + 1] = e;
                    
n[o + 2] = f;
                    
n[o + 3] = d;
                    
n[o + 4] = e;
                    
n[o + 5] = f;
                    
n[o + 6] = d;
                    
n[o + 7] = e;
                    
n[o + 8] = f
                
}
            }
            
k.bufferData(k.ARRAY_BUFFER, a.normalArray, k.DYNAMIC_DRAW);
            
k.enableVertexAttribArray(b.attributes.normal);
            
k.vertexAttribPointer(b.attributes.normal, 3, k.FLOAT, false, 0, 0)
        }
        if (
a.hasUvs && c.map) {
            
k.bindBuffer(k.ARRAY_BUFFER, a.__webglUvBuffer);
            
k.bufferData(k.ARRAY_BUFFER,
                
a.uvArray, k.DYNAMIC_DRAW);
            
k.enableVertexAttribArray(b.attributes.uv);
            
k.vertexAttribPointer(b.attributes.uv, 2, k.FLOAT, false, 0, 0)
        }
        if (
a.hasColors && c.vertexColors !== THREE.NoColors) {
            
k.bindBuffer(k.ARRAY_BUFFER, a.__webglColorBuffer);
            
k.bufferData(k.ARRAY_BUFFER, a.colorArray, k.DYNAMIC_DRAW);
            
k.enableVertexAttribArray(b.attributes.color);
            
k.vertexAttribPointer(b.attributes.color, 3, k.FLOAT, false, 0, 0)
        }
        
k.drawArrays(k.TRIANGLES, 0, a.count);
        
a.count = 0
    
};
    
this.renderBufferDirect = function(a, b, c, d, e, f) {
        if (
d.visible !== false) {
            
c =
                
q(a, b, c, d, f);
            
a = c.attributes;
            
b = false;
            
d = e.id * 16777215 + c.id * 2 + (d.wireframe ? 1 : 0);
            if (
d !== H) {
                
H = d;
                
b = true
            
}
            if (
f instanceof THREE.Mesh) {
                
f = e.offsets;
                
f.length > 1 && (b = true);
                
d = 0;
                for (
c = f.length; d < c; ++d) {
                    var 
g = f[d].index;
                    if (
b) {
                        var 
h = e.attributes.position,
                            
i = h.itemSize;
                        
k.bindBuffer(k.ARRAY_BUFFER, h.buffer);
                        
k.vertexAttribPointer(a.position, i, k.FLOAT, false, 0, g * i * 4);
                        
h = e.attributes.normal;
                        if (
a.normal >= 0 && h) {
                            
i = h.itemSize;
                            
k.bindBuffer(k.ARRAY_BUFFER, h.buffer);
                            
k.vertexAttribPointer(a.normal, i, k.FLOAT, false, 0, g * i * 4)
                        }
                        
h = e.attributes.uv;
                        if (
a.uv >= 0 && h)
                            if (
h.buffer) {
                                
i = h.itemSize;
                                
k.bindBuffer(k.ARRAY_BUFFER, h.buffer);
                                
k.vertexAttribPointer(a.uv, i, k.FLOAT, false, 0, g * i * 4);
                                
k.enableVertexAttribArray(a.uv)
                            } else 
k.disableVertexAttribArray(a.uv);
                        
h = e.attributes.color;
                        if (
a.color >= 0 && h) {
                            
i = h.itemSize;
                            
k.bindBuffer(k.ARRAY_BUFFER, h.buffer);
                            
k.vertexAttribPointer(a.color, i, k.FLOAT, false, 0, g * i * 4)
                        }
                        
h = e.attributes.tangent;
                        if (
a.tangent >= 0 && h) {
                            
i = h.itemSize;
                            
k.bindBuffer(k.ARRAY_BUFFER, h.buffer);
                            
k.vertexAttribPointer(a.tangent, i, k.FLOAT, false, 0, g * i * 4)
                        }
                        
k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,
                            
e.attributes.index.buffer)
                    }
                    
k.drawElements(k.TRIANGLES, f[d].count, k.UNSIGNED_SHORT, f[d].start * 2);
                    
E.info.render.calls++;
                    
E.info.render.vertices = E.info.render.vertices + f[d].count;
                    
E.info.render.faces = E.info.render.faces + f[d].count / 3
                
}
            }
        }
    };
    
this.renderBuffer = function(a, b, c, d, e, f) {
        if (
d.visible !== false) {
            var 
g, i, c = q(a, b, c, d, f),
                
b = c.attributes,
                
a = false,
                
c = e.id * 16777215 + c.id * 2 + (d.wireframe ? 1 : 0);
            if (
c !== H) {
                
H = c;
                
a = true
            
}
            if (!
d.morphTargets && b.position >= 0) {
                if (
a) {
                    
k.bindBuffer(k.ARRAY_BUFFER, e.__webglVertexBuffer);
                    
k.vertexAttribPointer(b.position,
                        
3, k.FLOAT, false, 0, 0)
                }
            } else if (
f.morphTargetBase) {
                
c = d.program.attributes;
                if (
f.morphTargetBase !== -1) {
                    
k.bindBuffer(k.ARRAY_BUFFER, e.__webglMorphTargetsBuffers[f.morphTargetBase]);
                    
k.vertexAttribPointer(c.position, 3, k.FLOAT, false, 0, 0)
                } else if (
c.position >= 0) {
                    
k.bindBuffer(k.ARRAY_BUFFER, e.__webglVertexBuffer);
                    
k.vertexAttribPointer(c.position, 3, k.FLOAT, false, 0, 0)
                }
                if (
f.morphTargetForcedOrder.length) {
                    var 
j = 0;
                    
i = f.morphTargetForcedOrder;
                    for (
g = f.morphTargetInfluences; j < d.numSupportedMorphTargets && j < i.length;) {
                        
k.bindBuffer(k.ARRAY_BUFFER,
                            
e.__webglMorphTargetsBuffers[i[j]]);
                        
k.vertexAttribPointer(c["morphTarget" + j], 3, k.FLOAT, false, 0, 0);
                        if (
d.morphNormals) {
                            
k.bindBuffer(k.ARRAY_BUFFER, e.__webglMorphNormalsBuffers[i[j]]);
                            
k.vertexAttribPointer(c["morphNormal" + j], 3, k.FLOAT, false, 0, 0)
                        }
                        
f.__webglMorphTargetInfluences[j] = g[i[j]];
                        
j++
                    }
                } else {
                    
i = [];
                    
g = f.morphTargetInfluences;
                    var 
m, l = g.length;
                    for (
m = 0; m < l; m++) {
                        
j = g[m];
                        
j > 0 && i.push([m, j])
                    }
                    if (
i.length > d.numSupportedMorphTargets) {
                        
i.sort(h);
                        
i.length = d.numSupportedMorphTargets
                    
} else i.length > d.numSupportedMorphNormals ?
                        
i.sort(h) : i.length === 0 && i.push([0, 0]);
                    for (
j = 0; j < d.numSupportedMorphTargets;) {
                        if (
i[j]) {
                            
m = i[j][0];
                            
k.bindBuffer(k.ARRAY_BUFFER, e.__webglMorphTargetsBuffers[m]);
                            
k.vertexAttribPointer(c["morphTarget" + j], 3, k.FLOAT, false, 0, 0);
                            if (
d.morphNormals) {
                                
k.bindBuffer(k.ARRAY_BUFFER, e.__webglMorphNormalsBuffers[m]);
                                
k.vertexAttribPointer(c["morphNormal" + j], 3, k.FLOAT, false, 0, 0)
                            }
                            
f.__webglMorphTargetInfluences[j] = g[m]
                        } else {
                            
k.vertexAttribPointer(c["morphTarget" + j], 3, k.FLOAT, false, 0, 0);
                            
d.morphNormals && k.vertexAttribPointer(c["morphNormal" +
                                
j], 3, k.FLOAT, false, 0, 0);
                            
f.__webglMorphTargetInfluences[j] = 0
                        
}
                        
j++
                    }
                }
                
d.program.uniforms.morphTargetInfluences !== null && k.uniform1fv(d.program.uniforms.morphTargetInfluences, f.__webglMorphTargetInfluences)
            }
            if (
a) {
                if (
e.__webglCustomAttributesList) {
                    
g = 0;
                    for (
i = e.__webglCustomAttributesList.length; g < i; g++) {
                        
c = e.__webglCustomAttributesList[g];
                        if (
b[c.buffer.belongsToAttribute] >= 0) {
                            
k.bindBuffer(k.ARRAY_BUFFER, c.buffer);
                            
k.vertexAttribPointer(b[c.buffer.belongsToAttribute], c.size, k.FLOAT, false, 0, 0)
                        }
                    }
                }
                if (
b.color >= 0) {
                    
k.bindBuffer(k.ARRAY_BUFFER,
                        
e.__webglColorBuffer);
                    
k.vertexAttribPointer(b.color, 3, k.FLOAT, false, 0, 0)
                }
                if (
b.normal >= 0) {
                    
k.bindBuffer(k.ARRAY_BUFFER, e.__webglNormalBuffer);
                    
k.vertexAttribPointer(b.normal, 3, k.FLOAT, false, 0, 0)
                }
                if (
b.tangent >= 0) {
                    
k.bindBuffer(k.ARRAY_BUFFER, e.__webglTangentBuffer);
                    
k.vertexAttribPointer(b.tangent, 4, k.FLOAT, false, 0, 0)
                }
                if (
b.uv >= 0)
                    if (
e.__webglUVBuffer) {
                        
k.bindBuffer(k.ARRAY_BUFFER, e.__webglUVBuffer);
                        
k.vertexAttribPointer(b.uv, 2, k.FLOAT, false, 0, 0);
                        
k.enableVertexAttribArray(b.uv)
                    } else 
k.disableVertexAttribArray(b.uv);
                if (
b.uv2 >= 0)
                    if (
e.__webglUV2Buffer) {
                        
k.bindBuffer(k.ARRAY_BUFFER, e.__webglUV2Buffer);
                        
k.vertexAttribPointer(b.uv2, 2, k.FLOAT, false, 0, 0);
                        
k.enableVertexAttribArray(b.uv2)
                    } else 
k.disableVertexAttribArray(b.uv2);
                if (
d.skinning && b.skinVertexA >= 0 && b.skinVertexB >= 0 && b.skinIndex >= 0 && b.skinWeight >= 0) {
                    
k.bindBuffer(k.ARRAY_BUFFER, e.__webglSkinVertexABuffer);
                    
k.vertexAttribPointer(b.skinVertexA, 4, k.FLOAT, false, 0, 0);
                    
k.bindBuffer(k.ARRAY_BUFFER, e.__webglSkinVertexBBuffer);
                    
k.vertexAttribPointer(b.skinVertexB, 4, k.FLOAT,
                        
false, 0, 0);
                    
k.bindBuffer(k.ARRAY_BUFFER, e.__webglSkinIndicesBuffer);
                    
k.vertexAttribPointer(b.skinIndex, 4, k.FLOAT, false, 0, 0);
                    
k.bindBuffer(k.ARRAY_BUFFER, e.__webglSkinWeightsBuffer);
                    
k.vertexAttribPointer(b.skinWeight, 4, k.FLOAT, false, 0, 0)
                }
            }
            if (
f instanceof THREE.Mesh) {
                if (
d.wireframe) {
                    
d = d.wireframeLinewidth;
                    if (
d !== nb) {
                        
k.lineWidth(d);
                        
nb = d
                    
}
                    
a && k.bindBuffer(k.ELEMENT_ARRAY_BUFFER, e.__webglLineBuffer);
                    
k.drawElements(k.LINES, e.__webglLineCount, k.UNSIGNED_SHORT, 0)
                } else {
                    
a && k.bindBuffer(k.ELEMENT_ARRAY_BUFFER, e.__webglFaceBuffer);
                    
k.drawElements(k.TRIANGLES, e.__webglFaceCount, k.UNSIGNED_SHORT, 0)
                }
                
E.info.render.calls++;
                
E.info.render.vertices = E.info.render.vertices + e.__webglFaceCount;
                
E.info.render.faces = E.info.render.faces + e.__webglFaceCount / 3
            
} else if (f instanceof THREE.Line) {
                
f = f.type === THREE.LineStrip ? k.LINE_STRIP : k.LINES;
                
d = d.linewidth;
                if (
d !== nb) {
                    
k.lineWidth(d);
                    
nb = d
                
}
                
k.drawArrays(f, 0, e.__webglLineCount);
                
E.info.render.calls++
            } else if (
f instanceof THREE.ParticleSystem) {
                
k.drawArrays(k.POINTS, 0, e.__webglParticleCount);
                
E.info.render.calls++;
                
E.info.render.points = E.info.render.points + e.__webglParticleCount
            
} else if (f instanceof THREE.Ribbon) {
                
k.drawArrays(k.TRIANGLE_STRIP, 0, e.__webglVertexCount);
                
E.info.render.calls++
            }
        }
    };
    
this.render = function(a, b, c, d) {
        var 
e, f, h, m, n = a.__lights,
            
o = a.fog;
        
ba = -1;
        
Ra = true;
        if (
b.parent === void 0) {
            
console.warn("DEPRECATED: Camera hasn't been added to a Scene. Adding it...");
            
a.add(b)
        }
        
this.autoUpdateScene && a.updateMatrixWorld();
        if (!
b._viewMatrixArray) b._viewMatrixArray = new Float32Array(16);
        if (!
b._projectionMatrixArray) b._projectionMatrixArray =
            new 
Float32Array(16);
        
b.matrixWorldInverse.getInverse(b.matrixWorld);
        
b.matrixWorldInverse.flattenToArray(b._viewMatrixArray);
        
b.projectionMatrix.flattenToArray(b._projectionMatrixArray);
        
Aa.multiply(b.projectionMatrix, b.matrixWorldInverse);
        
Da.setFromMatrix(Aa);
        
this.autoUpdateObjects && this.initWebGLObjects(a);
        
i(this.renderPluginsPre, a, b);
        
E.info.render.calls = 0;
        
E.info.render.vertices = 0;
        
E.info.render.faces = 0;
        
E.info.render.points = 0;
        
this.setRenderTarget(c);
        (
this.autoClear || d) && this.clear(this.autoClearColor,
            
this.autoClearDepth, this.autoClearStencil);
        
m = a.__webglObjects;
        
d = 0;
        for (
e = m.length; d < e; d++) {
            
f = m[d];
            
h = f.object;
            
f.render = false;
            if (
h.visible && (!(h instanceof THREE.Mesh || h instanceof THREE.ParticleSystem) || !h.frustumCulled || Da.contains(h))) {
                
s(h, b);
                var 
p = f,
                    
r = p.object,
                    
q = p.buffer,
                    
t = void 0,
                    
t = t = void 0,
                    
t = r.material;
                if (
t instanceof THREE.MeshFaceMaterial) {
                    
t = q.materialIndex;
                    if (
t >= 0) {
                        
t = r.geometry.materials[t];
                        if (
t.transparent) {
                            
p.transparent = t;
                            
p.opaque = null
                        
} else {
                            
p.opaque = t;
                            
p.transparent = null
                        
}
                    }
                } else if (
t)
                    if (
t.transparent) {
                        
p.transparent =
                            
t;
                        
p.opaque = null
                    
} else {
                        
p.opaque = t;
                        
p.transparent = null
                    
}
                
f.render = true;
                if (
this.sortObjects)
                    if (
h.renderDepth) f.z = h.renderDepth;
                    else {
                        
qa.copy(h.matrixWorld.getPosition());
                        
Aa.multiplyVector3(qa);
                        
f.z = qa.z
                    
}
            }
        }
        
this.sortObjects && m.sort(g);
        
m = a.__webglObjectsImmediate;
        
d = 0;
        for (
e = m.length; d < e; d++) {
            
f = m[d];
            
h = f.object;
            if (
h.visible) {
                
s(h, b);
                
h = f.object.material;
                if (
h.transparent) {
                    
f.transparent = h;
                    
f.opaque = null
                
} else {
                    
f.opaque = h;
                    
f.transparent = null
                
}
            }
        }
        if (
a.overrideMaterial) {
            
d = a.overrideMaterial;
            
this.setBlending(d.blending, d.blendEquation,
                
d.blendSrc, d.blendDst);
            
this.setDepthTest(d.depthTest);
            
this.setDepthWrite(d.depthWrite);
            
w(d.polygonOffset, d.polygonOffsetFactor, d.polygonOffsetUnits);
            
j(a.__webglObjects, false, "", b, n, o, true, d);
            
l(a.__webglObjectsImmediate, "", b, n, o, false, d)
        } else {
            
this.setBlending(THREE.NormalBlending);
            
j(a.__webglObjects, true, "opaque", b, n, o, false);
            
l(a.__webglObjectsImmediate, "opaque", b, n, o, false);
            
j(a.__webglObjects, false, "transparent", b, n, o, true);
            
l(a.__webglObjectsImmediate, "transparent", b, n, o, true)
        }
        
i(this.renderPluginsPost,
            
a, b);
        if (
c && c.generateMipmaps && c.minFilter !== THREE.NearestFilter && c.minFilter !== THREE.LinearFilter)
            if (
c instanceof THREE.WebGLRenderTargetCube) {
                
k.bindTexture(k.TEXTURE_CUBE_MAP, c.__webglTexture);
                
k.generateMipmap(k.TEXTURE_CUBE_MAP);
                
k.bindTexture(k.TEXTURE_CUBE_MAP, null)
            } else {
                
k.bindTexture(k.TEXTURE_2D, c.__webglTexture);
                
k.generateMipmap(k.TEXTURE_2D);
                
k.bindTexture(k.TEXTURE_2D, null)
            }
        
this.setDepthTest(true);
        
this.setDepthWrite(true)
    };
    
this.renderImmediateObject = function(a, b, c, d, e) {
        var 
f = q(a, b, c, d, e);
        
H = -1;
        
E.setObjectFaces(e);
        
e.immediateRenderCallback ? e.immediateRenderCallback(f, k, Da) : e.render(function(a) {
            
E.renderBufferImmediate(a, f, d)
        })
    };
    
this.initWebGLObjects = function(a) {
        if (!
a.__webglObjects) {
            
a.__webglObjects = [];
            
a.__webglObjectsImmediate = [];
            
a.__webglSprites = [];
            
a.__webglFlares = []
        }
        for (; 
a.__objectsAdded.length;) {
            var 
g = a.__objectsAdded[0],
                
h = a,
                
i = void 0,
                
j = void 0,
                
l = void 0;
            if (!
g.__webglInit) {
                
g.__webglInit = true;
                
g._modelViewMatrix = new THREE.Matrix4;
                
g._normalMatrix = new THREE.Matrix3;
                if (
g instanceof THREE.Mesh) {
                    
j =
                        
g.geometry;
                    if (
j instanceof THREE.Geometry) {
                        if (
j.geometryGroups === void 0) {
                            var 
q = j,
                                
s = void 0,
                                
t = void 0,
                                
u = void 0,
                                
v = void 0,
                                
w = void 0,
                                
x = void 0,
                                
z = void 0,
                                
C = {},
                                
D = q.morphTargets.length,
                                
B = q.morphNormals.length;
                            
q.geometryGroups = {};
                            
s = 0;
                            for (
t = q.faces.length; s < t; s++) {
                                
u = q.faces[s];
                                
v = u.materialIndex;
                                
x = v !== void 0 ? v : -1;
                                
C[x] === void 0 && (C[x] = {
                                    
hash: x,
                                    
counter: 0
                                
});
                                
z = C[x].hash + "_" + C[x].counter;
                                
q.geometryGroups[z] === void 0 && (q.geometryGroups[z] = {
                                    
faces3: [],
                                    
faces4: [],
                                    
materialIndex: v,
                                    
vertices: 0,
                                    
numMorphTargets: D,
                                    
numMorphNormals: B
                                
});
                                
w = u instanceof THREE.Face3 ? 3 : 4;
                                if (
q.geometryGroups[z].vertices + w > 65535) {
                                    
C[x].counter = C[x].counter + 1;
                                    
z = C[x].hash + "_" + C[x].counter;
                                    
q.geometryGroups[z] === void 0 && (q.geometryGroups[z] = {
                                        
faces3: [],
                                        
faces4: [],
                                        
materialIndex: v,
                                        
vertices: 0,
                                        
numMorphTargets: D,
                                        
numMorphNormals: B
                                    
})
                                }
                                
u instanceof THREE.Face3 ? q.geometryGroups[z].faces3.push(s) : q.geometryGroups[z].faces4.push(s);
                                
q.geometryGroups[z].vertices = q.geometryGroups[z].vertices + w
                            
}
                            
q.geometryGroupsList = [];
                            var 
R = void 0;
                            for (
R in q.geometryGroups) {
                                
q.geometryGroups[R].id =
                                    
ia++;
                                
q.geometryGroupsList.push(q.geometryGroups[R])
                            }
                        }
                        for (
i in j.geometryGroups) {
                            
l = j.geometryGroups[i];
                            if (!
l.__webglVertexBuffer) {
                                var 
H = l;
                                
H.__webglVertexBuffer = k.createBuffer();
                                
H.__webglNormalBuffer = k.createBuffer();
                                
H.__webglTangentBuffer = k.createBuffer();
                                
H.__webglColorBuffer = k.createBuffer();
                                
H.__webglUVBuffer = k.createBuffer();
                                
H.__webglUV2Buffer = k.createBuffer();
                                
H.__webglSkinVertexABuffer = k.createBuffer();
                                
H.__webglSkinVertexBBuffer = k.createBuffer();
                                
H.__webglSkinIndicesBuffer = k.createBuffer();
                                
H.__webglSkinWeightsBuffer =
                                    
k.createBuffer();
                                
H.__webglFaceBuffer = k.createBuffer();
                                
H.__webglLineBuffer = k.createBuffer();
                                var 
G = void 0,
                                    
P = void 0;
                                if (
H.numMorphTargets) {
                                    
H.__webglMorphTargetsBuffers = [];
                                    
G = 0;
                                    for (
P = H.numMorphTargets; G < P; G++) H.__webglMorphTargetsBuffers.push(k.createBuffer())
                                }
                                if (
H.numMorphNormals) {
                                    
H.__webglMorphNormalsBuffers = [];
                                    
G = 0;
                                    for (
P = H.numMorphNormals; G < P; G++) H.__webglMorphNormalsBuffers.push(k.createBuffer())
                                }
                                
E.info.memory.geometries++;
                                var 
F = l,
                                    
J = g,
                                    
U = J.geometry,
                                    
M = F.faces3,
                                    
N = F.faces4,
                                    
O = M.length * 3 + N.length * 4,
                                    
W = M.length *
                                    
1 + N.length * 2,
                                    
S = M.length * 3 + N.length * 4,
                                    
Q = c(J, F),
                                    
X = e(Q),
                                    
T = d(Q),
                                    
ba = Q.vertexColors ? Q.vertexColors : false;
                                
F.__vertexArray = new Float32Array(O * 3);
                                if (
T) F.__normalArray = new Float32Array(O * 3);
                                if (
U.hasTangents) F.__tangentArray = new Float32Array(O * 4);
                                if (
ba) F.__colorArray = new Float32Array(O * 3);
                                if (
X) {
                                    if (
U.faceUvs.length > 0 || U.faceVertexUvs.length > 0) F.__uvArray = new Float32Array(O * 2);
                                    if (
U.faceUvs.length > 1 || U.faceVertexUvs.length > 1) F.__uv2Array = new Float32Array(O * 2)
                                }
                                if (
J.geometry.skinWeights.length && J.geometry.skinIndices.length) {
                                    
F.__skinVertexAArray =
                                        new 
Float32Array(O * 4);
                                    
F.__skinVertexBArray = new Float32Array(O * 4);
                                    
F.__skinIndexArray = new Float32Array(O * 4);
                                    
F.__skinWeightArray = new Float32Array(O * 4)
                                }
                                
F.__faceArray = new Uint16Array(W * 3);
                                
F.__lineArray = new Uint16Array(S * 2);
                                var 
fa = void 0,
                                    
ca = void 0;
                                if (
F.numMorphTargets) {
                                    
F.__morphTargetsArrays = [];
                                    
fa = 0;
                                    for (
ca = F.numMorphTargets; fa < ca; fa++) F.__morphTargetsArrays.push(new Float32Array(O * 3))
                                }
                                if (
F.numMorphNormals) {
                                    
F.__morphNormalsArrays = [];
                                    
fa = 0;
                                    for (
ca = F.numMorphNormals; fa < ca; fa++) F.__morphNormalsArrays.push(new Float32Array(O *
                                        
3))
                                }
                                
F.__webglFaceCount = W * 3;
                                
F.__webglLineCount = S * 2;
                                if (
Q.attributes) {
                                    if (
F.__webglCustomAttributesList === void 0) F.__webglCustomAttributesList = [];
                                    var 
aa = void 0;
                                    for (
aa in Q.attributes) {
                                        var 
na = Q.attributes[aa],
                                            
ma = {},
                                            
bb;
                                        for (
bb in na) ma[bb] = na[bb];
                                        if (!
ma.__webglInitialized || ma.createUniqueBuffers) {
                                            
ma.__webglInitialized = true;
                                            var 
Ga = 1;
                                            
ma.type === "v2" ? Ga = 2 : ma.type === "v3" ? Ga = 3 : ma.type === "v4" ? Ga = 4 : ma.type === "c" && (Ga = 3);
                                            
ma.size = Ga;
                                            
ma.array = new Float32Array(O * Ga);
                                            
ma.buffer = k.createBuffer();
                                            
ma.buffer.belongsToAttribute =
                                                
aa;
                                            
na.needsUpdate = true;
                                            
ma.__original = na
                                        
}
                                        
F.__webglCustomAttributesList.push(ma)
                                    }
                                }
                                
F.__inittedArrays = true;
                                
j.verticesNeedUpdate = true;
                                
j.morphTargetsNeedUpdate = true;
                                
j.elementsNeedUpdate = true;
                                
j.uvsNeedUpdate = true;
                                
j.normalsNeedUpdate = true;
                                
j.tangentsNeedUpdate = true;
                                
j.colorsNeedUpdate = true
                            
}
                        }
                    } else if (
j instanceof THREE.BufferGeometry) {
                        var 
Oa = j,
                            
Pa = void 0,
                            
qa = void 0,
                            
sa = void 0;
                        for (
Pa in Oa.attributes) {
                            
sa = Pa === "index" ? k.ELEMENT_ARRAY_BUFFER : k.ARRAY_BUFFER;
                            
qa = Oa.attributes[Pa];
                            
qa.buffer = k.createBuffer();
                            
k.bindBuffer(sa,
                                
qa.buffer);
                            
k.bufferData(sa, qa.array, k.STATIC_DRAW)
                        }
                    }
                } else if (
g instanceof THREE.Ribbon) {
                    
j = g.geometry;
                    if (!
j.__webglVertexBuffer) {
                        var 
Aa = j;
                        
Aa.__webglVertexBuffer = k.createBuffer();
                        
Aa.__webglColorBuffer = k.createBuffer();
                        
E.info.memory.geometries++;
                        var 
Da = j,
                            
Fa = Da.vertices.length;
                        
Da.__vertexArray = new Float32Array(Fa * 3);
                        
Da.__colorArray = new Float32Array(Fa * 3);
                        
Da.__webglVertexCount = Fa;
                        
j.verticesNeedUpdate = true;
                        
j.colorsNeedUpdate = true
                    
}
                } else if (
g instanceof THREE.Line) {
                    
j = g.geometry;
                    if (!
j.__webglVertexBuffer) {
                        var 
nb =
                            
j;
                        
nb.__webglVertexBuffer = k.createBuffer();
                        
nb.__webglColorBuffer = k.createBuffer();
                        
E.info.memory.geometries++;
                        var 
gb = j,
                            
Va = g,
                            
Ra = gb.vertices.length;
                        
gb.__vertexArray = new Float32Array(Ra * 3);
                        
gb.__colorArray = new Float32Array(Ra * 3);
                        
gb.__webglLineCount = Ra;
                        
b(gb, Va);
                        
j.verticesNeedUpdate = true;
                        
j.colorsNeedUpdate = true
                    
}
                } else if (
g instanceof THREE.ParticleSystem) {
                    
j = g.geometry;
                    if (!
j.__webglVertexBuffer) {
                        var 
Ya = j;
                        
Ya.__webglVertexBuffer = k.createBuffer();
                        
Ya.__webglColorBuffer = k.createBuffer();
                        
E.info.geometries++;
                        var 
Ua =
                            
j,
                            
Ob = g,
                            
ob = Ua.vertices.length;
                        
Ua.__vertexArray = new Float32Array(ob * 3);
                        
Ua.__colorArray = new Float32Array(ob * 3);
                        
Ua.__sortArray = [];
                        
Ua.__webglParticleCount = ob;
                        
b(Ua, Ob);
                        
j.verticesNeedUpdate = true;
                        
j.colorsNeedUpdate = true
                    
}
                }
            }
            if (!
g.__webglActive) {
                if (
g instanceof THREE.Mesh) {
                    
j = g.geometry;
                    if (
j instanceof THREE.BufferGeometry) m(h.__webglObjects, j, g);
                    else
                        for (
i in j.geometryGroups) {
                            
l = j.geometryGroups[i];
                            
m(h.__webglObjects, l, g)
                        }
                } else if (
g instanceof THREE.Ribbon || g instanceof THREE.Line || g instanceof THREE.ParticleSystem) {
                    
j =
                        
g.geometry;
                    
m(h.__webglObjects, j, g)
                } else 
g instanceof THREE.ImmediateRenderObject || g.immediateRenderCallback ? h.__webglObjectsImmediate.push({
                    
object: g,
                    
opaque: null,
                    
transparent: null
                
}) : g instanceof THREE.Sprite ? h.__webglSprites.push(g) : g instanceof THREE.LensFlare && h.__webglFlares.push(g);
                
g.__webglActive = true
            
}
            
a.__objectsAdded.splice(0, 1)
        }
        for (; 
a.__objectsRemoved.length;) {
            var 
db = a.__objectsRemoved[0],
                
kb = a;
            
db instanceof THREE.Mesh || db instanceof THREE.ParticleSystem || db instanceof THREE.Ribbon || db instanceof
            
THREE.Line ? r(kb.__webglObjects, db) : db instanceof THREE.Sprite ? o(kb.__webglSprites, db) : db instanceof THREE.LensFlare ? o(kb.__webglFlares, db) : (db instanceof THREE.ImmediateRenderObject || db.immediateRenderCallback) && r(kb.__webglObjectsImmediate, db);
            
db.__webglActive = false;
            
a.__objectsRemoved.splice(0, 1)
        }
        for (var 
hb = 0, pb = a.__webglObjects.length; hb < pb; hb++) {
            var 
lb = a.__webglObjects[hb].object,
                
da = lb.geometry,
                
cb = void 0,
                
oc = void 0,
                
Wa = void 0;
            if (
lb instanceof THREE.Mesh)
                if (
da instanceof THREE.BufferGeometry) {
                    if (
da.verticesNeedUpdate ||
                        
da.elementsNeedUpdate || da.uvsNeedUpdate || da.normalsNeedUpdate || da.colorsNeedUpdate || da.tangentsNeedUpdate) {
                        var 
Ib = da,
                            
pc = k.DYNAMIC_DRAW,
                            
ec = !da.dynamic,
                            
qc = Ib.attributes,
                            
Gb = qc.index,
                            
dc = qc.position,
                            
Yc = qc.normal,
                            
Zc = qc.uv,
                            
$c = qc.color,
                            
ad = qc.tangent;
                        if (
Ib.elementsNeedUpdate && Gb !== void 0) {
                            
k.bindBuffer(k.ELEMENT_ARRAY_BUFFER, Gb.buffer);
                            
k.bufferData(k.ELEMENT_ARRAY_BUFFER, Gb.array, pc)
                        }
                        if (
Ib.verticesNeedUpdate && dc !== void 0) {
                            
k.bindBuffer(k.ARRAY_BUFFER, dc.buffer);
                            
k.bufferData(k.ARRAY_BUFFER, dc.array, pc)
                        }
                        if (
Ib.normalsNeedUpdate &&
                            
Yc !== void 0) {
                            
k.bindBuffer(k.ARRAY_BUFFER, Yc.buffer);
                            
k.bufferData(k.ARRAY_BUFFER, Yc.array, pc)
                        }
                        if (
Ib.uvsNeedUpdate && Zc !== void 0) {
                            
k.bindBuffer(k.ARRAY_BUFFER, Zc.buffer);
                            
k.bufferData(k.ARRAY_BUFFER, Zc.array, pc)
                        }
                        if (
Ib.colorsNeedUpdate && $c !== void 0) {
                            
k.bindBuffer(k.ARRAY_BUFFER, $c.buffer);
                            
k.bufferData(k.ARRAY_BUFFER, $c.array, pc)
                        }
                        if (
Ib.tangentsNeedUpdate && ad !== void 0) {
                            
k.bindBuffer(k.ARRAY_BUFFER, ad.buffer);
                            
k.bufferData(k.ARRAY_BUFFER, ad.array, pc)
                        }
                        if (
ec) {
                            var 
md = void 0;
                            for (
md in Ib.attributes) delete Ib.attributes[md].array
                        }
                    }
                    
da.verticesNeedUpdate =
                        
false;
                    
da.elementsNeedUpdate = false;
                    
da.uvsNeedUpdate = false;
                    
da.normalsNeedUpdate = false;
                    
da.colorsNeedUpdate = false;
                    
da.tangentsNeedUpdate = false
                
} else {
                    for (var 
bd = 0, yd = da.geometryGroupsList.length; bd < yd; bd++) {
                        
cb = da.geometryGroupsList[bd];
                        
Wa = c(lb, cb);
                        
oc = Wa.attributes && n(Wa);
                        if (
da.verticesNeedUpdate || da.morphTargetsNeedUpdate || da.elementsNeedUpdate || da.uvsNeedUpdate || da.normalsNeedUpdate || da.colorsNeedUpdate || da.tangentsNeedUpdate || oc) {
                            var 
ga = cb,
                                
zd = lb,
                                
Za = k.DYNAMIC_DRAW,
                                
Ad = !da.dynamic,
                                
hc = Wa;
                            if (
ga.__inittedArrays) {
                                var 
nd =
                                    
d(hc),
                                    
cd = hc.vertexColors ? hc.vertexColors : false,
                                    
od = e(hc),
                                    
Kc = nd === THREE.SmoothShading,
                                    
I = void 0,
                                    
V = void 0,
                                    
jb = void 0,
                                    
L = void 0,
                                    
rc = void 0,
                                    
Rb = void 0,
                                    
mb = void 0,
                                    
Lc = void 0,
                                    
Jb = void 0,
                                    
sc = void 0,
                                    
tc = void 0,
                                    
Y = void 0,
                                    
Z = void 0,
                                    $ = 
void 0,
                                    
oa = void 0,
                                    
qb = void 0,
                                    
rb = void 0,
                                    
sb = void 0,
                                    
xc = void 0,
                                    
tb = void 0,
                                    
ub = void 0,
                                    
vb = void 0,
                                    
yc = void 0,
                                    
wb = void 0,
                                    
xb = void 0,
                                    
yb = void 0,
                                    
zc = void 0,
                                    
zb = void 0,
                                    
Ab = void 0,
                                    
Bb = void 0,
                                    
Ac = void 0,
                                    
Cb = void 0,
                                    
Db = void 0,
                                    
Eb = void 0,
                                    
Bc = void 0,
                                    
Sb = void 0,
                                    
Tb = void 0,
                                    
Ub = void 0,
                                    
Mc = void 0,
                                    
Vb = void 0,
                                    
Wb = void 0,
                                    
Xb = void 0,
                                    
Nc =
                                    
void 0,
                                    
ja = void 0,
                                    
pd = void 0,
                                    
Yb = void 0,
                                    
uc = void 0,
                                    
vc = void 0,
                                    
Ja = void 0,
                                    
qd = void 0,
                                    
Ha = void 0,
                                    
Ia = void 0,
                                    
Zb = void 0,
                                    
Kb = void 0,
                                    
za = 0,
                                    
Ea = 0,
                                    
Lb = 0,
                                    
Mb = 0,
                                    
eb = 0,
                                    
Qa = 0,
                                    
pa = 0,
                                    
Sa = 0,
                                    
Ba = 0,
                                    
K = 0,
                                    
ea = 0,
                                    
A = 0,
                                    
$a = void 0,
                                    
Ka = ga.__vertexArray,
                                    
Cc = ga.__uvArray,
                                    
Dc = ga.__uv2Array,
                                    
fb = ga.__normalArray,
                                    
ta = ga.__tangentArray,
                                    
La = ga.__colorArray,
                                    
ua = ga.__skinVertexAArray,
                                    
va = ga.__skinVertexBArray,
                                    
wa = ga.__skinIndexArray,
                                    
xa = ga.__skinWeightArray,
                                    
dd = ga.__morphTargetsArrays,
                                    
ed = ga.__morphNormalsArrays,
                                    
fd = ga.__webglCustomAttributesList,
                                    
y = void 0,
                                    
Fb = ga.__faceArray,
                                    
ab = ga.__lineArray,
                                    
Ta = zd.geometry,
                                    
Bd = Ta.elementsNeedUpdate,
                                    
rd = Ta.uvsNeedUpdate,
                                    
Cd = Ta.normalsNeedUpdate,
                                    
Dd = Ta.tangentsNeedUpdate,
                                    
Ed = Ta.colorsNeedUpdate,
                                    
Fd = Ta.morphTargetsNeedUpdate,
                                    
ic = Ta.vertices,
                                    
ka = ga.faces3,
                                    
la = ga.faces4,
                                    
Ca = Ta.faces,
                                    
gd = Ta.faceVertexUvs[0],
                                    
hd = Ta.faceVertexUvs[1],
                                    
jc = Ta.skinVerticesA,
                                    
kc = Ta.skinVerticesB,
                                    
lc = Ta.skinIndices,
                                    
$b = Ta.skinWeights,
                                    
ac = Ta.morphTargets,
                                    
Oc = Ta.morphNormals;
                                if (
Ta.verticesNeedUpdate) {
                                    
I = 0;
                                    for (
V = ka.length; I < V; I++) {
                                        
L = Ca[ka[I]];
                                        
Y = ic[L.a];
                                        
Z = ic[L.b];
                                        $ = 
ic[L.c];
                                        
Ka[Ea] = Y.x;
                                        
Ka[Ea +
                                            
1] = Y.y;
                                        
Ka[Ea + 2] = Y.z;
                                        
Ka[Ea + 3] = Z.x;
                                        
Ka[Ea + 4] = Z.y;
                                        
Ka[Ea + 5] = Z.z;
                                        
Ka[Ea + 6] = $.x;
                                        
Ka[Ea + 7] = $.y;
                                        
Ka[Ea + 8] = $.z;
                                        
Ea = Ea + 9
                                    
}
                                    
I = 0;
                                    for (
V = la.length; I < V; I++) {
                                        
L = Ca[la[I]];
                                        
Y = ic[L.a];
                                        
Z = ic[L.b];
                                        $ = 
ic[L.c];
                                        
oa = ic[L.d];
                                        
Ka[Ea] = Y.x;
                                        
Ka[Ea + 1] = Y.y;
                                        
Ka[Ea + 2] = Y.z;
                                        
Ka[Ea + 3] = Z.x;
                                        
Ka[Ea + 4] = Z.y;
                                        
Ka[Ea + 5] = Z.z;
                                        
Ka[Ea + 6] = $.x;
                                        
Ka[Ea + 7] = $.y;
                                        
Ka[Ea + 8] = $.z;
                                        
Ka[Ea + 9] = oa.x;
                                        
Ka[Ea + 10] = oa.y;
                                        
Ka[Ea + 11] = oa.z;
                                        
Ea = Ea + 12
                                    
}
                                    
k.bindBuffer(k.ARRAY_BUFFER, ga.__webglVertexBuffer);
                                    
k.bufferData(k.ARRAY_BUFFER, Ka, Za)
                                }
                                if (
Fd) {
                                    
Ja = 0;
                                    for (
qd = ac.length; Ja < qd; Ja++) {
                                        
I = ea = 0;
                                        for (
V = ka.length; I <
                                            
V; I++) {
                                            
Zb = ka[I];
                                            
L = Ca[Zb];
                                            
Y = ac[Ja].vertices[L.a];
                                            
Z = ac[Ja].vertices[L.b];
                                            $ = 
ac[Ja].vertices[L.c];
                                            
Ha = dd[Ja];
                                            
Ha[ea] = Y.x;
                                            
Ha[ea + 1] = Y.y;
                                            
Ha[ea + 2] = Y.z;
                                            
Ha[ea + 3] = Z.x;
                                            
Ha[ea + 4] = Z.y;
                                            
Ha[ea + 5] = Z.z;
                                            
Ha[ea + 6] = $.x;
                                            
Ha[ea + 7] = $.y;
                                            
Ha[ea + 8] = $.z;
                                            if (
hc.morphNormals) {
                                                if (
Kc) {
                                                    
Kb = Oc[Ja].vertexNormals[Zb];
                                                    
tb = Kb.a;
                                                    
ub = Kb.b;
                                                    
vb = Kb.c
                                                
} else vb = ub = tb = Oc[Ja].faceNormals[Zb];
                                                
Ia = ed[Ja];
                                                
Ia[ea] = tb.x;
                                                
Ia[ea + 1] = tb.y;
                                                
Ia[ea + 2] = tb.z;
                                                
Ia[ea + 3] = ub.x;
                                                
Ia[ea + 4] = ub.y;
                                                
Ia[ea + 5] = ub.z;
                                                
Ia[ea + 6] = vb.x;
                                                
Ia[ea + 7] = vb.y;
                                                
Ia[ea + 8] = vb.z
                                            
}
                                            
ea = ea + 9
                                        
}
                                        
I = 0;
                                        for (
V = la.length; I < V; I++) {
                                            
Zb =
                                                
la[I];
                                            
L = Ca[Zb];
                                            
Y = ac[Ja].vertices[L.a];
                                            
Z = ac[Ja].vertices[L.b];
                                            $ = 
ac[Ja].vertices[L.c];
                                            
oa = ac[Ja].vertices[L.d];
                                            
Ha = dd[Ja];
                                            
Ha[ea] = Y.x;
                                            
Ha[ea + 1] = Y.y;
                                            
Ha[ea + 2] = Y.z;
                                            
Ha[ea + 3] = Z.x;
                                            
Ha[ea + 4] = Z.y;
                                            
Ha[ea + 5] = Z.z;
                                            
Ha[ea + 6] = $.x;
                                            
Ha[ea + 7] = $.y;
                                            
Ha[ea + 8] = $.z;
                                            
Ha[ea + 9] = oa.x;
                                            
Ha[ea + 10] = oa.y;
                                            
Ha[ea + 11] = oa.z;
                                            if (
hc.morphNormals) {
                                                if (
Kc) {
                                                    
Kb = Oc[Ja].vertexNormals[Zb];
                                                    
tb = Kb.a;
                                                    
ub = Kb.b;
                                                    
vb = Kb.c;
                                                    
yc = Kb.d
                                                
} else yc = vb = ub = tb = Oc[Ja].faceNormals[Zb];
                                                
Ia = ed[Ja];
                                                
Ia[ea] = tb.x;
                                                
Ia[ea + 1] = tb.y;
                                                
Ia[ea + 2] = tb.z;
                                                
Ia[ea + 3] = ub.x;
                                                
Ia[ea + 4] = ub.y;
                                                
Ia[ea + 5] = ub.z;
                                                
Ia[ea +
                                                    
6] = vb.x;
                                                
Ia[ea + 7] = vb.y;
                                                
Ia[ea + 8] = vb.z;
                                                
Ia[ea + 9] = yc.x;
                                                
Ia[ea + 10] = yc.y;
                                                
Ia[ea + 11] = yc.z
                                            
}
                                            
ea = ea + 12
                                        
}
                                        
k.bindBuffer(k.ARRAY_BUFFER, ga.__webglMorphTargetsBuffers[Ja]);
                                        
k.bufferData(k.ARRAY_BUFFER, dd[Ja], Za);
                                        if (
hc.morphNormals) {
                                            
k.bindBuffer(k.ARRAY_BUFFER, ga.__webglMorphNormalsBuffers[Ja]);
                                            
k.bufferData(k.ARRAY_BUFFER, ed[Ja], Za)
                                        }
                                    }
                                }
                                if (
$b.length) {
                                    
I = 0;
                                    for (
V = ka.length; I < V; I++) {
                                        
L = Ca[ka[I]];
                                        
zb = $b[L.a];
                                        
Ab = $b[L.b];
                                        
Bb = $b[L.c];
                                        
xa[K] = zb.x;
                                        
xa[K + 1] = zb.y;
                                        
xa[K + 2] = zb.z;
                                        
xa[K + 3] = zb.w;
                                        
xa[K + 4] = Ab.x;
                                        
xa[K + 5] = Ab.y;
                                        
xa[K + 6] = Ab.z;
                                        
xa[K + 7] = Ab.w;
                                        
xa[K + 8] = Bb.x;
                                        
xa[K + 9] = Bb.y;
                                        
xa[K + 10] = Bb.z;
                                        
xa[K + 11] = Bb.w;
                                        
Cb = lc[L.a];
                                        
Db = lc[L.b];
                                        
Eb = lc[L.c];
                                        
wa[K] = Cb.x;
                                        
wa[K + 1] = Cb.y;
                                        
wa[K + 2] = Cb.z;
                                        
wa[K + 3] = Cb.w;
                                        
wa[K + 4] = Db.x;
                                        
wa[K + 5] = Db.y;
                                        
wa[K + 6] = Db.z;
                                        
wa[K + 7] = Db.w;
                                        
wa[K + 8] = Eb.x;
                                        
wa[K + 9] = Eb.y;
                                        
wa[K + 10] = Eb.z;
                                        
wa[K + 11] = Eb.w;
                                        
Sb = jc[L.a];
                                        
Tb = jc[L.b];
                                        
Ub = jc[L.c];
                                        
ua[K] = Sb.x;
                                        
ua[K + 1] = Sb.y;
                                        
ua[K + 2] = Sb.z;
                                        
ua[K + 3] = 1;
                                        
ua[K + 4] = Tb.x;
                                        
ua[K + 5] = Tb.y;
                                        
ua[K + 6] = Tb.z;
                                        
ua[K + 7] = 1;
                                        
ua[K + 8] = Ub.x;
                                        
ua[K + 9] = Ub.y;
                                        
ua[K + 10] = Ub.z;
                                        
ua[K + 11] = 1;
                                        
Vb = kc[L.a];
                                        
Wb = kc[L.b];
                                        
Xb = kc[L.c];
                                        
va[K] = Vb.x;
                                        
va[K + 1] = Vb.y;
                                        
va[K + 2] = Vb.z;
                                        
va[K + 3] =
                                            
1;
                                        
va[K + 4] = Wb.x;
                                        
va[K + 5] = Wb.y;
                                        
va[K + 6] = Wb.z;
                                        
va[K + 7] = 1;
                                        
va[K + 8] = Xb.x;
                                        
va[K + 9] = Xb.y;
                                        
va[K + 10] = Xb.z;
                                        
va[K + 11] = 1;
                                        
K = K + 12
                                    
}
                                    
I = 0;
                                    for (
V = la.length; I < V; I++) {
                                        
L = Ca[la[I]];
                                        
zb = $b[L.a];
                                        
Ab = $b[L.b];
                                        
Bb = $b[L.c];
                                        
Ac = $b[L.d];
                                        
xa[K] = zb.x;
                                        
xa[K + 1] = zb.y;
                                        
xa[K + 2] = zb.z;
                                        
xa[K + 3] = zb.w;
                                        
xa[K + 4] = Ab.x;
                                        
xa[K + 5] = Ab.y;
                                        
xa[K + 6] = Ab.z;
                                        
xa[K + 7] = Ab.w;
                                        
xa[K + 8] = Bb.x;
                                        
xa[K + 9] = Bb.y;
                                        
xa[K + 10] = Bb.z;
                                        
xa[K + 11] = Bb.w;
                                        
xa[K + 12] = Ac.x;
                                        
xa[K + 13] = Ac.y;
                                        
xa[K + 14] = Ac.z;
                                        
xa[K + 15] = Ac.w;
                                        
Cb = lc[L.a];
                                        
Db = lc[L.b];
                                        
Eb = lc[L.c];
                                        
Bc = lc[L.d];
                                        
wa[K] = Cb.x;
                                        
wa[K + 1] = Cb.y;
                                        
wa[K + 2] = Cb.z;
                                        
wa[K + 3] = Cb.w;
                                        
wa[K +
                                            
4] = Db.x;
                                        
wa[K + 5] = Db.y;
                                        
wa[K + 6] = Db.z;
                                        
wa[K + 7] = Db.w;
                                        
wa[K + 8] = Eb.x;
                                        
wa[K + 9] = Eb.y;
                                        
wa[K + 10] = Eb.z;
                                        
wa[K + 11] = Eb.w;
                                        
wa[K + 12] = Bc.x;
                                        
wa[K + 13] = Bc.y;
                                        
wa[K + 14] = Bc.z;
                                        
wa[K + 15] = Bc.w;
                                        
Sb = jc[L.a];
                                        
Tb = jc[L.b];
                                        
Ub = jc[L.c];
                                        
Mc = jc[L.d];
                                        
ua[K] = Sb.x;
                                        
ua[K + 1] = Sb.y;
                                        
ua[K + 2] = Sb.z;
                                        
ua[K + 3] = 1;
                                        
ua[K + 4] = Tb.x;
                                        
ua[K + 5] = Tb.y;
                                        
ua[K + 6] = Tb.z;
                                        
ua[K + 7] = 1;
                                        
ua[K + 8] = Ub.x;
                                        
ua[K + 9] = Ub.y;
                                        
ua[K + 10] = Ub.z;
                                        
ua[K + 11] = 1;
                                        
ua[K + 12] = Mc.x;
                                        
ua[K + 13] = Mc.y;
                                        
ua[K + 14] = Mc.z;
                                        
ua[K + 15] = 1;
                                        
Vb = kc[L.a];
                                        
Wb = kc[L.b];
                                        
Xb = kc[L.c];
                                        
Nc = kc[L.d];
                                        
va[K] = Vb.x;
                                        
va[K + 1] = Vb.y;
                                        
va[K + 2] = Vb.z;
                                        
va[K + 3] = 1;
                                        
va[K + 4] = Wb.x;
                                        
va[K + 5] = Wb.y;
                                        
va[K + 6] = Wb.z;
                                        
va[K + 7] = 1;
                                        
va[K + 8] = Xb.x;
                                        
va[K + 9] = Xb.y;
                                        
va[K + 10] = Xb.z;
                                        
va[K + 11] = 1;
                                        
va[K + 12] = Nc.x;
                                        
va[K + 13] = Nc.y;
                                        
va[K + 14] = Nc.z;
                                        
va[K + 15] = 1;
                                        
K = K + 16
                                    
}
                                    if (
K > 0) {
                                        
k.bindBuffer(k.ARRAY_BUFFER, ga.__webglSkinVertexABuffer);
                                        
k.bufferData(k.ARRAY_BUFFER, ua, Za);
                                        
k.bindBuffer(k.ARRAY_BUFFER, ga.__webglSkinVertexBBuffer);
                                        
k.bufferData(k.ARRAY_BUFFER, va, Za);
                                        
k.bindBuffer(k.ARRAY_BUFFER, ga.__webglSkinIndicesBuffer);
                                        
k.bufferData(k.ARRAY_BUFFER, wa, Za);
                                        
k.bindBuffer(k.ARRAY_BUFFER, ga.__webglSkinWeightsBuffer);
                                        
k.bufferData(k.ARRAY_BUFFER,
                                            
xa, Za)
                                    }
                                }
                                if (
Ed && cd) {
                                    
I = 0;
                                    for (
V = ka.length; I < V; I++) {
                                        
L = Ca[ka[I]];
                                        
mb = L.vertexColors;
                                        
Lc = L.color;
                                        if (
mb.length === 3 && cd === THREE.VertexColors) {
                                            
wb = mb[0];
                                            
xb = mb[1];
                                            
yb = mb[2]
                                        } else 
yb = xb = wb = Lc;
                                        
La[Ba] = wb.r;
                                        
La[Ba + 1] = wb.g;
                                        
La[Ba + 2] = wb.b;
                                        
La[Ba + 3] = xb.r;
                                        
La[Ba + 4] = xb.g;
                                        
La[Ba + 5] = xb.b;
                                        
La[Ba + 6] = yb.r;
                                        
La[Ba + 7] = yb.g;
                                        
La[Ba + 8] = yb.b;
                                        
Ba = Ba + 9
                                    
}
                                    
I = 0;
                                    for (
V = la.length; I < V; I++) {
                                        
L = Ca[la[I]];
                                        
mb = L.vertexColors;
                                        
Lc = L.color;
                                        if (
mb.length === 4 && cd === THREE.VertexColors) {
                                            
wb = mb[0];
                                            
xb = mb[1];
                                            
yb = mb[2];
                                            
zc = mb[3]
                                        } else 
zc = yb = xb = wb = Lc;
                                        
La[Ba] = wb.r;
                                        
La[Ba + 1] = wb.g;
                                        
La[Ba + 2] = wb.b;
                                        
La[Ba + 3] = xb.r;
                                        
La[Ba + 4] = xb.g;
                                        
La[Ba + 5] = xb.b;
                                        
La[Ba + 6] = yb.r;
                                        
La[Ba + 7] = yb.g;
                                        
La[Ba + 8] = yb.b;
                                        
La[Ba + 9] = zc.r;
                                        
La[Ba + 10] = zc.g;
                                        
La[Ba + 11] = zc.b;
                                        
Ba = Ba + 12
                                    
}
                                    if (
Ba > 0) {
                                        
k.bindBuffer(k.ARRAY_BUFFER, ga.__webglColorBuffer);
                                        
k.bufferData(k.ARRAY_BUFFER, La, Za)
                                    }
                                }
                                if (
Dd && Ta.hasTangents) {
                                    
I = 0;
                                    for (
V = ka.length; I < V; I++) {
                                        
L = Ca[ka[I]];
                                        
Jb = L.vertexTangents;
                                        
qb = Jb[0];
                                        
rb = Jb[1];
                                        
sb = Jb[2];
                                        
ta[pa] = qb.x;
                                        
ta[pa + 1] = qb.y;
                                        
ta[pa + 2] = qb.z;
                                        
ta[pa + 3] = qb.w;
                                        
ta[pa + 4] = rb.x;
                                        
ta[pa + 5] = rb.y;
                                        
ta[pa + 6] = rb.z;
                                        
ta[pa + 7] = rb.w;
                                        
ta[pa + 8] = sb.x;
                                        
ta[pa + 9] = sb.y;
                                        
ta[pa +
                                            
10] = sb.z;
                                        
ta[pa + 11] = sb.w;
                                        
pa = pa + 12
                                    
}
                                    
I = 0;
                                    for (
V = la.length; I < V; I++) {
                                        
L = Ca[la[I]];
                                        
Jb = L.vertexTangents;
                                        
qb = Jb[0];
                                        
rb = Jb[1];
                                        
sb = Jb[2];
                                        
xc = Jb[3];
                                        
ta[pa] = qb.x;
                                        
ta[pa + 1] = qb.y;
                                        
ta[pa + 2] = qb.z;
                                        
ta[pa + 3] = qb.w;
                                        
ta[pa + 4] = rb.x;
                                        
ta[pa + 5] = rb.y;
                                        
ta[pa + 6] = rb.z;
                                        
ta[pa + 7] = rb.w;
                                        
ta[pa + 8] = sb.x;
                                        
ta[pa + 9] = sb.y;
                                        
ta[pa + 10] = sb.z;
                                        
ta[pa + 11] = sb.w;
                                        
ta[pa + 12] = xc.x;
                                        
ta[pa + 13] = xc.y;
                                        
ta[pa + 14] = xc.z;
                                        
ta[pa + 15] = xc.w;
                                        
pa = pa + 16
                                    
}
                                    
k.bindBuffer(k.ARRAY_BUFFER, ga.__webglTangentBuffer);
                                    
k.bufferData(k.ARRAY_BUFFER, ta, Za)
                                }
                                if (
Cd && nd) {
                                    
I = 0;
                                    for (
V = ka.length; I < V; I++) {
                                        
L = Ca[ka[I]];
                                        
rc = L.vertexNormals;
                                        
Rb = L.normal;
                                        if (
rc.length === 3 && Kc)
                                            for (
ja = 0; ja < 3; ja++) {
                                                
Yb = rc[ja];
                                                
fb[Qa] = Yb.x;
                                                
fb[Qa + 1] = Yb.y;
                                                
fb[Qa + 2] = Yb.z;
                                                
Qa = Qa + 3
                                            
} else
                                                for (
ja = 0; ja < 3; ja++) {
                                                    
fb[Qa] = Rb.x;
                                                    
fb[Qa + 1] = Rb.y;
                                                    
fb[Qa + 2] = Rb.z;
                                                    
Qa = Qa + 3
                                                
}
                                    }
                                    
I = 0;
                                    for (
V = la.length; I < V; I++) {
                                        
L = Ca[la[I]];
                                        
rc = L.vertexNormals;
                                        
Rb = L.normal;
                                        if (
rc.length === 4 && Kc)
                                            for (
ja = 0; ja < 4; ja++) {
                                                
Yb = rc[ja];
                                                
fb[Qa] = Yb.x;
                                                
fb[Qa + 1] = Yb.y;
                                                
fb[Qa + 2] = Yb.z;
                                                
Qa = Qa + 3
                                            
} else
                                                for (
ja = 0; ja < 4; ja++) {
                                                    
fb[Qa] = Rb.x;
                                                    
fb[Qa + 1] = Rb.y;
                                                    
fb[Qa + 2] = Rb.z;
                                                    
Qa = Qa + 3
                                                
}
                                    }
                                    
k.bindBuffer(k.ARRAY_BUFFER, ga.__webglNormalBuffer);
                                    
k.bufferData(k.ARRAY_BUFFER, fb, Za)
                                }
                                if (
rd && gd && od) {
                                    
I = 0;
                                    for (
V = ka.length; I < V; I++) {
                                        
jb = ka[I];
                                        
L = Ca[jb];
                                        
sc = gd[jb];
                                        if (
sc !== void 0)
                                            for (
ja = 0; ja < 3; ja++) {
                                                
uc = sc[ja];
                                                
Cc[Lb] = uc.u;
                                                
Cc[Lb + 1] = uc.v;
                                                
Lb = Lb + 2
                                            
}
                                    }
                                    
I = 0;
                                    for (
V = la.length; I < V; I++) {
                                        
jb = la[I];
                                        
L = Ca[jb];
                                        
sc = gd[jb];
                                        if (
sc !== void 0)
                                            for (
ja = 0; ja < 4; ja++) {
                                                
uc = sc[ja];
                                                
Cc[Lb] = uc.u;
                                                
Cc[Lb + 1] = uc.v;
                                                
Lb = Lb + 2
                                            
}
                                    }
                                    if (
Lb > 0) {
                                        
k.bindBuffer(k.ARRAY_BUFFER, ga.__webglUVBuffer);
                                        
k.bufferData(k.ARRAY_BUFFER, Cc, Za)
                                    }
                                }
                                if (
rd && hd && od) {
                                    
I = 0;
                                    for (
V = ka.length; I < V; I++) {
                                        
jb = ka[I];
                                        
L = Ca[jb];
                                        
tc = hd[jb];
                                        if (
tc !== void 0)
                                            for (
ja =
                                                
0; ja < 3; ja++) {
                                                
vc = tc[ja];
                                                
Dc[Mb] = vc.u;
                                                
Dc[Mb + 1] = vc.v;
                                                
Mb = Mb + 2
                                            
}
                                    }
                                    
I = 0;
                                    for (
V = la.length; I < V; I++) {
                                        
jb = la[I];
                                        
L = Ca[jb];
                                        
tc = hd[jb];
                                        if (
tc !== void 0)
                                            for (
ja = 0; ja < 4; ja++) {
                                                
vc = tc[ja];
                                                
Dc[Mb] = vc.u;
                                                
Dc[Mb + 1] = vc.v;
                                                
Mb = Mb + 2
                                            
}
                                    }
                                    if (
Mb > 0) {
                                        
k.bindBuffer(k.ARRAY_BUFFER, ga.__webglUV2Buffer);
                                        
k.bufferData(k.ARRAY_BUFFER, Dc, Za)
                                    }
                                }
                                if (
Bd) {
                                    
I = 0;
                                    for (
V = ka.length; I < V; I++) {
                                        
L = Ca[ka[I]];
                                        
Fb[eb] = za;
                                        
Fb[eb + 1] = za + 1;
                                        
Fb[eb + 2] = za + 2;
                                        
eb = eb + 3;
                                        
ab[Sa] = za;
                                        
ab[Sa + 1] = za + 1;
                                        
ab[Sa + 2] = za;
                                        
ab[Sa + 3] = za + 2;
                                        
ab[Sa + 4] = za + 1;
                                        
ab[Sa + 5] = za + 2;
                                        
Sa = Sa + 6;
                                        
za = za + 3
                                    
}
                                    
I = 0;
                                    for (
V = la.length; I < V; I++) {
                                        
L =
                                            
Ca[la[I]];
                                        
Fb[eb] = za;
                                        
Fb[eb + 1] = za + 1;
                                        
Fb[eb + 2] = za + 3;
                                        
Fb[eb + 3] = za + 1;
                                        
Fb[eb + 4] = za + 2;
                                        
Fb[eb + 5] = za + 3;
                                        
eb = eb + 6;
                                        
ab[Sa] = za;
                                        
ab[Sa + 1] = za + 1;
                                        
ab[Sa + 2] = za;
                                        
ab[Sa + 3] = za + 3;
                                        
ab[Sa + 4] = za + 1;
                                        
ab[Sa + 5] = za + 2;
                                        
ab[Sa + 6] = za + 2;
                                        
ab[Sa + 7] = za + 3;
                                        
Sa = Sa + 8;
                                        
za = za + 4
                                    
}
                                    
k.bindBuffer(k.ELEMENT_ARRAY_BUFFER, ga.__webglFaceBuffer);
                                    
k.bufferData(k.ELEMENT_ARRAY_BUFFER, Fb, Za);
                                    
k.bindBuffer(k.ELEMENT_ARRAY_BUFFER, ga.__webglLineBuffer);
                                    
k.bufferData(k.ELEMENT_ARRAY_BUFFER, ab, Za)
                                }
                                if (
fd) {
                                    
ja = 0;
                                    for (
pd = fd.length; ja < pd; ja++) {
                                        
y = fd[ja];
                                        if (
y.__original.needsUpdate) {
                                            
A =
                                                
0;
                                            if (
y.size === 1)
                                                if (
y.boundTo === void 0 || y.boundTo === "vertices") {
                                                    
I = 0;
                                                    for (
V = ka.length; I < V; I++) {
                                                        
L = Ca[ka[I]];
                                                        
y.array[A] = y.value[L.a];
                                                        
y.array[A + 1] = y.value[L.b];
                                                        
y.array[A + 2] = y.value[L.c];
                                                        
A = A + 3
                                                    
}
                                                    
I = 0;
                                                    for (
V = la.length; I < V; I++) {
                                                        
L = Ca[la[I]];
                                                        
y.array[A] = y.value[L.a];
                                                        
y.array[A + 1] = y.value[L.b];
                                                        
y.array[A + 2] = y.value[L.c];
                                                        
y.array[A + 3] = y.value[L.d];
                                                        
A = A + 4
                                                    
}
                                                } else {
                                                    if (
y.boundTo === "faces") {
                                                        
I = 0;
                                                        for (
V = ka.length; I < V; I++) {
                                                            
$a = y.value[ka[I]];
                                                            
y.array[A] = $a;
                                                            
y.array[A + 1] = $a;
                                                            
y.array[A + 2] = $a;
                                                            
A = A + 3
                                                        
}
                                                        
I = 0;
                                                        for (
V = la.length; I < V; I++) {
                                                            
$a = y.value[la[I]];
                                                            
y.array[A] = $a;
                                                            
y.array[A + 1] = $a;
                                                            
y.array[A + 2] = $a;
                                                            
y.array[A + 3] = $a;
                                                            
A = A + 4
                                                        
}
                                                    }
                                                } else if (
y.size === 2)
                                                if (
y.boundTo === void 0 || y.boundTo === "vertices") {
                                                    
I = 0;
                                                    for (
V = ka.length; I < V; I++) {
                                                        
L = Ca[ka[I]];
                                                        
Y = y.value[L.a];
                                                        
Z = y.value[L.b];
                                                        $ = 
y.value[L.c];
                                                        
y.array[A] = Y.x;
                                                        
y.array[A + 1] = Y.y;
                                                        
y.array[A + 2] = Z.x;
                                                        
y.array[A + 3] = Z.y;
                                                        
y.array[A + 4] = $.x;
                                                        
y.array[A + 5] = $.y;
                                                        
A = A + 6
                                                    
}
                                                    
I = 0;
                                                    for (
V = la.length; I < V; I++) {
                                                        
L = Ca[la[I]];
                                                        
Y = y.value[L.a];
                                                        
Z = y.value[L.b];
                                                        $ = 
y.value[L.c];
                                                        
oa = y.value[L.d];
                                                        
y.array[A] = Y.x;
                                                        
y.array[A + 1] = Y.y;
                                                        
y.array[A + 2] = Z.x;
                                                        
y.array[A + 3] = Z.y;
                                                        
y.array[A +
                                                            
4] = $.x;
                                                        
y.array[A + 5] = $.y;
                                                        
y.array[A + 6] = oa.x;
                                                        
y.array[A + 7] = oa.y;
                                                        
A = A + 8
                                                    
}
                                                } else {
                                                    if (
y.boundTo === "faces") {
                                                        
I = 0;
                                                        for (
V = ka.length; I < V; I++) {
                                                            $ = 
Z = Y = $a = y.value[ka[I]];
                                                            
y.array[A] = Y.x;
                                                            
y.array[A + 1] = Y.y;
                                                            
y.array[A + 2] = Z.x;
                                                            
y.array[A + 3] = Z.y;
                                                            
y.array[A + 4] = $.x;
                                                            
y.array[A + 5] = $.y;
                                                            
A = A + 6
                                                        
}
                                                        
I = 0;
                                                        for (
V = la.length; I < V; I++) {
                                                            
oa = $ = Z = Y = $a = y.value[la[I]];
                                                            
y.array[A] = Y.x;
                                                            
y.array[A + 1] = Y.y;
                                                            
y.array[A + 2] = Z.x;
                                                            
y.array[A + 3] = Z.y;
                                                            
y.array[A + 4] = $.x;
                                                            
y.array[A + 5] = $.y;
                                                            
y.array[A + 6] = oa.x;
                                                            
y.array[A + 7] = oa.y;
                                                            
A = A + 8
                                                        
}
                                                    }
                                                } else if (
y.size === 3) {
                                                var 
ha;
                                                
ha = y.type === "c" ? ["r",
                                                    
"g", "b"
                                                
] : ["x", "y", "z"];
                                                if (
y.boundTo === void 0 || y.boundTo === "vertices") {
                                                    
I = 0;
                                                    for (
V = ka.length; I < V; I++) {
                                                        
L = Ca[ka[I]];
                                                        
Y = y.value[L.a];
                                                        
Z = y.value[L.b];
                                                        $ = 
y.value[L.c];
                                                        
y.array[A] = Y[ha[0]];
                                                        
y.array[A + 1] = Y[ha[1]];
                                                        
y.array[A + 2] = Y[ha[2]];
                                                        
y.array[A + 3] = Z[ha[0]];
                                                        
y.array[A + 4] = Z[ha[1]];
                                                        
y.array[A + 5] = Z[ha[2]];
                                                        
y.array[A + 6] = $[ha[0]];
                                                        
y.array[A + 7] = $[ha[1]];
                                                        
y.array[A + 8] = $[ha[2]];
                                                        
A = A + 9
                                                    
}
                                                    
I = 0;
                                                    for (
V = la.length; I < V; I++) {
                                                        
L = Ca[la[I]];
                                                        
Y = y.value[L.a];
                                                        
Z = y.value[L.b];
                                                        $ = 
y.value[L.c];
                                                        
oa = y.value[L.d];
                                                        
y.array[A] = Y[ha[0]];
                                                        
y.array[A + 1] = Y[ha[1]];
                                                        
y.array[A + 2] = Y[ha[2]];
                                                        
y.array[A + 3] = Z[ha[0]];
                                                        
y.array[A + 4] = Z[ha[1]];
                                                        
y.array[A + 5] = Z[ha[2]];
                                                        
y.array[A + 6] = $[ha[0]];
                                                        
y.array[A + 7] = $[ha[1]];
                                                        
y.array[A + 8] = $[ha[2]];
                                                        
y.array[A + 9] = oa[ha[0]];
                                                        
y.array[A + 10] = oa[ha[1]];
                                                        
y.array[A + 11] = oa[ha[2]];
                                                        
A = A + 12
                                                    
}
                                                } else if (
y.boundTo === "faces") {
                                                    
I = 0;
                                                    for (
V = ka.length; I < V; I++) {
                                                        $ = 
Z = Y = $a = y.value[ka[I]];
                                                        
y.array[A] = Y[ha[0]];
                                                        
y.array[A + 1] = Y[ha[1]];
                                                        
y.array[A + 2] = Y[ha[2]];
                                                        
y.array[A + 3] = Z[ha[0]];
                                                        
y.array[A + 4] = Z[ha[1]];
                                                        
y.array[A + 5] = Z[ha[2]];
                                                        
y.array[A + 6] = $[ha[0]];
                                                        
y.array[A + 7] = $[ha[1]];
                                                        
y.array[A + 8] =
                                                            $[
ha[2]];
                                                        
A = A + 9
                                                    
}
                                                    
I = 0;
                                                    for (
V = la.length; I < V; I++) {
                                                        
oa = $ = Z = Y = $a = y.value[la[I]];
                                                        
y.array[A] = Y[ha[0]];
                                                        
y.array[A + 1] = Y[ha[1]];
                                                        
y.array[A + 2] = Y[ha[2]];
                                                        
y.array[A + 3] = Z[ha[0]];
                                                        
y.array[A + 4] = Z[ha[1]];
                                                        
y.array[A + 5] = Z[ha[2]];
                                                        
y.array[A + 6] = $[ha[0]];
                                                        
y.array[A + 7] = $[ha[1]];
                                                        
y.array[A + 8] = $[ha[2]];
                                                        
y.array[A + 9] = oa[ha[0]];
                                                        
y.array[A + 10] = oa[ha[1]];
                                                        
y.array[A + 11] = oa[ha[2]];
                                                        
A = A + 12
                                                    
}
                                                }
                                            } else if (
y.size === 4)
                                                if (
y.boundTo === void 0 || y.boundTo === "vertices") {
                                                    
I = 0;
                                                    for (
V = ka.length; I < V; I++) {
                                                        
L = Ca[ka[I]];
                                                        
Y = y.value[L.a];
                                                        
Z = y.value[L.b];
                                                        $ = 
y.value[L.c];
                                                        
y.array[A] =
                                                            
Y.x;
                                                        
y.array[A + 1] = Y.y;
                                                        
y.array[A + 2] = Y.z;
                                                        
y.array[A + 3] = Y.w;
                                                        
y.array[A + 4] = Z.x;
                                                        
y.array[A + 5] = Z.y;
                                                        
y.array[A + 6] = Z.z;
                                                        
y.array[A + 7] = Z.w;
                                                        
y.array[A + 8] = $.x;
                                                        
y.array[A + 9] = $.y;
                                                        
y.array[A + 10] = $.z;
                                                        
y.array[A + 11] = $.w;
                                                        
A = A + 12
                                                    
}
                                                    
I = 0;
                                                    for (
V = la.length; I < V; I++) {
                                                        
L = Ca[la[I]];
                                                        
Y = y.value[L.a];
                                                        
Z = y.value[L.b];
                                                        $ = 
y.value[L.c];
                                                        
oa = y.value[L.d];
                                                        
y.array[A] = Y.x;
                                                        
y.array[A + 1] = Y.y;
                                                        
y.array[A + 2] = Y.z;
                                                        
y.array[A + 3] = Y.w;
                                                        
y.array[A + 4] = Z.x;
                                                        
y.array[A + 5] = Z.y;
                                                        
y.array[A + 6] = Z.z;
                                                        
y.array[A + 7] = Z.w;
                                                        
y.array[A + 8] = $.x;
                                                        
y.array[A + 9] = $.y;
                                                        
y.array[A + 10] = $.z;
                                                        
y.array[A + 11] =
                                                            $.
w;
                                                        
y.array[A + 12] = oa.x;
                                                        
y.array[A + 13] = oa.y;
                                                        
y.array[A + 14] = oa.z;
                                                        
y.array[A + 15] = oa.w;
                                                        
A = A + 16
                                                    
}
                                                } else if (
y.boundTo === "faces") {
                                                
I = 0;
                                                for (
V = ka.length; I < V; I++) {
                                                    $ = 
Z = Y = $a = y.value[ka[I]];
                                                    
y.array[A] = Y.x;
                                                    
y.array[A + 1] = Y.y;
                                                    
y.array[A + 2] = Y.z;
                                                    
y.array[A + 3] = Y.w;
                                                    
y.array[A + 4] = Z.x;
                                                    
y.array[A + 5] = Z.y;
                                                    
y.array[A + 6] = Z.z;
                                                    
y.array[A + 7] = Z.w;
                                                    
y.array[A + 8] = $.x;
                                                    
y.array[A + 9] = $.y;
                                                    
y.array[A + 10] = $.z;
                                                    
y.array[A + 11] = $.w;
                                                    
A = A + 12
                                                
}
                                                
I = 0;
                                                for (
V = la.length; I < V; I++) {
                                                    
oa = $ = Z = Y = $a = y.value[la[I]];
                                                    
y.array[A] = Y.x;
                                                    
y.array[A + 1] = Y.y;
                                                    
y.array[A + 2] = Y.z;
                                                    
y.array[A + 3] = Y.w;
                                                    
y.array[A + 4] = Z.x;
                                                    
y.array[A + 5] = Z.y;
                                                    
y.array[A + 6] = Z.z;
                                                    
y.array[A + 7] = Z.w;
                                                    
y.array[A + 8] = $.x;
                                                    
y.array[A + 9] = $.y;
                                                    
y.array[A + 10] = $.z;
                                                    
y.array[A + 11] = $.w;
                                                    
y.array[A + 12] = oa.x;
                                                    
y.array[A + 13] = oa.y;
                                                    
y.array[A + 14] = oa.z;
                                                    
y.array[A + 15] = oa.w;
                                                    
A = A + 16
                                                
}
                                            }
                                            
k.bindBuffer(k.ARRAY_BUFFER, y.buffer);
                                            
k.bufferData(k.ARRAY_BUFFER, y.array, Za)
                                        }
                                    }
                                }
                                if (
Ad) {
                                    
delete ga.__inittedArrays;
                                    
delete ga.__colorArray;
                                    
delete ga.__normalArray;
                                    
delete ga.__tangentArray;
                                    
delete ga.__uvArray;
                                    
delete ga.__uv2Array;
                                    
delete ga.__faceArray;
                                    
delete ga.__vertexArray;
                                    
delete ga.__lineArray;
                                    
delete ga.__skinVertexAArray;
                                    
delete ga.__skinVertexBArray;
                                    
delete ga.__skinIndexArray;
                                    
delete ga.__skinWeightArray
                                
}
                            }
                        }
                    }
                    
da.verticesNeedUpdate = false;
                    
da.morphTargetsNeedUpdate = false;
                    
da.elementsNeedUpdate = false;
                    
da.uvsNeedUpdate = false;
                    
da.normalsNeedUpdate = false;
                    
da.colorsNeedUpdate = false;
                    
da.tangentsNeedUpdate = false;
                    
Wa.attributes && p(Wa)
                } else if (
lb instanceof THREE.Ribbon) {
                if (
da.verticesNeedUpdate || da.colorsNeedUpdate) {
                    var 
bc = da,
                        
sd = k.DYNAMIC_DRAW,
                        
Ec = void 0,
                        
Fc = void 0,
                        
Pc = void 0,
                        
cc = void 0,
                        
Qc = void 0,
                        
td = bc.vertices,
                        
ud = bc.colors,
                        
Gd = td.length,
                        
Hd = ud.length,
                        
Rc = bc.__vertexArray,
                        
Sc = bc.__colorArray,
                        
Id = bc.colorsNeedUpdate;
                    if (
bc.verticesNeedUpdate) {
                        for (
Ec = 0; Ec < Gd; Ec++) {
                            
Pc = td[Ec];
                            
cc = Ec * 3;
                            
Rc[cc] = Pc.x;
                            
Rc[cc + 1] = Pc.y;
                            
Rc[cc + 2] = Pc.z
                        
}
                        
k.bindBuffer(k.ARRAY_BUFFER, bc.__webglVertexBuffer);
                        
k.bufferData(k.ARRAY_BUFFER, Rc, sd)
                    }
                    if (
Id) {
                        for (
Fc = 0; Fc < Hd; Fc++) {
                            
Qc = ud[Fc];
                            
cc = Fc * 3;
                            
Sc[cc] = Qc.r;
                            
Sc[cc + 1] = Qc.g;
                            
Sc[cc + 2] = Qc.b
                        
}
                        
k.bindBuffer(k.ARRAY_BUFFER, bc.__webglColorBuffer);
                        
k.bufferData(k.ARRAY_BUFFER, Sc, sd)
                    }
                }
                
da.verticesNeedUpdate = false;
                
da.colorsNeedUpdate =
                    
false
            
} else if (lb instanceof THREE.Line) {
                
Wa = c(lb, cb);
                
oc = Wa.attributes && n(Wa);
                if (
da.verticesNeedUpdate || da.colorsNeedUpdate || oc) {
                    var 
Nb = da,
                        
id = k.DYNAMIC_DRAW,
                        
Gc = void 0,
                        
Hc = void 0,
                        
Tc = void 0,
                        
ya = void 0,
                        
Uc = void 0,
                        
vd = Nb.vertices,
                        
wd = Nb.colors,
                        
Jd = vd.length,
                        
Kd = wd.length,
                        
Vc = Nb.__vertexArray,
                        
Wc = Nb.__colorArray,
                        
Ld = Nb.colorsNeedUpdate,
                        
jd = Nb.__webglCustomAttributesList,
                        
Xc = void 0,
                        
xd = void 0,
                        
Na = void 0,
                        
wc = void 0,
                        
Xa = void 0,
                        
ra = void 0;
                    if (
Nb.verticesNeedUpdate) {
                        for (
Gc = 0; Gc < Jd; Gc++) {
                            
Tc = vd[Gc];
                            
ya = Gc * 3;
                            
Vc[ya] = Tc.x;
                            
Vc[ya + 1] =
                                
Tc.y;
                            
Vc[ya + 2] = Tc.z
                        
}
                        
k.bindBuffer(k.ARRAY_BUFFER, Nb.__webglVertexBuffer);
                        
k.bufferData(k.ARRAY_BUFFER, Vc, id)
                    }
                    if (
Ld) {
                        for (
Hc = 0; Hc < Kd; Hc++) {
                            
Uc = wd[Hc];
                            
ya = Hc * 3;
                            
Wc[ya] = Uc.r;
                            
Wc[ya + 1] = Uc.g;
                            
Wc[ya + 2] = Uc.b
                        
}
                        
k.bindBuffer(k.ARRAY_BUFFER, Nb.__webglColorBuffer);
                        
k.bufferData(k.ARRAY_BUFFER, Wc, id)
                    }
                    if (
jd) {
                        
Xc = 0;
                        for (
xd = jd.length; Xc < xd; Xc++) {
                            
ra = jd[Xc];
                            if (
ra.needsUpdate && (ra.boundTo === void 0 || ra.boundTo === "vertices")) {
                                
ya = 0;
                                
wc = ra.value.length;
                                if (
ra.size === 1)
                                    for (
Na = 0; Na < wc; Na++) ra.array[Na] = ra.value[Na];
                                else if (
ra.size === 2)
                                    for (
Na =
                                        
0; Na < wc; Na++) {
                                        
Xa = ra.value[Na];
                                        
ra.array[ya] = Xa.x;
                                        
ra.array[ya + 1] = Xa.y;
                                        
ya = ya + 2
                                    
} else if (ra.size === 3)
                                        if (
ra.type === "c")
                                            for (
Na = 0; Na < wc; Na++) {
                                                
Xa = ra.value[Na];
                                                
ra.array[ya] = Xa.r;
                                                
ra.array[ya + 1] = Xa.g;
                                                
ra.array[ya + 2] = Xa.b;
                                                
ya = ya + 3
                                            
} else
                                                for (
Na = 0; Na < wc; Na++) {
                                                    
Xa = ra.value[Na];
                                                    
ra.array[ya] = Xa.x;
                                                    
ra.array[ya + 1] = Xa.y;
                                                    
ra.array[ya + 2] = Xa.z;
                                                    
ya = ya + 3
                                                
} else if (ra.size === 4)
                                                    for (
Na = 0; Na < wc; Na++) {
                                                        
Xa = ra.value[Na];
                                                        
ra.array[ya] = Xa.x;
                                                        
ra.array[ya + 1] = Xa.y;
                                                        
ra.array[ya + 2] = Xa.z;
                                                        
ra.array[ya + 3] = Xa.w;
                                                        
ya = ya + 4
                                                    
}
                                                
k.bindBuffer(k.ARRAY_BUFFER, ra.buffer);
                                
k.bufferData(k.ARRAY_BUFFER, ra.array, id)
                            }
                        }
                    }
                }
                
da.verticesNeedUpdate = false;
                
da.colorsNeedUpdate = false;
                
Wa.attributes && p(Wa)
            } else if (
lb instanceof THREE.ParticleSystem) {
                
Wa = c(lb, cb);
                
oc = Wa.attributes && n(Wa);
                (
da.verticesNeedUpdate || da.colorsNeedUpdate || lb.sortParticles || oc) && f(da, k.DYNAMIC_DRAW, lb);
                
da.verticesNeedUpdate = false;
                
da.colorsNeedUpdate = false;
                
Wa.attributes && p(Wa)
            }
        }
    };
    
this.initMaterial = function(a, b, c, d) {
        var 
e, f, g, h, i, j, m, l;
        
a instanceof THREE.MeshDepthMaterial ? l = "depth" : a instanceof THREE.MeshNormalMaterial ?
            
l = "normal" : a instanceof THREE.MeshBasicMaterial ? l = "basic" : a instanceof THREE.MeshLambertMaterial ? l = "lambert" : a instanceof THREE.MeshPhongMaterial ? l = "phong" : a instanceof THREE.LineBasicMaterial ? l = "basic" : a instanceof THREE.ParticleBasicMaterial && (l = "particle_basic");
        if (
l) {
            var 
n = THREE.ShaderLib[l];
            
a.uniforms = THREE.UniformsUtils.clone(n.uniforms);
            
a.vertexShader = n.vertexShader;
            
a.fragmentShader = n.fragmentShader
        
}
        var 
o, p;
        
o = g = e = n = 0;
        for (
f = b.length; o < f; o++) {
            
p = b[o];
            if (!
p.onlyShadow) {
                
p instanceof THREE.DirectionalLight &&
                    
g++;
                
p instanceof THREE.PointLight && e++;
                
p instanceof THREE.SpotLight && n++
            }
        }
        if (
e + n + g <= Q) {
            
o = g;
            
f = e
        
} else {
            
o = Math.ceil(Q * g / (e + g));
            
n = f = Q - o
        
}
        
e = o;
        
g = n;
        
n = m = 0;
        for (
o = b.length; n < o; n++) {
            
p = b[n];
            if (
p.castShadow) {
                
p instanceof THREE.SpotLight && m++;
                
p instanceof THREE.DirectionalLight && !p.shadowCascade && m++
            }
        }
        if (
dc && d && d.useVertexTexture) j = 1024;
        else {
            
b = k.getParameter(k.MAX_VERTEX_UNIFORM_VECTORS);
            
b = Math.floor((b - 20) / 4);
            if (
d !== void 0 && d instanceof THREE.SkinnedMesh) {
                
b = Math.min(d.bones.length, b);
                
b < d.bones.length && console.warn("WebGLRenderer: too many bones - " +
                    
d.bones.length + ", this GPU supports just " + b + " (try OpenGL instead of ANGLE)")
            }
            
j = b
        
}
        var 
r;
        
a: {
            
p = a.fragmentShader;
            
o = a.vertexShader;
            var 
n = a.uniforms,
                
b = a.attributes,
                
c = {
                    
map: !!a.map,
                    
envMap: !!a.envMap,
                    
lightMap: !!a.lightMap,
                    
vertexColors: a.vertexColors,
                    
fog: c,
                    
useFog: a.fog,
                    
sizeAttenuation: a.sizeAttenuation,
                    
skinning: a.skinning,
                    
maxBones: j,
                    
useVertexTexture: dc && d && d.useVertexTexture,
                    
boneTextureWidth: d && d.boneTextureWidth,
                    
boneTextureHeight: d && d.boneTextureHeight,
                    
morphTargets: a.morphTargets,
                    
morphNormals: a.morphNormals,
                    
maxMorphTargets: this.maxMorphTargets,
                    
maxMorphNormals: this.maxMorphNormals,
                    
maxDirLights: e,
                    
maxPointLights: f,
                    
maxSpotLights: g,
                    
maxShadows: m,
                    
shadowMapEnabled: this.shadowMapEnabled && d.receiveShadow,
                    
shadowMapSoft: this.shadowMapSoft,
                    
shadowMapDebug: this.shadowMapDebug,
                    
shadowMapCascade: this.shadowMapCascade,
                    
alphaTest: a.alphaTest,
                    
metal: a.metal,
                    
perPixel: a.perPixel,
                    
wrapAround: a.wrapAround,
                    
doubleSided: d && d.doubleSided
                
},
                
q, d = [];
            if (
l) d.push(l);
            else {
                
d.push(p);
                
d.push(o)
            }
            for (
q in c) {
                
d.push(q);
                
d.push(c[q])
            }
            
l = d.join();
            
q = 0;
            for (
d = aa.length; q < d; q++) {
                
e = aa[q];
                if (
e.code === l) {
                    
e.usedTimes++;
                    
r = e.program;
                    break 
a
                
}
            }
            
q = k.createProgram();
            
d = ["precision " + u + " float;", cb ? "#define VERTEX_TEXTURES" : "", E.gammaInput ? "#define GAMMA_INPUT" : "", E.gammaOutput ? "#define GAMMA_OUTPUT" : "", E.physicallyBasedShading ? "#define PHYSICALLY_BASED_SHADING" : "", "#define MAX_DIR_LIGHTS " + c.maxDirLights, "#define MAX_POINT_LIGHTS " + c.maxPointLights, "#define MAX_SPOT_LIGHTS " + c.maxSpotLights, "#define MAX_SHADOWS " + c.maxShadows, "#define MAX_BONES " + c.maxBones,
                
c.map ? "#define USE_MAP" : "", c.envMap ? "#define USE_ENVMAP" : "", c.lightMap ? "#define USE_LIGHTMAP" : "", c.vertexColors ? "#define USE_COLOR" : "", c.skinning ? "#define USE_SKINNING" : "", c.useVertexTexture ? "#define BONE_TEXTURE" : "", c.boneTextureWidth ? "#define N_BONE_PIXEL_X " + c.boneTextureWidth.toFixed(1) : "", c.boneTextureHeight ? "#define N_BONE_PIXEL_Y " + c.boneTextureHeight.toFixed(1) : "", c.morphTargets ? "#define USE_MORPHTARGETS" : "", c.morphNormals ? "#define USE_MORPHNORMALS" : "", c.perPixel ? "#define PHONG_PER_PIXEL" :
                
"", c.wrapAround ? "#define WRAP_AROUND" : "", c.doubleSided ? "#define DOUBLE_SIDED" : "", c.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", c.shadowMapSoft ? "#define SHADOWMAP_SOFT" : "", c.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "", c.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "", c.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "", "uniform mat4 objectMatrix;nuniform mat4 modelViewMatrix;nuniform mat4 projectionMatrix;nuniform mat4 viewMatrix;nuniform mat3 normalMatrix;nuniform vec3 cameraPosition;nattribute vec3 position;nattribute vec3 normal;nattribute vec2 uv;nattribute vec2 uv2;n#ifdef USE_COLORnattribute vec3 color;n#endifn#ifdef USE_MORPHTARGETSnattribute vec3 morphTarget0;nattribute vec3 morphTarget1;nattribute vec3 morphTarget2;nattribute vec3 morphTarget3;n#ifdef USE_MORPHNORMALSnattribute vec3 morphNormal0;nattribute vec3 morphNormal1;nattribute vec3 morphNormal2;nattribute vec3 morphNormal3;n#elsenattribute vec3 morphTarget4;nattribute vec3 morphTarget5;nattribute vec3 morphTarget6;nattribute vec3 morphTarget7;n#endifn#endifn#ifdef USE_SKINNINGnattribute vec4 skinVertexA;nattribute vec4 skinVertexB;nattribute vec4 skinIndex;nattribute vec4 skinWeight;n#endifn"
            
].join("n");
            
e = ["precision " + u + " float;", "#define MAX_DIR_LIGHTS " + c.maxDirLights, "#define MAX_POINT_LIGHTS " + c.maxPointLights, "#define MAX_SPOT_LIGHTS " + c.maxSpotLights, "#define MAX_SHADOWS " + c.maxShadows, c.alphaTest ? "#define ALPHATEST " + c.alphaTest : "", E.gammaInput ? "#define GAMMA_INPUT" : "", E.gammaOutput ? "#define GAMMA_OUTPUT" : "", E.physicallyBasedShading ? "#define PHYSICALLY_BASED_SHADING" : "", c.useFog && c.fog ? "#define USE_FOG" : "", c.useFog && c.fog instanceof THREE.FogExp2 ? "#define FOG_EXP2" : "", c.map ? "#define USE_MAP" :
                
"", c.envMap ? "#define USE_ENVMAP" : "", c.lightMap ? "#define USE_LIGHTMAP" : "", c.vertexColors ? "#define USE_COLOR" : "", c.metal ? "#define METAL" : "", c.perPixel ? "#define PHONG_PER_PIXEL" : "", c.wrapAround ? "#define WRAP_AROUND" : "", c.doubleSided ? "#define DOUBLE_SIDED" : "", c.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", c.shadowMapSoft ? "#define SHADOWMAP_SOFT" : "", c.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "", c.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "", "uniform mat4 viewMatrix;nuniform vec3 cameraPosition;n"
            
].join("n");
            
e = t("fragment", e + p);
            
d = t("vertex", d + o);
            
k.attachShader(q, d);
            
k.attachShader(q, e);
            
k.linkProgram(q);
            
k.getProgramParameter(q, k.LINK_STATUS) || console.error("Could not initialise shadernVALIDATE_STATUS: " + k.getProgramParameter(q, k.VALIDATE_STATUS) + ", gl error [" + k.getError() + "]");
            
k.deleteShader(e);
            
k.deleteShader(d);
            
q.uniforms = {};
            
q.attributes = {};
            var 
s, d = ["viewMatrix", "modelViewMatrix", "projectionMatrix", "normalMatrix", "objectMatrix", "cameraPosition", "morphTargetInfluences"];
            
c.useVertexTexture ? d.push("boneTexture") :
                
d.push("boneGlobalMatrices");
            for (
s in n) d.push(s);
            
s = d;
            
d = 0;
            for (
n = s.length; d < n; d++) {
                
e = s[d];
                
q.uniforms[e] = k.getUniformLocation(q, e)
            }
            
d = ["position", "normal", "uv", "uv2", "tangent", "color", "skinVertexA", "skinVertexB", "skinIndex", "skinWeight"];
            for (
s = 0; s < c.maxMorphTargets; s++) d.push("morphTarget" + s);
            for (
s = 0; s < c.maxMorphNormals; s++) d.push("morphNormal" + s);
            for (
r in b) d.push(r);
            
r = d;
            
s = 0;
            for (
c = r.length; s < c; s++) {
                
d = r[s];
                
q.attributes[d] = k.getAttribLocation(q, d)
            }
            
q.id = T++;
            
aa.push({
                
program: q,
                
code: l,
                
usedTimes: 1
            
});
            
E.info.memory.programs =
                
aa.length;
            
r = q
        
}
        
a.program = r;
        
r = a.program.attributes;
        
r.position >= 0 && k.enableVertexAttribArray(r.position);
        
r.color >= 0 && k.enableVertexAttribArray(r.color);
        
r.normal >= 0 && k.enableVertexAttribArray(r.normal);
        
r.tangent >= 0 && k.enableVertexAttribArray(r.tangent);
        if (
a.skinning && r.skinVertexA >= 0 && r.skinVertexB >= 0 && r.skinIndex >= 0 && r.skinWeight >= 0) {
            
k.enableVertexAttribArray(r.skinVertexA);
            
k.enableVertexAttribArray(r.skinVertexB);
            
k.enableVertexAttribArray(r.skinIndex);
            
k.enableVertexAttribArray(r.skinWeight)
        }
        if (
a.attributes)
            for (
i in a.attributes) r[i] !==
                
void 0 && r[i] >= 0 && k.enableVertexAttribArray(r[i]);
        if (
a.morphTargets) {
            
a.numSupportedMorphTargets = 0;
            
q = "morphTarget";
            for (
i = 0; i < this.maxMorphTargets; i++) {
                
s = q + i;
                if (
r[s] >= 0) {
                    
k.enableVertexAttribArray(r[s]);
                    
a.numSupportedMorphTargets++
                }
            }
        }
        if (
a.morphNormals) {
            
a.numSupportedMorphNormals = 0;
            
q = "morphNormal";
            for (
i = 0; i < this.maxMorphNormals; i++) {
                
s = q + i;
                if (
r[s] >= 0) {
                    
k.enableVertexAttribArray(r[s]);
                    
a.numSupportedMorphNormals++
                }
            }
        }
        
a.uniformsList = [];
        for (
h in a.uniforms) a.uniformsList.push([a.uniforms[h], h])
    };
    
this.setFaceCulling =
        function(
a, b) {
            if (
a) {
                !
b || b === "ccw" ? k.frontFace(k.CCW) : k.frontFace(k.CW);
                
a === "back" ? k.cullFace(k.BACK) : a === "front" ? k.cullFace(k.FRONT) : k.cullFace(k.FRONT_AND_BACK);
                
k.enable(k.CULL_FACE)
            } else 
k.disable(k.CULL_FACE)
        };
    
this.setObjectFaces = function(a) {
        if (
S !== a.doubleSided) {
            
a.doubleSided ? k.disable(k.CULL_FACE) : k.enable(k.CULL_FACE);
            
S = a.doubleSided
        
}
        if (
R !== a.flipSided) {
            
a.flipSided ? k.frontFace(k.CW) : k.frontFace(k.CCW);
            
R = a.flipSided
        
}
    };
    
this.setDepthTest = function(a) {
        if (
Ga !== a) {
            
a ? k.enable(k.DEPTH_TEST) : k.disable(k.DEPTH_TEST);
            
Ga = a
        
}
    };
    
this.setDepthWrite = function(a) {
        if (
na !== a) {
            
k.depthMask(a);
            
na = a
        
}
    };
    
this.setBlending = function(a, b, c, d) {
        if (
a !== P) {
            if (
a === THREE.NoBlending) k.disable(k.BLEND);
            else if (
a === THREE.AdditiveBlending) {
                
k.enable(k.BLEND);
                
k.blendEquation(k.FUNC_ADD);
                
k.blendFunc(k.SRC_ALPHA, k.ONE)
            } else if (
a === THREE.SubtractiveBlending) {
                
k.enable(k.BLEND);
                
k.blendEquation(k.FUNC_ADD);
                
k.blendFunc(k.ZERO, k.ONE_MINUS_SRC_COLOR)
            } else if (
a === THREE.MultiplyBlending) {
                
k.enable(k.BLEND);
                
k.blendEquation(k.FUNC_ADD);
                
k.blendFunc(k.ZERO, k.SRC_COLOR)
            } else if (
a ===
                
THREE.CustomBlending) k.enable(k.BLEND);
            else {
                
k.enable(k.BLEND);
                
k.blendEquationSeparate(k.FUNC_ADD, k.FUNC_ADD);
                
k.blendFuncSeparate(k.SRC_ALPHA, k.ONE_MINUS_SRC_ALPHA, k.ONE, k.ONE_MINUS_SRC_ALPHA)
            }
            
P = a
        
}
        if (
a === THREE.CustomBlending) {
            if (
b !== U) {
                
k.blendEquation(D(b));
                
U = b
            
}
            if (
c !== fa || d !== ma) {
                
k.blendFunc(D(c), D(d));
                
fa = c;
                
ma = d
            
}
        } else 
ma = fa = U = null
    
};
    
this.setTexture = function(a, b) {
        if (
a.needsUpdate) {
            if (!
a.__webglInit) {
                
a.__webglInit = true;
                
a.__webglTexture = k.createTexture();
                
E.info.memory.textures++
            }
            
k.activeTexture(k.TEXTURE0 +
                
b);
            
k.bindTexture(k.TEXTURE_2D, a.__webglTexture);
            
k.pixelStorei(k.UNPACK_FLIP_Y_WEBGL, a.flipY);
            
k.pixelStorei(k.UNPACK_PREMULTIPLY_ALPHA_WEBGL, a.premultiplyAlpha);
            var 
c = a.image,
                
d = (c.width & c.width - 1) === 0 && (c.height & c.height - 1) === 0,
                
e = D(a.format),
                
f = D(a.type);
            
v(k.TEXTURE_2D, a, d);
            
a instanceof THREE.DataTexture ? k.texImage2D(k.TEXTURE_2D, 0, e, c.width, c.height, 0, e, f, c.data) : k.texImage2D(k.TEXTURE_2D, 0, e, e, f, a.image);
            
a.generateMipmaps && d && k.generateMipmap(k.TEXTURE_2D);
            
a.needsUpdate = false;
            if (
a.onUpdate) a.onUpdate()
        } else {
            
k.activeTexture(k.TEXTURE0 +
                
b);
            
k.bindTexture(k.TEXTURE_2D, a.__webglTexture)
        }
    };
    
this.setRenderTarget = function(a) {
        var 
b = a instanceof THREE.WebGLRenderTargetCube;
        if (
a && !a.__webglFramebuffer) {
            if (
a.depthBuffer === void 0) a.depthBuffer = true;
            if (
a.stencilBuffer === void 0) a.stencilBuffer = true;
            
a.__webglTexture = k.createTexture();
            var 
c = (a.width & a.width - 1) === 0 && (a.height & a.height - 1) === 0,
                
d = D(a.format),
                
e = D(a.type);
            if (
b) {
                
a.__webglFramebuffer = [];
                
a.__webglRenderbuffer = [];
                
k.bindTexture(k.TEXTURE_CUBE_MAP, a.__webglTexture);
                
v(k.TEXTURE_CUBE_MAP, a, c);
                for (var 
f = 0; f < 6; f++) {
                    
a.__webglFramebuffer[f] = k.createFramebuffer();
                    
a.__webglRenderbuffer[f] = k.createRenderbuffer();
                    
k.texImage2D(k.TEXTURE_CUBE_MAP_POSITIVE_X + f, 0, d, a.width, a.height, 0, d, e, null);
                    var 
g = a,
                        
h = k.TEXTURE_CUBE_MAP_POSITIVE_X + f;
                    
k.bindFramebuffer(k.FRAMEBUFFER, a.__webglFramebuffer[f]);
                    
k.framebufferTexture2D(k.FRAMEBUFFER, k.COLOR_ATTACHMENT0, h, g.__webglTexture, 0);
                    
x(a.__webglRenderbuffer[f], a)
                }
                
c && k.generateMipmap(k.TEXTURE_CUBE_MAP)
            } else {
                
a.__webglFramebuffer = k.createFramebuffer();
                
a.__webglRenderbuffer =
                    
k.createRenderbuffer();
                
k.bindTexture(k.TEXTURE_2D, a.__webglTexture);
                
v(k.TEXTURE_2D, a, c);
                
k.texImage2D(k.TEXTURE_2D, 0, d, a.width, a.height, 0, d, e, null);
                
d = k.TEXTURE_2D;
                
k.bindFramebuffer(k.FRAMEBUFFER, a.__webglFramebuffer);
                
k.framebufferTexture2D(k.FRAMEBUFFER, k.COLOR_ATTACHMENT0, d, a.__webglTexture, 0);
                
x(a.__webglRenderbuffer, a);
                
c && k.generateMipmap(k.TEXTURE_2D)
            }
            
b ? k.bindTexture(k.TEXTURE_CUBE_MAP, null) : k.bindTexture(k.TEXTURE_2D, null);
            
k.bindRenderbuffer(k.RENDERBUFFER, null);
            
k.bindFramebuffer(k.FRAMEBUFFER,
                
null)
        }
        if (
a) {
            
b = b ? a.__webglFramebuffer[a.activeCubeFace] : a.__webglFramebuffer;
            
c = a.width;
            
a = a.height;
            
e = d = 0
        
} else {
            
b = null;
            
c = ob;
            
a = kb;
            
d = gb;
            
e = Ob
        
}
        if (
b !== W) {
            
k.bindFramebuffer(k.FRAMEBUFFER, b);
            
k.viewport(d, e, c, a);
            
W = b
        
}
        
ec = c;
        
Ua = 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 = c.wrapS !== void 0 ? c.wrapS : THREE.ClampToEdgeWrapping;
    
this.wrapT = c.wrapT !== void 0 ? c.wrapT : THREE.ClampToEdgeWrapping;
    
this.magFilter = c.magFilter !== void 0 ? c.magFilter : THREE.LinearFilter;
    
this.minFilter = c.minFilter !== void 0 ? c.minFilter : THREE.LinearMipMapLinearFilter;
    
this.anisotropy = c.anisotropy !== void 0 ? c.anisotropy : 1;
    
this.offset = new THREE.Vector2(0, 0);
    
this.repeat = new THREE.Vector2(1, 1);
    
this.format = c.format !== void 0 ? c.format :
        
THREE.RGBAFormat;
    
this.type = c.type !== void 0 ? c.type : THREE.UnsignedByteType;
    
this.depthBuffer = c.depthBuffer !== void 0 ? c.depthBuffer : true;
    
this.stencilBuffer = c.stencilBuffer !== void 0 ? c.stencilBuffer : true;
    
this.generateMipmaps = true
};
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.anisotropy = this.anisotropy;
    
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;
    
a.generateMipmaps = this.generateMipmaps;
    return 
a
};
THREE.WebGLRenderTargetCube = function(a, b, c) {
    
THREE.WebGLRenderTarget.call(this, a, b, c);
    
this.activeCubeFace = 0
};
THREE.WebGLRenderTargetCube.prototype = Object.create(THREE.WebGLRenderTarget.prototype);
THREE.RenderableVertex = function() {
    
this.positionWorld = new THREE.Vector3;
    
this.positionScreen = new THREE.Vector4;
    
this.visible = true
};
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.ColorUtils = {
    
adjustHSV: function(a, b, c, d) {
        var 
e = THREE.ColorUtils.__hsv;
        
THREE.ColorUtils.rgbToHsv(a, e);
        
e.h = THREE.Math.clamp(e.h + b, 0, 1);
        
e.s = THREE.Math.clamp(e.s + c, 0, 1);
        
e.v = THREE.Math.clamp(e.v + d, 0, 1);
        
a.setHSV(e.h, e.s, e.v)
    },
    
rgbToHsv: function(a, b) {
        var 
c = a.r,
            
d = a.g,
            
e = a.b,
            
f = Math.max(Math.max(c, d), e),
            
g = Math.min(Math.min(c, d), e);
        if (
g === f) g = c = 0;
        else {
            var 
h = f - g,
                
g = h / f,
                
c = (c === f ? (d - e) / h : d === f ? 2 + (e - c) / h : 4 + (c - d) / h) / 6;
            
c < 0 && (c = c + 1);
            
c > 1 && (c = c - 1)
        }
        
b === void 0 && (b = {
            
h: 0,
            
s: 0,
            
v: 0
        
});
        
b.h = c;
        
b.s = g;
        
b.v = f;
        return 
b
    
}
};
THREE.ColorUtils.__hsv = {
    
h: 0,
    
s: 0,
    
v: 0
};
THREE.GeometryUtils = {
    
merge: function(a, b) {
        for (var 
c, d, e = a.vertices.length, f = b instanceof THREE.Mesh ? b.geometry : b, g = a.vertices, h = f.vertices, i = a.faces, j = f.faces, l = a.faceVertexUvs[0], m = f.faceVertexUvs[0], n = {}, p = 0; p < a.materials.length; p++) n[a.materials[p].id] = p;
        if (
b instanceof THREE.Mesh) {
            
b.matrixAutoUpdate && b.updateMatrix();
            
c = b.matrix;
            
d = new THREE.Matrix4;
            
d.extractRotation(c, b.scale)
        }
        for (var 
p = 0, r = h.length; p < r; p++) {
            var 
o = h[p].clone();
            
c && c.multiplyVector3(o);
            
g.push(o)
        }
        
p = 0;
        for (
r = j.length; p < r; p++) {
            var 
g =
                
j[p],
                
q, s, w = g.vertexNormals,
                
t = g.vertexColors;
            
g instanceof THREE.Face3 ? q = new THREE.Face3(g.a + e, g.b + e, g.c + e) : g instanceof THREE.Face4 && (q = new THREE.Face4(g.a + e, g.b + e, g.c + e, g.d + e));
            
q.normal.copy(g.normal);
            
d && d.multiplyVector3(q.normal);
            
h = 0;
            for (
o = w.length; h < o; h++) {
                
s = w[h].clone();
                
d && d.multiplyVector3(s);
                
q.vertexNormals.push(s)
            }
            
q.color.copy(g.color);
            
h = 0;
            for (
o = t.length; h < o; h++) {
                
s = t[h];
                
q.vertexColors.push(s.clone())
            }
            if (
g.materialIndex !== void 0) {
                
h = f.materials[g.materialIndex];
                
o = h.id;
                
t = n[o];
                if (
t === void 0) {
                    
t =
                        
a.materials.length;
                    
n[o] = t;
                    
a.materials.push(h)
                }
                
q.materialIndex = t
            
}
            
q.centroid.copy(g.centroid);
            
c && c.multiplyVector3(q.centroid);
            
i.push(q)
        }
        
p = 0;
        for (
r = m.length; p < r; p++) {
            
c = m[p];
            
d = [];
            
h = 0;
            for (
o = c.length; h < o; h++) d.push(new THREE.UV(c[h].u, c[h].v));
            
l.push(d)
        }
    },
    clone: function(
a) {
        var 
b = new THREE.Geometry,
            
c, d = a.vertices,
            
e = a.faces,
            
f = a.faceVertexUvs[0];
        if (
a.materials) b.materials = a.materials.slice();
        
a = 0;
        for (
c = d.length; a < c; a++) b.vertices.push(d[a].clone());
        
a = 0;
        for (
c = e.length; a < c; a++) b.faces.push(e[a].clone());
        
a = 0;
        for (
c = f.length; a < c; a++) {
            for (var 
d = f[a], e = [], g = 0, h = d.length; g < h; g++) e.push(new THREE.UV(d[g].u, d[g].v));
            
b.faceVertexUvs[0].push(e)
        }
        return 
b
    
},
    
randomPointInTriangle: function(a, b, c) {
        var 
d, e, f, g = new THREE.Vector3,
            
h = THREE.GeometryUtils.__v1;
        
d = THREE.GeometryUtils.random();
        
e = THREE.GeometryUtils.random();
        if (
d + e > 1) {
            
d = 1 - d;
            
e = 1 - e
        
}
        
f = 1 - d - e;
        
g.copy(a);
        
g.multiplyScalar(d);
        
h.copy(b);
        
h.multiplyScalar(e);
        
g.addSelf(h);
        
h.copy(c);
        
h.multiplyScalar(f);
        
g.addSelf(h);
        return 
g
    
},
    
randomPointInFace: function(a, b, c) {
        var 
d, e, f;
        if (
a instanceof THREE.Face3) {
            
d = b.vertices[a.a];
            
e = b.vertices[a.b];
            
f = b.vertices[a.c];
            return 
THREE.GeometryUtils.randomPointInTriangle(d, e, f)
        }
        if (
a instanceof THREE.Face4) {
            
d = b.vertices[a.a];
            
e = b.vertices[a.b];
            
f = b.vertices[a.c];
            var 
b = b.vertices[a.d],
                
g;
            if (
c)
                if (
a._area1 && a._area2) {
                    
c = a._area1;
                    
g = a._area2
                
} else {
                    
c = THREE.GeometryUtils.triangleArea(d, e, b);
                    
g = THREE.GeometryUtils.triangleArea(e, f, b);
                    
a._area1 = c;
                    
a._area2 = g
                
} else {
                
c = THREE.GeometryUtils.triangleArea(d, e, b);
                
g = THREE.GeometryUtils.triangleArea(e, f, b)
            }
            return 
THREE.GeometryUtils.random() *
                (
c + g) < c ? THREE.GeometryUtils.randomPointInTriangle(d, e, b) : THREE.GeometryUtils.randomPointInTriangle(e, f, b)
        }
    },
    
randomPointsInGeometry: function(a, b) {
        function 
c(a) {
            function 
b(c, d) {
                if (
d < c) return c;
                var 
e = c + Math.floor((d - c) / 2);
                return 
j[e] > a ? b(c, e - 1) : j[e] < a ? b(e + 1, d) : e
            
}
            return 
b(0, j.length - 1)
        }
        var 
d, e, f = a.faces,
            
g = a.vertices,
            
h = f.length,
            
i = 0,
            
j = [],
            
l, m, n, p;
        for (
e = 0; e < h; e++) {
            
d = f[e];
            if (
d instanceof THREE.Face3) {
                
l = g[d.a];
                
m = g[d.b];
                
n = g[d.c];
                
d._area = THREE.GeometryUtils.triangleArea(l, m, n)
            } else if (
d instanceof THREE.Face4) {
                
l =
                    
g[d.a];
                
m = g[d.b];
                
n = g[d.c];
                
p = g[d.d];
                
d._area1 = THREE.GeometryUtils.triangleArea(l, m, p);
                
d._area2 = THREE.GeometryUtils.triangleArea(m, n, p);
                
d._area = d._area1 + d._area2
            
}
            
i = i + d._area;
            
j[e] = i
        
}
        
d = [];
        for (
e = 0; e < b; e++) {
            
g = THREE.GeometryUtils.random() * i;
            
g = c(g);
            
d[e] = THREE.GeometryUtils.randomPointInFace(f[g], a, true)
        }
        return 
d
    
},
    
triangleArea: function(a, b, c) {
        var 
d, e = THREE.GeometryUtils.__v1;
        
e.sub(a, b);
        
d = e.length();
        
e.sub(a, c);
        
a = e.length();
        
e.sub(b, c);
        
c = e.length();
        
b = 0.5 * (d + a + c);
        return 
Math.sqrt(b * (b - d) * (b - a) * (b - c))
    },
    
center: function(a) {
        
a.computeBoundingBox();
        var 
b = a.boundingBox,
            
c = new THREE.Vector3;
        
c.add(b.min, b.max);
        
c.multiplyScalar(-0.5);
        
a.applyMatrix((new THREE.Matrix4).makeTranslation(c.x, c.y, c.z));
        
a.computeBoundingBox();
        return 
c
    
},
    
normalizeUVs: function(a) {
        for (var 
a = a.faceVertexUvs[0], b = 0, c = a.length; b < c; b++)
            for (var 
d = a[b], e = 0, f = d.length; e < f; e++) {
                if (
d[e].u !== 1) d[e].u = d[e].u - Math.floor(d[e].u);
                if (
d[e].v !== 1) d[e].v = d[e].v - Math.floor(d[e].v)
            }
    },
    
triangulateQuads: function(a) {
        var 
b, c, d, e, f = [],
            
g = [],
            
h = [];
        
b = 0;
        for (
c = a.faceUvs.length; b < c; b++) g[b] = [];
        
b = 0;
        for (
c = a.faceVertexUvs.length; b <
            
c; b++) h[b] = [];
        
b = 0;
        for (
c = a.faces.length; b < c; b++) {
            
d = a.faces[b];
            if (
d instanceof THREE.Face4) {
                
e = d.a;
                var 
i = d.b,
                    
j = d.c,
                    
l = d.d,
                    
m = new THREE.Face3,
                    
n = new THREE.Face3;
                
m.color.copy(d.color);
                
n.color.copy(d.color);
                
m.materialIndex = d.materialIndex;
                
n.materialIndex = d.materialIndex;
                
m.a = e;
                
m.b = i;
                
m.c = l;
                
n.a = i;
                
n.b = j;
                
n.c = l;
                if (
d.vertexColors.length === 4) {
                    
m.vertexColors[0] = d.vertexColors[0].clone();
                    
m.vertexColors[1] = d.vertexColors[1].clone();
                    
m.vertexColors[2] = d.vertexColors[3].clone();
                    
n.vertexColors[0] = d.vertexColors[1].clone();
                    
n.vertexColors[1] = d.vertexColors[2].clone();
                    
n.vertexColors[2] = d.vertexColors[3].clone()
                }
                
f.push(m, n);
                
d = 0;
                for (
e = a.faceVertexUvs.length; d < e; d++)
                    if (
a.faceVertexUvs[d].length) {
                        
m = a.faceVertexUvs[d][b];
                        
i = m[1];
                        
j = m[2];
                        
l = m[3];
                        
m = [m[0].clone(), i.clone(), l.clone()];
                        
i = [i.clone(), j.clone(), l.clone()];
                        
h[d].push(m, i)
                    }
                
d = 0;
                for (
e = a.faceUvs.length; d < e; d++)
                    if (
a.faceUvs[d].length) {
                        
i = a.faceUvs[d][b];
                        
g[d].push(i, i)
                    }
            } else {
                
f.push(d);
                
d = 0;
                for (
e = a.faceUvs.length; d < e; d++) g[d].push(a.faceUvs[d]);
                
d = 0;
                for (
e = a.faceVertexUvs.length; d <
                    
e; d++) h[d].push(a.faceVertexUvs[d])
            }
        }
        
a.faces = f;
        
a.faceUvs = g;
        
a.faceVertexUvs = h;
        
a.computeCentroids();
        
a.computeFaceNormals();
        
a.computeVertexNormals();
        
a.hasTangents && a.computeTangents()
    },
    
explode: function(a) {
        for (var 
b = [], c = 0, d = a.faces.length; c < d; c++) {
            var 
e = b.length,
                
f = a.faces[c];
            if (
f instanceof THREE.Face4) {
                var 
g = f.a,
                    
h = f.b,
                    
i = f.c,
                    
g = a.vertices[g],
                    
h = a.vertices[h],
                    
i = a.vertices[i],
                    
j = a.vertices[f.d];
                
b.push(g.clone());
                
b.push(h.clone());
                
b.push(i.clone());
                
b.push(j.clone());
                
f.a = e;
                
f.b = e + 1;
                
f.c = e + 2;
                
f.d = e + 3
            
} else {
                
g = f.a;
                
h = f.b;
                
i = f.c;
                
g = a.vertices[g];
                
h = a.vertices[h];
                
i = a.vertices[i];
                
b.push(g.clone());
                
b.push(h.clone());
                
b.push(i.clone());
                
f.a = e;
                
f.b = e + 1;
                
f.c = e + 2
            
}
        }
        
a.vertices = b;
        
delete a.__tmpVertices
    
},
    
tessellate: function(a, b) {
        var 
c, d, e, f, g, h, i, j, l, m, n, p, r, o, q, s, w, t, v, x = [],
            
C = [];
        
c = 0;
        for (
d = a.faceVertexUvs.length; c < d; c++) C[c] = [];
        
c = 0;
        for (
d = a.faces.length; c < d; c++) {
            
e = a.faces[c];
            if (
e instanceof THREE.Face3) {
                
f = e.a;
                
g = e.b;
                
h = e.c;
                
j = a.vertices[f];
                
l = a.vertices[g];
                
m = a.vertices[h];
                
p = j.distanceTo(l);
                
r = l.distanceTo(m);
                
n = j.distanceTo(m);
                if (
p >
                    
b || r > b || n > b) {
                    
i = a.vertices.length;
                    
t = e.clone();
                    
v = e.clone();
                    if (
p >= r && p >= n) {
                        
j = j.clone();
                        
j.lerpSelf(l, 0.5);
                        
t.a = f;
                        
t.b = i;
                        
t.c = h;
                        
v.a = i;
                        
v.b = g;
                        
v.c = h;
                        if (
e.vertexNormals.length === 3) {
                            
f = e.vertexNormals[0].clone();
                            
f.lerpSelf(e.vertexNormals[1], 0.5);
                            
t.vertexNormals[1].copy(f);
                            
v.vertexNormals[0].copy(f)
                        }
                        if (
e.vertexColors.length === 3) {
                            
f = e.vertexColors[0].clone();
                            
f.lerpSelf(e.vertexColors[1], 0.5);
                            
t.vertexColors[1].copy(f);
                            
v.vertexColors[0].copy(f)
                        }
                        
e = 0
                    
} else if (r >= p && r >= n) {
                        
j = l.clone();
                        
j.lerpSelf(m, 0.5);
                        
t.a = f;
                        
t.b = g;
                        
t.c =
                            
i;
                        
v.a = i;
                        
v.b = h;
                        
v.c = f;
                        if (
e.vertexNormals.length === 3) {
                            
f = e.vertexNormals[1].clone();
                            
f.lerpSelf(e.vertexNormals[2], 0.5);
                            
t.vertexNormals[2].copy(f);
                            
v.vertexNormals[0].copy(f);
                            
v.vertexNormals[1].copy(e.vertexNormals[2]);
                            
v.vertexNormals[2].copy(e.vertexNormals[0])
                        }
                        if (
e.vertexColors.length === 3) {
                            
f = e.vertexColors[1].clone();
                            
f.lerpSelf(e.vertexColors[2], 0.5);
                            
t.vertexColors[2].copy(f);
                            
v.vertexColors[0].copy(f);
                            
v.vertexColors[1].copy(e.vertexColors[2]);
                            
v.vertexColors[2].copy(e.vertexColors[0])
                        }
                        
e = 1
                    
} else {
                        
j = j.clone();
                        
j.lerpSelf(m, 0.5);
                        
t.a = f;
                        
t.b = g;
                        
t.c = i;
                        
v.a = i;
                        
v.b = g;
                        
v.c = h;
                        if (
e.vertexNormals.length === 3) {
                            
f = e.vertexNormals[0].clone();
                            
f.lerpSelf(e.vertexNormals[2], 0.5);
                            
t.vertexNormals[2].copy(f);
                            
v.vertexNormals[0].copy(f)
                        }
                        if (
e.vertexColors.length === 3) {
                            
f = e.vertexColors[0].clone();
                            
f.lerpSelf(e.vertexColors[2], 0.5);
                            
t.vertexColors[2].copy(f);
                            
v.vertexColors[0].copy(f)
                        }
                        
e = 2
                    
}
                    
x.push(t, v);
                    
a.vertices.push(j);
                    
f = 0;
                    for (
g = a.faceVertexUvs.length; f < g; f++)
                        if (
a.faceVertexUvs[f].length) {
                            
j = a.faceVertexUvs[f][c];
                            
v = j[0];
                            
h = j[1];
                            
t = j[2];
                            if (
e ===
                                
0) {
                                
l = v.clone();
                                
l.lerpSelf(h, 0.5);
                                
j = [v.clone(), l.clone(), t.clone()];
                                
h = [l.clone(), h.clone(), t.clone()]
                            } else if (
e === 1) {
                                
l = h.clone();
                                
l.lerpSelf(t, 0.5);
                                
j = [v.clone(), h.clone(), l.clone()];
                                
h = [l.clone(), t.clone(), v.clone()]
                            } else {
                                
l = v.clone();
                                
l.lerpSelf(t, 0.5);
                                
j = [v.clone(), h.clone(), l.clone()];
                                
h = [l.clone(), h.clone(), t.clone()]
                            }
                            
C[f].push(j, h)
                        }
                } else {
                    
x.push(e);
                    
f = 0;
                    for (
g = a.faceVertexUvs.length; f < g; f++) C[f].push(a.faceVertexUvs[f][c])
                }
            } else {
                
f = e.a;
                
g = e.b;
                
h = e.c;
                
i = e.d;
                
j = a.vertices[f];
                
l = a.vertices[g];
                
m = a.vertices[h];
                
n =
                    
a.vertices[i];
                
p = j.distanceTo(l);
                
r = l.distanceTo(m);
                
o = m.distanceTo(n);
                
q = j.distanceTo(n);
                if (
p > b || r > b || o > b || q > b) {
                    
s = a.vertices.length;
                    
w = a.vertices.length + 1;
                    
t = e.clone();
                    
v = e.clone();
                    if (
p >= r && p >= o && p >= q || o >= r && o >= p && o >= q) {
                        
p = j.clone();
                        
p.lerpSelf(l, 0.5);
                        
l = m.clone();
                        
l.lerpSelf(n, 0.5);
                        
t.a = f;
                        
t.b = s;
                        
t.c = w;
                        
t.d = i;
                        
v.a = s;
                        
v.b = g;
                        
v.c = h;
                        
v.d = w;
                        if (
e.vertexNormals.length === 4) {
                            
f = e.vertexNormals[0].clone();
                            
f.lerpSelf(e.vertexNormals[1], 0.5);
                            
g = e.vertexNormals[2].clone();
                            
g.lerpSelf(e.vertexNormals[3], 0.5);
                            
t.vertexNormals[1].copy(f);
                            
t.vertexNormals[2].copy(g);
                            
v.vertexNormals[0].copy(f);
                            
v.vertexNormals[3].copy(g)
                        }
                        if (
e.vertexColors.length === 4) {
                            
f = e.vertexColors[0].clone();
                            
f.lerpSelf(e.vertexColors[1], 0.5);
                            
g = e.vertexColors[2].clone();
                            
g.lerpSelf(e.vertexColors[3], 0.5);
                            
t.vertexColors[1].copy(f);
                            
t.vertexColors[2].copy(g);
                            
v.vertexColors[0].copy(f);
                            
v.vertexColors[3].copy(g)
                        }
                        
e = 0
                    
} else {
                        
p = l.clone();
                        
p.lerpSelf(m, 0.5);
                        
l = n.clone();
                        
l.lerpSelf(j, 0.5);
                        
t.a = f;
                        
t.b = g;
                        
t.c = s;
                        
t.d = w;
                        
v.a = w;
                        
v.b = s;
                        
v.c = h;
                        
v.d = i;
                        if (
e.vertexNormals.length === 4) {
                            
f = e.vertexNormals[1].clone();
                            
f.lerpSelf(e.vertexNormals[2], 0.5);
                            
g = e.vertexNormals[3].clone();
                            
g.lerpSelf(e.vertexNormals[0], 0.5);
                            
t.vertexNormals[2].copy(f);
                            
t.vertexNormals[3].copy(g);
                            
v.vertexNormals[0].copy(g);
                            
v.vertexNormals[1].copy(f)
                        }
                        if (
e.vertexColors.length === 4) {
                            
f = e.vertexColors[1].clone();
                            
f.lerpSelf(e.vertexColors[2], 0.5);
                            
g = e.vertexColors[3].clone();
                            
g.lerpSelf(e.vertexColors[0], 0.5);
                            
t.vertexColors[2].copy(f);
                            
t.vertexColors[3].copy(g);
                            
v.vertexColors[0].copy(g);
                            
v.vertexColors[1].copy(f)
                        }
                        
e = 1
                    
}
                    
x.push(t, v);
                    
a.vertices.push(p, l);
                    
f = 0;
                    for (
g = a.faceVertexUvs.length; f < g; f++)
                        if (
a.faceVertexUvs[f].length) {
                            
j = a.faceVertexUvs[f][c];
                            
v = j[0];
                            
h = j[1];
                            
t = j[2];
                            
j = j[3];
                            if (
e === 0) {
                                
l = v.clone();
                                
l.lerpSelf(h, 0.5);
                                
m = t.clone();
                                
m.lerpSelf(j, 0.5);
                                
v = [v.clone(), l.clone(), m.clone(), j.clone()];
                                
h = [l.clone(), h.clone(), t.clone(), m.clone()]
                            } else {
                                
l = h.clone();
                                
l.lerpSelf(t, 0.5);
                                
m = j.clone();
                                
m.lerpSelf(v, 0.5);
                                
v = [v.clone(), h.clone(), l.clone(), m.clone()];
                                
h = [m.clone(), l.clone(), t.clone(), j.clone()]
                            }
                            
C[f].push(v, h)
                        }
                } else {
                    
x.push(e);
                    
f = 0;
                    for (
g = a.faceVertexUvs.length; f < g; f++) C[f].push(a.faceVertexUvs[f][c])
                }
            }
        }
        
a.faces =
            
x;
        
a.faceVertexUvs = C
    
}
};
THREE.GeometryUtils.random = THREE.Math.random16;
THREE.GeometryUtils.__v1 = new THREE.Vector3;
THREE.ImageUtils = {
    
crossOrigin: "anonymous",
    
loadTexture: function(a, b, c, d) {
        var 
e = new THREE.Texture(void 0, b),
            
b = new THREE.ImageLoader;
        
b.addEventListener("load", function(a) {
            
e.image = a.content;
            
e.needsUpdate = true;
            
c && c(e)
        });
        
b.addEventListener("error", function(a) {
            
d && d(a.message)
        });
        
b.crossOrigin = this.crossOrigin;
        
b.load(a);
        return 
e
    
},
    
loadTextureCube: function(a, b, c) {
        var 
d, e = [],
            
f = new THREE.Texture(e, b);
        
f.flipY = false;
        
b = e.loadCount = 0;
        for (
d = a.length; b < d; ++b) {
            
e[b] = new Image;
            
e[b].onload = function() {
                
e.loadCount = e.loadCount +
                    
1;
                if (
e.loadCount === 6) {
                    
f.needsUpdate = true;
                    
c && c()
                }
            };
            
e[b].crossOrigin = this.crossOrigin;
            
e[b].src = a[b]
        }
        return 
f
    
},
    
getNormalMap: function(a, b) {
        var 
c = function(a) {
                var 
b = Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]);
                return [
a[0] / b, a[1] / b, a[2] / b]
            },
            
b = b | 1,
            
d = a.width,
            
e = a.height,
            
f = document.createElement("canvas");
        
f.width = d;
        
f.height = e;
        var 
g = f.getContext("2d");
        
g.drawImage(a, 0, 0);
        for (var 
h = g.getImageData(0, 0, d, e).data, i = g.createImageData(d, e), j = i.data, l = 0; l < d; l++)
            for (var 
m = 0; m < e; m++) {
                var 
n = m - 1 < 0 ? 0 : m - 1,
                    
p = m + 1 > e - 1 ? e - 1 : m + 1,
                    
r =
                    
l - 1 < 0 ? 0 : l - 1,
                    
o = l + 1 > d - 1 ? d - 1 : l + 1,
                    
q = [],
                    
s = [0, 0, h[(m * d + l) * 4] / 255 * b];
                
q.push([-1, 0, h[(m * d + r) * 4] / 255 * b]);
                
q.push([-1, -1, h[(n * d + r) * 4] / 255 * b]);
                
q.push([0, -1, h[(n * d + l) * 4] / 255 * b]);
                
q.push([1, -1, h[(n * d + o) * 4] / 255 * b]);
                
q.push([1, 0, h[(m * d + o) * 4] / 255 * b]);
                
q.push([1, 1, h[(p * d + o) * 4] / 255 * b]);
                
q.push([0, 1, h[(p * d + l) * 4] / 255 * b]);
                
q.push([-1, 1, h[(p * d + r) * 4] / 255 * b]);
                
n = [];
                
r = q.length;
                for (
p = 0; p < r; p++) {
                    var 
o = q[p],
                        
w = q[(p + 1) % r],
                        
o = [o[0] - s[0], o[1] - s[1], o[2] - s[2]],
                        
w = [w[0] - s[0], w[1] - s[1], w[2] - s[2]];
                    
n.push(c([o[1] * w[2] - o[2] * w[1], o[2] * w[0] - o[0] *
                        
w[2], o[0] * w[1] - o[1] * w[0]
                    ]))
                }
                
q = [0, 0, 0];
                for (
p = 0; p < n.length; p++) {
                    
q[0] = q[0] + n[p][0];
                    
q[1] = q[1] + n[p][1];
                    
q[2] = q[2] + n[p][2]
                }
                
q[0] = q[0] / n.length;
                
q[1] = q[1] / n.length;
                
q[2] = q[2] / n.length;
                
s = (m * d + l) * 4;
                
j[s] = (q[0] + 1) / 2 * 255 | 0;
                
j[s + 1] = (q[1] + 1) / 2 * 255 | 0;
                
j[s + 2] = q[2] * 255 | 0;
                
j[s + 3] = 255
            
}
        
g.putImageData(i, 0, 0);
        return 
f
    
},
    
generateDataTexture: function(a, b, c) {
        for (var 
d = a * b, e = new Uint8Array(3 * d), f = Math.floor(c.r * 255), g = Math.floor(c.g * 255), c = Math.floor(c.b * 255), h = 0; h < d; h++) {
            
e[h * 3] = f;
            
e[h * 3 + 1] = g;
            
e[h * 3 + 2] = c
        
}
        
a = new THREE.DataTexture(e, a,
            
b, THREE.RGBFormat);
        
a.needsUpdate = true;
        return 
a
    
}
};
THREE.SceneUtils = {
    
showHierarchy: function(a, b) {
        
THREE.SceneUtils.traverseHierarchy(a, function(a) {
            
a.visible = b
        
})
    },
    
traverseHierarchy: function(a, b) {
        var 
c, d, e = a.children.length;
        for (
d = 0; d < e; d++) {
            
c = a.children[d];
            
b(c);
            
THREE.SceneUtils.traverseHierarchy(c, b)
        }
    },
    
createMultiMaterialObject: function(a, b) {
        var 
c, d = b.length,
            
e = new THREE.Object3D;
        for (
c = 0; c < d; c++) {
            var 
f = new THREE.Mesh(a, b[c]);
            
e.add(f)
        }
        return 
e
    
},
    
cloneObject: function(a) {
        var 
b;
        if (
a instanceof THREE.MorphAnimMesh) {
            
b = new THREE.MorphAnimMesh(a.geometry, a.material);
            
b.duration = a.duration;
            
b.mirroredLoop = a.mirroredLoop;
            
b.time = a.time;
            
b.lastKeyframe = a.lastKeyframe;
            
b.currentKeyframe = a.currentKeyframe;
            
b.direction = a.direction;
            
b.directionBackwards = a.directionBackwards
        
} else if (a instanceof THREE.SkinnedMesh) b = new THREE.SkinnedMesh(a.geometry, a.material);
        else if (
a instanceof THREE.Mesh) b = new THREE.Mesh(a.geometry, a.material);
        else if (
a instanceof THREE.Line) b = new THREE.Line(a.geometry, a.material, a.type);
        else if (
a instanceof THREE.Ribbon) b = new THREE.Ribbon(a.geometry, a.material);
        else if (
a instanceof THREE.ParticleSystem) {
            
b = new THREE.ParticleSystem(a.geometry, a.material);
            
b.sortParticles = a.sortParticles
        
} else if (a instanceof THREE.Particle) b = new THREE.Particle(a.material);
        else if (
a instanceof THREE.Sprite) {
            
b = new THREE.Sprite({});
            
b.color.copy(a.color);
            
b.map = a.map;
            
b.blending = a.blending;
            
b.useScreenCoordinates = a.useScreenCoordinates;
            
b.mergeWith3D = a.mergeWith3D;
            
b.affectedByDistance = a.affectedByDistance;
            
b.scaleByViewport = a.scaleByViewport;
            
b.alignment = a.alignment;
            
b.rotation3d.copy(a.rotation3d);
            
b.rotation = a.rotation;
            
b.opacity = a.opacity;
            
b.uvOffset.copy(a.uvOffset);
            
b.uvScale.copy(a.uvScale)
        } else 
a instanceof THREE.LOD ? b = new THREE.LOD : a instanceof THREE.Object3D && (b = new THREE.Object3D);
        
b.name = a.name;
        
b.parent = a.parent;
        
b.up.copy(a.up);
        
b.position.copy(a.position);
        
b.rotation instanceof THREE.Vector3 && b.rotation.copy(a.rotation);
        
b.eulerOrder = a.eulerOrder;
        
b.scale.copy(a.scale);
        
b.dynamic = a.dynamic;
        
b.doubleSided = a.doubleSided;
        
b.flipSided = a.flipSided;
        
b.renderDepth = a.renderDepth;
        
b.rotationAutoUpdate =
            
a.rotationAutoUpdate;
        
b.matrix.copy(a.matrix);
        
b.matrixWorld.copy(a.matrixWorld);
        
b.matrixRotationWorld.copy(a.matrixRotationWorld);
        
b.matrixAutoUpdate = a.matrixAutoUpdate;
        
b.matrixWorldNeedsUpdate = a.matrixWorldNeedsUpdate;
        
b.quaternion.copy(a.quaternion);
        
b.useQuaternion = a.useQuaternion;
        
b.boundRadius = a.boundRadius;
        
b.boundRadiusScale = a.boundRadiusScale;
        
b.visible = a.visible;
        
b.castShadow = a.castShadow;
        
b.receiveShadow = a.receiveShadow;
        
b.frustumCulled = a.frustumCulled;
        for (var 
c = 0; c < a.children.length; c++) {
            var 
d = THREE.SceneUtils.cloneObject(a.children[c]);
            
b.children[c] = d;
            
d.parent = b
        
}
        if (
a instanceof THREE.LOD)
            for (
c = 0; c < a.LODs.length; c++) b.LODs[c] = {
                
visibleAtDistance: a.LODs[c].visibleAtDistance,
                
object3D: b.children[c]
            };
        return 
b
    
},
    
detach: function(a, b, c) {
        
a.applyMatrix(b.matrixWorld);
        
b.remove(a);
        
c.add(a)
    },
    
attach: function(a, b, c) {
        var 
d = new THREE.Matrix4;
        
d.getInverse(c.matrixWorld);
        
a.applyMatrix(d);
        
b.remove(a);
        
c.add(a)
    }
};
THREE.WebGLRenderer && (THREE.ShaderUtils = {
    
lib: {
        
fresnel: {
            
uniforms: {
                
mRefractionRatio: {
                    
type: "f",
                    
value: 1.02
                
},
                
mFresnelBias: {
                    
type: "f",
                    
value: 0.1
                
},
                
mFresnelPower: {
                    
type: "f",
                    
value: 2
                
},
                
mFresnelScale: {
                    
type: "f",
                    
value: 1
                
},
                
tCube: {
                    
type: "t",
                    
value: 1,
                    
texture: null
                
}
            },
            
fragmentShader: "uniform samplerCube tCube;nvarying vec3 vReflect;nvarying vec3 vRefract[3];nvarying float vReflectionFactor;nvoid main() {nvec4 reflectedColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );nvec4 refractedColor = vec4( 1.0, 1.0, 1.0, 1.0 );nrefractedColor.r = textureCube( tCube, vec3( -vRefract[0].x, vRefract[0].yz ) ).r;nrefractedColor.g = textureCube( tCube, vec3( -vRefract[1].x, vRefract[1].yz ) ).g;nrefractedColor.b = textureCube( tCube, vec3( -vRefract[2].x, vRefract[2].yz ) ).b;nrefractedColor.a = 1.0;ngl_FragColor = mix( refractedColor, reflectedColor, clamp( vReflectionFactor, 0.0, 1.0 ) );n}",
            
vertexShader: "uniform float mRefractionRatio;nuniform float mFresnelBias;nuniform float mFresnelScale;nuniform float mFresnelPower;nvarying vec3 vReflect;nvarying vec3 vRefract[3];nvarying float vReflectionFactor;nvoid main() {nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );nvec4 mPosition = objectMatrix * vec4( position, 1.0 );nvec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );nvec3 I = mPosition.xyz - cameraPosition;nvReflect = reflect( I, nWorld );nvRefract[0] = refract( normalize( I ), nWorld, mRefractionRatio );nvRefract[1] = refract( normalize( I ), nWorld, mRefractionRatio * 0.99 );nvRefract[2] = refract( normalize( I ), nWorld, mRefractionRatio * 0.98 );nvReflectionFactor = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( I ), nWorld ), mFresnelPower );ngl_Position = projectionMatrix * mvPosition;n}"
        
},
        
normal: {
            
uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.fog, THREE.UniformsLib.lights, THREE.UniformsLib.shadowmap, {
                
enableAO: {
                    
type: "i",
                    
value: 0
                
},
                
enableDiffuse: {
                    
type: "i",
                    
value: 0
                
},
                
enableSpecular: {
                    
type: "i",
                    
value: 0
                
},
                
enableReflection: {
                    
type: "i",
                    
value: 0
                
},
                
enableDisplacement: {
                    
type: "i",
                    
value: 0
                
},
                
tDiffuse: {
                    
type: "t",
                    
value: 0,
                    
texture: null
                
},
                
tCube: {
                    
type: "t",
                    
value: 1,
                    
texture: null
                
},
                
tNormal: {
                    
type: "t",
                    
value: 2,
                    
texture: null
                
},
                
tSpecular: {
                    
type: "t",
                    
value: 3,
                    
texture: null
                
},
                
tAO: {
                    
type: "t",
                    
value: 4,
                    
texture: null
                
},
                
tDisplacement: {
                    
type: "t",
                    
value: 5,
                    
texture: null
                
},
                
uNormalScale: {
                    
type: "f",
                    
value: 1
                
},
                
uDisplacementBias: {
                    
type: "f",
                    
value: 0
                
},
                
uDisplacementScale: {
                    
type: "f",
                    
value: 1
                
},
                
uDiffuseColor: {
                    
type: "c",
                    
value: new THREE.Color(16777215)
                },
                
uSpecularColor: {
                    
type: "c",
                    
value: new THREE.Color(1118481)
                },
                
uAmbientColor: {
                    
type: "c",
                    
value: new THREE.Color(16777215)
                },
                
uShininess: {
                    
type: "f",
                    
value: 30
                
},
                
uOpacity: {
                    
type: "f",
                    
value: 1
                
},
                
uReflectivity: {
                    
type: "f",
                    
value: 0.5
                
},
                
uOffset: {
                    
type: "v2",
                    
value: new THREE.Vector2(0, 0)
                },
                
uRepeat: {
                    
type: "v2",
                    
value: new THREE.Vector2(1, 1)
                },
                
wrapRGB: {
                    
type: "v3",
                    
value: new THREE.Vector3(1, 1, 1)
                }
            }]),
            
fragmentShader: ["uniform vec3 uAmbientColor;nuniform vec3 uDiffuseColor;nuniform vec3 uSpecularColor;nuniform float uShininess;nuniform float uOpacity;nuniform bool enableDiffuse;nuniform bool enableSpecular;nuniform bool enableAO;nuniform bool enableReflection;nuniform sampler2D tDiffuse;nuniform sampler2D tNormal;nuniform sampler2D tSpecular;nuniform sampler2D tAO;nuniform samplerCube tCube;nuniform float uNormalScale;nuniform float uReflectivity;nvarying vec3 vTangent;nvarying vec3 vBinormal;nvarying vec3 vNormal;nvarying vec2 vUv;nuniform vec3 ambientLightColor;n#if MAX_DIR_LIGHTS > 0nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];n#endifn#if MAX_POINT_LIGHTS > 0nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];n#endifn#if MAX_SPOT_LIGHTS > 0nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];n#endifn#ifdef WRAP_AROUNDnuniform vec3 wrapRGB;n#endifnvarying vec3 vWorldPosition;",
                
THREE.ShaderChunk.shadowmap_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, "void main() {nvec3 vViewPosition = cameraPosition - vWorldPosition;ngl_FragColor = vec4( vec3( 1.0 ), uOpacity );nvec3 specularTex = vec3( 1.0 );nvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;nnormalTex.xy *= uNormalScale;nnormalTex = normalize( normalTex );nif( enableDiffuse ) {n#ifdef GAMMA_INPUTnvec4 texelColor = texture2D( tDiffuse, vUv );ntexelColor.xyz *= texelColor.xyz;ngl_FragColor = gl_FragColor * texelColor;n#elsengl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );n#endifn}nif( enableAO ) {n#ifdef GAMMA_INPUTnvec4 aoColor = texture2D( tAO, vUv );naoColor.xyz *= aoColor.xyz;ngl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;n#elsengl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;n#endifn}nif( enableSpecular )nspecularTex = texture2D( tSpecular, vUv ).xyz;nmat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );nvec3 finalNormal = tsb * normalTex;nvec3 normal = normalize( finalNormal );nvec3 viewPosition = normalize( vViewPosition );n#if MAX_POINT_LIGHTS > 0nvec3 pointDiffuse = vec3( 0.0 );nvec3 pointSpecular = vec3( 0.0 );nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );nvec3 pointVector = lPosition.xyz + vViewPosition.xyz;nfloat pointDistance = 1.0;nif ( pointLightDistance[ i ] > 0.0 )npointDistance = 1.0 - min( ( length( pointVector ) / pointLightDistance[ i ] ), 1.0 );npointVector = normalize( pointVector );n#ifdef WRAP_AROUNDnfloat pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );n#elsenfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );n#endifnpointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;nvec3 pointHalfVector = normalize( pointVector + viewPosition );nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );nfloat pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );n#ifdef PHYSICALLY_BASED_SHADINGnfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;n#elsenpointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;n#endifn}n#endifn#if MAX_SPOT_LIGHTS > 0nvec3 spotDiffuse = vec3( 0.0 );nvec3 spotSpecular = vec3( 0.0 );nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );nvec3 spotVector = lPosition.xyz + vViewPosition.xyz;nfloat spotDistance = 1.0;nif ( spotLightDistance[ i ] > 0.0 )nspotDistance = 1.0 - min( ( length( spotVector ) / spotLightDistance[ i ] ), 1.0 );nspotVector = normalize( spotVector );nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );nif ( spotEffect > spotLightAngle[ i ] ) {nspotEffect = pow( spotEffect, spotLightExponent[ i ] );n#ifdef WRAP_AROUNDnfloat spotDiffuseWeightFull = max( dot( normal, spotVector ), 0.0 );nfloat spotDiffuseWeightHalf = max( 0.5 * dot( normal, spotVector ) + 0.5, 0.0 );nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );n#elsenfloat spotDiffuseWeight = max( dot( normal, spotVector ), 0.0 );n#endifnspotDiffuse += spotDistance * spotLightColor[ i ] * uDiffuseColor * spotDiffuseWeight * spotEffect;nvec3 spotHalfVector = normalize( spotVector + viewPosition );nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );nfloat spotSpecularWeight = specularTex.r * max( pow( spotDotNormalHalf, uShininess ), 0.0 );n#ifdef PHYSICALLY_BASED_SHADINGnfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( spotVector, spotHalfVector ), 5.0 );nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * spotDistance * specularNormalization * spotEffect;n#elsenspotSpecular += spotDistance * spotLightColor[ i ] * uSpecularColor * spotSpecularWeight * spotDiffuseWeight * spotEffect;n#endifn}n}n#endifn#if MAX_DIR_LIGHTS > 0nvec3 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_AROUNDnfloat directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );nfloat directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );nvec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );n#elsenfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );n#endifndirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;nvec3 dirHalfVector = normalize( dirVector + viewPosition );nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );nfloat dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );n#ifdef PHYSICALLY_BASED_SHADINGnfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;n#elsendirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;n#endifn}n#endifnvec3 totalDiffuse = vec3( 0.0 );nvec3 totalSpecular = vec3( 0.0 );n#if MAX_DIR_LIGHTS > 0ntotalDiffuse += dirDiffuse;ntotalSpecular += dirSpecular;n#endifn#if MAX_POINT_LIGHTS > 0ntotalDiffuse += pointDiffuse;ntotalSpecular += pointSpecular;n#endifn#if MAX_SPOT_LIGHTS > 0ntotalDiffuse += spotDiffuse;ntotalSpecular += spotSpecular;n#endifngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor) + totalSpecular;nif ( enableReflection ) {nvec3 vReflect = reflect( normalize( vWorldPosition ), normal );nvec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );n#ifdef GAMMA_INPUTncubeColor.xyz *= cubeColor.xyz;n#endifngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );n}",
                
THREE.ShaderChunk.shadowmap_fragment, THREE.ShaderChunk.linear_to_gamma_fragment, THREE.ShaderChunk.fog_fragment, "}"
            
].join("n"),
            
vertexShader: ["attribute vec4 tangent;nuniform vec2 uOffset;nuniform vec2 uRepeat;nuniform bool enableDisplacement;n#ifdef VERTEX_TEXTURESnuniform sampler2D tDisplacement;nuniform float uDisplacementScale;nuniform float uDisplacementBias;n#endifnvarying vec3 vTangent;nvarying vec3 vBinormal;nvarying vec3 vNormal;nvarying vec2 vUv;nvarying vec3 vWorldPosition;",
                
THREE.ShaderChunk.shadowmap_pars_vertex, "void main() {nvNormal = normalMatrix * normal;nvTangent = normalMatrix * tangent.xyz;nvBinormal = cross( vNormal, vTangent ) * tangent.w;nvUv = uv * uRepeat + uOffset;nvec3 displacedPosition;n#ifdef VERTEX_TEXTURESnif ( enableDisplacement ) {nvec3 dv = texture2D( tDisplacement, uv ).xyz;nfloat df = uDisplacementScale * dv.x + uDisplacementBias;ndisplacedPosition = position + normalize( normal ) * df;n} else {ndisplacedPosition = position;n}n#elsendisplacedPosition = position;n#endifnvec4 mvPosition = modelViewMatrix * vec4( displacedPosition, 1.0 );nvec4 wPosition = objectMatrix * vec4( displacedPosition, 1.0 );ngl_Position = projectionMatrix * mvPosition;nvWorldPosition = wPosition.xyz;n#ifdef USE_SHADOWMAPnfor( int i = 0; i < MAX_SHADOWS; i ++ ) {nvShadowCoord[ i ] = shadowMatrix[ i ] * wPosition;n}n#endifn}"
            
].join("n")
        },
        
cube: {
            
uniforms: {
                
tCube: {
                    
type: "t",
                    
value: 1,
                    
texture: null
                
},
                
tFlip: {
                    
type: "f",
                    
value: -1
                
}
            },
            
vertexShader: "varying vec3 vViewPosition;nvoid main() {nvec4 mPosition = objectMatrix * vec4( position, 1.0 );nvViewPosition = cameraPosition - mPosition.xyz;ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );n}",
            
fragmentShader: "uniform samplerCube tCube;nuniform float tFlip;nvarying vec3 vViewPosition;nvoid main() {nvec3 wPos = cameraPosition - vViewPosition;ngl_FragColor = textureCube( tCube, vec3( tFlip * wPos.x, wPos.yz ) );n}"
        
}
    }
});
THREE.FontUtils = {
    
faces: {},
    
face: "helvetiker",
    
weight: "normal",
    
style: "normal",
    
size: 150,
    
divisions: 10,
    
getFace: function() {
        return 
this.faces[this.face][this.weight][this.style]
    },
    
loadFace: function(a) {
        var 
b = a.familyName.toLowerCase();
        
this.faces[b] = this.faces[b] || {};
        
this.faces[b][a.cssFontWeight] = this.faces[b][a.cssFontWeight] || {};
        
this.faces[b][a.cssFontWeight][a.cssFontStyle] = a;
        return 
this.faces[b][a.cssFontWeight][a.cssFontStyle] = a
    
},
    
drawText: function(a) {
        for (var 
b = this.getFace(), c = this.size / b.resolution, d =
                
0, e = ("" + a).split(""), f = e.length, g = [], a = 0; a < f; a++) {
            var 
h = new THREE.Path,
                
h = this.extractGlyphPoints(e[a], b, c, d, h),
                
d = d + h.offset;
            
g.push(h.path)
        }
        return {
            
paths: g,
            
offset: d / 2
        
}
    },
    
extractGlyphPoints: function(a, b, c, d, e) {
        var 
f = [],
            
g, h, i, j, l, m, n, p, r, o, q, s = b.glyphs[a] || b.glyphs["?"];
        if (
s) {
            if (
s.o) {
                
b = s._cachedOutline || (s._cachedOutline = s.o.split(" "));
                
j = b.length;
                for (
a = 0; a < j;) {
                    
i = b[a++];
                    switch (
i) {
                        case 
"m":
                            
i = b[a++] * c + d;
                            
l = b[a++] * c;
                            
e.moveTo(i, l);
                            break;
                        case 
"l":
                            
i = b[a++] * c + d;
                            
l = b[a++] * c;
                            
e.lineTo(i, l);
                            break;
                        case 
"q":
                            
i = b[a++] *
                                
c + d;
                            
l = b[a++] * c;
                            
p = b[a++] * c + d;
                            
r = b[a++] * c;
                            
e.quadraticCurveTo(p, r, i, l);
                            if (
g = f[f.length - 1]) {
                                
m = g.x;
                                
n = g.y;
                                
g = 1;
                                for (
h = this.divisions; g <= h; g++) {
                                    var 
w = g / h;
                                    
THREE.Shape.Utils.b2(w, m, p, i);
                                    
THREE.Shape.Utils.b2(w, n, r, l)
                                }
                            }
                            break;
                        case 
"b":
                            
i = b[a++] * c + d;
                            
l = b[a++] * c;
                            
p = b[a++] * c + d;
                            
r = b[a++] * -c;
                            
o = b[a++] * c + d;
                            
q = b[a++] * -c;
                            
e.bezierCurveTo(i, l, p, r, o, q);
                            if (
g = f[f.length - 1]) {
                                
m = g.x;
                                
n = g.y;
                                
g = 1;
                                for (
h = this.divisions; g <= h; g++) {
                                    
w = g / h;
                                    
THREE.Shape.Utils.b3(w, m, p, o, i);
                                    
THREE.Shape.Utils.b3(w, n, r, q, l)
                                }
                            }
                    }
                }
            }
            return {
                
offset: s.ha * c,
                
path: e
            
}
        }
    }
};
THREE.FontUtils.generateShapes = function(a, b) {
    var 
b = b || {},
        
c = b.curveSegments !== void 0 ? b.curveSegments : 4,
        
d = b.font !== void 0 ? b.font : "helvetiker",
        
e = b.weight !== void 0 ? b.weight : "normal",
        
f = b.style !== void 0 ? b.style : "normal";
    
THREE.FontUtils.size = b.size !== void 0 ? b.size : 100;
    
THREE.FontUtils.divisions = c;
    
THREE.FontUtils.face = d;
    
THREE.FontUtils.weight = e;
    
THREE.FontUtils.style = f;
    
c = THREE.FontUtils.drawText(a).paths;
    
d = [];
    
e = 0;
    for (
f = c.length; e < f; e++) Array.prototype.push.apply(d, c[e].toShapes());
    return 
d
};
(function(
a) {
    var 
b = function(a) {
        for (var 
b = a.length, e = 0, f = b - 1, g = 0; g < b; f = g++) e = e + (a[f].x * a[g].y - a[g].x * a[f].y);
        return 
e * 0.5
    
};
    
a.Triangulate = function(a, d) {
        var 
e = a.length;
        if (
e < 3) return null;
        var 
f = [],
            
g = [],
            
h = [],
            
i, j, l;
        if (
b(a) > 0)
            for (
j = 0; j < e; j++) g[j] = j;
        else
            for (
j = 0; j < e; j++) g[j] = e - 1 - j;
        var 
m = 2 * e;
        for (
j = e - 1; e > 2;) {
            if (
m-- <= 0) {
                
console.log("Warning, unable to triangulate polygon!");
                break
            }
            
i = j;
            
e <= i && (i = 0);
            
j = i + 1;
            
e <= j && (j = 0);
            
l = j + 1;
            
e <= l && (l = 0);
            var 
n;
            
a: {
                
n = a;
                var 
p = i,
                    
r = j,
                    
o = l,
                    
q = e,
                    
s = g,
                    
w = void 0,
                    
t = void 0,
                    
v = void 0,
                    
x = void 0,
                    
C = void 0,
                    
D = void 0,
                    
z = void 0,
                    
u = void 0,
                    
G = void 0,
                    
t = n[s[p]].x,
                    
v = n[s[p]].y,
                    
x = n[s[r]].x,
                    
C = n[s[r]].y,
                    
D = n[s[o]].x,
                    
z = n[s[o]].y;
                if (
1.0E-10 > (x - t) * (z - v) - (C - v) * (D - t)) n = false;
                else {
                    for (
w = 0; w < q; w++)
                        if (!(
w == p || w == r || w == o)) {
                            var 
u = n[s[w]].x,
                                
G = n[s[w]].y,
                                
J = void 0,
                                
M = void 0,
                                
O = void 0,
                                
X = void 0,
                                
B = void 0,
                                
F = void 0,
                                
Q = void 0,
                                
E = void 0,
                                
aa = void 0,
                                
T = void 0,
                                
N = void 0,
                                
W = void 0,
                                
J = O = B = void 0,
                                
J = D - x,
                                
M = z - C,
                                
O = t - D,
                                
X = v - z,
                                
B = x - t,
                                
F = C - v,
                                
Q = u - t,
                                
E = G - v,
                                
aa = u - x,
                                
T = G - C,
                                
N = u - D,
                                
W = G - z,
                                
J = J * T - M * aa,
                                
B = B * E - F * Q,
                                
O = O * W - X * N;
                            if (
J >= 0 && O >= 0 && B >= 0) {
                                
n = false;
                                break 
a
                            
}
                        }
                    
n = true
                
}
            }
            if (
n) {
                
f.push([a[g[i]],
                    
a[g[j]], a[g[l]]
                ]);
                
h.push([g[i], g[j], g[l]]);
                
i = j;
                for (
l = j + 1; l < e; i++, l++) g[i] = g[l];
                
e--;
                
m = 2 * e
            
}
        }
        return 
d ? h : f
    
};
    
a.Triangulate.area = b;
    return 
a
})(THREE.FontUtils);
self._typeface_js = {
    
faces: THREE.FontUtils.faces,
    
loadFace: THREE.FontUtils.loadFace
};
THREE.BufferGeometry = function() {
    
this.id = THREE.GeometryCount++;
    
this.attributes = {};
    
this.dynamic = false;
    
this.boundingSphere = this.boundingBox = null;
    
this.hasTangents = false;
    
this.morphTargets = []
};
THREE.BufferGeometry.prototype = {
    
constructor: THREE.BufferGeometry,
    
applyMatrix: function(a) {
        var 
b, c;
        if (
this.attributes.position) b = this.attributes.position.array;
        if (
this.attributes.normal) c = this.attributes.normal.array;
        if (
b !== void 0) {
            
a.multiplyVector3Array(b);
            
this.verticesNeedUpdate = true
        
}
        if (
c !== void 0) {
            
b = new THREE.Matrix4;
            
b.extractRotation(a);
            
b.multiplyVector3Array(c);
            
this.normalsNeedUpdate = true
        
}
    },
    
computeBoundingBox: function() {
        if (!
this.boundingBox) this.boundingBox = {
            
min: new THREE.Vector3(Infinity, Infinity,
                
Infinity),
            
max: new THREE.Vector3(-Infinity, -Infinity, -Infinity)
        };
        var 
a = this.attributes.position.array;
        if (
a)
            for (var 
b = this.boundingBox, c, d, e, f = 0, g = a.length; f < g; f = f + 3) {
                
c = a[f];
                
d = a[f + 1];
                
e = a[f + 2];
                if (
c < b.min.x) b.min.x = c;
                else if (
c > b.max.x) b.max.x = c;
                if (
d < b.min.y) b.min.y = d;
                else if (
d > b.max.y) b.max.y = d;
                if (
e < b.min.z) b.min.z = e;
                else if (
e > b.max.z) b.max.z = e
            
}
        if (
a === void 0 || a.length === 0) {
            
this.boundingBox.min.set(0, 0, 0);
            
this.boundingBox.max.set(0, 0, 0)
        }
    },
    
computeBoundingSphere: function() {
        if (!
this.boundingSphere) this.boundingSphere = {
            
radius: 0
        
};
        var 
a = this.attributes.position.array;
        if (
a) {
            for (var 
b, c = 0, d, e, f = 0, g = a.length; f < g; f = f + 3) {
                
b = a[f];
                
d = a[f + 1];
                
e = a[f + 2];
                
b = Math.sqrt(b * b + d * d + e * e);
                
b > c && (c = b)
            }
            
this.boundingSphere.radius = c
        
}
    },
    
computeVertexNormals: function() {
        if (
this.attributes.position && this.attributes.index) {
            var 
a, b, c, d;
            
a = this.attributes.position.array.length;
            if (
this.attributes.normal === void 0) this.attributes.normal = {
                
itemSize: 3,
                array: new 
Float32Array(a),
                
numItems: a
            
};
            else {
                
a = 0;
                for (
b = this.attributes.normal.array.length; a < b; a++) this.attributes.normal.array[a] =
                    
0
            
}
            var 
e = this.offsets,
                
f = this.attributes.index.array,
                
g = this.attributes.position.array,
                
h = this.attributes.normal.array,
                
i, j, l, m, n, p, r = new THREE.Vector3,
                
o = new THREE.Vector3,
                
q = new THREE.Vector3,
                
s = new THREE.Vector3,
                
w = new THREE.Vector3;
            
c = 0;
            for (
d = e.length; c < d; ++c) {
                
b = e[c].start;
                
i = e[c].count;
                var 
t = e[c].index;
                
a = b;
                for (
b = b + i; a < b; a = a + 3) {
                    
i = t + f[a];
                    
j = t + f[a + 1];
                    
l = t + f[a + 2];
                    
m = g[i * 3];
                    
n = g[i * 3 + 1];
                    
p = g[i * 3 + 2];
                    
r.set(m, n, p);
                    
m = g[j * 3];
                    
n = g[j * 3 + 1];
                    
p = g[j * 3 + 2];
                    
o.set(m, n, p);
                    
m = g[l * 3];
                    
n = g[l * 3 + 1];
                    
p = g[l * 3 + 2];
                    
q.set(m, n, p);
                    
s.sub(q, o);
                    
w.sub(r,
                        
o);
                    
s.crossSelf(w);
                    
h[i * 3] = h[i * 3] + s.x;
                    
h[i * 3 + 1] = h[i * 3 + 1] + s.y;
                    
h[i * 3 + 2] = h[i * 3 + 2] + s.z;
                    
h[j * 3] = h[j * 3] + s.x;
                    
h[j * 3 + 1] = h[j * 3 + 1] + s.y;
                    
h[j * 3 + 2] = h[j * 3 + 2] + s.z;
                    
h[l * 3] = h[l * 3] + s.x;
                    
h[l * 3 + 1] = h[l * 3 + 1] + s.y;
                    
h[l * 3 + 2] = h[l * 3 + 2] + s.z
                
}
            }
            
a = 0;
            for (
b = h.length; a < b; a = a + 3) {
                
m = h[a];
                
n = h[a + 1];
                
p = h[a + 2];
                
c = 1 / Math.sqrt(m * m + n * n + p * p);
                
h[a] = h[a] * c;
                
h[a + 1] = h[a + 1] * c;
                
h[a + 2] = h[a + 2] * c
            
}
            
this.normalsNeedUpdate = true
        
}
    },
    
computeTangents: function() {
        function 
a(a, b, c) {
            
m = d[a * 3];
            
n = d[a * 3 + 1];
            
p = d[a * 3 + 2];
            
r = d[b * 3];
            
o = d[b * 3 + 1];
            
q = d[b * 3 + 2];
            
s = d[c * 3];
            
w = d[c * 3 + 1];
            
t = d[c * 3 + 2];
            
v =
                
f[a * 2];
            
x = f[a * 2 + 1];
            
C = f[b * 2];
            
D = f[b * 2 + 1];
            
z = f[c * 2];
            
u = f[c * 2 + 1];
            
G = r - m;
            
J = s - m;
            
M = o - n;
            
O = w - n;
            
X = q - p;
            
B = t - p;
            
F = C - v;
            
Q = z - v;
            
E = D - x;
            
aa = u - x;
            
T = 1 / (F * aa - Q * E);
            
N.set((aa * G - E * J) * T, (aa * M - E * O) * T, (aa * X - E * B) * T);
            
W.set((F * J - Q * G) * T, (F * O - Q * M) * T, (F * B - Q * X) * T);
            
j[a].addSelf(N);
            
j[b].addSelf(N);
            
j[c].addSelf(N);
            
l[a].addSelf(W);
            
l[b].addSelf(W);
            
l[c].addSelf(W)
        }

        function 
b(a) {
            
ma.x = e[a * 3];
            
ma.y = e[a * 3 + 1];
            
ma.z = e[a * 3 + 2];
            
Ga.copy(ma);
            
Oa = j[a];
            
U.copy(Oa);
            
U.subSelf(ma.multiplyScalar(ma.dot(Oa))).normalize();
            
fa.cross(Ga, Oa);
            
Pa = fa.dot(l[a]);
            
na = Pa < 0 ? -1 : 1;
            
i[a * 4] = U.x;
            
i[a * 4 + 1] = U.y;
            
i[a * 4 + 2] = U.z;
            
i[a * 4 + 3] = na
        
}
        if (
this.attributes.index === void 0 || this.attributes.position === void 0 || this.attributes.normal === void 0 || this.attributes.uv === void 0) console.warn("Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()");
        else {
            var 
c = this.attributes.index.array,
                
d = this.attributes.position.array,
                
e = this.attributes.normal.array,
                
f = this.attributes.uv.array,
                
g = d.length / 3;
            if (
this.attributes.tangent === void 0) {
                var 
h = 4 * g;
                
this.attributes.tangent = {
                    
itemSize: 4,
                    array: new 
Float32Array(h),
                    
numItems: h
                
}
            }
            for (var 
i = this.attributes.tangent.array, j = [], l = [], h = 0; h < g; h++) {
                
j[h] = new THREE.Vector3;
                
l[h] = new THREE.Vector3
            
}
            var 
m, n, p, r, o, q, s, w, t, v, x, C, D, z, u, G, J, M, O, X, B, F, Q, E, aa, T, N = new THREE.Vector3,
                
W = new THREE.Vector3,
                
ba, H, ca, ia, S, R = this.offsets,
                
h = 0;
            for (
H = R.length; h < H; ++h) {
                
ba = R[h].start;
                
ca = R[h].count;
                var 
P = R[h].index,
                    
g = ba;
                for (
ba = ba + ca; g < ba; g = g + 3) {
                    
ca = P + c[g];
                    
ia = P + c[g + 1];
                    
S = P + c[g + 2];
                    
a(ca, ia, S)
                }
            }
            var 
U = new THREE.Vector3,
                
fa = new THREE.Vector3,
                
ma = new THREE.Vector3,
                
Ga =
                new 
THREE.Vector3,
                
na, Oa, Pa, h = 0;
            for (
H = R.length; h < H; ++h) {
                
ba = R[h].start;
                
ca = R[h].count;
                
P = R[h].index;
                
g = ba;
                for (
ba = ba + ca; g < ba; g = g + 3) {
                    
ca = P + c[g];
                    
ia = P + c[g + 1];
                    
S = P + c[g + 2];
                    
b(ca);
                    
b(ia);
                    
b(S)
                }
            }
            
this.tangentsNeedUpdate = this.hasTangents = true
        
}
    }
};
THREE.Curve = function() {};
THREE.Curve.prototype.getPoint = function() {
    
console.log("Warning, getPoint() not implemented!");
    return 
null
};
THREE.Curve.prototype.getPointAt = function(a) {
    return 
this.getPoint(this.getUtoTmapping(a))
};
THREE.Curve.prototype.getPoints = function(a) {
    
a || (a = 5);
    var 
b, c = [];
    for (
b = 0; b <= a; b++) c.push(this.getPoint(b / a));
    return 
c
};
THREE.Curve.prototype.getSpacedPoints = function(a) {
    
a || (a = 5);
    var 
b, c = [];
    for (
b = 0; b <= a; b++) c.push(this.getPointAt(b / a));
    return 
c
};
THREE.Curve.prototype.getLength = function() {
    var 
a = this.getLengths();
    return 
a[a.length - 1]
};
THREE.Curve.prototype.getLengths = function(a) {
    
a || (a = this.__arcLengthDivisions ? this.__arcLengthDivisions : 200);
    if (
this.cacheArcLengths && this.cacheArcLengths.length == a + 1 && !this.needsUpdate) return this.cacheArcLengths;
    
this.needsUpdate = false;
    var 
b = [],
        
c, d = this.getPoint(0),
        
e, f = 0;
    
b.push(0);
    for (
e = 1; e <= a; e++) {
        
c = this.getPoint(e / a);
        
f = f + c.distanceTo(d);
        
b.push(f);
        
d = c
    
}
    return 
this.cacheArcLengths = b
};
THREE.Curve.prototype.updateArcLengths = function() {
    
this.needsUpdate = true;
    
this.getLengths()
};
THREE.Curve.prototype.getUtoTmapping = function(a, b) {
    var 
c = this.getLengths(),
        
d = 0,
        
e = c.length,
        
f;
    
f = b ? b : a * c[e - 1];
    for (var 
g = 0, h = e - 1, i; g <= h;) {
        
d = Math.floor(g + (h - g) / 2);
        
i = c[d] - f;
        if (
i < 0) g = d + 1;
        else if (
i > 0) h = d - 1;
        else {
            
h = d;
            break
        }
    }
    
d = h;
    if (
c[d] == f) return d / (e - 1);
    
g = c[d];
    return 
c = (d + (f - g) / (c[d + 1] - g)) / (e - 1)
};
THREE.Curve.prototype.getNormalVector = function(a) {
    
a = this.getTangent(a);
    return new 
THREE.Vector2(-a.y, a.x)
};
THREE.Curve.prototype.getTangent = function(a) {
    var 
b = a - 1.0E-4,
        
a = a + 1.0E-4;
    
b < 0 && (b = 0);
    
a > 1 && (a = 1);
    
b = this.getPoint(b);
    return 
this.getPoint(a).clone().subSelf(b).normalize()
};
THREE.Curve.prototype.getTangentAt = function(a) {
    return 
this.getTangent(this.getUtoTmapping(a))
};
THREE.LineCurve = function(a, b) {
    
this.v1 = a;
    
this.v2 = b
};
THREE.LineCurve.prototype = Object.create(THREE.Curve.prototype);
THREE.LineCurve.prototype.getPoint = function(a) {
    var 
b = this.v2.clone().subSelf(this.v1);
    
b.multiplyScalar(a).addSelf(this.v1);
    return 
b
};
THREE.LineCurve.prototype.getPointAt = function(a) {
    return 
this.getPoint(a)
};
THREE.LineCurve.prototype.getTangent = function() {
    return 
this.v2.clone().subSelf(this.v1).normalize()
};
THREE.QuadraticBezierCurve = function(a, b, c) {
    
this.v0 = a;
    
this.v1 = b;
    
this.v2 = c
};
THREE.QuadraticBezierCurve.prototype = Object.create(THREE.Curve.prototype);
THREE.QuadraticBezierCurve.prototype.getPoint = function(a) {
    var 
b;
    
b = THREE.Shape.Utils.b2(a, this.v0.x, this.v1.x, this.v2.x);
    
a = THREE.Shape.Utils.b2(a, this.v0.y, this.v1.y, this.v2.y);
    return new 
THREE.Vector2(b, a)
};
THREE.QuadraticBezierCurve.prototype.getTangent = function(a) {
    var 
b;
    
b = THREE.Curve.Utils.tangentQuadraticBezier(a, this.v0.x, this.v1.x, this.v2.x);
    
a = THREE.Curve.Utils.tangentQuadraticBezier(a, this.v0.y, this.v1.y, this.v2.y);
    
b = new THREE.Vector2(b, a);
    
b.normalize();
    return 
b
};
THREE.CubicBezierCurve = function(a, b, c, d) {
    
this.v0 = a;
    
this.v1 = b;
    
this.v2 = c;
    
this.v3 = d
};
THREE.CubicBezierCurve.prototype = Object.create(THREE.Curve.prototype);
THREE.CubicBezierCurve.prototype.getPoint = function(a) {
    var 
b;
    
b = THREE.Shape.Utils.b3(a, this.v0.x, this.v1.x, this.v2.x, this.v3.x);
    
a = THREE.Shape.Utils.b3(a, this.v0.y, this.v1.y, this.v2.y, this.v3.y);
    return new 
THREE.Vector2(b, a)
};
THREE.CubicBezierCurve.prototype.getTangent = function(a) {
    var 
b;
    
b = THREE.Curve.Utils.tangentCubicBezier(a, this.v0.x, this.v1.x, this.v2.x, this.v3.x);
    
a = THREE.Curve.Utils.tangentCubicBezier(a, this.v0.y, this.v1.y, this.v2.y, this.v3.y);
    
b = new THREE.Vector2(b, a);
    
b.normalize();
    return 
b
};
THREE.SplineCurve = function(a) {
    
this.points = a == void 0 ? [] : a
};
THREE.SplineCurve.prototype = Object.create(THREE.Curve.prototype);
THREE.SplineCurve.prototype.getPoint = function(a) {
    var 
b = new THREE.Vector2,
        
c = [],
        
d = this.points,
        
e;
    
e = (d.length - 1) * a;
    
a = Math.floor(e);
    
e = e - a;
    
c[0] = a == 0 ? a : a - 1;
    
c[1] = a;
    
c[2] = a > d.length - 2 ? d.length - 1 : a + 1;
    
c[3] = a > d.length - 3 ? d.length - 1 : a + 2;
    
b.x = THREE.Curve.Utils.interpolate(d[c[0]].x, d[c[1]].x, d[c[2]].x, d[c[3]].x, e);
    
b.y = THREE.Curve.Utils.interpolate(d[c[0]].y, d[c[1]].y, d[c[2]].y, d[c[3]].y, e);
    return 
b
};
THREE.EllipseCurve = function(a, b, c, d, e, f, g) {
    
this.aX = a;
    
this.aY = b;
    
this.xRadius = c;
    
this.yRadius = d;
    
this.aStartAngle = e;
    
this.aEndAngle = f;
    
this.aClockwise = g
};
THREE.EllipseCurve.prototype = Object.create(THREE.Curve.prototype);
THREE.EllipseCurve.prototype.getPoint = function(a) {
    var 
b = this.aEndAngle - this.aStartAngle;
    
this.aClockwise || (a = 1 - a);
    
b = this.aStartAngle + a * b;
    
a = this.aX + this.xRadius * Math.cos(b);
    
b = this.aY + this.yRadius * Math.sin(b);
    return new 
THREE.Vector2(a, b)
};
THREE.ArcCurve = function(a, b, c, d, e, f) {
    
THREE.EllipseCurve.call(this, a, b, c, c, d, e, f)
};
THREE.ArcCurve.prototype = Object.create(THREE.EllipseCurve.prototype);
THREE.Curve.Utils = {
    
tangentQuadraticBezier: function(a, b, c, d) {
        return 
2 * (1 - a) * (c - b) + 2 * a * (d - c)
    },
    
tangentCubicBezier: function(a, b, c, d, e) {
        return -
3 * b * (1 - a) * (1 - a) + 3 * c * (1 - a) * (1 - a) - 6 * a * c * (1 - a) + 6 * a * d * (1 - a) - 3 * a * a * d + 3 * a * a * e
    
},
    
tangentSpline: function(a) {
        return 
6 * a * a - 6 * a + (3 * a * a - 4 * a + 1) + (-6 * a * a + 6 * a) + (3 * a * a - 2 * a)
    },
    
interpolate: function(a, b, c, d, e) {
        var 
a = (c - a) * 0.5,
            
d = (d - b) * 0.5,
            
f = e * e;
        return (
2 * b - 2 * c + a + d) * e * f + (-3 * b + 3 * c - 2 * a - d) * f + a * e + b
    
}
};
THREE.Curve.create = function(a, b) {
    
a.prototype = Object.create(THREE.Curve.prototype);
    
a.prototype.getPoint = b;
    return 
a
};
THREE.LineCurve3 = THREE.Curve.create(function(a, b) {
    
this.v1 = a;
    
this.v2 = b
}, function(a) {
    var 
b = new THREE.Vector3;
    
b.sub(this.v2, this.v1);
    
b.multiplyScalar(a);
    
b.addSelf(this.v1);
    return 
b
});
THREE.QuadraticBezierCurve3 = THREE.Curve.create(function(a, b, c) {
    
this.v0 = a;
    
this.v1 = b;
    
this.v2 = c
}, function(a) {
    var 
b, c;
    
b = THREE.Shape.Utils.b2(a, this.v0.x, this.v1.x, this.v2.x);
    
c = THREE.Shape.Utils.b2(a, this.v0.y, this.v1.y, this.v2.y);
    
a = THREE.Shape.Utils.b2(a, this.v0.z, this.v1.z, this.v2.z);
    return new 
THREE.Vector3(b, c, a)
});
THREE.CubicBezierCurve3 = THREE.Curve.create(function(a, b, c, d) {
    
this.v0 = a;
    
this.v1 = b;
    
this.v2 = c;
    
this.v3 = d
}, function(a) {
    var 
b, c;
    
b = THREE.Shape.Utils.b3(a, this.v0.x, this.v1.x, this.v2.x, this.v3.x);
    
c = THREE.Shape.Utils.b3(a, this.v0.y, this.v1.y, this.v2.y, this.v3.y);
    
a = THREE.Shape.Utils.b3(a, this.v0.z, this.v1.z, this.v2.z, this.v3.z);
    return new 
THREE.Vector3(b, c, a)
});
THREE.SplineCurve3 = THREE.Curve.create(function(a) {
    
this.points = a == void 0 ? [] : a
}, function(a) {
    var 
b = new THREE.Vector3,
        
c = [],
        
d = this.points,
        
e, a = (d.length - 1) * a;
    
e = Math.floor(a);
    
a = a - e;
    
c[0] = e == 0 ? e : e - 1;
    
c[1] = e;
    
c[2] = e > d.length - 2 ? d.length - 1 : e + 1;
    
c[3] = e > d.length - 3 ? d.length - 1 : e + 2;
    
e = d[c[0]];
    var 
f = d[c[1]],
        
g = d[c[2]],
        
c = d[c[3]];
    
b.x = THREE.Curve.Utils.interpolate(e.x, f.x, g.x, c.x, a);
    
b.y = THREE.Curve.Utils.interpolate(e.y, f.y, g.y, c.y, a);
    
b.z = THREE.Curve.Utils.interpolate(e.z, f.z, g.z, c.z, a);
    return 
b
});
THREE.ClosedSplineCurve3 = THREE.Curve.create(function(a) {
    
this.points = a == void 0 ? [] : a
}, function(a) {
    var 
b = new THREE.Vector3,
        
c = [],
        
d = this.points,
        
e;
    
e = (d.length - 0) * a;
    
a = Math.floor(e);
    
e = e - a;
    
a = a + (a > 0 ? 0 : (Math.floor(Math.abs(a) / d.length) + 1) * d.length);
    
c[0] = (a - 1) % d.length;
    
c[1] = a % d.length;
    
c[2] = (a + 1) % d.length;
    
c[3] = (a + 2) % d.length;
    
b.x = THREE.Curve.Utils.interpolate(d[c[0]].x, d[c[1]].x, d[c[2]].x, d[c[3]].x, e);
    
b.y = THREE.Curve.Utils.interpolate(d[c[0]].y, d[c[1]].y, d[c[2]].y, d[c[3]].y, e);
    
b.z = THREE.Curve.Utils.interpolate(d[c[0]].z,
        
d[c[1]].z, d[c[2]].z, d[c[3]].z, e);
    return 
b
});
THREE.CurvePath = function() {
    
this.curves = [];
    
this.bends = [];
    
this.autoClose = false
};
THREE.CurvePath.prototype = Object.create(THREE.Curve.prototype);
THREE.CurvePath.prototype.add = function(a) {
    
this.curves.push(a)
};
THREE.CurvePath.prototype.checkConnection = function() {};
THREE.CurvePath.prototype.closePath = function() {
    var 
a = this.curves[0].getPoint(0),
        
b = this.curves[this.curves.length - 1].getPoint(1);
    
a.equals(b) || this.curves.push(new THREE.LineCurve(b, a))
};
THREE.CurvePath.prototype.getPoint = function(a) {
    for (var 
b = a * this.getLength(), c = this.getCurveLengths(), a = 0; a < c.length;) {
        if (
c[a] >= b) {
            
b = c[a] - b;
            
a = this.curves[a];
            
b = 1 - b / a.getLength();
            return 
a.getPointAt(b)
        }
        
a++
    }
    return 
null
};
THREE.CurvePath.prototype.getLength = function() {
    var 
a = this.getCurveLengths();
    return 
a[a.length - 1]
};
THREE.CurvePath.prototype.getCurveLengths = function() {
    if (
this.cacheLengths && this.cacheLengths.length == this.curves.length) return this.cacheLengths;
    var 
a = [],
        
b = 0,
        
c, d = this.curves.length;
    for (
c = 0; c < d; c++) {
        
b = b + this.curves[c].getLength();
        
a.push(b)
    }
    return 
this.cacheLengths = a
};
THREE.CurvePath.prototype.getBoundingBox = function() {
    var 
a = this.getPoints(),
        
b, c, d, e;
    
b = c = Number.NEGATIVE_INFINITY;
    
d = e = Number.POSITIVE_INFINITY;
    var 
f, g, h, i;
    
i = new THREE.Vector2;
    
g = 0;
    for (
h = a.length; g < h; g++) {
        
f = a[g];
        if (
f.x > b) b = f.x;
        else if (
f.x < d) d = f.x;
        if (
f.y > c) c = f.y;
        else if (
f.y < e) e = f.y;
        
i.addSelf(f.x, f.y)
    }
    return {
        
minX: d,
        
minY: e,
        
maxX: b,
        
maxY: c,
        
centroid: i.divideScalar(h)
    }
};
THREE.CurvePath.prototype.createPointsGeometry = function(a) {
    return 
this.createGeometry(this.getPoints(a, true))
};
THREE.CurvePath.prototype.createSpacedPointsGeometry = function(a) {
    return 
this.createGeometry(this.getSpacedPoints(a, true))
};
THREE.CurvePath.prototype.createGeometry = function(a) {
    for (var 
b = new THREE.Geometry, c = 0; c < a.length; c++) b.vertices.push(new THREE.Vector3(a[c].x, a[c].y, 0));
    return 
b
};
THREE.CurvePath.prototype.addWrapPath = function(a) {
    
this.bends.push(a)
};
THREE.CurvePath.prototype.getTransformedPoints = function(a, b) {
    var 
c = this.getPoints(a),
        
d, e;
    if (!
b) b = this.bends;
    
d = 0;
    for (
e = b.length; d < e; d++) c = this.getWrapPoints(c, b[d]);
    return 
c
};
THREE.CurvePath.prototype.getTransformedSpacedPoints = function(a, b) {
    var 
c = this.getSpacedPoints(a),
        
d, e;
    if (!
b) b = this.bends;
    
d = 0;
    for (
e = b.length; d < e; d++) c = this.getWrapPoints(c, b[d]);
    return 
c
};
THREE.CurvePath.prototype.getWrapPoints = function(a, b) {
    var 
c = this.getBoundingBox(),
        
d, e, f, g, h, i;
    
d = 0;
    for (
e = a.length; d < e; d++) {
        
f = a[d];
        
g = f.x;
        
h = f.y;
        
i = g / c.maxX;
        
i = b.getUtoTmapping(i, g);
        
g = b.getPoint(i);
        
h = b.getNormalVector(i).multiplyScalar(h);
        
f.x = g.x + h.x;
        
f.y = g.y + h.y
    
}
    return 
a
};
THREE.Gyroscope = function() {
    
THREE.Object3D.call(this)
};
THREE.Gyroscope.prototype = Object.create(THREE.Object3D.prototype);
THREE.Gyroscope.prototype.updateMatrixWorld = function(a) {
    
this.matrixAutoUpdate && this.updateMatrix();
    if (
this.matrixWorldNeedsUpdate || a) {
        if (
this.parent) {
            
this.matrixWorld.multiply(this.parent.matrixWorld, this.matrix);
            
this.matrixWorld.decompose(this.translationWorld, this.rotationWorld, this.scaleWorld);
            
this.matrix.decompose(this.translationObject, this.rotationObject, this.scaleObject);
            
this.matrixWorld.compose(this.translationWorld, this.rotationObject, this.scaleWorld)
        } else 
this.matrixWorld.copy(this.matrix);
        
this.matrixWorldNeedsUpdate = false;
        
a = true
    
}
    for (var 
b = 0, c = this.children.length; b < c; b++) this.children[b].updateMatrixWorld(a)
};
THREE.Gyroscope.prototype.translationWorld = new THREE.Vector3;
THREE.Gyroscope.prototype.translationObject = new THREE.Vector3;
THREE.Gyroscope.prototype.rotationWorld = new THREE.Quaternion;
THREE.Gyroscope.prototype.rotationObject = new THREE.Quaternion;
THREE.Gyroscope.prototype.scaleWorld = new THREE.Vector3;
THREE.Gyroscope.prototype.scaleObject = new THREE.Vector3;
THREE.Path = function(a) {
    
THREE.CurvePath.call(this);
    
this.actions = [];
    
a && this.fromPoints(a)
};
THREE.Path.prototype = Object.create(THREE.CurvePath.prototype);
THREE.PathActions = {
    
MOVE_TO: "moveTo",
    
LINE_TO: "lineTo",
    
QUADRATIC_CURVE_TO: "quadraticCurveTo",
    
BEZIER_CURVE_TO: "bezierCurveTo",
    
CSPLINE_THRU: "splineThru",
    
ARC: "arc",
    
ELLIPSE: "ellipse"
};
THREE.Path.prototype.fromPoints = function(a) {
    
this.moveTo(a[0].x, a[0].y);
    for (var 
b = 1, c = a.length; b < c; b++) this.lineTo(a[b].x, a[b].y)
};
THREE.Path.prototype.moveTo = function(a, b) {
    var 
c = Array.prototype.slice.call(arguments);
    
this.actions.push({
        
action: THREE.PathActions.MOVE_TO,
        
args: c
    
})
};
THREE.Path.prototype.lineTo = function(a, b) {
    var 
c = Array.prototype.slice.call(arguments),
        
d = this.actions[this.actions.length - 1].args;
    
this.curves.push(new THREE.LineCurve(new THREE.Vector2(d[d.length - 2], d[d.length - 1]), new THREE.Vector2(a, b)));
    
this.actions.push({
        
action: THREE.PathActions.LINE_TO,
        
args: c
    
})
};
THREE.Path.prototype.quadraticCurveTo = function(a, b, c, d) {
    var 
e = Array.prototype.slice.call(arguments),
        
f = this.actions[this.actions.length - 1].args;
    
this.curves.push(new THREE.QuadraticBezierCurve(new THREE.Vector2(f[f.length - 2], f[f.length - 1]), new THREE.Vector2(a, b), new THREE.Vector2(c, d)));
    
this.actions.push({
        
action: THREE.PathActions.QUADRATIC_CURVE_TO,
        
args: e
    
})
};
THREE.Path.prototype.bezierCurveTo = function(a, b, c, d, e, f) {
    var 
g = Array.prototype.slice.call(arguments),
        
h = this.actions[this.actions.length - 1].args;
    
this.curves.push(new THREE.CubicBezierCurve(new THREE.Vector2(h[h.length - 2], h[h.length - 1]), new THREE.Vector2(a, b), new THREE.Vector2(c, d), new THREE.Vector2(e, f)));
    
this.actions.push({
        
action: THREE.PathActions.BEZIER_CURVE_TO,
        
args: g
    
})
};
THREE.Path.prototype.splineThru = function(a) {
    var 
b = Array.prototype.slice.call(arguments),
        
c = this.actions[this.actions.length - 1].args,
        
c = [new THREE.Vector2(c[c.length - 2], c[c.length - 1])];
    Array.
prototype.push.apply(c, a);
    
this.curves.push(new THREE.SplineCurve(c));
    
this.actions.push({
        
action: THREE.PathActions.CSPLINE_THRU,
        
args: b
    
})
};
THREE.Path.prototype.ellipse = function(a, b, c, d, e, f, g) {
    var 
h = this.actions[this.actions.length - 1];
    
this.absellipse(h.x + a, h.y + b, c, d, e, f, g)
};
THREE.Path.prototype.arc = function(a, b, c, d, e, f) {
    var 
g = this.actions[this.actions.length - 1];
    
this.absarc(g.x + a, g.y + b, c, d, e, f)
};
THREE.Path.prototype.absellipse = function(a, b, c, d, e, f, g) {
    var 
h = Array.prototype.slice.call(arguments),
        
i = new THREE.EllipseCurve(a, b, c, d, e, f, g);
    
this.curves.push(i);
    
i = i.getPoint(g ? 1 : 0);
    
h.push(i.x);
    
h.push(i.y);
    
this.actions.push({
        
action: THREE.PathActions.ELLIPSE,
        
args: h
    
})
};
THREE.Path.prototype.absarc = function(a, b, c, d, e, f) {
    
this.absellipse(a, b, c, c, d, e, f)
};
THREE.Path.prototype.getSpacedPoints = function(a) {
    
a || (a = 40);
    for (var 
b = [], c = 0; c < a; c++) b.push(this.getPoint(c / a));
    return 
b
};
THREE.Path.prototype.getPoints = function(a, b) {
    if (
this.useSpacedPoints) {
        
console.log("tata");
        return 
this.getSpacedPoints(a, b)
    }
    var 
a = a || 12,
        
c = [],
        
d, e, f, g, h, i, j, l, m, n, p, r, o;
    
d = 0;
    for (
e = this.actions.length; d < e; d++) {
        
f = this.actions[d];
        
g = f.action;
        
f = f.args;
        switch (
g) {
            case 
THREE.PathActions.MOVE_TO:
                
c.push(new THREE.Vector2(f[0], f[1]));
                break;
            case 
THREE.PathActions.LINE_TO:
                
c.push(new THREE.Vector2(f[0], f[1]));
                break;
            case 
THREE.PathActions.QUADRATIC_CURVE_TO:
                
h = f[2];
                
i = f[3];
                
m = f[0];
                
n = f[1];
                if (
c.length > 0) {
                    
g = c[c.length - 1];
                    
p = g.x;
                    
r = g.y
                
} else {
                    
g = this.actions[d - 1].args;
                    
p = g[g.length - 2];
                    
r = g[g.length - 1]
                }
                for (
f = 1; f <= a; f++) {
                    
o = f / a;
                    
g = THREE.Shape.Utils.b2(o, p, m, h);
                    
o = THREE.Shape.Utils.b2(o, r, n, i);
                    
c.push(new THREE.Vector2(g, o))
                }
                break;
            case 
THREE.PathActions.BEZIER_CURVE_TO:
                
h = f[4];
                
i = f[5];
                
m = f[0];
                
n = f[1];
                
j = f[2];
                
l = f[3];
                if (
c.length > 0) {
                    
g = c[c.length - 1];
                    
p = g.x;
                    
r = g.y
                
} else {
                    
g = this.actions[d - 1].args;
                    
p = g[g.length - 2];
                    
r = g[g.length - 1]
                }
                for (
f = 1; f <= a; f++) {
                    
o = f / a;
                    
g = THREE.Shape.Utils.b3(o, p, m, j, h);
                    
o = THREE.Shape.Utils.b3(o, r, n, l, i);
                    
c.push(new THREE.Vector2(g,
                        
o))
                }
                break;
            case 
THREE.PathActions.CSPLINE_THRU:
                
g = this.actions[d - 1].args;
                
o = [new THREE.Vector2(g[g.length - 2], g[g.length - 1])];
                
g = a * f[0].length;
                
o = o.concat(f[0]);
                
o = new THREE.SplineCurve(o);
                for (
f = 1; f <= g; f++) c.push(o.getPointAt(f / g));
                break;
            case 
THREE.PathActions.ARC:
                
h = f[0];
                
i = f[1];
                
n = f[2];
                
j = f[3];
                
g = f[4];
                
m = !!f[5];
                
p = g - j;
                
r = a * 2;
                for (
f = 1; f <= r; f++) {
                    
o = f / r;
                    
m || (o = 1 - o);
                    
o = j + o * p;
                    
g = h + n * Math.cos(o);
                    
o = i + n * Math.sin(o);
                    
c.push(new THREE.Vector2(g, o))
                }
                break;
            case 
THREE.PathActions.ELLIPSE:
                
h = f[0];
                
i = f[1];
                
n = f[2];
                
l = f[3];
                
j = f[4];
                
g = f[5];
                
m = !!f[6];
                
p = g - j;
                
r = a * 2;
                for (
f = 1; f <= r; f++) {
                    
o = f / r;
                    
m || (o = 1 - o);
                    
o = j + o * p;
                    
g = h + n * Math.cos(o);
                    
o = i + l * Math.sin(o);
                    
c.push(new THREE.Vector2(g, o))
                }
        }
    }
    
d = c[c.length - 1];
    
Math.abs(d.x - c[0].x) < 1.0E-10 && Math.abs(d.y - c[0].y) < 1.0E-10 && c.splice(c.length - 1, 1);
    
b && c.push(c[0]);
    return 
c
};
THREE.Path.prototype.toShapes = function() {
    var 
a, b, c, d, e = [],
        
f = new THREE.Path;
    
a = 0;
    for (
b = this.actions.length; a < b; a++) {
        
c = this.actions[a];
        
d = c.args;
        
c = c.action;
        if (
c == THREE.PathActions.MOVE_TO && f.actions.length != 0) {
            
e.push(f);
            
f = new THREE.Path
        
}
        
f[c].apply(f, d)
    }
    
f.actions.length != 0 && e.push(f);
    if (
e.length == 0) return [];
    var 
g;
    
d = [];
    
a = !THREE.Shape.Utils.isClockWise(e[0].getPoints());
    if (
e.length == 1) {
        
f = e[0];
        
g = new THREE.Shape;
        
g.actions = f.actions;
        
g.curves = f.curves;
        
d.push(g);
        return 
d
    
}
    if (
a) {
        
g = new THREE.Shape;
        
a = 0;
        for (
b = e.length; a <
            
b; a++) {
            
f = e[a];
            if (
THREE.Shape.Utils.isClockWise(f.getPoints())) {
                
g.actions = f.actions;
                
g.curves = f.curves;
                
d.push(g);
                
g = new THREE.Shape
            
} else g.holes.push(f)
        }
    } else {
        
a = 0;
        for (
b = e.length; a < b; a++) {
            
f = e[a];
            if (
THREE.Shape.Utils.isClockWise(f.getPoints())) {
                
g && d.push(g);
                
g = new THREE.Shape;
                
g.actions = f.actions;
                
g.curves = f.curves
            
} else g.holes.push(f)
        }
        
d.push(g)
    }
    return 
d
};
THREE.Shape = function() {
    
THREE.Path.apply(this, arguments);
    
this.holes = []
};
THREE.Shape.prototype = Object.create(THREE.Path.prototype);
THREE.Shape.prototype.extrude = function(a) {
    return new 
THREE.ExtrudeGeometry(this, a)
};
THREE.Shape.prototype.getPointsHoles = function(a) {
    var 
b, c = this.holes.length,
        
d = [];
    for (
b = 0; b < c; b++) d[b] = this.holes[b].getTransformedPoints(a, this.bends);
    return 
d
};
THREE.Shape.prototype.getSpacedPointsHoles = function(a) {
    var 
b, c = this.holes.length,
        
d = [];
    for (
b = 0; b < c; b++) d[b] = this.holes[b].getTransformedSpacedPoints(a, this.bends);
    return 
d
};
THREE.Shape.prototype.extractAllPoints = function(a) {
    return {
        
shape: this.getTransformedPoints(a),
        
holes: this.getPointsHoles(a)
    }
};
THREE.Shape.prototype.extractPoints = function(a) {
    return 
this.useSpacedPoints ? this.extractAllSpacedPoints(a) : this.extractAllPoints(a)
};
THREE.Shape.prototype.extractAllSpacedPoints = function(a) {
    return {
        
shape: this.getTransformedSpacedPoints(a),
        
holes: this.getSpacedPointsHoles(a)
    }
};
THREE.Shape.Utils = {
    
removeHoles: function(a, b) {
        var 
c = a.concat(),
            
d = c.concat(),
            
e, f, g, h, i, j, l, m, n, p, r = [];
        for (
i = 0; i < b.length; i++) {
            
j = b[i];
            Array.
prototype.push.apply(d, j);
            
f = Number.POSITIVE_INFINITY;
            for (
e = 0; e < j.length; e++) {
                
n = j[e];
                
p = [];
                for (
m = 0; m < c.length; m++) {
                    
l = c[m];
                    
l = n.distanceToSquared(l);
                    
p.push(l);
                    if (
l < f) {
                        
f = l;
                        
g = e;
                        
h = m
                    
}
                }
            }
            
e = h - 1 >= 0 ? h - 1 : c.length - 1;
            
f = g - 1 >= 0 ? g - 1 : j.length - 1;
            var 
o = [j[g], c[h], c[e]];
            
m = THREE.FontUtils.Triangulate.area(o);
            var 
q = [j[g], j[f], c[h]];
            
n = THREE.FontUtils.Triangulate.area(q);
            
p = h;
            
l = g;
            
h = h + 1;
            
g = g +
                -
1;
            
h < 0 && (h = h + c.length);
            
h = h % c.length;
            
g < 0 && (g = g + j.length);
            
g = g % j.length;
            
e = h - 1 >= 0 ? h - 1 : c.length - 1;
            
f = g - 1 >= 0 ? g - 1 : j.length - 1;
            
o = [j[g], c[h], c[e]];
            
o = THREE.FontUtils.Triangulate.area(o);
            
q = [j[g], j[f], c[h]];
            
q = THREE.FontUtils.Triangulate.area(q);
            if (
m + n > o + q) {
                
h = p;
                
g = l;
                
h < 0 && (h = h + c.length);
                
h = h % c.length;
                
g < 0 && (g = g + j.length);
                
g = g % j.length;
                
e = h - 1 >= 0 ? h - 1 : c.length - 1;
                
f = g - 1 >= 0 ? g - 1 : j.length - 1
            
}
            
m = c.slice(0, h);
            
n = c.slice(h);
            
p = j.slice(g);
            
l = j.slice(0, g);
            
f = [j[g], j[f], c[h]];
            
r.push([j[g], c[h], c[e]]);
            
r.push(f);
            
c = m.concat(p).concat(l).concat(n)
        }
        return {
            
shape: c,
            
isolatedPts: r,
            
allpoints: d
        
}
    },
    
triangulateShape: function(a, b) {
        var 
c = THREE.Shape.Utils.removeHoles(a, b),
            
d = c.allpoints,
            
e = c.isolatedPts,
            
c = THREE.FontUtils.Triangulate(c.shape, false),
            
f, g, h, i, j = {};
        
f = 0;
        for (
g = d.length; f < g; f++) {
            
i = d[f].x + ":" + d[f].y;
            
j[i] !== void 0 && console.log("Duplicate point", i);
            
j[i] = f
        
}
        
f = 0;
        for (
g = c.length; f < g; f++) {
            
h = c[f];
            for (
d = 0; d < 3; d++) {
                
i = h[d].x + ":" + h[d].y;
                
i = j[i];
                
i !== void 0 && (h[d] = i)
            }
        }
        
f = 0;
        for (
g = e.length; f < g; f++) {
            
h = e[f];
            for (
d = 0; d < 3; d++) {
                
i = h[d].x + ":" + h[d].y;
                
i = j[i];
                
i !== void 0 && (h[d] = i)
            }
        }
        return 
c.concat(e)
    },
    
isClockWise: function(a) {
        return 
THREE.FontUtils.Triangulate.area(a) < 0
    
},
    
b2p0: function(a, b) {
        var 
c = 1 - a;
        return 
c * c * b
    
},
    
b2p1: function(a, b) {
        return 
2 * (1 - a) * a * b
    
},
    
b2p2: function(a, b) {
        return 
a * a * b
    
},
    
b2: function(a, b, c, d) {
        return 
this.b2p0(a, b) + this.b2p1(a, c) + this.b2p2(a, d)
    },
    
b3p0: function(a, b) {
        var 
c = 1 - a;
        return 
c * c * c * b
    
},
    
b3p1: function(a, b) {
        var 
c = 1 - a;
        return 
3 * c * c * a * b
    
},
    
b3p2: function(a, b) {
        return 
3 * (1 - a) * a * a * b
    
},
    
b3p3: function(a, b) {
        return 
a * a * a * b
    
},
    
b3: function(a, b, c, d, e) {
        return 
this.b3p0(a, b) + this.b3p1(a, c) + this.b3p2(a, d) +
            
this.b3p3(a, e)
    }
};
THREE.AnimationHandler = function() {
    var 
a = [],
        
b = {},
        
c = {
            
update: function(b) {
                for (var 
c = 0; c < a.length; c++) a[c].update(b)
            },
            
addToUpdate: function(b) {
                
a.indexOf(b) === -1 && a.push(b)
            },
            
removeFromUpdate: function(b) {
                
b = a.indexOf(b);
                
b !== -1 && a.splice(b, 1)
            },
            
add: function(a) {
                
b[a.name] !== void 0 && console.log("THREE.AnimationHandler.add: Warning! " + a.name + " already exists in library. Overwriting.");
                
b[a.name] = a;
                if (
a.initialized !== true) {
                    for (var 
c = 0; c < a.hierarchy.length; c++) {
                        for (var 
d = 0; d < a.hierarchy[c].keys.length; d++) {
                            if (
a.hierarchy[c].keys[d].time < 0) a.hierarchy[c].keys[d].time =
                                
0;
                            if (
a.hierarchy[c].keys[d].rot !== void 0 && !(a.hierarchy[c].keys[d].rot instanceof THREE.Quaternion)) {
                                var 
h = a.hierarchy[c].keys[d].rot;
                                
a.hierarchy[c].keys[d].rot = new THREE.Quaternion(h[0], h[1], h[2], h[3])
                            }
                        }
                        if (
a.hierarchy[c].keys.length && a.hierarchy[c].keys[0].morphTargets !== void 0) {
                            
h = {};
                            for (
d = 0; d < a.hierarchy[c].keys.length; d++)
                                for (var 
i = 0; i < a.hierarchy[c].keys[d].morphTargets.length; i++) {
                                    var 
j = a.hierarchy[c].keys[d].morphTargets[i];
                                    
h[j] = -1
                                
}
                            
a.hierarchy[c].usedMorphTargets = h;
                            for (
d = 0; d < a.hierarchy[c].keys.length; d++) {
                                var 
l = {};
                                for (
j in h) {
                                    for (
i = 0; i < a.hierarchy[c].keys[d].morphTargets.length; i++)
                                        if (
a.hierarchy[c].keys[d].morphTargets[i] === j) {
                                            
l[j] = a.hierarchy[c].keys[d].morphTargetsInfluences[i];
                                            break
                                        }
                                    
i === a.hierarchy[c].keys[d].morphTargets.length && (l[j] = 0)
                                }
                                
a.hierarchy[c].keys[d].morphTargetsInfluences = l
                            
}
                        }
                        for (
d = 1; d < a.hierarchy[c].keys.length; d++)
                            if (
a.hierarchy[c].keys[d].time === a.hierarchy[c].keys[d - 1].time) {
                                
a.hierarchy[c].keys.splice(d, 1);
                                
d--
                            }
                        for (
d = 0; d < a.hierarchy[c].keys.length; d++) a.hierarchy[c].keys[d].index = d
                    
}
                    
d = parseInt(a.length *
                        
a.fps, 10);
                    
a.JIT = {};
                    
a.JIT.hierarchy = [];
                    for (
c = 0; c < a.hierarchy.length; c++) a.JIT.hierarchy.push(Array(d));
                    
a.initialized = true
                
}
            },
            
get: function(a) {
                if (
typeof a === "string") {
                    if (
b[a]) return b[a];
                    
console.log("THREE.AnimationHandler.get: Couldn't find animation " + a);
                    return 
null
                
}
            },
            
parse: function(a) {
                var 
b = [];
                if (
a instanceof THREE.SkinnedMesh)
                    for (var 
c = 0; c < a.bones.length; c++) b.push(a.bones[c]);
                else 
d(a, b);
                return 
b
            
}
        },
        
d = function(a, b) {
            
b.push(a);
            for (var 
c = 0; c < a.children.length; c++) d(a.children[c], b)
        };
    
c.LINEAR = 0;
    
c.CATMULLROM =
        
1;
    
c.CATMULLROM_FORWARD = 2;
    return 
c
}();
THREE.Animation = function(a, b, c) {
    
this.root = a;
    
this.data = THREE.AnimationHandler.get(b);
    
this.hierarchy = THREE.AnimationHandler.parse(a);
    
this.currentTime = 0;
    
this.timeScale = 1;
    
this.isPlaying = false;
    
this.loop = this.isPaused = true;
    
this.interpolationType = c !== void 0 ? c : THREE.AnimationHandler.LINEAR;
    
this.points = [];
    
this.target = new THREE.Vector3
};
THREE.Animation.prototype.play = function(a, b) {
    if (
this.isPlaying === false) {
        
this.isPlaying = true;
        
this.loop = a !== void 0 ? a : true;
        
this.currentTime = b !== void 0 ? b : 0;
        var 
c, d = this.hierarchy.length,
            
e;
        for (
c = 0; c < d; c++) {
            
e = this.hierarchy[c];
            if (
this.interpolationType !== THREE.AnimationHandler.CATMULLROM_FORWARD) e.useQuaternion = true;
            
e.matrixAutoUpdate = true;
            if (
e.animationCache === void 0) {
                
e.animationCache = {};
                
e.animationCache.prevKey = {
                    
pos: 0,
                    
rot: 0,
                    
scl: 0
                
};
                
e.animationCache.nextKey = {
                    
pos: 0,
                    
rot: 0,
                    
scl: 0
                
};
                
e.animationCache.originalMatrix =
                    
e instanceof THREE.Bone ? e.skinMatrix : e.matrix
            
}
            var 
f = e.animationCache.prevKey;
            
e = e.animationCache.nextKey;
            
f.pos = this.data.hierarchy[c].keys[0];
            
f.rot = this.data.hierarchy[c].keys[0];
            
f.scl = this.data.hierarchy[c].keys[0];
            
e.pos = this.getNextKeyWith("pos", c, 1);
            
e.rot = this.getNextKeyWith("rot", c, 1);
            
e.scl = this.getNextKeyWith("scl", c, 1)
        }
        
this.update(0)
    }
    
this.isPaused = false;
    
THREE.AnimationHandler.addToUpdate(this)
};
THREE.Animation.prototype.pause = function() {
    
this.isPaused === true ? THREE.AnimationHandler.addToUpdate(this) : THREE.AnimationHandler.removeFromUpdate(this);
    
this.isPaused = !this.isPaused
};
THREE.Animation.prototype.stop = function() {
    
this.isPaused = this.isPlaying = false;
    
THREE.AnimationHandler.removeFromUpdate(this)
};
THREE.Animation.prototype.update = function(a) {
    if (
this.isPlaying !== false) {
        var 
b = ["pos", "rot", "scl"],
            
c, d, e, f, g, h, i, j, l;
        
l = this.currentTime = this.currentTime + a * this.timeScale;
        
j = this.currentTime = this.currentTime % this.data.length;
        
parseInt(Math.min(j * this.data.fps, this.data.length * this.data.fps), 10);
        for (var 
m = 0, n = this.hierarchy.length; m < n; m++) {
            
a = this.hierarchy[m];
            
i = a.animationCache;
            for (var 
p = 0; p < 3; p++) {
                
c = b[p];
                
g = i.prevKey[c];
                
h = i.nextKey[c];
                if (
h.time <= l) {
                    if (
j < l)
                        if (
this.loop) {
                            
g = this.data.hierarchy[m].keys[0];
                            for (
h = this.getNextKeyWith(c, m, 1); h.time < j;) {
                                
g = h;
                                
h = this.getNextKeyWith(c, m, h.index + 1)
                            }
                        } else {
                            
this.stop();
                            return
                        } else {
                        do {
                            
g = h;
                            
h = this.getNextKeyWith(c, m, h.index + 1)
                        } while (
h.time < j)
                    }
                    
i.prevKey[c] = g;
                    
i.nextKey[c] = h
                
}
                
a.matrixAutoUpdate = true;
                
a.matrixWorldNeedsUpdate = true;
                
d = (j - g.time) / (h.time - g.time);
                
e = g[c];
                
f = h[c];
                if (
d < 0 || d > 1) {
                    
console.log("THREE.Animation.update: Warning! Scale out of bounds:" + d + " on bone " + m);
                    
d = d < 0 ? 0 : 1
                
}
                if (
c === "pos") {
                    
c = a.position;
                    if (
this.interpolationType === THREE.AnimationHandler.LINEAR) {
                        
c.x = e[0] +
                            (
f[0] - e[0]) * d;
                        
c.y = e[1] + (f[1] - e[1]) * d;
                        
c.z = e[2] + (f[2] - e[2]) * d
                    
} else if (this.interpolationType === THREE.AnimationHandler.CATMULLROM || this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD) {
                        
this.points[0] = this.getPrevKeyWith("pos", m, g.index - 1).pos;
                        
this.points[1] = e;
                        
this.points[2] = f;
                        
this.points[3] = this.getNextKeyWith("pos", m, h.index + 1).pos;
                        
d = d * 0.33 + 0.33;
                        
e = this.interpolateCatmullRom(this.points, d);
                        
c.x = e[0];
                        
c.y = e[1];
                        
c.z = e[2];
                        if (
this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD) {
                            
d =
                                
this.interpolateCatmullRom(this.points, d * 1.01);
                            
this.target.set(d[0], d[1], d[2]);
                            
this.target.subSelf(c);
                            
this.target.y = 0;
                            
this.target.normalize();
                            
d = Math.atan2(this.target.x, this.target.z);
                            
a.rotation.set(0, d, 0)
                        }
                    }
                } else if (
c === "rot") THREE.Quaternion.slerp(e, f, a.quaternion, d);
                else if (
c === "scl") {
                    
c = a.scale;
                    
c.x = e[0] + (f[0] - e[0]) * d;
                    
c.y = e[1] + (f[1] - e[1]) * d;
                    
c.z = e[2] + (f[2] - e[2]) * d
                
}
            }
        }
    }
};
THREE.Animation.prototype.interpolateCatmullRom = function(a, b) {
    var 
c = [],
        
d = [],
        
e, f, g, h, i, j;
    
e = (a.length - 1) * b;
    
f = Math.floor(e);
    
e = e - f;
    
c[0] = f === 0 ? f : f - 1;
    
c[1] = f;
    
c[2] = f > a.length - 2 ? f : f + 1;
    
c[3] = f > a.length - 3 ? f : f + 2;
    
f = a[c[0]];
    
h = a[c[1]];
    
i = a[c[2]];
    
j = a[c[3]];
    
c = e * e;
    
g = e * c;
    
d[0] = this.interpolate(f[0], h[0], i[0], j[0], e, c, g);
    
d[1] = this.interpolate(f[1], h[1], i[1], j[1], e, c, g);
    
d[2] = this.interpolate(f[2], h[2], i[2], j[2], e, c, g);
    return 
d
};
THREE.Animation.prototype.interpolate = function(a, b, c, d, e, f, g) {
    
a = (c - a) * 0.5;
    
d = (d - b) * 0.5;
    return (
2 * (b - c) + a + d) * g + (-3 * (b - c) - 2 * a - d) * f + a * e + b
};
THREE.Animation.prototype.getNextKeyWith = function(a, b, c) {
    for (var 
d = this.data.hierarchy[b].keys, c = this.interpolationType === THREE.AnimationHandler.CATMULLROM || this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ? c < d.length - 1 ? c : d.length - 1 : c % d.length; c < d.length; c++)
        if (
d[c][a] !== void 0) return d[c];
    return 
this.data.hierarchy[b].keys[0]
};
THREE.Animation.prototype.getPrevKeyWith = function(a, b, c) {
    for (var 
d = this.data.hierarchy[b].keys, c = this.interpolationType === THREE.AnimationHandler.CATMULLROM || this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ? c > 0 ? c : 0 : c >= 0 ? c : c + d.length; c >= 0; c--)
        if (
d[c][a] !== void 0) return d[c];
    return 
this.data.hierarchy[b].keys[d.length - 1]
};
THREE.KeyFrameAnimation = function(a, b, c) {
    
this.root = a;
    
this.data = THREE.AnimationHandler.get(b);
    
this.hierarchy = THREE.AnimationHandler.parse(a);
    
this.currentTime = 0;
    
this.timeScale = 0.0010;
    
this.isPlaying = false;
    
this.loop = this.isPaused = true;
    
this.JITCompile = c !== void 0 ? c : true;
    
a = 0;
    for (
b = this.hierarchy.length; a < b; a++) {
        var 
c = this.data.hierarchy[a].sids,
            
d = this.hierarchy[a];
        if (
this.data.hierarchy[a].keys.length && c) {
            for (var 
e = 0; e < c.length; e++) {
                var 
f = c[e],
                    
g = this.getNextKeyWith(f, a, 0);
                
g && g.apply(f)
            }
            
d.matrixAutoUpdate =
                
false;
            
this.data.hierarchy[a].node.updateMatrix();
            
d.matrixWorldNeedsUpdate = true
        
}
    }
};
THREE.KeyFrameAnimation.prototype.play = function(a, b) {
    if (!
this.isPlaying) {
        
this.isPlaying = true;
        
this.loop = a !== void 0 ? a : true;
        
this.currentTime = b !== void 0 ? b : 0;
        
this.startTimeMs = b;
        
this.startTime = 1E7;
        
this.endTime = -this.startTime;
        var 
c, d = this.hierarchy.length,
            
e, f;
        for (
c = 0; c < d; c++) {
            
e = this.hierarchy[c];
            
f = this.data.hierarchy[c];
            
e.useQuaternion = true;
            if (
f.animationCache === void 0) {
                
f.animationCache = {};
                
f.animationCache.prevKey = null;
                
f.animationCache.nextKey = null;
                
f.animationCache.originalMatrix = e instanceof THREE.Bone ?
                    
e.skinMatrix : e.matrix
            
}
            
e = this.data.hierarchy[c].keys;
            if (
e.length) {
                
f.animationCache.prevKey = e[0];
                
f.animationCache.nextKey = e[1];
                
this.startTime = Math.min(e[0].time, this.startTime);
                
this.endTime = Math.max(e[e.length - 1].time, this.endTime)
            }
        }
        
this.update(0)
    }
    
this.isPaused = false;
    
THREE.AnimationHandler.addToUpdate(this)
};
THREE.KeyFrameAnimation.prototype.pause = function() {
    
this.isPaused ? THREE.AnimationHandler.addToUpdate(this) : THREE.AnimationHandler.removeFromUpdate(this);
    
this.isPaused = !this.isPaused
};
THREE.KeyFrameAnimation.prototype.stop = function() {
    
this.isPaused = this.isPlaying = false;
    
THREE.AnimationHandler.removeFromUpdate(this);
    for (var 
a = 0; a < this.data.hierarchy.length; a++) {
        var 
b = this.hierarchy[a],
            
c = this.data.hierarchy[a];
        if (
c.animationCache !== void 0) {
            var 
d = c.animationCache.originalMatrix;
            if (
b instanceof THREE.Bone) {
                
d.copy(b.skinMatrix);
                
b.skinMatrix = d
            
} else {
                
d.copy(b.matrix);
                
b.matrix = d
            
}
            
delete c.animationCache
        
}
    }
};
THREE.KeyFrameAnimation.prototype.update = function(a) {
    if (
this.isPlaying) {
        var 
b, c, d, e, f = this.data.JIT.hierarchy,
            
g, h, i;
        
h = this.currentTime = this.currentTime + a * this.timeScale;
        
g = this.currentTime = this.currentTime % this.data.length;
        if (
g < this.startTimeMs) g = this.currentTime = this.startTimeMs + g;
        
e = parseInt(Math.min(g * this.data.fps, this.data.length * this.data.fps), 10);
        if ((
i = g < h) && !this.loop) {
            for (var 
a = 0, j = this.hierarchy.length; a < j; a++) {
                var 
l = this.data.hierarchy[a].keys,
                    
f = this.data.hierarchy[a].sids;
                
d = l.length - 1;
                
e =
                    
this.hierarchy[a];
                if (
l.length) {
                    for (
l = 0; l < f.length; l++) {
                        
g = f[l];
                        (
h = this.getPrevKeyWith(g, a, d)) && h.apply(g)
                    }
                    
this.data.hierarchy[a].node.updateMatrix();
                    
e.matrixWorldNeedsUpdate = true
                
}
            }
            
this.stop()
        } else if (!(
g < this.startTime)) {
            
a = 0;
            for (
j = this.hierarchy.length; a < j; a++) {
                
d = this.hierarchy[a];
                
b = this.data.hierarchy[a];
                var 
l = b.keys,
                    
m = b.animationCache;
                if (
this.JITCompile && f[a][e] !== void 0)
                    if (
d instanceof THREE.Bone) {
                        
d.skinMatrix = f[a][e];
                        
d.matrixWorldNeedsUpdate = false
                    
} else {
                        
d.matrix = f[a][e];
                        
d.matrixWorldNeedsUpdate =
                            
true
                    
} else if (l.length) {
                    if (
this.JITCompile && m) d instanceof THREE.Bone ? d.skinMatrix = m.originalMatrix : d.matrix = m.originalMatrix;
                    
b = m.prevKey;
                    
c = m.nextKey;
                    if (
b && c) {
                        if (
c.time <= h) {
                            if (
i && this.loop) {
                                
b = l[0];
                                for (
c = l[1]; c.time < g;) {
                                    
b = c;
                                    
c = l[b.index + 1]
                                }
                            } else if (!
i)
                                for (var 
n = l.length - 1; c.time < g && c.index !== n;) {
                                    
b = c;
                                    
c = l[b.index + 1]
                                }
                            
m.prevKey = b;
                            
m.nextKey = c
                        
}
                        
c.time >= g ? b.interpolate(c, g) : b.interpolate(c, c.time)
                    }
                    
this.data.hierarchy[a].node.updateMatrix();
                    
d.matrixWorldNeedsUpdate = true
                
}
            }
            if (
this.JITCompile && f[0][e] === void 0) {
                
this.hierarchy[0].updateMatrixWorld(true);
                for (
a = 0; a < this.hierarchy.length; a++) f[a][e] = this.hierarchy[a] instanceof THREE.Bone ? this.hierarchy[a].skinMatrix.clone() : this.hierarchy[a].matrix.clone()
            }
        }
    }
};
THREE.KeyFrameAnimation.prototype.getNextKeyWith = function(a, b, c) {
    
b = this.data.hierarchy[b].keys;
    for (
c = c % b.length; c < b.length; c++)
        if (
b[c].hasTarget(a)) return b[c];
    return 
b[0]
};
THREE.KeyFrameAnimation.prototype.getPrevKeyWith = function(a, b, c) {
    
b = this.data.hierarchy[b].keys;
    for (
c = c >= 0 ? c : c + b.length; c >= 0; c--)
        if (
b[c].hasTarget(a)) return b[c];
    return 
b[b.length - 1]
};
THREE.CubeCamera = function(a, b, c) {
    
THREE.Object3D.call(this);
    var 
d = new THREE.PerspectiveCamera(90, 1, a, b);
    
d.up.set(0, -1, 0);
    
d.lookAt(new THREE.Vector3(1, 0, 0));
    
this.add(d);
    var 
e = new THREE.PerspectiveCamera(90, 1, a, b);
    
e.up.set(0, -1, 0);
    
e.lookAt(new THREE.Vector3(-1, 0, 0));
    
this.add(e);
    var 
f = new THREE.PerspectiveCamera(90, 1, a, b);
    
f.up.set(0, 0, 1);
    
f.lookAt(new THREE.Vector3(0, 1, 0));
    
this.add(f);
    var 
g = new THREE.PerspectiveCamera(90, 1, a, b);
    
g.up.set(0, 0, -1);
    
g.lookAt(new THREE.Vector3(0, -1, 0));
    
this.add(g);
    var 
h = new THREE.PerspectiveCamera(90,
        
1, a, b);
    
h.up.set(0, -1, 0);
    
h.lookAt(new THREE.Vector3(0, 0, 1));
    
this.add(h);
    var 
i = new THREE.PerspectiveCamera(90, 1, a, b);
    
i.up.set(0, -1, 0);
    
i.lookAt(new THREE.Vector3(0, 0, -1));
    
this.add(i);
    
this.renderTarget = new THREE.WebGLRenderTargetCube(c, c, {
        
format: THREE.RGBFormat,
        
magFilter: THREE.LinearFilter,
        
minFilter: THREE.LinearFilter
    
});
    
this.updateCubeMap = function(a, b) {
        var 
c = this.renderTarget,
            
n = c.generateMipmaps;
        
c.generateMipmaps = false;
        
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.generateMipmaps = n;
        
c.activeCubeFace = 5;
        
a.render(b, i, c)
    }
};
THREE.CubeCamera.prototype = Object.create(THREE.Object3D.prototype);
THREE.CombinedCamera = function(a, b, c, d, e, f, g) {
    
THREE.Camera.call(this);
    
this.fov = c;
    
this.left = -a / 2;
    
this.right = a / 2;
    
this.top = b / 2;
    
this.bottom = -b / 2;
    
this.cameraO = new THREE.OrthographicCamera(a / -2, a / 2, b / 2, b / -2, f, g);
    
this.cameraP = new THREE.PerspectiveCamera(c, a / b, d, e);
    
this.zoom = 1;
    
this.toPerspective()
};
THREE.CombinedCamera.prototype = Object.create(THREE.Camera.prototype);
THREE.CombinedCamera.prototype.toPerspective = function() {
    
this.near = this.cameraP.near;
    
this.far = this.cameraP.far;
    
this.cameraP.fov = this.fov / this.zoom;
    
this.cameraP.updateProjectionMatrix();
    
this.projectionMatrix = this.cameraP.projectionMatrix;
    
this.inPerspectiveMode = true;
    
this.inOrthographicMode = false
};
THREE.CombinedCamera.prototype.toOrthographic = function() {
    var 
a = this.cameraP.aspect,
        
b = (this.cameraP.near + this.cameraP.far) / 2,
        
b = Math.tan(this.fov / 2) * b,
        
a = 2 * b * a / 2,
        
b = b / this.zoom,
        
a = a / this.zoom;
    
this.cameraO.left = -a;
    
this.cameraO.right = a;
    
this.cameraO.top = b;
    
this.cameraO.bottom = -b;
    
this.cameraO.updateProjectionMatrix();
    
this.near = this.cameraO.near;
    
this.far = this.cameraO.far;
    
this.projectionMatrix = this.cameraO.projectionMatrix;
    
this.inPerspectiveMode = false;
    
this.inOrthographicMode = true
};
THREE.CombinedCamera.prototype.setSize = function(a, b) {
    
this.cameraP.aspect = a / b;
    
this.left = -a / 2;
    
this.right = a / 2;
    
this.top = b / 2;
    
this.bottom = -b / 2
};
THREE.CombinedCamera.prototype.setFov = function(a) {
    
this.fov = a;
    
this.inPerspectiveMode ? this.toPerspective() : this.toOrthographic()
};
THREE.CombinedCamera.prototype.updateProjectionMatrix = function() {
    if (
this.inPerspectiveMode) this.toPerspective();
    else {
        
this.toPerspective();
        
this.toOrthographic()
    }
};
THREE.CombinedCamera.prototype.setLens = function(a, b) {
    var 
c = 2 * Math.atan((b !== void 0 ? b : 24) / (a * 2)) * (180 / Math.PI);
    
this.setFov(c);
    return 
c
};
THREE.CombinedCamera.prototype.setZoom = function(a) {
    
this.zoom = a;
    
this.inPerspectiveMode ? this.toPerspective() : this.toOrthographic()
};
THREE.CombinedCamera.prototype.toFrontView = function() {
    
this.rotation.x = 0;
    
this.rotation.y = 0;
    
this.rotation.z = 0;
    
this.rotationAutoUpdate = false
};
THREE.CombinedCamera.prototype.toBackView = function() {
    
this.rotation.x = 0;
    
this.rotation.y = Math.PI;
    
this.rotation.z = 0;
    
this.rotationAutoUpdate = false
};
THREE.CombinedCamera.prototype.toLeftView = function() {
    
this.rotation.x = 0;
    
this.rotation.y = -Math.PI / 2;
    
this.rotation.z = 0;
    
this.rotationAutoUpdate = false
};
THREE.CombinedCamera.prototype.toRightView = function() {
    
this.rotation.x = 0;
    
this.rotation.y = Math.PI / 2;
    
this.rotation.z = 0;
    
this.rotationAutoUpdate = false
};
THREE.CombinedCamera.prototype.toTopView = function() {
    
this.rotation.x = -Math.PI / 2;
    
this.rotation.y = 0;
    
this.rotation.z = 0;
    
this.rotationAutoUpdate = false
};
THREE.CombinedCamera.prototype.toBottomView = function() {
    
this.rotation.x = Math.PI / 2;
    
this.rotation.y = 0;
    
this.rotation.z = 0;
    
this.rotationAutoUpdate = false
};
THREE.FirstPersonControls = function(a, b) {
    function 
c(a, b) {
        return function() {
            
b.apply(a, arguments)
        }
    }
    
this.object = a;
    
this.target = new THREE.Vector3(0, 0, 0);
    
this.domElement = b !== void 0 ? b : document;
    
this.movementSpeed = 1;
    
this.lookSpeed = 0.0050;
    
this.lookVertical = true;
    
this.autoForward = false;
    
this.activeLook = true;
    
this.heightSpeed = false;
    
this.heightCoef = 1;
    
this.heightMin = 0;
    
this.heightMax = 1;
    
this.constrainVertical = false;
    
this.verticalMin = 0;
    
this.verticalMax = Math.PI;
    
this.theta = this.phi = this.lon = this.lat = this.mouseY = this.mouseX =
        
this.autoSpeedFactor = 0;
    
this.mouseDragOn = this.freeze = this.moveRight = this.moveLeft = this.moveBackward = this.moveForward = false;
    
this.viewHalfY = this.viewHalfX = 0;
    
this.domElement !== document && this.domElement.setAttribute("tabindex", -1);
    
this.handleResize = function() {
        if (
this.domElement === document) {
            
this.viewHalfX = window.innerWidth / 2;
            
this.viewHalfY = window.innerHeight / 2
        
} else {
            
this.viewHalfX = this.domElement.offsetWidth / 2;
            
this.viewHalfY = this.domElement.offsetHeight / 2
        
}
    };
    
this.onMouseDown = function(a) {
        
this.domElement !==
            
document && this.domElement.focus();
        
a.preventDefault();
        
a.stopPropagation();
        if (
this.activeLook) switch (a.button) {
            case 
0:
                
this.moveForward = true;
                break;
            case 
2:
                
this.moveBackward = true
        
}
        
this.mouseDragOn = true
    
};
    
this.onMouseUp = function(a) {
        
a.preventDefault();
        
a.stopPropagation();
        if (
this.activeLook) switch (a.button) {
            case 
0:
                
this.moveForward = false;
                break;
            case 
2:
                
this.moveBackward = false
        
}
        
this.mouseDragOn = false
    
};
    
this.onMouseMove = function(a) {
        if (
this.domElement === document) {
            
this.mouseX = a.pageX - this.viewHalfX;
            
this.mouseY = a.pageY -
                
this.viewHalfY
        
} else {
            
this.mouseX = a.pageX - this.domElement.offsetLeft - this.viewHalfX;
            
this.mouseY = a.pageY - this.domElement.offsetTop - this.viewHalfY
        
}
    };
    
this.onKeyDown = function(a) {
        switch (
a.keyCode) {
            case 
38:
            case 
87:
                
this.moveForward = true;
                break;
            case 
37:
            case 
65:
                
this.moveLeft = true;
                break;
            case 
40:
            case 
83:
                
this.moveBackward = true;
                break;
            case 
39:
            case 
68:
                
this.moveRight = true;
                break;
            case 
82:
                
this.moveUp = true;
                break;
            case 
70:
                
this.moveDown = true;
                break;
            case 
81:
                
this.freeze = !this.freeze
        
}
    };
    
this.onKeyUp = function(a) {
        switch (
a.keyCode) {
            case 
38:
            case 
87:
                
this.moveForward =
                    
false;
                break;
            case 
37:
            case 
65:
                
this.moveLeft = false;
                break;
            case 
40:
            case 
83:
                
this.moveBackward = false;
                break;
            case 
39:
            case 
68:
                
this.moveRight = false;
                break;
            case 
82:
                
this.moveUp = false;
                break;
            case 
70:
                
this.moveDown = false
        
}
    };
    
this.update = function(a) {
        var 
b = 0;
        if (!
this.freeze) {
            if (
this.heightSpeed) {
                
b = THREE.Math.clamp(this.object.position.y, this.heightMin, this.heightMax) - this.heightMin;
                
this.autoSpeedFactor = a * b * this.heightCoef
            
} else this.autoSpeedFactor = 0;
            
b = a * this.movementSpeed;
            (
this.moveForward || this.autoForward && !this.moveBackward) &&
            
this.object.translateZ(-(b + this.autoSpeedFactor));
            
this.moveBackward && this.object.translateZ(b);
            
this.moveLeft && this.object.translateX(-b);
            
this.moveRight && this.object.translateX(b);
            
this.moveUp && this.object.translateY(b);
            
this.moveDown && this.object.translateY(-b);
            
a = a * this.lookSpeed;
            
this.activeLook || (a = 0);
            
this.lon = this.lon + this.mouseX * a;
            if (
this.lookVertical) this.lat = this.lat - this.mouseY * a;
            
this.lat = Math.max(-85, Math.min(85, this.lat));
            
this.phi = (90 - this.lat) * Math.PI / 180;
            
this.theta = this.lon * Math.PI / 180;
            var 
b =
                
this.target,
                
c = this.object.position;
            
b.x = c.x + 100 * Math.sin(this.phi) * Math.cos(this.theta);
            
b.y = c.y + 100 * Math.cos(this.phi);
            
b.z = c.z + 100 * Math.sin(this.phi) * Math.sin(this.theta);
            
b = 1;
            
this.constrainVertical && (b = Math.PI / (this.verticalMax - this.verticalMin));
            
this.lon = this.lon + this.mouseX * a;
            if (
this.lookVertical) this.lat = this.lat - this.mouseY * a * b;
            
this.lat = Math.max(-85, Math.min(85, this.lat));
            
this.phi = (90 - this.lat) * Math.PI / 180;
            
this.theta = this.lon * Math.PI / 180;
            if (
this.constrainVertical) this.phi = THREE.Math.mapLinear(this.phi,
                
0, Math.PI, this.verticalMin, this.verticalMax);
            
b = this.target;
            
c = this.object.position;
            
b.x = c.x + 100 * Math.sin(this.phi) * Math.cos(this.theta);
            
b.y = c.y + 100 * Math.cos(this.phi);
            
b.z = c.z + 100 * Math.sin(this.phi) * Math.sin(this.theta);
            
this.object.lookAt(b)
        }
    };
    
this.domElement.addEventListener("contextmenu", function(a) {
        
a.preventDefault()
    }, 
false);
    
this.domElement.addEventListener("mousemove", c(this, this.onMouseMove), false);
    
this.domElement.addEventListener("mousedown", c(this, this.onMouseDown), false);
    
this.domElement.addEventListener("mouseup",
        
c(this, this.onMouseUp), false);
    
this.domElement.addEventListener("keydown", c(this, this.onKeyDown), false);
    
this.domElement.addEventListener("keyup", c(this, this.onKeyUp), false);
    
this.handleResize()
};
THREE.PathControls = function(a, b) {
    function 
c(a) {
        return (
a = a * 2) < 1 ? 0.5 * a * a : -0.5 * (--a * (a - 2) - 1)
    }

    function 
d(a, b) {
        return function() {
            
b.apply(a, arguments)
        }
    }

    function 
e(a, b, c, d) {
        var 
e = {
                
name: c,
                
fps: 0.6,
                
length: d,
                
hierarchy: []
            },
            
f, g = b.getControlPointsArray(),
            
h = b.getLength(),
            
q = g.length,
            
s = 0;
        
f = q - 1;
        
b = {
            
parent: -1,
            
keys: []
        };
        
b.keys[0] = {
            
time: 0,
            
pos: g[0],
            
rot: [0, 0, 0, 1],
            
scl: [1, 1, 1]
        };
        
b.keys[f] = {
            
time: d,
            
pos: g[f],
            
rot: [0, 0, 0, 1],
            
scl: [1, 1, 1]
        };
        for (
f = 1; f < q - 1; f++) {
            
s = d * h.chunks[f] / h.total;
            
b.keys[f] = {
                
time: s,
                
pos: g[f]
            }
        }
        
e.hierarchy[0] = b;
        
THREE.AnimationHandler.add(e);
        return new 
THREE.Animation(a, c, THREE.AnimationHandler.CATMULLROM_FORWARD, false)
    }

    function 
f(a, b) {
        var 
c, d, e = new THREE.Geometry;
        for (
c = 0; c < a.points.length * b; c++) {
            
d = c / (a.points.length * b);
            
d = a.getPoint(d);
            
e.vertices[c] = new THREE.Vector3(d.x, d.y, d.z)
        }
        return 
e
    
}
    
this.object = a;
    
this.domElement = b !== void 0 ? b : document;
    
this.id = "PathControls" + THREE.PathControlsIdCounter++;
    
this.duration = 1E4;
    
this.waypoints = [];
    
this.useConstantSpeed = true;
    
this.resamplingCoef = 50;
    
this.debugPath = new THREE.Object3D;
    
this.debugDummy = new THREE.Object3D;
    
this.animationParent = new THREE.Object3D;
    
this.lookSpeed = 0.0050;
    
this.lookHorizontal = this.lookVertical = true;
    
this.verticalAngleMap = {
        
srcRange: [0, 2 * Math.PI],
        
dstRange: [0, 2 * Math.PI]
    };
    
this.horizontalAngleMap = {
        
srcRange: [0, 2 * Math.PI],
        
dstRange: [0, 2 * Math.PI]
    };
    
this.target = new THREE.Object3D;
    
this.theta = this.phi = this.lon = this.lat = this.mouseY = this.mouseX = 0;
    var 
g = Math.PI * 2,
        
h = Math.PI / 180;
    
this.viewHalfY = this.viewHalfX = 0;
    
this.domElement !== document && this.domElement.setAttribute("tabindex", -1);
    
this.handleResize = function() {
        if (
this.domElement ===
            
document) {
            
this.viewHalfX = window.innerWidth / 2;
            
this.viewHalfY = window.innerHeight / 2
        
} else {
            
this.viewHalfX = this.domElement.offsetWidth / 2;
            
this.viewHalfY = this.domElement.offsetHeight / 2
        
}
    };
    
this.update = function(a) {
        var 
b;
        if (
this.lookHorizontal) this.lon = this.lon + this.mouseX * this.lookSpeed * a;
        if (
this.lookVertical) this.lat = this.lat - this.mouseY * this.lookSpeed * a;
        
this.lon = Math.max(0, Math.min(360, this.lon));
        
this.lat = Math.max(-85, Math.min(85, this.lat));
        
this.phi = (90 - this.lat) * h;
        
this.theta = this.lon * h;
        
a = this.phi % g;
        
this.phi =
            
a >= 0 ? a : a + g;
        
b = this.verticalAngleMap.srcRange;
        
a = this.verticalAngleMap.dstRange;
        
b = THREE.Math.mapLinear(this.phi, b[0], b[1], a[0], a[1]);
        var 
d = a[1] - a[0];
        
this.phi = c((b - a[0]) / d) * d + a[0];
        
b = this.horizontalAngleMap.srcRange;
        
a = this.horizontalAngleMap.dstRange;
        
b = THREE.Math.mapLinear(this.theta, b[0], b[1], a[0], a[1]);
        
d = a[1] - a[0];
        
this.theta = c((b - a[0]) / d) * d + a[0];
        
a = this.target.position;
        
a.x = 100 * Math.sin(this.phi) * Math.cos(this.theta);
        
a.y = 100 * Math.cos(this.phi);
        
a.z = 100 * Math.sin(this.phi) * Math.sin(this.theta);
        
this.object.lookAt(this.target.position)
    };
    
this.onMouseMove = function(a) {
        if (
this.domElement === document) {
            
this.mouseX = a.pageX - this.viewHalfX;
            
this.mouseY = a.pageY - this.viewHalfY
        
} else {
            
this.mouseX = a.pageX - this.domElement.offsetLeft - this.viewHalfX;
            
this.mouseY = a.pageY - this.domElement.offsetTop - this.viewHalfY
        
}
    };
    
this.init = function() {
        
this.spline = new THREE.Spline;
        
this.spline.initFromArray(this.waypoints);
        
this.useConstantSpeed && this.spline.reparametrizeByArcLength(this.resamplingCoef);
        if (
this.createDebugDummy) {
            var 
a = new THREE.MeshLambertMaterial({
                    
color: 30719
                
}),
                
b = new THREE.MeshLambertMaterial({
                    
color: 65280
                
}),
                
c = new THREE.CubeGeometry(10, 10, 20),
                
g = new THREE.CubeGeometry(2, 2, 10);
            
this.animationParent = new THREE.Mesh(c, a);
            
a = new THREE.Mesh(g, b);
            
a.position.set(0, 10, 0);
            
this.animation = e(this.animationParent, this.spline, this.id, this.duration);
            
this.animationParent.add(this.object);
            
this.animationParent.add(this.target);
            
this.animationParent.add(a)
        } else {
            
this.animation = e(this.animationParent, this.spline, this.id, this.duration);
            
this.animationParent.add(this.target);
            
this.animationParent.add(this.object)
        }
        if (
this.createDebugPath) {
            var 
a =
                
this.debugPath,
                
b = this.spline,
                
g = f(b, 10),
                
c = f(b, 10),
                
h = new THREE.LineBasicMaterial({
                    
color: 16711680,
                    
linewidth: 3
                
}),
                
g = new THREE.Line(g, h),
                
c = new THREE.ParticleSystem(c, new THREE.ParticleBasicMaterial({
                    
color: 16755200,
                    
size: 3
                
}));
            
g.scale.set(1, 1, 1);
            
a.add(g);
            
c.scale.set(1, 1, 1);
            
a.add(c);
            for (var 
g = new THREE.SphereGeometry(1, 16, 8), h = new THREE.MeshBasicMaterial({
                    
color: 65280
                
}), p = 0; p < b.points.length; p++) {
                
c = new THREE.Mesh(g, h);
                
c.position.copy(b.points[p]);
                
a.add(c)
            }
        }
        
this.domElement.addEventListener("mousemove", d(this,
            
this.onMouseMove), false)
    };
    
this.handleResize()
};
THREE.PathControlsIdCounter = 0;
THREE.FlyControls = function(a, b) {
    function 
c(a, b) {
        return function() {
            
b.apply(a, arguments)
        }
    }
    
this.object = a;
    
this.domElement = b !== void 0 ? b : document;
    
b && this.domElement.setAttribute("tabindex", -1);
    
this.movementSpeed = 1;
    
this.rollSpeed = 0.0050;
    
this.autoForward = this.dragToLook = false;
    
this.object.useQuaternion = true;
    
this.tmpQuaternion = new THREE.Quaternion;
    
this.mouseStatus = 0;
    
this.moveState = {
        
up: 0,
        
down: 0,
        
left: 0,
        
right: 0,
        
forward: 0,
        
back: 0,
        
pitchUp: 0,
        
pitchDown: 0,
        
yawLeft: 0,
        
yawRight: 0,
        
rollLeft: 0,
        
rollRight: 0
    
};
    
this.moveVector =
        new 
THREE.Vector3(0, 0, 0);
    
this.rotationVector = new THREE.Vector3(0, 0, 0);
    
this.handleEvent = function(a) {
        if (
typeof this[a.type] == "function") this[a.type](a)
    };
    
this.keydown = function(a) {
        if (!
a.altKey) {
            switch (
a.keyCode) {
                case 
16:
                    
this.movementSpeedMultiplier = 0.1;
                    break;
                case 
87:
                    
this.moveState.forward = 1;
                    break;
                case 
83:
                    
this.moveState.back = 1;
                    break;
                case 
65:
                    
this.moveState.left = 1;
                    break;
                case 
68:
                    
this.moveState.right = 1;
                    break;
                case 
82:
                    
this.moveState.up = 1;
                    break;
                case 
70:
                    
this.moveState.down = 1;
                    break;
                case 
38:
                    
this.moveState.pitchUp =
                        
1;
                    break;
                case 
40:
                    
this.moveState.pitchDown = 1;
                    break;
                case 
37:
                    
this.moveState.yawLeft = 1;
                    break;
                case 
39:
                    
this.moveState.yawRight = 1;
                    break;
                case 
81:
                    
this.moveState.rollLeft = 1;
                    break;
                case 
69:
                    
this.moveState.rollRight = 1
            
}
            
this.updateMovementVector();
            
this.updateRotationVector()
        }
    };
    
this.keyup = function(a) {
        switch (
a.keyCode) {
            case 
16:
                
this.movementSpeedMultiplier = 1;
                break;
            case 
87:
                
this.moveState.forward = 0;
                break;
            case 
83:
                
this.moveState.back = 0;
                break;
            case 
65:
                
this.moveState.left = 0;
                break;
            case 
68:
                
this.moveState.right = 0;
                break;
            case 
82:
                
this.moveState.up =
                    
0;
                break;
            case 
70:
                
this.moveState.down = 0;
                break;
            case 
38:
                
this.moveState.pitchUp = 0;
                break;
            case 
40:
                
this.moveState.pitchDown = 0;
                break;
            case 
37:
                
this.moveState.yawLeft = 0;
                break;
            case 
39:
                
this.moveState.yawRight = 0;
                break;
            case 
81:
                
this.moveState.rollLeft = 0;
                break;
            case 
69:
                
this.moveState.rollRight = 0
        
}
        
this.updateMovementVector();
        
this.updateRotationVector()
    };
    
this.mousedown = function(a) {
        
this.domElement !== document && this.domElement.focus();
        
a.preventDefault();
        
a.stopPropagation();
        if (
this.dragToLook) this.mouseStatus++;
        else switch (
a.button) {
            case 
0:
                
this.object.moveForward =
                    
true;
                break;
            case 
2:
                
this.object.moveBackward = true
        
}
    };
    
this.mousemove = function(a) {
        if (!
this.dragToLook || this.mouseStatus > 0) {
            var 
b = this.getContainerDimensions(),
                
c = b.size[0] / 2,
                
g = b.size[1] / 2;
            
this.moveState.yawLeft = -(a.pageX - b.offset[0] - c) / c;
            
this.moveState.pitchDown = (a.pageY - b.offset[1] - g) / g;
            
this.updateRotationVector()
        }
    };
    
this.mouseup = function(a) {
        
a.preventDefault();
        
a.stopPropagation();
        if (
this.dragToLook) {
            
this.mouseStatus--;
            
this.moveState.yawLeft = this.moveState.pitchDown = 0
        
} else switch (a.button) {
            case 
0:
                
this.moveForward =
                    
false;
                break;
            case 
2:
                
this.moveBackward = false
        
}
        
this.updateRotationVector()
    };
    
this.update = function(a) {
        var 
b = a * this.movementSpeed,
            
a = a * this.rollSpeed;
        
this.object.translateX(this.moveVector.x * b);
        
this.object.translateY(this.moveVector.y * b);
        
this.object.translateZ(this.moveVector.z * b);
        
this.tmpQuaternion.set(this.rotationVector.x * a, this.rotationVector.y * a, this.rotationVector.z * a, 1).normalize();
        
this.object.quaternion.multiplySelf(this.tmpQuaternion);
        
this.object.matrix.setPosition(this.object.position);
        
this.object.matrix.setRotationFromQuaternion(this.object.quaternion);
        
this.object.matrixWorldNeedsUpdate = true
    
};
    
this.updateMovementVector = function() {
        var 
a = this.moveState.forward || this.autoForward && !this.moveState.back ? 1 : 0;
        
this.moveVector.x = -this.moveState.left + this.moveState.right;
        
this.moveVector.y = -this.moveState.down + this.moveState.up;
        
this.moveVector.z = -a + this.moveState.back
    
};
    
this.updateRotationVector = function() {
        
this.rotationVector.x = -this.moveState.pitchDown + this.moveState.pitchUp;
        
this.rotationVector.y = -this.moveState.yawRight + this.moveState.yawLeft;
        
this.rotationVector.z = -this.moveState.rollRight + this.moveState.rollLeft
    
};
    
this.getContainerDimensions = function() {
        return 
this.domElement != document ? {
            
size: [this.domElement.offsetWidth, this.domElement.offsetHeight],
            
offset: [this.domElement.offsetLeft, this.domElement.offsetTop]
        } : {
            
size: [window.innerWidth, window.innerHeight],
            
offset: [0, 0]
        }
    };
    
this.domElement.addEventListener("mousemove", c(this, this.mousemove), false);
    
this.domElement.addEventListener("mousedown", c(this, this.mousedown), false);
    
this.domElement.addEventListener("mouseup",
        
c(this, this.mouseup), false);
    
this.domElement.addEventListener("keydown", c(this, this.keydown), false);
    
this.domElement.addEventListener("keyup", c(this, this.keyup), false);
    
this.updateMovementVector();
    
this.updateRotationVector()
};
THREE.RollControls = function(a, b) {
    
this.object = a;
    
this.domElement = b !== void 0 ? b : document;
    
this.mouseLook = true;
    
this.autoForward = false;
    
this.rollSpeed = this.movementSpeed = this.lookSpeed = 1;
    
this.constrainVertical = [-0.9, 0.9];
    
this.object.matrixAutoUpdate = false;
    
this.forward = new THREE.Vector3(0, 0, 1);
    
this.roll = 0;
    var 
c = new THREE.Vector3,
        
d = new THREE.Vector3,
        
e = new THREE.Vector3,
        
f = new THREE.Matrix4,
        
g = false,
        
h = 1,
        
i = 0,
        
j = 0,
        
l = 0,
        
m = 0,
        
n = 0,
        
p = 0,
        
r = 0;
    
this.handleResize = function() {
        
p = window.innerWidth / 2;
        
r = window.innerHeight / 2
    
};
    
this.update =
        function(
a) {
            if (
this.mouseLook) {
                var 
b = a * this.lookSpeed;
                
this.rotateHorizontally(b * m);
                
this.rotateVertically(b * n)
            }
            
b = a * this.movementSpeed;
            
this.object.translateZ(-b * (i > 0 || this.autoForward && !(i < 0) ? 1 : i));
            
this.object.translateX(b * j);
            
this.object.translateY(b * l);
            if (
g) this.roll = this.roll + this.rollSpeed * a * h;
            if (
this.forward.y > this.constrainVertical[1]) {
                
this.forward.y = this.constrainVertical[1];
                
this.forward.normalize()
            } else if (
this.forward.y < this.constrainVertical[0]) {
                
this.forward.y = this.constrainVertical[0];
                
this.forward.normalize()
            }
            
e.copy(this.forward);
            
d.set(0, 1, 0);
            
c.cross(d, e).normalize();
            
d.cross(e, c).normalize();
            
this.object.matrix.elements[0] = c.x;
            
this.object.matrix.elements[4] = d.x;
            
this.object.matrix.elements[8] = e.x;
            
this.object.matrix.elements[1] = c.y;
            
this.object.matrix.elements[5] = d.y;
            
this.object.matrix.elements[9] = e.y;
            
this.object.matrix.elements[2] = c.z;
            
this.object.matrix.elements[6] = d.z;
            
this.object.matrix.elements[10] = e.z;
            
f.identity();
            
f.elements[0] = Math.cos(this.roll);
            
f.elements[4] = -Math.sin(this.roll);
            
f.elements[1] = Math.sin(this.roll);
            
f.elements[5] =
                
Math.cos(this.roll);
            
this.object.matrix.multiplySelf(f);
            
this.object.matrixWorldNeedsUpdate = true;
            
this.object.matrix.elements[12] = this.object.position.x;
            
this.object.matrix.elements[13] = this.object.position.y;
            
this.object.matrix.elements[14] = this.object.position.z
        
};
    
this.translateX = function(a) {
        
this.object.position.x = this.object.position.x + this.object.matrix.elements[0] * a;
        
this.object.position.y = this.object.position.y + this.object.matrix.elements[1] * a;
        
this.object.position.z = this.object.position.z + this.object.matrix.elements[2] *
            
a
    
};
    
this.translateY = function(a) {
        
this.object.position.x = this.object.position.x + this.object.matrix.elements[4] * a;
        
this.object.position.y = this.object.position.y + this.object.matrix.elements[5] * a;
        
this.object.position.z = this.object.position.z + this.object.matrix.elements[6] * a
    
};
    
this.translateZ = function(a) {
        
this.object.position.x = this.object.position.x - this.object.matrix.elements[8] * a;
        
this.object.position.y = this.object.position.y - this.object.matrix.elements[9] * a;
        
this.object.position.z = this.object.position.z -
            
this.object.matrix.elements[10] * a
    
};
    
this.rotateHorizontally = function(a) {
        
c.set(this.object.matrix.elements[0], this.object.matrix.elements[1], this.object.matrix.elements[2]);
        
c.multiplyScalar(a);
        
this.forward.subSelf(c);
        
this.forward.normalize()
    };
    
this.rotateVertically = function(a) {
        
d.set(this.object.matrix.elements[4], this.object.matrix.elements[5], this.object.matrix.elements[6]);
        
d.multiplyScalar(a);
        
this.forward.addSelf(d);
        
this.forward.normalize()
    };
    
this.domElement.addEventListener("contextmenu", function(a) {
            
a.preventDefault()
        },
        
false);
    
this.domElement.addEventListener("mousemove", function(a) {
        
m = (a.clientX - p) / window.innerWidth;
        
n = (a.clientY - r) / window.innerHeight
    
}, false);
    
this.domElement.addEventListener("mousedown", function(a) {
        
a.preventDefault();
        
a.stopPropagation();
        switch (
a.button) {
            case 
0:
                
i = 1;
                break;
            case 
2:
                
i = -1
        
}
    }, 
false);
    
this.domElement.addEventListener("mouseup", function(a) {
        
a.preventDefault();
        
a.stopPropagation();
        switch (
a.button) {
            case 
0:
                
i = 0;
                break;
            case 
2:
                
i = 0
        
}
    }, 
false);
    
this.domElement.addEventListener("keydown", function(a) {
        switch (
a.keyCode) {
            case 
38:
            case 
87:
                
i =
                    
1;
                break;
            case 
37:
            case 
65:
                
j = -1;
                break;
            case 
40:
            case 
83:
                
i = -1;
                break;
            case 
39:
            case 
68:
                
j = 1;
                break;
            case 
81:
                
g = true;
                
h = 1;
                break;
            case 
69:
                
g = true;
                
h = -1;
                break;
            case 
82:
                
l = 1;
                break;
            case 
70:
                
l = -1
        
}
    }, 
false);
    
this.domElement.addEventListener("keyup", function(a) {
        switch (
a.keyCode) {
            case 
38:
            case 
87:
                
i = 0;
                break;
            case 
37:
            case 
65:
                
j = 0;
                break;
            case 
40:
            case 
83:
                
i = 0;
                break;
            case 
39:
            case 
68:
                
j = 0;
                break;
            case 
81:
                
g = false;
                break;
            case 
69:
                
g = false;
                break;
            case 
82:
                
l = 0;
                break;
            case 
70:
                
l = 0
        
}
    }, 
false);
    
this.handleResize()
};
THREE.TrackballControls = function(a, b) {
    
THREE.EventTarget.call(this);
    var 
c = this;
    
this.object = a;
    
this.domElement = b !== void 0 ? b : document;
    
this.enabled = true;
    
this.screen = {
        
width: 0,
        
height: 0,
        
offsetLeft: 0,
        
offsetTop: 0
    
};
    
this.radius = (this.screen.width + this.screen.height) / 4;
    
this.rotateSpeed = 1;
    
this.zoomSpeed = 1.2;
    
this.panSpeed = 0.3;
    
this.staticMoving = this.noPan = this.noZoom = this.noRotate = false;
    
this.dynamicDampingFactor = 0.2;
    
this.minDistance = 0;
    
this.maxDistance = Infinity;
    
this.keys = [65, 83, 68];
    
this.target = new THREE.Vector3;
    var 
d =
        new 
THREE.Vector3,
        
e = false,
        
f = -1,
        
g = new THREE.Vector3,
        
h = new THREE.Vector3,
        
i = new THREE.Vector3,
        
j = new THREE.Vector2,
        
l = new THREE.Vector2,
        
m = new THREE.Vector2,
        
n = new THREE.Vector2,
        
p = {
            
type: "change"
        
};
    
this.handleResize = function() {
        
this.screen.width = window.innerWidth;
        
this.screen.height = window.innerHeight;
        
this.screen.offsetLeft = 0;
        
this.screen.offsetTop = 0;
        
this.radius = (this.screen.width + this.screen.height) / 4
    
};
    
this.handleEvent = function(a) {
        if (
typeof this[a.type] == "function") this[a.type](a)
    };
    
this.getMouseOnScreen = function(a,
        
b) {
        return new 
THREE.Vector2((a - c.screen.offsetLeft) / c.radius * 0.5, (b - c.screen.offsetTop) / c.radius * 0.5)
    };
    
this.getMouseProjectionOnBall = function(a, b) {
        var 
d = new THREE.Vector3((a - c.screen.width * 0.5 - c.screen.offsetLeft) / c.radius, (c.screen.height * 0.5 + c.screen.offsetTop - b) / c.radius, 0),
            
e = d.length();
        
e > 1 ? d.normalize() : d.z = Math.sqrt(1 - e * e);
        
g.copy(c.object.position).subSelf(c.target);
        
e = c.object.up.clone().setLength(d.y);
        
e.addSelf(c.object.up.clone().crossSelf(g).setLength(d.x));
        
e.addSelf(g.setLength(d.z));
        return 
e
    
};
    
this.rotateCamera = function() {
        var 
a = Math.acos(h.dot(i) / h.length() / i.length());
        if (
a) {
            var 
b = (new THREE.Vector3).cross(h, i).normalize(),
                
d = new THREE.Quaternion,
                
a = a * c.rotateSpeed;
            
d.setFromAxisAngle(b, -a);
            
d.multiplyVector3(g);
            
d.multiplyVector3(c.object.up);
            
d.multiplyVector3(i);
            if (
c.staticMoving) h = i;
            else {
                
d.setFromAxisAngle(b, a * (c.dynamicDampingFactor - 1));
                
d.multiplyVector3(h)
            }
        }
    };
    
this.zoomCamera = function() {
        var 
a = 1 + (l.y - j.y) * c.zoomSpeed;
        if (
a !== 1 && a > 0) {
            
g.multiplyScalar(a);
            
c.staticMoving ? j = l : j.y = j.y + (l.y - j.y) *
                
this.dynamicDampingFactor
        
}
    };
    
this.panCamera = function() {
        var 
a = n.clone().subSelf(m);
        if (
a.lengthSq()) {
            
a.multiplyScalar(g.length() * c.panSpeed);
            var 
b = g.clone().crossSelf(c.object.up).setLength(a.x);
            
b.addSelf(c.object.up.clone().setLength(a.y));
            
c.object.position.addSelf(b);
            
c.target.addSelf(b);
            
c.staticMoving ? m = n : m.addSelf(a.sub(n, m).multiplyScalar(c.dynamicDampingFactor))
        }
    };
    
this.checkDistances = function() {
        if (!
c.noZoom || !c.noPan) {
            
c.object.position.lengthSq() > c.maxDistance * c.maxDistance && c.object.position.setLength(c.maxDistance);
            
g.lengthSq() < c.minDistance * c.minDistance && c.object.position.add(c.target, g.setLength(c.minDistance))
        }
    };
    
this.update = function() {
        
g.copy(c.object.position).subSelf(c.target);
        
c.noRotate || c.rotateCamera();
        
c.noZoom || c.zoomCamera();
        
c.noPan || c.panCamera();
        
c.object.position.add(c.target, g);
        
c.checkDistances();
        
c.object.lookAt(c.target);
        if (
d.distanceToSquared(c.object.position) > 0) {
            
c.dispatchEvent(p);
            
d.copy(c.object.position)
        }
    };
    
this.domElement.addEventListener("contextmenu", function(a) {
        
a.preventDefault()
    }, 
false);
    
this.domElement.addEventListener("mousemove", function(a) {
        if (
c.enabled) {
            if (
e) {
                
h = i = c.getMouseProjectionOnBall(a.clientX, a.clientY);
                
j = l = c.getMouseOnScreen(a.clientX, a.clientY);
                
m = n = c.getMouseOnScreen(a.clientX, a.clientY);
                
e = false
            
}
            
f !== -1 && (f === 0 && !c.noRotate ? i = c.getMouseProjectionOnBall(a.clientX, a.clientY) : f === 1 && !c.noZoom ? l = c.getMouseOnScreen(a.clientX, a.clientY) : f === 2 && !c.noPan && (n = c.getMouseOnScreen(a.clientX, a.clientY)))
        }
    }, 
false);
    
this.domElement.addEventListener("mousedown", function(a) {
        if (
c.enabled) {
            
a.preventDefault();
            
a.stopPropagation();
            if (
f === -1) {
                
f = a.button;
                
f === 0 && !c.noRotate ? h = i = c.getMouseProjectionOnBall(a.clientX, a.clientY) : f === 1 && !c.noZoom ? j = l = c.getMouseOnScreen(a.clientX, a.clientY) : this.noPan || (m = n = c.getMouseOnScreen(a.clientX, a.clientY))
            }
        }
    }, 
false);
    
this.domElement.addEventListener("mouseup", function(a) {
        if (
c.enabled) {
            
a.preventDefault();
            
a.stopPropagation();
            
f = -1
        
}
    }, 
false);
    
window.addEventListener("keydown", function(a) {
        if (
c.enabled && f === -1) {
            
a.keyCode === c.keys[0] && !c.noRotate ? f = 0 : a.keyCode === c.keys[1] && !c.noZoom ?
                
f = 1 : a.keyCode === c.keys[2] && !c.noPan && (f = 2);
            
f !== -1 && (e = true)
        }
    }, 
false);
    
window.addEventListener("keyup", function() {
        
c.enabled && f !== -1 && (f = -1)
    }, 
false);
    
this.handleResize()
};
THREE.OrbitControls = function(a, b) {
    var 
c, d, e;

    function 
f() {
        return 
2 * Math.PI / 60 / 60 * i.autoRotateSpeed
    
}

    function 
g(a) {
        
a.preventDefault();
        if (
v === c) {
            
m.set(a.clientX, a.clientY);
            
n.sub(m, l);
            
i.rotateLeft(2 * Math.PI * n.x / j * i.userRotateSpeed);
            
i.rotateUp(2 * Math.PI * n.y / j * i.userRotateSpeed);
            
l.copy(m)
        } else if (
v === d) {
            
r.set(a.clientX, a.clientY);
            
o.sub(r, p);
            
o.y > 0 ? i.zoomIn() : i.zoomOut();
            
p.copy(r)
        }
    }

    function 
h() {
        if (
i.userRotate) {
            
document.removeEventListener("mousemove", g, false);
            
document.removeEventListener("mouseup", h, false);
            
v = e
        
}
    }
    
THREE.EventTarget.call(this);
    
this.object = a;
    
this.domElement = b !== void 0 ? b : document;
    
this.center = new THREE.Vector3;
    
this.userZoom = true;
    
this.userZoomSpeed = 1;
    
this.userRotate = true;
    
this.userRotateSpeed = 1;
    
this.autoRotate = false;
    
this.autoRotateSpeed = 2;
    var 
i = this,
        
j = 1800,
        
l = new THREE.Vector2,
        
m = new THREE.Vector2,
        
n = new THREE.Vector2,
        
p = new THREE.Vector2,
        
r = new THREE.Vector2,
        
o = new THREE.Vector2,
        
q = 0,
        
s = 0,
        
w = 1,
        
t = new THREE.Vector3;
    
e = -1;
    
c = 0;
    
d = 1;
    var 
v = e,
        
x = {
            
type: "change"
        
};
    
this.rotateLeft = function(a) {
        
a === void 0 && (a = f());
        
s = s - a
    
};
    
this.rotateRight = function(a) {
        
a === void 0 && (a = f());
        
s = s + a
    
};
    
this.rotateUp = function(a) {
        
a === void 0 && (a = f());
        
q = q - a
    
};
    
this.rotateDown = function(a) {
        
a === void 0 && (a = f());
        
q = q + a
    
};
    
this.zoomIn = function(a) {
        
a === void 0 && (a = Math.pow(0.95, i.userZoomSpeed));
        
w = w / a
    
};
    
this.zoomOut = function(a) {
        
a === void 0 && (a = Math.pow(0.95, i.userZoomSpeed));
        
w = w * a
    
};
    
this.update = function() {
        var 
a = this.object.position,
            
b = a.clone().subSelf(this.center),
            
c = Math.atan2(b.x, b.z),
            
d = Math.atan2(Math.sqrt(b.x * b.x + b.z * b.z), b.y);
        
this.autoRotate && this.rotateLeft(f());
        var 
c = c + s,
            
d = d + q,
            
d = Math.max(1.0E-6, Math.min(Math.PI - 1.0E-6, d)),
            
e = b.length();
        
b.x = e * Math.sin(d) * Math.sin(c);
        
b.y = e * Math.cos(d);
        
b.z = e * Math.sin(d) * Math.cos(c);
        
b.multiplyScalar(w);
        
a.copy(this.center).addSelf(b);
        
this.object.lookAt(this.center);
        
q = s = 0;
        
w = 1;
        if (
t.distanceTo(this.object.position) > 0) {
            
this.dispatchEvent(x);
            
t.copy(this.object.position)
        }
    };
    
this.domElement.addEventListener("contextmenu", function(a) {
        
a.preventDefault()
    }, 
false);
    
this.domElement.addEventListener("mousedown", function(a) {
        if (
i.userRotate) {
            
a.preventDefault();
            if (
a.button === 0 || a.button === 2) {
                
v = c;
                
l.set(a.clientX, a.clientY)
            } else if (
a.button === 1) {
                
v = d;
                
p.set(a.clientX, a.clientY)
            }
            
document.addEventListener("mousemove", g, false);
            
document.addEventListener("mouseup", h, false)
        }
    }, 
false);
    
this.domElement.addEventListener("mousewheel", function(a) {
        
i.userZoom && (a.wheelDelta > 0 ? i.zoomOut() : i.zoomIn())
    }, 
false)
};
THREE.CubeGeometry = function(a, b, c, d, e, f, g, h) {
    function 
i(a, b, c, g, h, i, l, m) {
        var 
n, p = d || 1,
            
o = e || 1,
            
q = h / 2,
            
r = i / 2,
            
s = j.vertices.length;
        if (
a === "x" && b === "y" || a === "y" && b === "x") n = "z";
        else if (
a === "x" && b === "z" || a === "z" && b === "x") {
            
n = "y";
            
o = f || 1
        
} else if (a === "z" && b === "y" || a === "y" && b === "z") {
            
n = "x";
            
p = f || 1
        
}
        var 
t = p + 1,
            
w = o + 1,
            
T = h / p,
            
N = i / o,
            
W = new THREE.Vector3;
        
W[n] = l > 0 ? 1 : -1;
        for (
h = 0; h < w; h++)
            for (
i = 0; i < t; i++) {
                var 
ba = new THREE.Vector3;
                
ba[a] = (i * T - q) * c;
                
ba[b] = (h * N - r) * g;
                
ba[n] = l;
                
j.vertices.push(ba)
            }
        for (
h = 0; h < o; h++)
            for (
i = 0; i < p; i++) {
                
a = new THREE.Face4(i +
                    
t * h + s, i + t * (h + 1) + s, i + 1 + t * (h + 1) + s, i + 1 + t * h + s);
                
a.normal.copy(W);
                
a.vertexNormals.push(W.clone(), W.clone(), W.clone(), W.clone());
                
a.materialIndex = m;
                
j.faces.push(a);
                
j.faceVertexUvs[0].push([new THREE.UV(i / p, 1 - h / o), new THREE.UV(i / p, 1 - (h + 1) / o), new THREE.UV((i + 1) / p, 1 - (h + 1) / o), new THREE.UV((i + 1) / p, 1 - h / o)])
            }
    }
    
THREE.Geometry.call(this);
    var 
j = this,
        
l = a / 2,
        
m = b / 2,
        
n = c / 2,
        
p, r, o, q, s, w;
    if (
g !== void 0) {
        if (
g instanceof Array) this.materials = g;
        else {
            
this.materials = [];
            for (
p = 0; p < 6; p++) this.materials.push(g)
        }
        
p = 0;
        
q = 1;
        
r = 2;
        
s = 3;
        
o = 4;
        
w =
            
5
    
} else this.materials = [];
    
this.sides = {
        
px: true,
        
nx: true,
        
py: true,
        
ny: true,
        
pz: true,
        
nz: true
    
};
    if (
h != void 0)
        for (var 
t in h) this.sides[t] !== void 0 && (this.sides[t] = h[t]);
    
this.sides.px && i("z", "y", -1, -1, c, b, l, p);
    
this.sides.nx && i("z", "y", 1, -1, c, b, -l, q);
    
this.sides.py && i("x", "z", 1, 1, a, c, m, r);
    
this.sides.ny && i("x", "z", 1, -1, a, c, -m, s);
    
this.sides.pz && i("x", "y", 1, -1, a, b, n, o);
    
this.sides.nz && i("x", "y", -1, -1, a, b, -n, w);
    
this.computeCentroids();
    
this.mergeVertices()
};
THREE.CubeGeometry.prototype = Object.create(THREE.Geometry.prototype);
THREE.CylinderGeometry = function(a, b, c, d, e, f) {
    
THREE.Geometry.call(this);
    var 
a = a !== void 0 ? a : 20,
        
b = b !== void 0 ? b : 20,
        
c = c !== void 0 ? c : 100,
        
g = c / 2,
        
d = d || 8,
        
e = e || 1,
        
h, i, j = [],
        
l = [];
    for (
i = 0; i <= e; i++) {
        var 
m = [],
            
n = [],
            
p = i / e,
            
r = p * (b - a) + a;
        for (
h = 0; h <= d; h++) {
            var 
o = h / d,
                
q = new THREE.Vector3;
            
q.x = r * Math.sin(o * Math.PI * 2);
            
q.y = -p * c + g;
            
q.z = r * Math.cos(o * Math.PI * 2);
            
this.vertices.push(q);
            
m.push(this.vertices.length - 1);
            
n.push(new THREE.UV(o, p))
        }
        
j.push(m);
        
l.push(n)
    }
    
c = (b - a) / c;
    for (
h = 0; h < d; h++) {
        if (
a !== 0) {
            
m = this.vertices[j[0][h]].clone();
            
n = this.vertices[j[0][h +
                
1
            
]].clone()
        } else {
            
m = this.vertices[j[1][h]].clone();
            
n = this.vertices[j[1][h + 1]].clone()
        }
        
m.setY(Math.sqrt(m.x * m.x + m.z * m.z) * c).normalize();
        
n.setY(Math.sqrt(n.x * n.x + n.z * n.z) * c).normalize();
        for (
i = 0; i < e; i++) {
            var 
p = j[i][h],
                
r = j[i + 1][h],
                
o = j[i + 1][h + 1],
                
q = j[i][h + 1],
                
s = m.clone(),
                
w = m.clone(),
                
t = n.clone(),
                
v = n.clone(),
                
x = l[i][h].clone(),
                
C = l[i + 1][h].clone(),
                
D = l[i + 1][h + 1].clone(),
                
z = l[i][h + 1].clone();
            
this.faces.push(new THREE.Face4(p, r, o, q, [s, w, t, v]));
            
this.faceVertexUvs[0].push([x, C, D, z])
        }
    }
    if (!
f && a > 0) {
        
this.vertices.push(new THREE.Vector3(0,
            
g, 0));
        for (
h = 0; h < d; h++) {
            
p = j[0][h];
            
r = j[0][h + 1];
            
o = this.vertices.length - 1;
            
s = new THREE.Vector3(0, 1, 0);
            
w = new THREE.Vector3(0, 1, 0);
            
t = new THREE.Vector3(0, 1, 0);
            
x = l[0][h].clone();
            
C = l[0][h + 1].clone();
            
D = new THREE.UV(C.u, 0);
            
this.faces.push(new THREE.Face3(p, r, o, [s, w, t]));
            
this.faceVertexUvs[0].push([x, C, D])
        }
    }
    if (!
f && b > 0) {
        
this.vertices.push(new THREE.Vector3(0, -g, 0));
        for (
h = 0; h < d; h++) {
            
p = j[i][h + 1];
            
r = j[i][h];
            
o = this.vertices.length - 1;
            
s = new THREE.Vector3(0, -1, 0);
            
w = new THREE.Vector3(0, -1, 0);
            
t = new THREE.Vector3(0, -1, 0);
            
x = l[i][h + 1].clone();
            
C = l[i][h].clone();
            
D = new THREE.UV(C.u, 1);
            
this.faces.push(new THREE.Face3(p, r, o, [s, w, t]));
            
this.faceVertexUvs[0].push([x, C, D])
        }
    }
    
this.computeCentroids();
    
this.computeFaceNormals()
};
THREE.CylinderGeometry.prototype = Object.create(THREE.Geometry.prototype);
THREE.ExtrudeGeometry = function(a, b) {
    if (
typeof a !== "undefined") {
        
THREE.Geometry.call(this);
        
a = a instanceof Array ? a : [a];
        
this.shapebb = a[a.length - 1].getBoundingBox();
        
this.addShapeList(a, b);
        
this.computeCentroids();
        
this.computeFaceNormals()
    }
};
THREE.ExtrudeGeometry.prototype = Object.create(THREE.Geometry.prototype);
THREE.ExtrudeGeometry.prototype.addShapeList = function(a, b) {
    for (var 
c = a.length, d = 0; d < c; d++) this.addShape(a[d], b)
};
THREE.ExtrudeGeometry.prototype.addShape = function(a, b) {
    function 
c(a, b, c) {
        
b || console.log("die");
        return 
b.clone().multiplyScalar(c).addSelf(a)
    }

    function 
d(a, b, c) {
        var 
d = THREE.ExtrudeGeometry.__v1,
            
e = THREE.ExtrudeGeometry.__v2,
            
f = THREE.ExtrudeGeometry.__v3,
            
g = THREE.ExtrudeGeometry.__v4,
            
h = THREE.ExtrudeGeometry.__v5,
            
i = THREE.ExtrudeGeometry.__v6;
        
d.set(a.x - b.x, a.y - b.y);
        
e.set(a.x - c.x, a.y - c.y);
        
d = d.normalize();
        
e = e.normalize();
        
f.set(-d.y, d.x);
        
g.set(e.y, -e.x);
        
h.copy(a).addSelf(f);
        
i.copy(a).addSelf(g);
        if (
h.equals(i)) return g.clone();
        
h.copy(b).addSelf(f);
        
i.copy(c).addSelf(g);
        
f = d.dot(g);
        
g = i.subSelf(h).dot(g);
        if (
f === 0) {
            
console.log("Either infinite or no solutions!");
            
g === 0 ? console.log("Its finite solutions.") : console.log("Too bad, no solutions.")
        }
        
g = g / f;
        if (
g < 0) {
            
b = Math.atan2(b.y - a.y, b.x - a.x);
            
a = Math.atan2(c.y - a.y, c.x - a.x);
            
b > a && (a = a + Math.PI * 2);
            
c = (b + a) / 2;
            
a = -Math.cos(c);
            
c = -Math.sin(c);
            return new 
THREE.Vector2(a, c)
        }
        return 
d.multiplyScalar(g).addSelf(h).subSelf(a).clone()
    }

    function 
e(c, d) {
        var 
e, f;
        for (
H = c.length; --H >= 0;) {
            
e = H;
            
f = H - 1;
            
f < 0 && (f =
                
c.length - 1);
            for (var 
g = 0, h = n + l * 2, g = 0; g < h; g++) {
                var 
i = N * g,
                    
j = N * (g + 1),
                    
m = d + e + i,
                    
i = d + f + i,
                    
p = d + f + j,
                    
j = d + e + j,
                    
o = c,
                    
q = g,
                    
r = h,
                    
s = e,
                    
u = f,
                    
m = m + M,
                    
i = i + M,
                    
p = p + M,
                    
j = j + M;
                
J.faces.push(new THREE.Face4(m, i, p, j, null, null, w));
                
m = t.generateSideWallUV(J, a, o, b, m, i, p, j, q, r, s, u);
                
J.faceVertexUvs[0].push(m)
            }
        }
    }

    function 
f(a, b, c) {
        
J.vertices.push(new THREE.Vector3(a, b, c))
    }

    function 
g(c, d, e, f) {
        
c = c + M;
        
d = d + M;
        
e = e + M;
        
J.faces.push(new THREE.Face3(c, d, e, null, null, s));
        
c = f ? t.generateBottomUV(J, a, b, c, d, e) : t.generateTopUV(J, a, b, c, d, e);
        
J.faceVertexUvs[0].push(c)
    }
    var 
h = b.amount !== void 0 ? b.amount : 100,
        
i = b.bevelThickness !== void 0 ? b.bevelThickness : 6,
        
j = b.bevelSize !== void 0 ? b.bevelSize : i - 2,
        
l = b.bevelSegments !== void 0 ? b.bevelSegments : 3,
        
m = b.bevelEnabled !== void 0 ? b.bevelEnabled : true,
        
n = b.steps !== void 0 ? b.steps : 1,
        
p = b.bendPath,
        
r = b.extrudePath,
        
o, q = false,
        
s = b.material,
        
w = b.extrudeMaterial,
        
t = b.UVGenerator !== void 0 ? b.UVGenerator : THREE.ExtrudeGeometry.WorldUVGenerator,
        
v, x, C, D;
    if (
r) {
        
o = r.getSpacedPoints(n);
        
q = true;
        
m = false;
        
v = b.frames !== void 0 ? b.frames : new THREE.TubeGeometry.FrenetFrames(r,
            
n, false);
        
x = new THREE.Vector3;
        
C = new THREE.Vector3;
        
D = new THREE.Vector3
    
}
    if (!
m) j = i = l = 0;
    var 
z, u, G, J = this,
        
M = this.vertices.length;
    
p && a.addWrapPath(p);
    var 
r = a.extractPoints(),
        
p = r.shape,
        
O = r.holes;
    if (
r = !THREE.Shape.Utils.isClockWise(p)) {
        
p = p.reverse();
        
u = 0;
        for (
G = O.length; u < G; u++) {
            
z = O[u];
            
THREE.Shape.Utils.isClockWise(z) && (O[u] = z.reverse())
        }
        
r = false
    
}
    var 
X = THREE.Shape.Utils.triangulateShape(p, O),
        
B = p;
    
u = 0;
    for (
G = O.length; u < G; u++) {
        
z = O[u];
        
p = p.concat(z)
    }
    var 
F, Q, E, aa, T, N = p.length,
        
W, ba = X.length,
        
r = [],
        
H = 0;
    
E = B.length;
    
F = E - 1;
    for (
Q = H + 1; H < E; H++, F++, Q++) {
        
F === E && (F = 0);
        
Q === E && (Q = 0);
        
r[H] = d(B[H], B[F], B[Q])
    }
    var 
ca = [],
        
ia, S = r.concat();
    
u = 0;
    for (
G = O.length; u < G; u++) {
        
z = O[u];
        
ia = [];
        
H = 0;
        
E = z.length;
        
F = E - 1;
        for (
Q = H + 1; H < E; H++, F++, Q++) {
            
F === E && (F = 0);
            
Q === E && (Q = 0);
            
ia[H] = d(z[H], z[F], z[Q])
        }
        
ca.push(ia);
        
S = S.concat(ia)
    }
    for (
F = 0; F < l; F++) {
        
E = F / l;
        
aa = i * (1 - E);
        
Q = j * Math.sin(E * Math.PI / 2);
        
H = 0;
        for (
E = B.length; H < E; H++) {
            
T = c(B[H], r[H], Q);
            
f(T.x, T.y, -aa)
        }
        
u = 0;
        for (
G = O.length; u < G; u++) {
            
z = O[u];
            
ia = ca[u];
            
H = 0;
            for (
E = z.length; H < E; H++) {
                
T = c(z[H], ia[H], Q);
                
f(T.x, T.y, -aa)
            }
        }
    }
    
Q = j;
    for (
H =
        
0; H < N; H++) {
        
T = m ? c(p[H], S[H], Q) : p[H];
        if (
q) {
            
C.copy(v.normals[0]).multiplyScalar(T.x);
            
x.copy(v.binormals[0]).multiplyScalar(T.y);
            
D.copy(o[0]).addSelf(C).addSelf(x);
            
f(D.x, D.y, D.z)
        } else 
f(T.x, T.y, 0)
    }
    for (
E = 1; E <= n; E++)
        for (
H = 0; H < N; H++) {
            
T = m ? c(p[H], S[H], Q) : p[H];
            if (
q) {
                
C.copy(v.normals[E]).multiplyScalar(T.x);
                
x.copy(v.binormals[E]).multiplyScalar(T.y);
                
D.copy(o[E]).addSelf(C).addSelf(x);
                
f(D.x, D.y, D.z)
            } else 
f(T.x, T.y, h / n * E)
        }
    for (
F = l - 1; F >= 0; F--) {
        
E = F / l;
        
aa = i * (1 - E);
        
Q = j * Math.sin(E * Math.PI / 2);
        
H = 0;
        for (
E = B.length; H < E; H++) {
            
T =
                
c(B[H], r[H], Q);
            
f(T.x, T.y, h + aa)
        }
        
u = 0;
        for (
G = O.length; u < G; u++) {
            
z = O[u];
            
ia = ca[u];
            
H = 0;
            for (
E = z.length; H < E; H++) {
                
T = c(z[H], ia[H], Q);
                
q ? f(T.x, T.y + o[n - 1].y, o[n - 1].x + aa) : f(T.x, T.y, h + aa)
            }
        }
    }(function() {
        if (
m) {
            var 
a;
            
a = N * 0;
            for (
H = 0; H < ba; H++) {
                
W = X[H];
                
g(W[2] + a, W[1] + a, W[0] + a, true)
            }
            
a = n + l * 2;
            
a = N * a;
            for (
H = 0; H < ba; H++) {
                
W = X[H];
                
g(W[0] + a, W[1] + a, W[2] + a, false)
            }
        } else {
            for (
H = 0; H < ba; H++) {
                
W = X[H];
                
g(W[2], W[1], W[0], true)
            }
            for (
H = 0; H < ba; H++) {
                
W = X[H];
                
g(W[0] + N * n, W[1] + N * n, W[2] + N * n, false)
            }
        }
    })();
    (function() {
        var 
a = 0;
        
e(B, a);
        
a = a + B.length;
        
u = 0;
        for (
G = O.length; u <
            
G; u++) {
            
z = O[u];
            
e(z, a);
            
a = a + z.length
        
}
    })()
};
THREE.ExtrudeGeometry.WorldUVGenerator = {
    
generateTopUV: function(a, b, c, d, e, f) {
        
b = a.vertices[e].x;
        
e = a.vertices[e].y;
        
c = a.vertices[f].x;
        
f = a.vertices[f].y;
        return [new 
THREE.UV(a.vertices[d].x, 1 - a.vertices[d].y), new THREE.UV(b, 1 - e), new THREE.UV(c, 1 - f)]
    },
    
generateBottomUV: function(a, b, c, d, e, f) {
        return 
this.generateTopUV(a, b, c, d, e, f)
    },
    
generateSideWallUV: function(a, b, c, d, e, f, g, h) {
        var 
b = a.vertices[e].x,
            
c = a.vertices[e].y,
            
e = a.vertices[e].z,
            
d = a.vertices[f].x,
            
i = a.vertices[f].y,
            
f = a.vertices[f].z,
            
j = a.vertices[g].x,
            
l =
            
a.vertices[g].y,
            
g = a.vertices[g].z,
            
m = a.vertices[h].x,
            
n = a.vertices[h].y,
            
a = a.vertices[h].z;
        return 
Math.abs(c - i) < 0.01 ? [new THREE.UV(b, e), new THREE.UV(d, f), new THREE.UV(j, g), new THREE.UV(m, a)] : [new THREE.UV(c, e), new THREE.UV(i, f), new THREE.UV(l, g), new THREE.UV(n, a)]
    }
};
THREE.ExtrudeGeometry.__v1 = new THREE.Vector2;
THREE.ExtrudeGeometry.__v2 = new THREE.Vector2;
THREE.ExtrudeGeometry.__v3 = new THREE.Vector2;
THREE.ExtrudeGeometry.__v4 = new THREE.Vector2;
THREE.ExtrudeGeometry.__v5 = new THREE.Vector2;
THREE.ExtrudeGeometry.__v6 = new THREE.Vector2;
THREE.LatheGeometry = function(a, b, c) {
    
THREE.Geometry.call(this);
    for (var 
b = b || 12, c = c || 2 * Math.PI, d = [], e = (new THREE.Matrix4).makeRotationZ(c / b), f = 0; f < a.length; f++) {
        
d[f] = a[f].clone();
        
this.vertices.push(d[f])
    }
    for (var 
g = b + 1, c = 0; c < g; c++)
        for (
f = 0; f < d.length; f++) {
            
d[f] = e.multiplyVector3(d[f].clone());
            
this.vertices.push(d[f])
        }
    for (
c = 0; c < b; c++) {
        
d = 0;
        for (
e = a.length; d < e - 1; d++) {
            
this.faces.push(new THREE.Face4(c * e + d, (c + 1) % g * e + d, (c + 1) % g * e + (d + 1) % e, c * e + (d + 1) % e));
            
this.faceVertexUvs[0].push([new THREE.UV(1 - c / b, d / e), new THREE.UV(1 -
                (
c + 1) / b, d / e), new THREE.UV(1 - (c + 1) / b, (d + 1) / e), new THREE.UV(1 - c / b, (d + 1) / e)])
        }
    }
    
this.computeCentroids();
    
this.computeFaceNormals();
    
this.computeVertexNormals()
};
THREE.LatheGeometry.prototype = Object.create(THREE.Geometry.prototype);
THREE.PlaneGeometry = function(a, b, c, d) {
    
THREE.Geometry.call(this);
    for (var 
e = a / 2, f = b / 2, c = c || 1, d = d || 1, g = c + 1, h = d + 1, i = a / c, j = b / d, l = new THREE.Vector3(0, 1, 0), a = 0; a < h; a++)
        for (
b = 0; b < g; b++) this.vertices.push(new THREE.Vector3(b * i - e, 0, a * j - f));
    for (
a = 0; a < d; a++)
        for (
b = 0; b < c; b++) {
            
e = new THREE.Face4(b + g * a, b + g * (a + 1), b + 1 + g * (a + 1), b + 1 + g * a);
            
e.normal.copy(l);
            
e.vertexNormals.push(l.clone(), l.clone(), l.clone(), l.clone());
            
this.faces.push(e);
            
this.faceVertexUvs[0].push([new THREE.UV(b / c, 1 - a / d), new THREE.UV(b / c, 1 - (a + 1) / d), new THREE.UV((b +
                
1) / c, 1 - (a + 1) / d), new THREE.UV((b + 1) / c, 1 - a / d)])
        }
    
this.computeCentroids()
};
THREE.PlaneGeometry.prototype = Object.create(THREE.Geometry.prototype);
THREE.SphereGeometry = function(a, b, c, d, e, f, g) {
    
THREE.Geometry.call(this);
    var 
a = a || 50,
        
d = d !== void 0 ? d : 0,
        
e = e !== void 0 ? e : Math.PI * 2,
        
f = f !== void 0 ? f : 0,
        
g = g !== void 0 ? g : Math.PI,
        
b = Math.max(3, Math.floor(b) || 8),
        
c = Math.max(2, Math.floor(c) || 6),
        
h, i, j = [],
        
l = [];
    for (
i = 0; i <= c; i++) {
        var 
m = [],
            
n = [];
        for (
h = 0; h <= b; h++) {
            var 
p = h / b,
                
r = i / c,
                
o = new THREE.Vector3;
            
o.x = -a * Math.cos(d + p * e) * Math.sin(f + r * g);
            
o.y = a * Math.cos(f + r * g);
            
o.z = a * Math.sin(d + p * e) * Math.sin(f + r * g);
            
this.vertices.push(o);
            
m.push(this.vertices.length - 1);
            
n.push(new THREE.UV(p,
                
1 - r))
        }
        
j.push(m);
        
l.push(n)
    }
    for (
i = 0; i < c; i++)
        for (
h = 0; h < b; h++) {
            var 
d = j[i][h + 1],
                
e = j[i][h],
                
f = j[i + 1][h],
                
g = j[i + 1][h + 1],
                
m = this.vertices[d].clone().normalize(),
                
n = this.vertices[e].clone().normalize(),
                
p = this.vertices[f].clone().normalize(),
                
r = this.vertices[g].clone().normalize(),
                
o = l[i][h + 1].clone(),
                
q = l[i][h].clone(),
                
s = l[i + 1][h].clone(),
                
w = l[i + 1][h + 1].clone();
            if (
Math.abs(this.vertices[d].y) == a) {
                
this.faces.push(new THREE.Face3(d, f, g, [m, p, r]));
                
this.faceVertexUvs[0].push([o, s, w])
            } else if (
Math.abs(this.vertices[f].y) ==
                
a) {
                
this.faces.push(new THREE.Face3(d, e, f, [m, n, p]));
                
this.faceVertexUvs[0].push([o, q, s])
            } else {
                
this.faces.push(new THREE.Face4(d, e, f, g, [m, n, p, r]));
                
this.faceVertexUvs[0].push([o, q, s, w])
            }
        }
    
this.computeCentroids();
    
this.computeFaceNormals();
    
this.boundingSphere = {
        
radius: a
    
}
};
THREE.SphereGeometry.prototype = Object.create(THREE.Geometry.prototype);
THREE.TextGeometry = function(a, b) {
    var 
c = THREE.FontUtils.generateShapes(a, b);
    
b.amount = b.height !== void 0 ? b.height : 50;
    if (
b.bevelThickness === void 0) b.bevelThickness = 10;
    if (
b.bevelSize === void 0) b.bevelSize = 8;
    if (
b.bevelEnabled === void 0) b.bevelEnabled = false;
    if (
b.bend) {
        var 
d = c[c.length - 1].getBoundingBox().maxX;
        
b.bendPath = new THREE.QuadraticBezierCurve(new THREE.Vector2(0, 0), new THREE.Vector2(d / 2, 120), new THREE.Vector2(d, 0))
    }
    
THREE.ExtrudeGeometry.call(this, c, b)
};
THREE.TextGeometry.prototype = Object.create(THREE.ExtrudeGeometry.prototype);
THREE.TorusGeometry = function(a, b, c, d, e) {
    
THREE.Geometry.call(this);
    
this.radius = a || 100;
    
this.tube = b || 40;
    
this.segmentsR = c || 8;
    
this.segmentsT = d || 6;
    
this.arc = e || Math.PI * 2;
    
e = new THREE.Vector3;
    
a = [];
    
b = [];
    for (
c = 0; c <= this.segmentsR; c++)
        for (
d = 0; d <= this.segmentsT; d++) {
            var 
f = d / this.segmentsT * this.arc,
                
g = c / this.segmentsR * Math.PI * 2;
            
e.x = this.radius * Math.cos(f);
            
e.y = this.radius * Math.sin(f);
            var 
h = new THREE.Vector3;
            
h.x = (this.radius + this.tube * Math.cos(g)) * Math.cos(f);
            
h.y = (this.radius + this.tube * Math.cos(g)) * Math.sin(f);
            
h.z =
                
this.tube * Math.sin(g);
            
this.vertices.push(h);
            
a.push(new THREE.UV(d / this.segmentsT, 1 - c / this.segmentsR));
            
b.push(h.clone().subSelf(e).normalize())
        }
    for (
c = 1; c <= this.segmentsR; c++)
        for (
d = 1; d <= this.segmentsT; d++) {
            var 
e = (this.segmentsT + 1) * c + d - 1,
                
f = (this.segmentsT + 1) * (c - 1) + d - 1,
                
g = (this.segmentsT + 1) * (c - 1) + d,
                
h = (this.segmentsT + 1) * c + d,
                
i = new THREE.Face4(e, f, g, h, [b[e], b[f], b[g], b[h]]);
            
i.normal.addSelf(b[e]);
            
i.normal.addSelf(b[f]);
            
i.normal.addSelf(b[g]);
            
i.normal.addSelf(b[h]);
            
i.normal.normalize();
            
this.faces.push(i);
            
this.faceVertexUvs[0].push([a[e].clone(), a[f].clone(), a[g].clone(), a[h].clone()])
        }
    
this.computeCentroids()
};
THREE.TorusGeometry.prototype = Object.create(THREE.Geometry.prototype);
THREE.TorusKnotGeometry = function(a, b, c, d, e, f, g) {
    function 
h(a, b, c, d, e, f) {
        var 
g = Math.cos(a);
        
Math.cos(b);
        
b = Math.sin(a);
        
a = c / d * a;
        
c = Math.cos(a);
        
g = e * (2 + c) * 0.5 * g;
        
b = e * (2 + c) * b * 0.5;
        
e = f * e * Math.sin(a) * 0.5;
        return new 
THREE.Vector3(g, b, e)
    }
    
THREE.Geometry.call(this);
    
this.radius = a || 200;
    
this.tube = b || 40;
    
this.segmentsR = c || 64;
    
this.segmentsT = d || 8;
    
this.p = e || 2;
    
this.q = f || 3;
    
this.heightScale = g || 1;
    
this.grid = Array(this.segmentsR);
    
c = new THREE.Vector3;
    
d = new THREE.Vector3;
    
e = new THREE.Vector3;
    for (
a = 0; a < this.segmentsR; ++a) {
        
this.grid[a] =
            Array(
this.segmentsT);
        for (
b = 0; b < this.segmentsT; ++b) {
            var 
i = a / this.segmentsR * 2 * this.p * Math.PI,
                
g = b / this.segmentsT * 2 * Math.PI,
                
f = h(i, g, this.q, this.p, this.radius, this.heightScale),
                
i = h(i + 0.01, g, this.q, this.p, this.radius, this.heightScale);
            
c.sub(i, f);
            
d.add(i, f);
            
e.cross(c, d);
            
d.cross(e, c);
            
e.normalize();
            
d.normalize();
            
i = -this.tube * Math.cos(g);
            
g = this.tube * Math.sin(g);
            
f.x = f.x + (i * d.x + g * e.x);
            
f.y = f.y + (i * d.y + g * e.y);
            
f.z = f.z + (i * d.z + g * e.z);
            
this.grid[a][b] = this.vertices.push(new THREE.Vector3(f.x, f.y, f.z)) - 1
        
}
    }
    for (
a = 0; a <
        
this.segmentsR; ++a)
        for (
b = 0; b < this.segmentsT; ++b) {
            var 
e = (a + 1) % this.segmentsR,
                
f = (b + 1) % this.segmentsT,
                
c = this.grid[a][b],
                
d = this.grid[e][b],
                
e = this.grid[e][f],
                
f = this.grid[a][f],
                
g = new THREE.UV(a / this.segmentsR, b / this.segmentsT),
                
i = new THREE.UV((a + 1) / this.segmentsR, b / this.segmentsT),
                
j = new THREE.UV((a + 1) / this.segmentsR, (b + 1) / this.segmentsT),
                
l = new THREE.UV(a / this.segmentsR, (b + 1) / this.segmentsT);
            
this.faces.push(new THREE.Face4(c, d, e, f));
            
this.faceVertexUvs[0].push([g, i, j, l])
        }
    
this.computeCentroids();
    
this.computeFaceNormals();
    
this.computeVertexNormals()
};
THREE.TorusKnotGeometry.prototype = Object.create(THREE.Geometry.prototype);
THREE.TubeGeometry = function(a, b, c, d, e, f) {
    
THREE.Geometry.call(this);
    
this.path = a;
    
this.segments = b || 64;
    
this.radius = c || 1;
    
this.segmentsRadius = d || 8;
    
this.closed = e || false;
    if (
f) this.debug = new THREE.Object3D;
    
this.grid = [];
    var 
g, h, f = this.segments + 1,
        
i, j, l, m = new THREE.Vector3,
        
n, p, r, b = new THREE.TubeGeometry.FrenetFrames(a, b, e);
    
n = b.tangents;
    
p = b.normals;
    
r = b.binormals;
    
this.tangents = n;
    
this.normals = p;
    
this.binormals = r;
    for (
b = 0; b < f; b++) {
        
this.grid[b] = [];
        
d = b / (f - 1);
        
l = a.getPointAt(d);
        
d = n[b];
        
g = p[b];
        
h = r[b];
        if (
this.debug) {
            
this.debug.add(new THREE.ArrowHelper(d,
                
l, c, 255));
            
this.debug.add(new THREE.ArrowHelper(g, l, c, 16711680));
            
this.debug.add(new THREE.ArrowHelper(h, l, c, 65280))
        }
        for (
d = 0; d < this.segmentsRadius; d++) {
            
i = d / this.segmentsRadius * 2 * Math.PI;
            
j = -this.radius * Math.cos(i);
            
i = this.radius * Math.sin(i);
            
m.copy(l);
            
m.x = m.x + (j * g.x + i * h.x);
            
m.y = m.y + (j * g.y + i * h.y);
            
m.z = m.z + (j * g.z + i * h.z);
            
this.grid[b][d] = this.vertices.push(new THREE.Vector3(m.x, m.y, m.z)) - 1
        
}
    }
    for (
b = 0; b < this.segments; b++)
        for (
d = 0; d < this.segmentsRadius; d++) {
            
f = e ? (b + 1) % this.segments : b + 1;
            
m = (d + 1) % this.segmentsRadius;
            
a = this.grid[b][d];
            
c = this.grid[f][d];
            
f = this.grid[f][m];
            
m = this.grid[b][m];
            
n = new THREE.UV(b / this.segments, d / this.segmentsRadius);
            
p = new THREE.UV((b + 1) / this.segments, d / this.segmentsRadius);
            
r = new THREE.UV((b + 1) / this.segments, (d + 1) / this.segmentsRadius);
            
g = new THREE.UV(b / this.segments, (d + 1) / this.segmentsRadius);
            
this.faces.push(new THREE.Face4(a, c, f, m));
            
this.faceVertexUvs[0].push([n, p, r, g])
        }
    
this.computeCentroids();
    
this.computeFaceNormals();
    
this.computeVertexNormals()
};
THREE.TubeGeometry.prototype = Object.create(THREE.Geometry.prototype);
THREE.TubeGeometry.FrenetFrames = function(a, b, c) {
    new 
THREE.Vector3;
    var 
d = new THREE.Vector3;
    new 
THREE.Vector3;
    var 
e = [],
        
f = [],
        
g = [],
        
h = new THREE.Vector3,
        
i = new THREE.Matrix4,
        
b = b + 1,
        
j, l, m;
    
this.tangents = e;
    
this.normals = f;
    
this.binormals = g;
    for (
j = 0; j < b; j++) {
        
l = j / (b - 1);
        
e[j] = a.getTangentAt(l);
        
e[j].normalize()
    }
    
f[0] = new THREE.Vector3;
    
g[0] = new THREE.Vector3;
    
a = Number.MAX_VALUE;
    
j = Math.abs(e[0].x);
    
l = Math.abs(e[0].y);
    
m = Math.abs(e[0].z);
    if (
j <= a) {
        
a = j;
        
d.set(1, 0, 0)
    }
    if (
l <= a) {
        
a = l;
        
d.set(0, 1, 0)
    }
    
m <= a && d.set(0, 0, 1);
    
h.cross(e[0], d).normalize();
    
f[0].cross(e[0], h);
    
g[0].cross(e[0], f[0]);
    for (
j = 1; j < b; j++) {
        
f[j] = f[j - 1].clone();
        
g[j] = g[j - 1].clone();
        
h.cross(e[j - 1], e[j]);
        if (
h.length() > 1.0E-4) {
            
h.normalize();
            
d = Math.acos(e[j - 1].dot(e[j]));
            
i.makeRotationAxis(h, d).multiplyVector3(f[j])
        }
        
g[j].cross(e[j], f[j])
    }
    if (
c) {
        
d = Math.acos(f[0].dot(f[b - 1]));
        
d = d / (b - 1);
        
e[0].dot(h.cross(f[0], f[b - 1])) > 0 && (d = -d);
        for (
j = 1; j < b; j++) {
            
i.makeRotationAxis(e[j], d * j).multiplyVector3(f[j]);
            
g[j].cross(e[j], f[j])
        }
    }
};
THREE.PolyhedronGeometry = function(a, b, c, d) {
    function 
e(a) {
        var 
b = a.normalize().clone();
        
b.index = i.vertices.push(b) - 1;
        var 
c = Math.atan2(a.z, -a.x) / 2 / Math.PI + 0.5,
            
a = Math.atan2(-a.y, Math.sqrt(a.x * a.x + a.z * a.z)) / Math.PI + 0.5;
        
b.uv = new THREE.UV(c, a);
        return 
b
    
}

    function 
f(a, b, c, d) {
        if (
d < 1) {
            
d = new THREE.Face3(a.index, b.index, c.index, [a.clone(), b.clone(), c.clone()]);
            
d.centroid.addSelf(a).addSelf(b).addSelf(c).divideScalar(3);
            
d.normal = d.centroid.clone().normalize();
            
i.faces.push(d);
            
d = Math.atan2(d.centroid.z, -d.centroid.x);
            
i.faceVertexUvs[0].push([h(a.uv, a, d), h(b.uv, b, d), h(c.uv, c, d)])
        } else {
            
d = d - 1;
            
f(a, g(a, b), g(a, c), d);
            
f(g(a, b), b, g(b, c), d);
            
f(g(a, c), g(b, c), c, d);
            
f(g(a, b), g(b, c), g(a, c), d)
        }
    }

    function 
g(a, b) {
        
m[a.index] || (m[a.index] = []);
        
m[b.index] || (m[b.index] = []);
        var 
c = m[a.index][b.index];
        
c === void 0 && (m[a.index][b.index] = m[b.index][a.index] = c = e((new THREE.Vector3).add(a, b).divideScalar(2)));
        return 
c
    
}

    function 
h(a, b, c) {
        
c < 0 && a.u === 1 && (a = new THREE.UV(a.u - 1, a.v));
        
b.x === 0 && b.z === 0 && (a = new THREE.UV(c / 2 / Math.PI + 0.5, a.v));
        return 
a
    
}
    
THREE.Geometry.call(this);
    for (var 
c = c || 1, d = d || 0, i = this, j = 0, l = a.length; j < l; j++) e(new THREE.Vector3(a[j][0], a[j][1], a[j][2]));
    for (var 
m = [], a = this.vertices, j = 0, l = b.length; j < l; j++) f(a[b[j][0]], a[b[j][1]], a[b[j][2]], d);
    
this.mergeVertices();
    
j = 0;
    for (
l = this.vertices.length; j < l; j++) this.vertices[j].multiplyScalar(c);
    
this.computeCentroids();
    
this.boundingSphere = {
        
radius: c
    
}
};
THREE.PolyhedronGeometry.prototype = Object.create(THREE.Geometry.prototype);
THREE.IcosahedronGeometry = function(a, b) {
    var 
c = (1 + Math.sqrt(5)) / 2;
    
THREE.PolyhedronGeometry.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)
};
THREE.IcosahedronGeometry.prototype = Object.create(THREE.Geometry.prototype);
THREE.OctahedronGeometry = function(a, b) {
    
THREE.PolyhedronGeometry.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)
};
THREE.OctahedronGeometry.prototype = Object.create(THREE.Geometry.prototype);
THREE.TetrahedronGeometry = function(a, b) {
    
THREE.PolyhedronGeometry.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)
};
THREE.TetrahedronGeometry.prototype = Object.create(THREE.Geometry.prototype);
THREE.ParametricGeometry = function(a, b, c, d) {
    
THREE.Geometry.call(this);
    var 
e = this.vertices,
        
f = this.faces,
        
g = this.faceVertexUvs[0],
        
d = d === void 0 ? false : d,
        
h, i, j, l, m = b + 1;
    for (
h = 0; h <= c; h++) {
        
l = h / c;
        for (
i = 0; i <= b; i++) {
            
j = i / b;
            
j = a(j, l);
            
e.push(j)
        }
    }
    var 
n, p, r, o;
    for (
h = 0; h < c; h++)
        for (
i = 0; i < b; i++) {
            
a = h * m + i;
            
e = h * m + i + 1;
            
l = (h + 1) * m + i;
            
j = (h + 1) * m + i + 1;
            
n = new THREE.UV(i / b, h / c);
            
p = new THREE.UV((i + 1) / b, h / c);
            
r = new THREE.UV(i / b, (h + 1) / c);
            
o = new THREE.UV((i + 1) / b, (h + 1) / c);
            if (
d) {
                
f.push(new THREE.Face3(a, e, l));
                
f.push(new THREE.Face3(e, j, l));
                
g.push([n,
                    
p, r
                
]);
                
g.push([p, o, r])
            } else {
                
f.push(new THREE.Face4(a, e, j, l));
                
g.push([n, p, o, r])
            }
        }
    
this.computeCentroids();
    
this.computeFaceNormals();
    
this.computeVertexNormals()
};
THREE.ParametricGeometry.prototype = Object.create(THREE.Geometry.prototype);
THREE.ConvexGeometry = function(a) {
    function 
b(b) {
        var 
d = a[b].clone(),
            
f = d.length();
        
d.x = d.x + f * c();
        
d.y = d.y + f * c();
        
d.z = d.z + f * c();
        for (var 
f = [], g = 0; g < e.length;) {
            var 
h = e[g],
                
i = d,
                
j = a[h[0]],
                
s;
            
s = j;
            var 
w = a[h[1]],
                
t = a[h[2]],
                
v = new THREE.Vector3,
                
x = new THREE.Vector3;
            
v.sub(t, w);
            
x.sub(s, w);
            
v.crossSelf(x);
            
v.isZero() || v.normalize();
            
s = v;
            
j = s.dot(j);
            if (
s.dot(i) >= j) {
                for (
i = 0; i < 3; i++) {
                    
j = [h[i], h[(i + 1) % 3]];
                    
s = true;
                    for (
w = 0; w < f.length; w++)
                        if (
f[w][0] === j[1] && f[w][1] === j[0]) {
                            
f[w] = f[f.length - 1];
                            
f.pop();
                            
s = false;
                            break
                        }
                    
s && f.push(j)
                }
                
e[g] =
                    
e[e.length - 1];
                
e.pop()
            } else 
g++
        }
        for (
w = 0; w < f.length; w++) e.push([f[w][0], f[w][1], b])
    }

    function 
c() {
        return (
Math.random() - 0.5) * 2.0E-6
    
}

    function 
d(a) {
        var 
b = a.length();
        return new 
THREE.UV(a.x / b, a.y / b)
    }
    
THREE.Geometry.call(this);
    for (var 
e = [
            [
0, 1, 2],
            [
0, 2, 1]
        ], 
f = 3; f < a.length; f++) b(f);
    for (var 
g = 0, h = Array(a.length), f = 0; f < e.length; f++)
        for (var 
i = e[f], j = 0; j < 3; j++) {
            if (
h[i[j]] === void 0) {
                
h[i[j]] = g++;
                
this.vertices.push(a[i[j]])
            }
            
i[j] = h[i[j]]
        }
    for (
f = 0; f < e.length; f++) this.faces.push(new THREE.Face3(e[f][0], e[f][1], e[f][2]));
    for (
f = 0; f < this.faces.length; f++) {
        
i = this.faces[f];
        
this.faceVertexUvs[0].push([d(this.vertices[i.a]), d(this.vertices[i.b]), d(this.vertices[i.c])])
    }
    
this.computeCentroids();
    
this.computeFaceNormals();
    
this.computeVertexNormals()
};
THREE.ConvexGeometry.prototype = Object.create(THREE.Geometry.prototype);
THREE.AxisHelper = function() {
    
THREE.Object3D.call(this);
    var 
a = new THREE.Geometry;
    
a.vertices.push(new THREE.Vector3);
    
a.vertices.push(new THREE.Vector3(0, 100, 0));
    var 
b = new THREE.CylinderGeometry(0, 5, 25, 5, 1),
        
c;
    
c = new THREE.Line(a, new THREE.LineBasicMaterial({
        
color: 16711680
    
}));
    
c.rotation.z = -Math.PI / 2;
    
this.add(c);
    
c = new THREE.Mesh(b, new THREE.MeshBasicMaterial({
        
color: 16711680
    
}));
    
c.position.x = 100;
    
c.rotation.z = -Math.PI / 2;
    
this.add(c);
    
c = new THREE.Line(a, new THREE.LineBasicMaterial({
        
color: 65280
    
}));
    
this.add(c);
    
c = new THREE.Mesh(b, new THREE.MeshBasicMaterial({
        
color: 65280
    
}));
    
c.position.y = 100;
    
this.add(c);
    
c = new THREE.Line(a, new THREE.LineBasicMaterial({
        
color: 255
    
}));
    
c.rotation.x = Math.PI / 2;
    
this.add(c);
    
c = new THREE.Mesh(b, new THREE.MeshBasicMaterial({
        
color: 255
    
}));
    
c.position.z = 100;
    
c.rotation.x = Math.PI / 2;
    
this.add(c)
};
THREE.AxisHelper.prototype = Object.create(THREE.Object3D.prototype);
THREE.ArrowHelper = function(a, b, c, d) {
    
THREE.Object3D.call(this);
    
d === void 0 && (d = 16776960);
    
c === void 0 && (c = 20);
    var 
e = new THREE.Geometry;
    
e.vertices.push(new THREE.Vector3(0, 0, 0));
    
e.vertices.push(new THREE.Vector3(0, 1, 0));
    
this.line = new THREE.Line(e, new THREE.LineBasicMaterial({
        
color: d
    
}));
    
this.add(this.line);
    
e = new THREE.CylinderGeometry(0, 0.05, 0.25, 5, 1);
    
this.cone = new THREE.Mesh(e, new THREE.MeshBasicMaterial({
        
color: d
    
}));
    
this.cone.position.set(0, 1, 0);
    
this.add(this.cone);
    if (
b instanceof THREE.Vector3) this.position =
        
b;
    
this.setDirection(a);
    
this.setLength(c)
};
THREE.ArrowHelper.prototype = Object.create(THREE.Object3D.prototype);
THREE.ArrowHelper.prototype.setDirection = function(a) {
    var 
b = (new THREE.Vector3(0, 1, 0)).crossSelf(a),
        
a = Math.acos((new THREE.Vector3(0, 1, 0)).dot(a.clone().normalize()));
    
this.matrix = (new THREE.Matrix4).makeRotationAxis(b.normalize(), a);
    
this.rotation.setEulerFromRotationMatrix(this.matrix, this.eulerOrder)
};
THREE.ArrowHelper.prototype.setLength = function(a) {
    
this.scale.set(a, a, a)
};
THREE.ArrowHelper.prototype.setColor = function(a) {
    
this.line.material.color.setHex(a);
    
this.cone.material.color.setHex(a)
};
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.Vector3);
        
d.lineGeometry.colors.push(new THREE.Color(b));
        
d.pointMap[a] === void 0 && (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.camera = a;
    
this.update(a);
    
this.lines = new THREE.Line(this.lineGeometry, this.lineMaterial, THREE.LinePieces);
    
this.add(this.lines)
};
THREE.CameraHelper.prototype = Object.create(THREE.Object3D.prototype);
THREE.CameraHelper.prototype.update = function() {
    function 
a(a, d, e, f) {
        
THREE.CameraHelper.__v.set(d, e, f);
        
THREE.CameraHelper.__projector.unprojectVector(THREE.CameraHelper.__v, THREE.CameraHelper.__c);
        
a = b.pointMap[a];
        if (
a !== void 0) {
            
d = 0;
            for (
e = a.length; d < e; d++) b.lineGeometry.vertices[a[d]].copy(THREE.CameraHelper.__v)
        }
    }
    var 
b = this;
    
THREE.CameraHelper.__c.projectionMatrix.copy(this.camera.projectionMatrix);
    
a("c", 0, 0, -1);
    
a("t", 0, 0, 1);
    
a("n1", -1, -1, -1);
    
a("n2", 1, -1, -1);
    
a("n3", -1, 1, -1);
    
a("n4", 1, 1, -1);
    
a("f1", -1, -1,
        
1);
    
a("f2", 1, -1, 1);
    
a("f3", -1, 1, 1);
    
a("f4", 1, 1, 1);
    
a("u1", 0.7, 1.1, -1);
    
a("u2", -0.7, 1.1, -1);
    
a("u3", 0, 2, -1);
    
a("cf1", -1, 0, 1);
    
a("cf2", 1, 0, 1);
    
a("cf3", 0, -1, 1);
    
a("cf4", 0, 1, 1);
    
a("cn1", -1, 0, -1);
    
a("cn2", 1, 0, -1);
    
a("cn3", 0, -1, -1);
    
a("cn4", 0, 1, -1);
    
this.lineGeometry.verticesNeedUpdate = true
};
THREE.CameraHelper.__projector = new THREE.Projector;
THREE.CameraHelper.__v = new THREE.Vector3;
THREE.CameraHelper.__c = new THREE.Camera;
THREE.SubdivisionModifier = function(a) {
    
this.subdivisions = a === void 0 ? 1 : a;
    
this.useOldVertexColors = false;
    
this.supportUVs = true;
    
this.debug = false
};
THREE.SubdivisionModifier.prototype.modify = function(a) {
    for (var 
b = this.subdivisions; b-- > 0;) this.smooth(a)
};
THREE.SubdivisionModifier.prototype.smooth = function(a) {
    function 
b() {
        
n.debug && console.log.apply(console, arguments)
    }

    function 
c() {
        
console && console.log.apply(console, arguments)
    }

    function 
d(a, c, d, e, g, h, i) {
        var 
j = new THREE.Face4(a, c, d, e, null, g.color, g.materialIndex);
        if (
n.useOldVertexColors) {
            
j.vertexColors = [];
            for (var 
o, p, q, r = 0; r < 4; r++) {
                
q = h[r];
                
o = new THREE.Color;
                
o.setRGB(0, 0, 0);
                for (var 
s = 0; s < q.length; s++) {
                    
p = g.vertexColors[q[s] - 1];
                    
o.r = o.r + p.r;
                    
o.g = o.g + p.g;
                    
o.b = o.b + p.b
                
}
                
o.r = o.r / q.length;
                
o.g = o.g / q.length;
                
o.b = o.b /
                    
q.length;
                
j.vertexColors[r] = o
            
}
        }
        
l.push(j);
        if (
n.supportUVs) {
            
g = [f(a, ""), f(c, i), f(d, i), f(e, i)];
            
g[0] ? g[1] ? g[2] ? g[3] ? m.push(g) : b("d :( ", e + ":" + i) : b("c :( ", d + ":" + i) : b("b :( ", c + ":" + i) : b("a :( ", a + ":" + i)
        }
    }

    function 
e(a, b) {
        return 
Math.min(a, b) + "_" + Math.max(a, b)
    }

    function 
f(a, d) {
        var 
e = a + ":" + d,
            
f = w[e];
        if (!
f) {
            
a >= t && a < t + r.length ? b("face pt") : b("edge pt");
            
c("warning, UV not found for", e);
            return 
null
        
}
        return 
f
    
}

    function 
g(a, b, d) {
        var 
e = a + ":" + b;
        
e in w ? c("dup vertexNo", a, "oldFaceNo", b, "value", d, "key", e, w[e]) : w[e] = d
    
}

    function 
h(a,
        
b) {
        
O[a] === void 0 && (O[a] = []);
        
O[a].push(b)
    }

    function 
i(a, b, c) {
        
X[a] === void 0 && (X[a] = {});
        
X[a][b] = c
    
}
    var 
j = [],
        
l = [],
        
m = [],
        
n = this,
        
p = a.vertices,
        
r = a.faces,
        
j = p.concat(),
        
o = [],
        
q = {},
        
s = {},
        
w = {},
        
t = p.length,
        
v, x, C, D, z, u = a.faceVertexUvs[0],
        
G;
    
b("originalFaces, uvs, originalVerticesLength", r.length, u.length, t);
    if (
n.supportUVs) {
        
v = 0;
        for (
x = u.length; v < x; v++) {
            
C = 0;
            for (
D = u[v].length; C < D; C++) {
                
G = r[v]["abcd".charAt(C)];
                
g(G, v, u[v][C])
            }
        }
    }
    if (
u.length == 0) n.supportUVs = false;
    
v = 0;
    for (
z in w) v++;
    if (!
v) {
        
n.supportUVs = false;
        
b("no uvs")
    }
    
b("-- Original Faces + Vertices UVs completed",
        
w, "vs", u.length);
    
v = 0;
    for (
x = r.length; v < x; v++) {
        
z = r[v];
        
o.push(z.centroid);
        
j.push(z.centroid);
        if (
n.supportUVs) {
            
u = new THREE.UV;
            if (
z instanceof THREE.Face3) {
                
u.u = f(z.a, v).u + f(z.b, v).u + f(z.c, v).u;
                
u.v = f(z.a, v).v + f(z.b, v).v + f(z.c, v).v;
                
u.u = u.u / 3;
                
u.v = u.v / 3
            
} else if (z instanceof THREE.Face4) {
                
u.u = f(z.a, v).u + f(z.b, v).u + f(z.c, v).u + f(z.d, v).u;
                
u.v = f(z.a, v).v + f(z.b, v).v + f(z.c, v).v + f(z.d, v).v;
                
u.u = u.u / 4;
                
u.v = u.v / 4
            
}
            
g(t + v, "", u)
        }
    }
    
b("-- added UVs for new Faces", w);
    
x = function(a) {
        function 
b(a, c) {
            
h[a] === void 0 && (h[a] = []);
            
h[a].push(c)
        }
        var 
c, d, f, g, h = {};
        
c = 0;
        for (
d = a.faces.length; c < d; c++) {
            
f = a.faces[c];
            if (
f instanceof THREE.Face3) {
                
g = e(f.a, f.b);
                
b(g, c);
                
g = e(f.b, f.c);
                
b(g, c);
                
g = e(f.c, f.a);
                
b(g, c)
            } else if (
f instanceof THREE.Face4) {
                
g = e(f.a, f.b);
                
b(g, c);
                
g = e(f.b, f.c);
                
b(g, c);
                
g = e(f.c, f.d);
                
b(g, c);
                
g = e(f.d, f.a);
                
b(g, c)
            }
        }
        return 
h
    
}(a);
    
G = 0;
    var 
J, M, O = {},
        
X = {};
    for (
v in x) {
        
u = x[v];
        
J = v.split("_");
        
M = J[0];
        
J = J[1];
        
h(M, [M, J]);
        
h(J, [M, J]);
        
C = 0;
        for (
D = u.length; C < D; C++) {
            
z = u[C];
            
i(M, z, v);
            
i(J, z, v)
        }
        
u.length < 2 && (s[v] = true)
    }
    
b("vertexEdgeMap", O, "vertexFaceMap", X);
    for (
v in x) {
        
u =
            
x[v];
        
z = u[0];
        
D = u[1];
        
J = v.split("_");
        
M = J[0];
        
J = J[1];
        
u = new THREE.Vector3;
        if (
s[v]) {
            
u.addSelf(p[M]);
            
u.addSelf(p[J]);
            
u.multiplyScalar(0.5)
        } else {
            
u.addSelf(o[z]);
            
u.addSelf(o[D]);
            
u.addSelf(p[M]);
            
u.addSelf(p[J]);
            
u.multiplyScalar(0.25)
        }
        
q[v] = t + r.length + G;
        
j.push(u);
        
G++;
        if (
n.supportUVs) {
            
u = new THREE.UV;
            
u.u = f(M, z).u + f(J, z).u;
            
u.v = f(M, z).v + f(J, z).v;
            
u.u = u.u / 2;
            
u.v = u.v / 2;
            
g(q[v], z, u);
            if (!
s[v]) {
                
u = new THREE.UV;
                
u.u = f(M, D).u + f(J, D).u;
                
u.v = f(M, D).v + f(J, D).v;
                
u.u = u.u / 2;
                
u.v = u.v / 2;
                
g(q[v], D, u)
            }
        }
    }
    
b("-- Step 2 done");
    var 
B, F;
    
D = ["123",
        
"12", "2", "23"
    
];
    
J = ["123", "23", "3", "31"];
    var 
Q = ["123", "31", "1", "12"],
        
E = ["1234", "12", "2", "23"],
        
aa = ["1234", "23", "3", "34"],
        
T = ["1234", "34", "4", "41"],
        
N = ["1234", "41", "1", "12"];
    
v = 0;
    for (
x = o.length; v < x; v++) {
        
z = r[v];
        
u = t + v;
        if (
z instanceof THREE.Face3) {
            
G = e(z.a, z.b);
            
M = e(z.b, z.c);
            
B = e(z.c, z.a);
            
d(u, q[G], z.b, q[M], z, D, v);
            
d(u, q[M], z.c, q[B], z, J, v);
            
d(u, q[B], z.a, q[G], z, Q, v)
        } else if (
z instanceof THREE.Face4) {
            
G = e(z.a, z.b);
            
M = e(z.b, z.c);
            
B = e(z.c, z.d);
            
F = e(z.d, z.a);
            
d(u, q[G], z.b, q[M], z, E, v);
            
d(u, q[M], z.c, q[B], z, aa, v);
            
d(u, q[B], z.d,
                
q[F], z, T, v);
            
d(u, q[F], z.a, q[G], z, N, v)
        } else 
b("face should be a face!", z)
    }
    
q = new THREE.Vector3;
    
z = new THREE.Vector3;
    
v = 0;
    for (
x = p.length; v < x; v++)
        if (
O[v] !== void 0) {
            
q.set(0, 0, 0);
            
z.set(0, 0, 0);
            
M = new THREE.Vector3(0, 0, 0);
            
u = 0;
            for (
C in X[v]) {
                
q.addSelf(o[C]);
                
u++
            }
            
D = 0;
            
G = O[v].length;
            for (
C = 0; C < G; C++) s[e(O[v][C][0], O[v][C][1])] && D++;
            if (
D != 2) {
                
q.divideScalar(u);
                for (
C = 0; C < G; C++) {
                    
u = O[v][C];
                    
u = p[u[0]].clone().addSelf(p[u[1]]).divideScalar(2);
                    
z.addSelf(u)
                }
                
z.divideScalar(G);
                
M.addSelf(p[v]);
                
M.multiplyScalar(G - 3);
                
M.addSelf(q);
                
M.addSelf(z.multiplyScalar(2));
                
M.divideScalar(G);
                
j[v] = M
            
}
        }
    
a.vertices = j;
    
a.faces = l;
    
a.faceVertexUvs[0] = m;
    
delete a.__tmpVertices;
    
a.computeCentroids();
    
a.computeFaceNormals();
    
a.computeVertexNormals()
};
THREE.ImmediateRenderObject = function() {
    
THREE.Object3D.call(this);
    
this.render = function() {}
};
THREE.ImmediateRenderObject.prototype = Object.create(THREE.Object3D.prototype);
THREE.LensFlare = function(a, b, c, d, e) {
    
THREE.Object3D.call(this);
    
this.lensFlares = [];
    
this.positionScreen = new THREE.Vector3;
    
this.customUpdateCallback = void 0;
    
a !== void 0 && this.add(a, b, c, d, e)
};
THREE.LensFlare.prototype = Object.create(THREE.Object3D.prototype);
THREE.LensFlare.prototype.add = function(a, b, c, d, e, f) {
    
b === void 0 && (b = -1);
    
c === void 0 && (c = 0);
    
f === void 0 && (f = 1);
    
e === void 0 && (e = new THREE.Color(16777215));
    if (
d === void 0) d = THREE.NormalBlending;
    
c = Math.min(c, Math.max(0, c));
    
this.lensFlares.push({
        
texture: a,
        
size: b,
        
distance: c,
        
x: 0,
        
y: 0,
        
z: 0,
        
scale: 1,
        
rotation: 1,
        
opacity: f,
        
color: e,
        
blending: d
    
})
};
THREE.LensFlare.prototype.updateLensFlares = function() {
    var 
a, b = this.lensFlares.length,
        
c, d = -this.positionScreen.x * 2,
        
e = -this.positionScreen.y * 2;
    for (
a = 0; a < b; a++) {
        
c = this.lensFlares[a];
        
c.x = this.positionScreen.x + d * c.distance;
        
c.y = this.positionScreen.y + e * c.distance;
        
c.wantedRotation = c.x * Math.PI * 0.25;
        
c.rotation = c.rotation + (c.wantedRotation - c.rotation) * 0.25
    
}
};
THREE.MorphBlendMesh = function(a, b) {
    
THREE.Mesh.call(this, a, b);
    
this.animationsMap = {};
    
this.animationsList = [];
    var 
c = this.geometry.morphTargets.length;
    
this.createAnimation("__default", 0, c - 1, c / 1);
    
this.setAnimationWeight("__default", 1)
};
THREE.MorphBlendMesh.prototype = Object.create(THREE.Mesh.prototype);
THREE.MorphBlendMesh.prototype.createAnimation = function(a, b, c, d) {
    
b = {
        
startFrame: b,
        
endFrame: c,
        
length: c - b + 1,
        
fps: d,
        
duration: (c - b) / d,
        
lastFrame: 0,
        
currentFrame: 0,
        
active: false,
        
time: 0,
        
direction: 1,
        
weight: 1,
        
directionBackwards: false,
        
mirroredLoop: false
    
};
    
this.animationsMap[a] = b;
    
this.animationsList.push(b)
};
THREE.MorphBlendMesh.prototype.autoCreateAnimations = function(a) {
    for (var 
b = /([a-z]+)(d+)/, c, d = {}, e = this.geometry, f = 0, g = e.morphTargets.length; f < g; f++) {
        var 
h = e.morphTargets[f].name.match(b);
        if (
h && h.length > 1) {
            var 
i = h[1];
            
d[i] || (d[i] = {
                
start: Infinity,
                
end: -Infinity
            
});
            
h = d[i];
            if (
f < h.start) h.start = f;
            if (
f > h.end) h.end = f;
            
c || (c = i)
        }
    }
    for (
i in d) {
        
h = d[i];
        
this.createAnimation(i, h.start, h.end, a)
    }
    
this.firstAnimation = c
};
THREE.MorphBlendMesh.prototype.setAnimationDirectionForward = function(a) {
    if (
a = this.animationsMap[a]) {
        
a.direction = 1;
        
a.directionBackwards = false
    
}
};
THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward = function(a) {
    if (
a = this.animationsMap[a]) {
        
a.direction = -1;
        
a.directionBackwards = true
    
}
};
THREE.MorphBlendMesh.prototype.setAnimationFPS = function(a, b) {
    var 
c = this.animationsMap[a];
    if (
c) {
        
c.fps = b;
        
c.duration = (c.end - c.start) / c.fps
    
}
};
THREE.MorphBlendMesh.prototype.setAnimationDuration = function(a, b) {
    var 
c = this.animationsMap[a];
    if (
c) {
        
c.duration = b;
        
c.fps = (c.end - c.start) / c.duration
    
}
};
THREE.MorphBlendMesh.prototype.setAnimationWeight = function(a, b) {
    var 
c = this.animationsMap[a];
    if (
c) c.weight = b
};
THREE.MorphBlendMesh.prototype.setAnimationTime = function(a, b) {
    var 
c = this.animationsMap[a];
    if (
c) c.time = b
};
THREE.MorphBlendMesh.prototype.getAnimationTime = function(a) {
    var 
b = 0;
    if (
a = this.animationsMap[a]) b = a.time;
    return 
b
};
THREE.MorphBlendMesh.prototype.getAnimationDuration = function(a) {
    var 
b = -1;
    if (
a = this.animationsMap[a]) b = a.duration;
    return 
b
};
THREE.MorphBlendMesh.prototype.playAnimation = function(a) {
    var 
b = this.animationsMap[a];
    if (
b) {
        
b.time = 0;
        
b.active = true
    
} else console.warn("animation[" + a + "] undefined")
};
THREE.MorphBlendMesh.prototype.stopAnimation = function(a) {
    if (
a = this.animationsMap[a]) a.active = false
};
THREE.MorphBlendMesh.prototype.update = function(a) {
    for (var 
b = 0, c = this.animationsList.length; b < c; b++) {
        var 
d = this.animationsList[b];
        if (
d.active) {
            var 
e = d.duration / d.length;
            
d.time = d.time + d.direction * a;
            if (
d.mirroredLoop) {
                if (
d.time > d.duration || d.time < 0) {
                    
d.direction = d.direction * -1;
                    if (
d.time > d.duration) {
                        
d.time = d.duration;
                        
d.directionBackwards = true
                    
}
                    if (
d.time < 0) {
                        
d.time = 0;
                        
d.directionBackwards = false
                    
}
                }
            } else {
                
d.time = d.time % d.duration;
                if (
d.time < 0) d.time = d.time + d.duration
            
}
            var 
f = d.startFrame + THREE.Math.clamp(Math.floor(d.time /
                    
e), 0, d.length - 1),
                
g = d.weight;
            if (
f !== d.currentFrame) {
                
this.morphTargetInfluences[d.lastFrame] = 0;
                
this.morphTargetInfluences[d.currentFrame] = 1 * g;
                
this.morphTargetInfluences[f] = 0;
                
d.lastFrame = d.currentFrame;
                
d.currentFrame = f
            
}
            
e = d.time % e / e;
            
d.directionBackwards && (e = 1 - e);
            
this.morphTargetInfluences[d.currentFrame] = e * g;
            
this.morphTargetInfluences[d.lastFrame] = (1 - e) * g
        
}
    }
};
THREE.LensFlarePlugin = function() {
    function 
a(a) {
        var 
c = b.createProgram(),
            
d = b.createShader(b.FRAGMENT_SHADER),
            
e = b.createShader(b.VERTEX_SHADER);
        
b.shaderSource(d, a.fragmentShader);
        
b.shaderSource(e, a.vertexShader);
        
b.compileShader(d);
        
b.compileShader(e);
        
b.attachShader(c, d);
        
b.attachShader(c, e);
        
b.linkProgram(c);
        return 
c
    
}
    var 
b, c, d, e, f, g, h, i, j, l, m, n, p;
    
this.init = function(r) {
        
b = r.context;
        
c = r;
        
d = new Float32Array(16);
        
e = new Uint16Array(6);
        
r = 0;
        
d[r++] = -1;
        
d[r++] = -1;
        
d[r++] = 0;
        
d[r++] = 0;
        
d[r++] = 1;
        
d[r++] = -1;
        
d[r++] = 1;
        
d[r++] =
            
0;
        
d[r++] = 1;
        
d[r++] = 1;
        
d[r++] = 1;
        
d[r++] = 1;
        
d[r++] = -1;
        
d[r++] = 1;
        
d[r++] = 0;
        
d[r++] = 1;
        
r = 0;
        
e[r++] = 0;
        
e[r++] = 1;
        
e[r++] = 2;
        
e[r++] = 0;
        
e[r++] = 2;
        
e[r++] = 3;
        
f = b.createBuffer();
        
g = b.createBuffer();
        
b.bindBuffer(b.ARRAY_BUFFER, f);
        
b.bufferData(b.ARRAY_BUFFER, d, b.STATIC_DRAW);
        
b.bindBuffer(b.ELEMENT_ARRAY_BUFFER, g);
        
b.bufferData(b.ELEMENT_ARRAY_BUFFER, e, b.STATIC_DRAW);
        
h = b.createTexture();
        
i = b.createTexture();
        
b.bindTexture(b.TEXTURE_2D, h);
        
b.texImage2D(b.TEXTURE_2D, 0, b.RGB, 16, 16, 0, b.RGB, b.UNSIGNED_BYTE, null);
        
b.texParameteri(b.TEXTURE_2D,
            
b.TEXTURE_WRAP_S, b.CLAMP_TO_EDGE);
        
b.texParameteri(b.TEXTURE_2D, b.TEXTURE_WRAP_T, b.CLAMP_TO_EDGE);
        
b.texParameteri(b.TEXTURE_2D, b.TEXTURE_MAG_FILTER, b.NEAREST);
        
b.texParameteri(b.TEXTURE_2D, b.TEXTURE_MIN_FILTER, b.NEAREST);
        
b.bindTexture(b.TEXTURE_2D, i);
        
b.texImage2D(b.TEXTURE_2D, 0, b.RGBA, 16, 16, 0, b.RGBA, b.UNSIGNED_BYTE, null);
        
b.texParameteri(b.TEXTURE_2D, b.TEXTURE_WRAP_S, b.CLAMP_TO_EDGE);
        
b.texParameteri(b.TEXTURE_2D, b.TEXTURE_WRAP_T, b.CLAMP_TO_EDGE);
        
b.texParameteri(b.TEXTURE_2D, b.TEXTURE_MAG_FILTER, b.NEAREST);
        
b.texParameteri(b.TEXTURE_2D, b.TEXTURE_MIN_FILTER, b.NEAREST);
        if (
b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS) <= 0) {
            
j = false;
            
l = a(THREE.ShaderFlares.lensFlare)
        } else {
            
j = true;
            
l = a(THREE.ShaderFlares.lensFlareVertexTexture)
        }
        
m = {};
        
n = {};
        
m.vertex = b.getAttribLocation(l, "position");
        
m.uv = b.getAttribLocation(l, "uv");
        
n.renderType = b.getUniformLocation(l, "renderType");
        
n.map = b.getUniformLocation(l, "map");
        
n.occlusionMap = b.getUniformLocation(l, "occlusionMap");
        
n.opacity = b.getUniformLocation(l, "opacity");
        
n.color = b.getUniformLocation(l,
            
"color");
        
n.scale = b.getUniformLocation(l, "scale");
        
n.rotation = b.getUniformLocation(l, "rotation");
        
n.screenPosition = b.getUniformLocation(l, "screenPosition");
        
p = false
    
};
    
this.render = function(a, d, e, s) {
        var 
a = a.__webglFlares,
            
w = a.length;
        if (
w) {
            var 
t = new THREE.Vector3,
                
v = s / e,
                
x = e * 0.5,
                
C = s * 0.5,
                
D = 16 / s,
                
z = new THREE.Vector2(D * v, D),
                
u = new THREE.Vector3(1, 1, 0),
                
G = new THREE.Vector2(1, 1),
                
J = n,
                
D = m;
            
b.useProgram(l);
            if (!
p) {
                
b.enableVertexAttribArray(m.vertex);
                
b.enableVertexAttribArray(m.uv);
                
p = true
            
}
            
b.uniform1i(J.occlusionMap, 0);
            
b.uniform1i(J.map,
                
1);
            
b.bindBuffer(b.ARRAY_BUFFER, f);
            
b.vertexAttribPointer(D.vertex, 2, b.FLOAT, false, 16, 0);
            
b.vertexAttribPointer(D.uv, 2, b.FLOAT, false, 16, 8);
            
b.bindBuffer(b.ELEMENT_ARRAY_BUFFER, g);
            
b.disable(b.CULL_FACE);
            
b.depthMask(false);
            var 
M, O, X, B, F;
            for (
M = 0; M < w; M++) {
                
D = 16 / s;
                
z.set(D * v, D);
                
B = a[M];
                
t.set(B.matrixWorld.elements[12], B.matrixWorld.elements[13], B.matrixWorld.elements[14]);
                
d.matrixWorldInverse.multiplyVector3(t);
                
d.projectionMatrix.multiplyVector3(t);
                
u.copy(t);
                
G.x = u.x * x + x;
                
G.y = u.y * C + C;
                if (
j || G.x > 0 && G.x < e && G.y > 0 &&
                    
G.y < s) {
                    
b.activeTexture(b.TEXTURE1);
                    
b.bindTexture(b.TEXTURE_2D, h);
                    
b.copyTexImage2D(b.TEXTURE_2D, 0, b.RGB, G.x - 8, G.y - 8, 16, 16, 0);
                    
b.uniform1i(J.renderType, 0);
                    
b.uniform2f(J.scale, z.x, z.y);
                    
b.uniform3f(J.screenPosition, u.x, u.y, u.z);
                    
b.disable(b.BLEND);
                    
b.enable(b.DEPTH_TEST);
                    
b.drawElements(b.TRIANGLES, 6, b.UNSIGNED_SHORT, 0);
                    
b.activeTexture(b.TEXTURE0);
                    
b.bindTexture(b.TEXTURE_2D, i);
                    
b.copyTexImage2D(b.TEXTURE_2D, 0, b.RGBA, G.x - 8, G.y - 8, 16, 16, 0);
                    
b.uniform1i(J.renderType, 1);
                    
b.disable(b.DEPTH_TEST);
                    
b.activeTexture(b.TEXTURE1);
                    
b.bindTexture(b.TEXTURE_2D, h);
                    
b.drawElements(b.TRIANGLES, 6, b.UNSIGNED_SHORT, 0);
                    
B.positionScreen.copy(u);
                    
B.customUpdateCallback ? B.customUpdateCallback(B) : B.updateLensFlares();
                    
b.uniform1i(J.renderType, 2);
                    
b.enable(b.BLEND);
                    
O = 0;
                    for (
X = B.lensFlares.length; O < X; O++) {
                        
F = B.lensFlares[O];
                        if (
F.opacity > 0.0010 && F.scale > 0.0010) {
                            
u.x = F.x;
                            
u.y = F.y;
                            
u.z = F.z;
                            
D = F.size * F.scale / s;
                            
z.x = D * v;
                            
z.y = D;
                            
b.uniform3f(J.screenPosition, u.x, u.y, u.z);
                            
b.uniform2f(J.scale, z.x, z.y);
                            
b.uniform1f(J.rotation, F.rotation);
                            
b.uniform1f(J.opacity, F.opacity);
                            
b.uniform3f(J.color, F.color.r, F.color.g, F.color.b);
                            
c.setBlending(F.blending, F.blendEquation, F.blendSrc, F.blendDst);
                            
c.setTexture(F.texture, 1);
                            
b.drawElements(b.TRIANGLES, 6, b.UNSIGNED_SHORT, 0)
                        }
                    }
                }
            }
            
b.enable(b.CULL_FACE);
            
b.enable(b.DEPTH_TEST);
            
b.depthMask(true)
        }
    }
};
THREE.ShadowMapPlugin = function() {
    var 
a, b, c, d, e, f = new THREE.Frustum,
        
g = new THREE.Matrix4,
        
h = new THREE.Vector3,
        
i = new THREE.Vector3;
    
this.init = function(f) {
        
a = f.context;
        
b = f;
        var 
f = THREE.ShaderLib.depthRGBA,
            
g = THREE.UniformsUtils.clone(f.uniforms);
        
c = new THREE.ShaderMaterial({
            
fragmentShader: f.fragmentShader,
            
vertexShader: f.vertexShader,
            
uniforms: g
        
});
        
d = new THREE.ShaderMaterial({
            
fragmentShader: f.fragmentShader,
            
vertexShader: f.vertexShader,
            
uniforms: g,
            
morphTargets: true
        
});
        
e = new THREE.ShaderMaterial({
            
fragmentShader: f.fragmentShader,
            
vertexShader: f.vertexShader,
            
uniforms: g,
            
skinning: true
        
});
        
c._shadowPass = true;
        
d._shadowPass = true;
        
e._shadowPass = true
    
};
    
this.render = function(a, c) {
        
b.shadowMapEnabled && b.shadowMapAutoUpdate && this.update(a, c)
    };
    
this.update = function(j, l) {
        var 
m, n, p, r, o, q, s, w, t, v = [];
        
r = 0;
        
a.clearColor(1, 1, 1, 1);
        
a.disable(a.BLEND);
        
a.enable(a.CULL_FACE);
        
b.shadowMapCullFrontFaces ? a.cullFace(a.FRONT) : a.cullFace(a.BACK);
        
b.setDepthTest(true);
        
m = 0;
        for (
n = j.__lights.length; m < n; m++) {
            
p = j.__lights[m];
            if (
p.castShadow)
                if (
p instanceof THREE.DirectionalLight &&
                    
p.shadowCascade)
                    for (
o = 0; o < p.shadowCascadeCount; o++) {
                        var 
x;
                        if (
p.shadowCascadeArray[o]) x = p.shadowCascadeArray[o];
                        else {
                            
t = p;
                            
s = o;
                            
x = new THREE.DirectionalLight;
                            
x.isVirtual = true;
                            
x.onlyShadow = true;
                            
x.castShadow = true;
                            
x.shadowCameraNear = t.shadowCameraNear;
                            
x.shadowCameraFar = t.shadowCameraFar;
                            
x.shadowCameraLeft = t.shadowCameraLeft;
                            
x.shadowCameraRight = t.shadowCameraRight;
                            
x.shadowCameraBottom = t.shadowCameraBottom;
                            
x.shadowCameraTop = t.shadowCameraTop;
                            
x.shadowCameraVisible = t.shadowCameraVisible;
                            
x.shadowDarkness = t.shadowDarkness;
                            
x.shadowBias = t.shadowCascadeBias[s];
                            
x.shadowMapWidth = t.shadowCascadeWidth[s];
                            
x.shadowMapHeight = t.shadowCascadeHeight[s];
                            
x.pointsWorld = [];
                            
x.pointsFrustum = [];
                            
w = x.pointsWorld;
                            
q = x.pointsFrustum;
                            for (var 
C = 0; C < 8; C++) {
                                
w[C] = new THREE.Vector3;
                                
q[C] = new THREE.Vector3
                            
}
                            
w = t.shadowCascadeNearZ[s];
                            
t = t.shadowCascadeFarZ[s];
                            
q[0].set(-1, -1, w);
                            
q[1].set(1, -1, w);
                            
q[2].set(-1, 1, w);
                            
q[3].set(1, 1, w);
                            
q[4].set(-1, -1, t);
                            
q[5].set(1, -1, t);
                            
q[6].set(-1, 1, t);
                            
q[7].set(1, 1, t);
                            
x.originalCamera = l;
                            
q = new THREE.Gyroscope;
                            
q.position = p.shadowCascadeOffset;
                            
q.add(x);
                            
q.add(x.target);
                            
l.add(q);
                            
p.shadowCascadeArray[o] = x;
                            
console.log("Created virtualLight", x)
                        }
                        
s = p;
                        
w = o;
                        
t = s.shadowCascadeArray[w];
                        
t.position.copy(s.position);
                        
t.target.position.copy(s.target.position);
                        
t.lookAt(t.target);
                        
t.shadowCameraVisible = s.shadowCameraVisible;
                        
t.shadowDarkness = s.shadowDarkness;
                        
t.shadowBias = s.shadowCascadeBias[w];
                        
q = s.shadowCascadeNearZ[w];
                        
s = s.shadowCascadeFarZ[w];
                        
t = t.pointsFrustum;
                        
t[0].z = q;
                        
t[1].z = q;
                        
t[2].z = q;
                        
t[3].z = q;
                        
t[4].z = s;
                        
t[5].z = s;
                        
t[6].z = s;
                        
t[7].z = s;
                        
v[r] = x;
                        
r++
                    } else {
                        
v[r] = p;
                        
r++
                    }
        }
        
m =
            
0;
        for (
n = v.length; m < n; m++) {
            
p = v[m];
            if (!
p.shadowMap) {
                
p.shadowMap = new THREE.WebGLRenderTarget(p.shadowMapWidth, p.shadowMapHeight, {
                    
minFilter: THREE.LinearFilter,
                    
magFilter: THREE.LinearFilter,
                    
format: THREE.RGBAFormat
                
});
                
p.shadowMapSize = new THREE.Vector2(p.shadowMapWidth, p.shadowMapHeight);
                
p.shadowMatrix = new THREE.Matrix4
            
}
            if (!
p.shadowCamera) {
                if (
p instanceof THREE.SpotLight) p.shadowCamera = new THREE.PerspectiveCamera(p.shadowCameraFov, p.shadowMapWidth / p.shadowMapHeight, p.shadowCameraNear, p.shadowCameraFar);
                else if (
p instanceof THREE.DirectionalLight) p.shadowCamera = new THREE.OrthographicCamera(p.shadowCameraLeft, p.shadowCameraRight, p.shadowCameraTop, p.shadowCameraBottom, p.shadowCameraNear, p.shadowCameraFar);
                else {
                    
console.error("Unsupported light type for shadow");
                    continue
                }
                
j.add(p.shadowCamera);
                
b.autoUpdateScene && j.updateMatrixWorld()
            }
            if (
p.shadowCameraVisible && !p.cameraHelper) {
                
p.cameraHelper = new THREE.CameraHelper(p.shadowCamera);
                
p.shadowCamera.add(p.cameraHelper)
            }
            if (
p.isVirtual && x.originalCamera == l) {
                
o = l;
                
r = p.shadowCamera;
                
q = p.pointsFrustum;
                
t = p.pointsWorld;
                
h.set(Infinity, Infinity, Infinity);
                
i.set(-Infinity, -Infinity, -Infinity);
                for (
s = 0; s < 8; s++) {
                    
w = t[s];
                    
w.copy(q[s]);
                    
THREE.ShadowMapPlugin.__projector.unprojectVector(w, o);
                    
r.matrixWorldInverse.multiplyVector3(w);
                    if (
w.x < h.x) h.x = w.x;
                    if (
w.x > i.x) i.x = w.x;
                    if (
w.y < h.y) h.y = w.y;
                    if (
w.y > i.y) i.y = w.y;
                    if (
w.z < h.z) h.z = w.z;
                    if (
w.z > i.z) i.z = w.z
                
}
                
r.left = h.x;
                
r.right = i.x;
                
r.top = i.y;
                
r.bottom = h.y;
                
r.updateProjectionMatrix()
            }
            
r = p.shadowMap;
            
q = p.shadowMatrix;
            
o = p.shadowCamera;
            
o.position.copy(p.matrixWorld.getPosition());
            
o.lookAt(p.target.matrixWorld.getPosition());
            
o.updateMatrixWorld();
            
o.matrixWorldInverse.getInverse(o.matrixWorld);
            if (
p.cameraHelper) p.cameraHelper.lines.visible = p.shadowCameraVisible;
            
p.shadowCameraVisible && p.cameraHelper.update();
            
q.set(0.5, 0, 0, 0.5, 0, 0.5, 0, 0.5, 0, 0, 0.5, 0.5, 0, 0, 0, 1);
            
q.multiplySelf(o.projectionMatrix);
            
q.multiplySelf(o.matrixWorldInverse);
            if (!
o._viewMatrixArray) o._viewMatrixArray = new Float32Array(16);
            if (!
o._projectionMatrixArray) o._projectionMatrixArray = new Float32Array(16);
            
o.matrixWorldInverse.flattenToArray(o._viewMatrixArray);
            
o.projectionMatrix.flattenToArray(o._projectionMatrixArray);
            
g.multiply(o.projectionMatrix, o.matrixWorldInverse);
            
f.setFromMatrix(g);
            
b.setRenderTarget(r);
            
b.clear();
            
t = j.__webglObjects;
            
p = 0;
            for (
r = t.length; p < r; p++) {
                
s = t[p];
                
q = s.object;
                
s.render = false;
                if (
q.visible && q.castShadow && (!(q instanceof THREE.Mesh) || !q.frustumCulled || f.contains(q))) {
                    
q._modelViewMatrix.multiply(o.matrixWorldInverse, q.matrixWorld);
                    
s.render = true
                
}
            }
            
p = 0;
            for (
r = t.length; p < r; p++) {
                
s = t[p];
                if (
s.render) {
                    
q = s.object;
                    
s = s.buffer;
                    
w = q.customDepthMaterial ?
                        
q.customDepthMaterial : q.geometry.morphTargets.length ? d : q instanceof THREE.SkinnedMesh ? e : c;
                    
s instanceof THREE.BufferGeometry ? b.renderBufferDirect(o, j.__lights, null, w, s, q) : b.renderBuffer(o, j.__lights, null, w, s, q)
                }
            }
            
t = j.__webglObjectsImmediate;
            
p = 0;
            for (
r = t.length; p < r; p++) {
                
s = t[p];
                
q = s.object;
                if (
q.visible && q.castShadow) {
                    
q._modelViewMatrix.multiply(o.matrixWorldInverse, q.matrixWorld);
                    
b.renderImmediateObject(o, j.__lights, null, c, q)
                }
            }
        }
        
m = b.getClearColor();
        
n = b.getClearAlpha();
        
a.clearColor(m.r, m.g, m.b, n);
        
a.enable(a.BLEND);
        
b.shadowMapCullFrontFaces && a.cullFace(a.BACK)
    }
};
THREE.ShadowMapPlugin.__projector = new THREE.Projector;
THREE.SpritePlugin = function() {
    function 
a(a, b) {
        return 
b.z - a.z
    
}
    var 
b, c, d, e, f, g, h, i, j, l;
    
this.init = function(a) {
        
b = a.context;
        
c = a;
        
d = new Float32Array(16);
        
e = new Uint16Array(6);
        
a = 0;
        
d[a++] = -1;
        
d[a++] = -1;
        
d[a++] = 0;
        
d[a++] = 0;
        
d[a++] = 1;
        
d[a++] = -1;
        
d[a++] = 1;
        
d[a++] = 0;
        
d[a++] = 1;
        
d[a++] = 1;
        
d[a++] = 1;
        
d[a++] = 1;
        
d[a++] = -1;
        
d[a++] = 1;
        
d[a++] = 0;
        
d[a++] = 1;
        
a = 0;
        
e[a++] = 0;
        
e[a++] = 1;
        
e[a++] = 2;
        
e[a++] = 0;
        
e[a++] = 2;
        
e[a++] = 3;
        
f = b.createBuffer();
        
g = b.createBuffer();
        
b.bindBuffer(b.ARRAY_BUFFER, f);
        
b.bufferData(b.ARRAY_BUFFER, d, b.STATIC_DRAW);
        
b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,
            
g);
        
b.bufferData(b.ELEMENT_ARRAY_BUFFER, e, b.STATIC_DRAW);
        var 
a = THREE.ShaderSprite.sprite,
            
n = b.createProgram(),
            
p = b.createShader(b.FRAGMENT_SHADER),
            
r = b.createShader(b.VERTEX_SHADER);
        
b.shaderSource(p, a.fragmentShader);
        
b.shaderSource(r, a.vertexShader);
        
b.compileShader(p);
        
b.compileShader(r);
        
b.attachShader(n, p);
        
b.attachShader(n, r);
        
b.linkProgram(n);
        
h = n;
        
i = {};
        
j = {};
        
i.position = b.getAttribLocation(h, "position");
        
i.uv = b.getAttribLocation(h, "uv");
        
j.uvOffset = b.getUniformLocation(h, "uvOffset");
        
j.uvScale = b.getUniformLocation(h,
            
"uvScale");
        
j.rotation = b.getUniformLocation(h, "rotation");
        
j.scale = b.getUniformLocation(h, "scale");
        
j.alignment = b.getUniformLocation(h, "alignment");
        
j.color = b.getUniformLocation(h, "color");
        
j.map = b.getUniformLocation(h, "map");
        
j.opacity = b.getUniformLocation(h, "opacity");
        
j.useScreenCoordinates = b.getUniformLocation(h, "useScreenCoordinates");
        
j.affectedByDistance = b.getUniformLocation(h, "affectedByDistance");
        
j.screenPosition = b.getUniformLocation(h, "screenPosition");
        
j.modelViewMatrix = b.getUniformLocation(h, "modelViewMatrix");
        
j.projectionMatrix = b.getUniformLocation(h, "projectionMatrix");
        
l = false
    
};
    
this.render = function(d, e, p, r) {
        var 
d = d.__webglSprites,
            
o = d.length;
        if (
o) {
            var 
q = i,
                
s = j,
                
w = r / p,
                
p = p * 0.5,
                
t = r * 0.5,
                
v = true;
            
b.useProgram(h);
            if (!
l) {
                
b.enableVertexAttribArray(q.position);
                
b.enableVertexAttribArray(q.uv);
                
l = true
            
}
            
b.disable(b.CULL_FACE);
            
b.enable(b.BLEND);
            
b.depthMask(true);
            
b.bindBuffer(b.ARRAY_BUFFER, f);
            
b.vertexAttribPointer(q.position, 2, b.FLOAT, false, 16, 0);
            
b.vertexAttribPointer(q.uv, 2, b.FLOAT, false, 16, 8);
            
b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,
                
g);
            
b.uniformMatrix4fv(s.projectionMatrix, false, e._projectionMatrixArray);
            
b.activeTexture(b.TEXTURE0);
            
b.uniform1i(s.map, 0);
            for (var 
x, C = [], q = 0; q < o; q++) {
                
x = d[q];
                if (
x.visible && x.opacity !== 0)
                    if (
x.useScreenCoordinates) x.z = -x.position.z;
                    else {
                        
x._modelViewMatrix.multiply(e.matrixWorldInverse, x.matrixWorld);
                        
x.z = -x._modelViewMatrix.elements[14]
                    }
            }
            
d.sort(a);
            for (
q = 0; q < o; q++) {
                
x = d[q];
                if (
x.visible && x.opacity !== 0 && x.map && x.map.image && x.map.image.width) {
                    if (
x.useScreenCoordinates) {
                        
b.uniform1i(s.useScreenCoordinates, 1);
                        
b.uniform3f(s.screenPosition, (x.position.x - p) / p, (t - x.position.y) / t, Math.max(0, Math.min(1, x.position.z)))
                    } else {
                        
b.uniform1i(s.useScreenCoordinates, 0);
                        
b.uniform1i(s.affectedByDistance, x.affectedByDistance ? 1 : 0);
                        
b.uniformMatrix4fv(s.modelViewMatrix, false, x._modelViewMatrix.elements)
                    }
                    
e = x.map.image.width / (x.scaleByViewport ? r : 1);
                    
C[0] = e * w * x.scale.x;
                    
C[1] = e * x.scale.y;
                    
b.uniform2f(s.uvScale, x.uvScale.x, x.uvScale.y);
                    
b.uniform2f(s.uvOffset, x.uvOffset.x, x.uvOffset.y);
                    
b.uniform2f(s.alignment, x.alignment.x, x.alignment.y);
                    
b.uniform1f(s.opacity, x.opacity);
                    
b.uniform3f(s.color, x.color.r, x.color.g, x.color.b);
                    
b.uniform1f(s.rotation, x.rotation);
                    
b.uniform2fv(s.scale, C);
                    if (
x.mergeWith3D && !v) {
                        
b.enable(b.DEPTH_TEST);
                        
v = true
                    
} else if (!x.mergeWith3D && v) {
                        
b.disable(b.DEPTH_TEST);
                        
v = false
                    
}
                    
c.setBlending(x.blending, x.blendEquation, x.blendSrc, x.blendDst);
                    
c.setTexture(x.map, 0);
                    
b.drawElements(b.TRIANGLES, 6, b.UNSIGNED_SHORT, 0)
                }
            }
            
b.enable(b.CULL_FACE);
            
b.enable(b.DEPTH_TEST);
            
b.depthMask(true)
        }
    }
};
THREE.DepthPassPlugin = function() {
    
this.enabled = false;
    
this.renderTarget = null;
    var 
a, b, c, d, e = new THREE.Frustum,
        
f = new THREE.Matrix4;
    
this.init = function(e) {
        
a = e.context;
        
b = e;
        var 
e = THREE.ShaderLib.depthRGBA,
            
f = THREE.UniformsUtils.clone(e.uniforms);
        
c = new THREE.ShaderMaterial({
            
fragmentShader: e.fragmentShader,
            
vertexShader: e.vertexShader,
            
uniforms: f
        
});
        
d = new THREE.ShaderMaterial({
            
fragmentShader: e.fragmentShader,
            
vertexShader: e.vertexShader,
            
uniforms: f,
            
morphTargets: true
        
});
        
c._shadowPass = true;
        
d._shadowPass = true
    
};
    
this.render =
        function(
a, b) {
            
this.enabled && this.update(a, b)
        };
    
this.update = function(g, h) {
        var 
i, j, l, m, n, p;
        
a.clearColor(1, 1, 1, 1);
        
a.disable(a.BLEND);
        
b.setDepthTest(true);
        
b.autoUpdateScene && g.updateMatrixWorld();
        if (!
h._viewMatrixArray) h._viewMatrixArray = new Float32Array(16);
        if (!
h._projectionMatrixArray) h._projectionMatrixArray = new Float32Array(16);
        
h.matrixWorldInverse.getInverse(h.matrixWorld);
        
h.matrixWorldInverse.flattenToArray(h._viewMatrixArray);
        
h.projectionMatrix.flattenToArray(h._projectionMatrixArray);
        
f.multiply(h.projectionMatrix,
            
h.matrixWorldInverse);
        
e.setFromMatrix(f);
        
b.setRenderTarget(this.renderTarget);
        
b.clear();
        
p = g.__webglObjects;
        
i = 0;
        for (
j = p.length; i < j; i++) {
            
l = p[i];
            
n = l.object;
            
l.render = false;
            if (
n.visible && (!(n instanceof THREE.Mesh) || !n.frustumCulled || e.contains(n))) {
                
n._modelViewMatrix.multiply(h.matrixWorldInverse, n.matrixWorld);
                
l.render = true
            
}
        }
        
i = 0;
        for (
j = p.length; i < j; i++) {
            
l = p[i];
            if (
l.render) {
                
n = l.object;
                
l = l.buffer;
                
b.setObjectFaces(n);
                
m = n.customDepthMaterial ? n.customDepthMaterial : n.geometry.morphTargets.length ? d : c;
                
l instanceof
                
THREE.BufferGeometry ? b.renderBufferDirect(h, g.__lights, null, m, l, n) : b.renderBuffer(h, g.__lights, null, m, l, n)
            }
        }
        
p = g.__webglObjectsImmediate;
        
i = 0;
        for (
j = p.length; i < j; i++) {
            
l = p[i];
            
n = l.object;
            if (
n.visible && n.castShadow) {
                
n._modelViewMatrix.multiply(h.matrixWorldInverse, n.matrixWorld);
                
b.renderImmediateObject(h, g.__lights, null, c, n)
            }
        }
        
i = b.getClearColor();
        
j = b.getClearAlpha();
        
a.clearColor(i.r, i.g, i.b, j);
        
a.enable(a.BLEND)
    }
};
THREE.ShaderFlares = {
    
lensFlareVertexTexture: {
        
vertexShader: "uniform vec3 screenPosition;nuniform vec2 scale;nuniform float rotation;nuniform int renderType;nuniform sampler2D occlusionMap;nattribute vec2 position;nattribute vec2 uv;nvarying vec2 vUV;nvarying float vVisibility;nvoid main() {nvUV = uv;nvec2 pos = position;nif( renderType == 2 ) {nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) ) +ntexture2D( occlusionMap, vec2( 0.5, 0.1 ) ) +ntexture2D( occlusionMap, vec2( 0.9, 0.1 ) ) +ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ) +ntexture2D( occlusionMap, vec2( 0.9, 0.9 ) ) +ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ) +ntexture2D( occlusionMap, vec2( 0.1, 0.9 ) ) +ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ) +ntexture2D( occlusionMap, vec2( 0.5, 0.5 ) );nvVisibility = (       visibility.r / 9.0 ) *n( 1.0 - visibility.g / 9.0 ) *n(       visibility.b / 9.0 ) *n( 1.0 - visibility.a / 9.0 );npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;n}ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );n}",
        
fragmentShader: "precision mediump float;nuniform sampler2D map;nuniform float opacity;nuniform int renderType;nuniform vec3 color;nvarying vec2 vUV;nvarying float vVisibility;nvoid main() {nif( renderType == 0 ) {ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );n} else if( renderType == 1 ) {ngl_FragColor = texture2D( map, vUV );n} else {nvec4 texture = texture2D( map, vUV );ntexture.a *= opacity * vVisibility;ngl_FragColor = texture;ngl_FragColor.rgb *= color;n}n}"
    
},
    
lensFlare: {
        
vertexShader: "uniform vec3 screenPosition;nuniform vec2 scale;nuniform float rotation;nuniform int renderType;nattribute vec2 position;nattribute vec2 uv;nvarying vec2 vUV;nvoid main() {nvUV = uv;nvec2 pos = position;nif( renderType == 2 ) {npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;n}ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );n}",
        
fragmentShader: "precision mediump float;nuniform sampler2D map;nuniform sampler2D occlusionMap;nuniform float opacity;nuniform int renderType;nuniform vec3 color;nvarying vec2 vUV;nvoid main() {nif( renderType == 0 ) {ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );n} else if( renderType == 1 ) {ngl_FragColor = texture2D( map, vUV );n} else {nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a +ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a +ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a +ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;nvisibility = ( 1.0 - visibility / 4.0 );nvec4 texture = texture2D( map, vUV );ntexture.a *= opacity * visibility;ngl_FragColor = texture;ngl_FragColor.rgb *= color;n}n}"
    
}
};
THREE.ShaderSprite = {
    
sprite: {
        
vertexShader: "uniform int useScreenCoordinates;nuniform int affectedByDistance;nuniform vec3 screenPosition;nuniform mat4 modelViewMatrix;nuniform mat4 projectionMatrix;nuniform float rotation;nuniform vec2 scale;nuniform vec2 alignment;nuniform vec2 uvOffset;nuniform vec2 uvScale;nattribute vec2 position;nattribute vec2 uv;nvarying vec2 vUV;nvoid main() {nvUV = uvOffset + uv * uvScale;nvec2 alignedPosition = position + alignment;nvec2 rotatedPosition;nrotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;nrotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;nvec4 finalPosition;nif( useScreenCoordinates != 0 ) {nfinalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );n} else {nfinalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );nfinalPosition.xy += rotatedPosition * ( affectedByDistance == 1 ? 1.0 : finalPosition.z );n}ngl_Position = finalPosition;n}",
        
fragmentShader: "precision mediump float;nuniform vec3 color;nuniform sampler2D map;nuniform float opacity;nvarying vec2 vUV;nvoid main() {nvec4 texture = texture2D( map, vUV );ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );n}"
    
}
};
?>
Онлайн: 1
Реклама