bio-pv
Version:
WebGL protein viewer
9 lines • 146 kB
JavaScript
/**
* PV - WebGL protein viewer v1.8.1
* http://biasmv.github.io/pv
*
* Copyright 2013-2015 Marco Biasini
* Released under the MIT license
*/
!function(a,b){if("function"==typeof define&&define.amd)define([],b);else if("object"==typeof exports)exports=b(),"object"==typeof module&&(module.exports=exports);else{var c=b();a.pv=c,a.io=c.io,a.mol=c.mol,a.color=c.color,a.rgb=c.rgb,a.viewpoint=c.viewpoint,a.vec3=c.vec3,a.vec4=c.vec4,a.mat3=c.mat3,a.mat4=c.mat4,a.quat=c.quat}}(this,function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U;return a=function(){var a={};if(!b)var b=1e-6;if(!c)var c="undefined"!=typeof Float32Array?Float32Array:Array;if(!d)var d=Math.random;var e={};e.setMatrixArrayType=function(a){c=a},a.glMatrix=e;var f={};f.create=function(){var a=new c(3);return a[0]=0,a[1]=0,a[2]=0,a},f.clone=function(a){var b=new c(3);return b[0]=a[0],b[1]=a[1],b[2]=a[2],b},f.fromValues=function(a,b,d){var e=new c(3);return e[0]=a,e[1]=b,e[2]=d,e},f.copy=function(a,b){return a[0]=b[0],a[1]=b[1],a[2]=b[2],a},f.set=function(a,b,c,d){return a[0]=b,a[1]=c,a[2]=d,a},f.add=function(a,b,c){return a[0]=b[0]+c[0],a[1]=b[1]+c[1],a[2]=b[2]+c[2],a},f.subtract=function(a,b,c){return a[0]=b[0]-c[0],a[1]=b[1]-c[1],a[2]=b[2]-c[2],a},f.sub=f.subtract,f.multiply=function(a,b,c){return a[0]=b[0]*c[0],a[1]=b[1]*c[1],a[2]=b[2]*c[2],a},f.mul=f.multiply,f.divide=function(a,b,c){return a[0]=b[0]/c[0],a[1]=b[1]/c[1],a[2]=b[2]/c[2],a},f.div=f.divide,f.min=function(a,b,c){return a[0]=Math.min(b[0],c[0]),a[1]=Math.min(b[1],c[1]),a[2]=Math.min(b[2],c[2]),a},f.max=function(a,b,c){return a[0]=Math.max(b[0],c[0]),a[1]=Math.max(b[1],c[1]),a[2]=Math.max(b[2],c[2]),a},f.scale=function(a,b,c){return a[0]=b[0]*c,a[1]=b[1]*c,a[2]=b[2]*c,a},f.scaleAndAdd=function(a,b,c,d){return a[0]=b[0]+c[0]*d,a[1]=b[1]+c[1]*d,a[2]=b[2]+c[2]*d,a},f.distance=function(a,b){var c=b[0]-a[0],d=b[1]-a[1],e=b[2]-a[2];return Math.sqrt(c*c+d*d+e*e)},f.dist=f.distance,f.squaredDistance=function(a,b){var c=b[0]-a[0],d=b[1]-a[1],e=b[2]-a[2];return c*c+d*d+e*e},f.sqrDist=f.squaredDistance,f.length=function(a){var b=a[0],c=a[1],d=a[2];return Math.sqrt(b*b+c*c+d*d)},f.len=f.length,f.squaredLength=function(a){var b=a[0],c=a[1],d=a[2];return b*b+c*c+d*d},f.sqrLen=f.squaredLength,f.negate=function(a,b){return a[0]=-b[0],a[1]=-b[1],a[2]=-b[2],a},f.normalize=function(a,b){var c=b[0],d=b[1],e=b[2],f=c*c+d*d+e*e;return f>0&&(f=1/Math.sqrt(f),a[0]=b[0]*f,a[1]=b[1]*f,a[2]=b[2]*f),a},f.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]},f.cross=function(a,b,c){var d=b[0],e=b[1],f=b[2],g=c[0],h=c[1],i=c[2];return a[0]=e*i-f*h,a[1]=f*g-d*i,a[2]=d*h-e*g,a},f.lerp=function(a,b,c,d){var e=b[0],f=b[1],g=b[2];return a[0]=e+d*(c[0]-e),a[1]=f+d*(c[1]-f),a[2]=g+d*(c[2]-g),a},f.random=function(a,b){b=b||1;var c=2*d()*Math.PI,e=2*d()-1,f=Math.sqrt(1-e*e)*b;return a[0]=Math.cos(c)*f,a[1]=Math.sin(c)*f,a[2]=e*b,a},f.transformMat4=function(a,b,c){var d=b[0],e=b[1],f=b[2];return a[0]=c[0]*d+c[4]*e+c[8]*f+c[12],a[1]=c[1]*d+c[5]*e+c[9]*f+c[13],a[2]=c[2]*d+c[6]*e+c[10]*f+c[14],a},f.transformMat3=function(a,b,c){var d=b[0],e=b[1],f=b[2];return a[0]=d*c[0]+e*c[3]+f*c[6],a[1]=d*c[1]+e*c[4]+f*c[7],a[2]=d*c[2]+e*c[5]+f*c[8],a},f.transformQuat=function(a,b,c){var d=b[0],e=b[1],f=b[2],g=c[0],h=c[1],i=c[2],j=c[3],k=j*d+h*f-i*e,l=j*e+i*d-g*f,m=j*f+g*e-h*d,n=-g*d-h*e-i*f;return a[0]=k*j+n*-g+l*-i-m*-h,a[1]=l*j+n*-h+m*-g-k*-i,a[2]=m*j+n*-i+k*-h-l*-g,a},f.forEach=function(){var a=f.create();return function(b,c,d,e,f,g){var h,i;for(c||(c=3),d||(d=0),i=e?Math.min(e*c+d,b.length):b.length,h=d;i>h;h+=c)a[0]=b[h],a[1]=b[h+1],a[2]=b[h+2],f(a,a,g),b[h]=a[0],b[h+1]=a[1],b[h+2]=a[2];return b}}(),f.str=function(a){return"vec3("+a[0]+", "+a[1]+", "+a[2]+")"},a.vec3=f;var g={};g.create=function(){var a=new c(4);return a[0]=0,a[1]=0,a[2]=0,a[3]=0,a},g.clone=function(a){var b=new c(4);return b[0]=a[0],b[1]=a[1],b[2]=a[2],b[3]=a[3],b},g.fromValues=function(a,b,d,e){var f=new c(4);return f[0]=a,f[1]=b,f[2]=d,f[3]=e,f},g.copy=function(a,b){return a[0]=b[0],a[1]=b[1],a[2]=b[2],a[3]=b[3],a},g.set=function(a,b,c,d,e){return a[0]=b,a[1]=c,a[2]=d,a[3]=e,a},g.add=function(a,b,c){return a[0]=b[0]+c[0],a[1]=b[1]+c[1],a[2]=b[2]+c[2],a[3]=b[3]+c[3],a},g.subtract=function(a,b,c){return a[0]=b[0]-c[0],a[1]=b[1]-c[1],a[2]=b[2]-c[2],a[3]=b[3]-c[3],a},g.sub=g.subtract,g.multiply=function(a,b,c){return a[0]=b[0]*c[0],a[1]=b[1]*c[1],a[2]=b[2]*c[2],a[3]=b[3]*c[3],a},g.mul=g.multiply,g.divide=function(a,b,c){return a[0]=b[0]/c[0],a[1]=b[1]/c[1],a[2]=b[2]/c[2],a[3]=b[3]/c[3],a},g.div=g.divide,g.min=function(a,b,c){return a[0]=Math.min(b[0],c[0]),a[1]=Math.min(b[1],c[1]),a[2]=Math.min(b[2],c[2]),a[3]=Math.min(b[3],c[3]),a},g.max=function(a,b,c){return a[0]=Math.max(b[0],c[0]),a[1]=Math.max(b[1],c[1]),a[2]=Math.max(b[2],c[2]),a[3]=Math.max(b[3],c[3]),a},g.scale=function(a,b,c){return a[0]=b[0]*c,a[1]=b[1]*c,a[2]=b[2]*c,a[3]=b[3]*c,a},g.scaleAndAdd=function(a,b,c,d){return a[0]=b[0]+c[0]*d,a[1]=b[1]+c[1]*d,a[2]=b[2]+c[2]*d,a[3]=b[3]+c[3]*d,a},g.distance=function(a,b){var c=b[0]-a[0],d=b[1]-a[1],e=b[2]-a[2],f=b[3]-a[3];return Math.sqrt(c*c+d*d+e*e+f*f)},g.dist=g.distance,g.squaredDistance=function(a,b){var c=b[0]-a[0],d=b[1]-a[1],e=b[2]-a[2],f=b[3]-a[3];return c*c+d*d+e*e+f*f},g.sqrDist=g.squaredDistance,g.length=function(a){var b=a[0],c=a[1],d=a[2],e=a[3];return Math.sqrt(b*b+c*c+d*d+e*e)},g.len=g.length,g.squaredLength=function(a){var b=a[0],c=a[1],d=a[2],e=a[3];return b*b+c*c+d*d+e*e},g.sqrLen=g.squaredLength,g.negate=function(a,b){return a[0]=-b[0],a[1]=-b[1],a[2]=-b[2],a[3]=-b[3],a},g.normalize=function(a,b){var c=b[0],d=b[1],e=b[2],f=b[3],g=c*c+d*d+e*e+f*f;return g>0&&(g=1/Math.sqrt(g),a[0]=b[0]*g,a[1]=b[1]*g,a[2]=b[2]*g,a[3]=b[3]*g),a},g.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]},g.lerp=function(a,b,c,d){var e=b[0],f=b[1],g=b[2],h=b[3];return a[0]=e+d*(c[0]-e),a[1]=f+d*(c[1]-f),a[2]=g+d*(c[2]-g),a[3]=h+d*(c[3]-h),a},g.random=function(a,b){return b=b||1,a[0]=d(),a[1]=d(),a[2]=d(),a[3]=d(),g.normalize(a,a),g.scale(a,a,b),a},g.transformMat4=function(a,b,c){var d=b[0],e=b[1],f=b[2],g=b[3];return a[0]=c[0]*d+c[4]*e+c[8]*f+c[12]*g,a[1]=c[1]*d+c[5]*e+c[9]*f+c[13]*g,a[2]=c[2]*d+c[6]*e+c[10]*f+c[14]*g,a[3]=c[3]*d+c[7]*e+c[11]*f+c[15]*g,a},g.transformQuat=function(a,b,c){var d=b[0],e=b[1],f=b[2],g=c[0],h=c[1],i=c[2],j=c[3],k=j*d+h*f-i*e,l=j*e+i*d-g*f,m=j*f+g*e-h*d,n=-g*d-h*e-i*f;return a[0]=k*j+n*-g+l*-i-m*-h,a[1]=l*j+n*-h+m*-g-k*-i,a[2]=m*j+n*-i+k*-h-l*-g,a},g.forEach=function(){var a=g.create();return function(b,c,d,e,f,g){var h,i;for(c||(c=4),d||(d=0),i=e?Math.min(e*c+d,b.length):b.length,h=d;i>h;h+=c)a[0]=b[h],a[1]=b[h+1],a[2]=b[h+2],a[3]=b[h+3],f(a,a,g),b[h]=a[0],b[h+1]=a[1],b[h+2]=a[2],b[h+3]=a[3];return b}}(),g.str=function(a){return"vec4("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"},a.vec4=g;var h={};h.create=function(){var a=new c(9);return a[0]=1,a[1]=0,a[2]=0,a[3]=0,a[4]=1,a[5]=0,a[6]=0,a[7]=0,a[8]=1,a},h.fromMat4=function(a,b){return a[0]=b[0],a[1]=b[1],a[2]=b[2],a[3]=b[4],a[4]=b[5],a[5]=b[6],a[6]=b[8],a[7]=b[9],a[8]=b[10],a},h.clone=function(a){var b=new c(9);return b[0]=a[0],b[1]=a[1],b[2]=a[2],b[3]=a[3],b[4]=a[4],b[5]=a[5],b[6]=a[6],b[7]=a[7],b[8]=a[8],b},h.copy=function(a,b){return 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},h.identity=function(a){return a[0]=1,a[1]=0,a[2]=0,a[3]=0,a[4]=1,a[5]=0,a[6]=0,a[7]=0,a[8]=1,a},h.transpose=function(a,b){if(a===b){var c=b[1],d=b[2],e=b[5];a[1]=b[3],a[2]=b[6],a[3]=c,a[5]=b[7],a[6]=d,a[7]=e}else 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 a},h.invert=function(a,b){var c=b[0],d=b[1],e=b[2],f=b[3],g=b[4],h=b[5],i=b[6],j=b[7],k=b[8],l=k*g-h*j,m=-k*f+h*i,n=j*f-g*i,o=c*l+d*m+e*n;return o?(o=1/o,a[0]=l*o,a[1]=(-k*d+e*j)*o,a[2]=(h*d-e*g)*o,a[3]=m*o,a[4]=(k*c-e*i)*o,a[5]=(-h*c+e*f)*o,a[6]=n*o,a[7]=(-j*c+d*i)*o,a[8]=(g*c-d*f)*o,a):null},h.adjoint=function(a,b){var c=b[0],d=b[1],e=b[2],f=b[3],g=b[4],h=b[5],i=b[6],j=b[7],k=b[8];return a[0]=g*k-h*j,a[1]=e*j-d*k,a[2]=d*h-e*g,a[3]=h*i-f*k,a[4]=c*k-e*i,a[5]=e*f-c*h,a[6]=f*j-g*i,a[7]=d*i-c*j,a[8]=c*g-d*f,a},h.determinant=function(a){var b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],i=a[7],j=a[8];return b*(j*f-g*i)+c*(-j*e+g*h)+d*(i*e-f*h)},h.multiply=function(a,b,c){var d=b[0],e=b[1],f=b[2],g=b[3],h=b[4],i=b[5],j=b[6],k=b[7],l=b[8],m=c[0],n=c[1],o=c[2],p=c[3],q=c[4],r=c[5],s=c[6],t=c[7],u=c[8];return a[0]=m*d+n*g+o*j,a[1]=m*e+n*h+o*k,a[2]=m*f+n*i+o*l,a[3]=p*d+q*g+r*j,a[4]=p*e+q*h+r*k,a[5]=p*f+q*i+r*l,a[6]=s*d+t*g+u*j,a[7]=s*e+t*h+u*k,a[8]=s*f+t*i+u*l,a},h.mul=h.multiply,h.translate=function(a,b,c){var d=b[0],e=b[1],f=b[2],g=b[3],h=b[4],i=b[5],j=b[6],k=b[7],l=b[8],m=c[0],n=c[1];return a[0]=d,a[1]=e,a[2]=f,a[3]=g,a[4]=h,a[5]=i,a[6]=m*d+n*g+j,a[7]=m*e+n*h+k,a[8]=m*f+n*i+l,a},h.rotate=function(a,b,c){var d=b[0],e=b[1],f=b[2],g=b[3],h=b[4],i=b[5],j=b[6],k=b[7],l=b[8],m=Math.sin(c),n=Math.cos(c);return a[0]=n*d+m*g,a[1]=n*e+m*h,a[2]=n*f+m*i,a[3]=n*g-m*d,a[4]=n*h-m*e,a[5]=n*i-m*f,a[6]=j,a[7]=k,a[8]=l,a},h.fromQuat=function(a,b){var c=b[0],d=b[1],e=b[2],f=b[3],g=c+c,h=d+d,i=e+e,j=c*g,k=c*h,l=c*i,m=d*h,n=d*i,o=e*i,p=f*g,q=f*h,r=f*i;return a[0]=1-(m+o),a[3]=k+r,a[6]=l-q,a[1]=k-r,a[4]=1-(j+o),a[7]=n+p,a[2]=l+q,a[5]=n-p,a[8]=1-(j+m),a},h.normalFromMat4=function(a,b){var c=b[0],d=b[1],e=b[2],f=b[3],g=b[4],h=b[5],i=b[6],j=b[7],k=b[8],l=b[9],m=b[10],n=b[11],o=b[12],p=b[13],q=b[14],r=b[15],s=c*h-d*g,t=c*i-e*g,u=c*j-f*g,v=d*i-e*h,w=d*j-f*h,x=e*j-f*i,y=k*p-l*o,z=k*q-m*o,A=k*r-n*o,B=l*q-m*p,C=l*r-n*p,D=m*r-n*q,E=s*D-t*C+u*B+v*A-w*z+x*y;return E?(E=1/E,a[0]=(h*D-i*C+j*B)*E,a[1]=(i*A-g*D-j*z)*E,a[2]=(g*C-h*A+j*y)*E,a[3]=(e*C-d*D-f*B)*E,a[4]=(c*D-e*A+f*z)*E,a[5]=(d*A-c*C-f*y)*E,a[6]=(p*x-q*w+r*v)*E,a[7]=(q*u-o*x-r*t)*E,a[8]=(o*w-p*u+r*s)*E,a):null},h.str=function(a){return"mat3("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+")"},a.mat3=h;var i={};i.create=function(){var a=new c(16);return a[0]=1,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=1,a[6]=0,a[7]=0,a[8]=0,a[9]=0,a[10]=1,a[11]=0,a[12]=0,a[13]=0,a[14]=0,a[15]=1,a},i.fromValues=function(a,b,d,e,f,g,h,i,j,k,l,m,n,o,p,q){var r=new c(16);return r[0]=a,r[1]=b,r[2]=d,r[3]=e,r[4]=f,r[5]=g,r[6]=h,r[7]=i,r[8]=j,r[9]=k,r[10]=l,r[11]=m,r[12]=n,r[13]=o,r[14]=p,r[15]=q,r},i.clone=function(a){var b=new c(16);return b[0]=a[0],b[1]=a[1],b[2]=a[2],b[3]=a[3],b[4]=a[4],b[5]=a[5],b[6]=a[6],b[7]=a[7],b[8]=a[8],b[9]=a[9],b[10]=a[10],b[11]=a[11],b[12]=a[12],b[13]=a[13],b[14]=a[14],b[15]=a[15],b},i.copy=function(a,b){return 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],a},i.identity=function(a){return a[0]=1,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=1,a[6]=0,a[7]=0,a[8]=0,a[9]=0,a[10]=1,a[11]=0,a[12]=0,a[13]=0,a[14]=0,a[15]=1,a},i.transpose=function(a,b){if(a===b){var c=b[1],d=b[2],e=b[3],f=b[6],g=b[7],h=b[11];a[1]=b[4],a[2]=b[8],a[3]=b[12],a[4]=c,a[6]=b[9],a[7]=b[13],a[8]=d,a[9]=f,a[11]=b[14],a[12]=e,a[13]=g,a[14]=h}else a[0]=b[0],a[1]=b[4],a[2]=b[8],a[3]=b[12],a[4]=b[1],a[5]=b[5],a[6]=b[9],a[7]=b[13],a[8]=b[2],a[9]=b[6],a[10]=b[10],a[11]=b[14],a[12]=b[3],a[13]=b[7],a[14]=b[11],a[15]=b[15];return a},i.invert=function(a,b){var c=b[0],d=b[1],e=b[2],f=b[3],g=b[4],h=b[5],i=b[6],j=b[7],k=b[8],l=b[9],m=b[10],n=b[11],o=b[12],p=b[13],q=b[14],r=b[15],s=c*h-d*g,t=c*i-e*g,u=c*j-f*g,v=d*i-e*h,w=d*j-f*h,x=e*j-f*i,y=k*p-l*o,z=k*q-m*o,A=k*r-n*o,B=l*q-m*p,C=l*r-n*p,D=m*r-n*q,E=s*D-t*C+u*B+v*A-w*z+x*y;return E?(E=1/E,a[0]=(h*D-i*C+j*B)*E,a[1]=(e*C-d*D-f*B)*E,a[2]=(p*x-q*w+r*v)*E,a[3]=(m*w-l*x-n*v)*E,a[4]=(i*A-g*D-j*z)*E,a[5]=(c*D-e*A+f*z)*E,a[6]=(q*u-o*x-r*t)*E,a[7]=(k*x-m*u+n*t)*E,a[8]=(g*C-h*A+j*y)*E,a[9]=(d*A-c*C-f*y)*E,a[10]=(o*w-p*u+r*s)*E,a[11]=(l*u-k*w-n*s)*E,a[12]=(h*z-g*B-i*y)*E,a[13]=(c*B-d*z+e*y)*E,a[14]=(p*t-o*v-q*s)*E,a[15]=(k*v-l*t+m*s)*E,a):null},i.adjoint=function(a,b){var c=b[0],d=b[1],e=b[2],f=b[3],g=b[4],h=b[5],i=b[6],j=b[7],k=b[8],l=b[9],m=b[10],n=b[11],o=b[12],p=b[13],q=b[14],r=b[15];return a[0]=h*(m*r-n*q)-l*(i*r-j*q)+p*(i*n-j*m),a[1]=-(d*(m*r-n*q)-l*(e*r-f*q)+p*(e*n-f*m)),a[2]=d*(i*r-j*q)-h*(e*r-f*q)+p*(e*j-f*i),a[3]=-(d*(i*n-j*m)-h*(e*n-f*m)+l*(e*j-f*i)),a[4]=-(g*(m*r-n*q)-k*(i*r-j*q)+o*(i*n-j*m)),a[5]=c*(m*r-n*q)-k*(e*r-f*q)+o*(e*n-f*m),a[6]=-(c*(i*r-j*q)-g*(e*r-f*q)+o*(e*j-f*i)),a[7]=c*(i*n-j*m)-g*(e*n-f*m)+k*(e*j-f*i),a[8]=g*(l*r-n*p)-k*(h*r-j*p)+o*(h*n-j*l),a[9]=-(c*(l*r-n*p)-k*(d*r-f*p)+o*(d*n-f*l)),a[10]=c*(h*r-j*p)-g*(d*r-f*p)+o*(d*j-f*h),a[11]=-(c*(h*n-j*l)-g*(d*n-f*l)+k*(d*j-f*h)),a[12]=-(g*(l*q-m*p)-k*(h*q-i*p)+o*(h*m-i*l)),a[13]=c*(l*q-m*p)-k*(d*q-e*p)+o*(d*m-e*l),a[14]=-(c*(h*q-i*p)-g*(d*q-e*p)+o*(d*i-e*h)),a[15]=c*(h*m-i*l)-g*(d*m-e*l)+k*(d*i-e*h),a},i.determinant=function(a){var b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],i=a[7],j=a[8],k=a[9],l=a[10],m=a[11],n=a[12],o=a[13],p=a[14],q=a[15],r=b*g-c*f,s=b*h-d*f,t=b*i-e*f,u=c*h-d*g,v=c*i-e*g,w=d*i-e*h,x=j*o-k*n,y=j*p-l*n,z=j*q-m*n,A=k*p-l*o,B=k*q-m*o,C=l*q-m*p;return r*C-s*B+t*A+u*z-v*y+w*x},i.multiply=function(a,b,c){var d=b[0],e=b[1],f=b[2],g=b[3],h=b[4],i=b[5],j=b[6],k=b[7],l=b[8],m=b[9],n=b[10],o=b[11],p=b[12],q=b[13],r=b[14],s=b[15],t=c[0],u=c[1],v=c[2],w=c[3];return a[0]=t*d+u*h+v*l+w*p,a[1]=t*e+u*i+v*m+w*q,a[2]=t*f+u*j+v*n+w*r,a[3]=t*g+u*k+v*o+w*s,t=c[4],u=c[5],v=c[6],w=c[7],a[4]=t*d+u*h+v*l+w*p,a[5]=t*e+u*i+v*m+w*q,a[6]=t*f+u*j+v*n+w*r,a[7]=t*g+u*k+v*o+w*s,t=c[8],u=c[9],v=c[10],w=c[11],a[8]=t*d+u*h+v*l+w*p,a[9]=t*e+u*i+v*m+w*q,a[10]=t*f+u*j+v*n+w*r,a[11]=t*g+u*k+v*o+w*s,t=c[12],u=c[13],v=c[14],w=c[15],a[12]=t*d+u*h+v*l+w*p,a[13]=t*e+u*i+v*m+w*q,a[14]=t*f+u*j+v*n+w*r,a[15]=t*g+u*k+v*o+w*s,a},i.fromMat3=function(a,b){return a[0]=b[0],a[1]=b[1],a[2]=b[2],a[3]=0,a[4]=b[3],a[5]=b[4],a[6]=b[5],a[7]=0,a[8]=b[6],a[9]=b[7],a[10]=b[8],a[11]=0,a[12]=0,a[13]=0,a[14]=0,a[15]=1,a},i.mul=i.multiply,i.translate=function(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p=c[0],q=c[1],r=c[2];return b===a?(a[12]=b[0]*p+b[4]*q+b[8]*r+b[12],a[13]=b[1]*p+b[5]*q+b[9]*r+b[13],a[14]=b[2]*p+b[6]*q+b[10]*r+b[14],a[15]=b[3]*p+b[7]*q+b[11]*r+b[15]):(d=b[0],e=b[1],f=b[2],g=b[3],h=b[4],i=b[5],j=b[6],k=b[7],l=b[8],m=b[9],n=b[10],o=b[11],a[0]=d,a[1]=e,a[2]=f,a[3]=g,a[4]=h,a[5]=i,a[6]=j,a[7]=k,a[8]=l,a[9]=m,a[10]=n,a[11]=o,a[12]=d*p+h*q+l*r+b[12],a[13]=e*p+i*q+m*r+b[13],a[14]=f*p+j*q+n*r+b[14],a[15]=g*p+k*q+o*r+b[15]),a},i.scale=function(a,b,c){var d=c[0],e=c[1],f=c[2];return a[0]=b[0]*d,a[1]=b[1]*d,a[2]=b[2]*d,a[3]=b[3]*d,a[4]=b[4]*e,a[5]=b[5]*e,a[6]=b[6]*e,a[7]=b[7]*e,a[8]=b[8]*f,a[9]=b[9]*f,a[10]=b[10]*f,a[11]=b[11]*f,a[12]=b[12],a[13]=b[13],a[14]=b[14],a[15]=b[15],a},i.rotate=function(a,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D=e[0],E=e[1],F=e[2],G=Math.sqrt(D*D+E*E+F*F);return Math.abs(G)<b?null:(G=1/G,D*=G,E*=G,F*=G,f=Math.sin(d),g=Math.cos(d),h=1-g,i=c[0],j=c[1],k=c[2],l=c[3],m=c[4],n=c[5],o=c[6],p=c[7],q=c[8],r=c[9],s=c[10],t=c[11],u=D*D*h+g,v=E*D*h+F*f,w=F*D*h-E*f,x=D*E*h-F*f,y=E*E*h+g,z=F*E*h+D*f,A=D*F*h+E*f,B=E*F*h-D*f,C=F*F*h+g,a[0]=i*u+m*v+q*w,a[1]=j*u+n*v+r*w,a[2]=k*u+o*v+s*w,a[3]=l*u+p*v+t*w,a[4]=i*x+m*y+q*z,a[5]=j*x+n*y+r*z,a[6]=k*x+o*y+s*z,a[7]=l*x+p*y+t*z,a[8]=i*A+m*B+q*C,a[9]=j*A+n*B+r*C,a[10]=k*A+o*B+s*C,a[11]=l*A+p*B+t*C,c!==a&&(a[12]=c[12],a[13]=c[13],a[14]=c[14],a[15]=c[15]),a)},i.rotateX=function(a,b,c){var d=Math.sin(c),e=Math.cos(c),f=b[4],g=b[5],h=b[6],i=b[7],j=b[8],k=b[9],l=b[10],m=b[11];return b!==a&&(a[0]=b[0],a[1]=b[1],a[2]=b[2],a[3]=b[3],a[12]=b[12],a[13]=b[13],a[14]=b[14],a[15]=b[15]),a[4]=f*e+j*d,a[5]=g*e+k*d,a[6]=h*e+l*d,a[7]=i*e+m*d,a[8]=j*e-f*d,a[9]=k*e-g*d,a[10]=l*e-h*d,a[11]=m*e-i*d,a},i.rotateY=function(a,b,c){var d=Math.sin(c),e=Math.cos(c),f=b[0],g=b[1],h=b[2],i=b[3],j=b[8],k=b[9],l=b[10],m=b[11];return b!==a&&(a[4]=b[4],a[5]=b[5],a[6]=b[6],a[7]=b[7],a[12]=b[12],a[13]=b[13],a[14]=b[14],a[15]=b[15]),a[0]=f*e-j*d,a[1]=g*e-k*d,a[2]=h*e-l*d,a[3]=i*e-m*d,a[8]=f*d+j*e,a[9]=g*d+k*e,a[10]=h*d+l*e,a[11]=i*d+m*e,a},i.rotateZ=function(a,b,c){var d=Math.sin(c),e=Math.cos(c),f=b[0],g=b[1],h=b[2],i=b[3],j=b[4],k=b[5],l=b[6],m=b[7];return b!==a&&(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]),a[0]=f*e+j*d,a[1]=g*e+k*d,a[2]=h*e+l*d,a[3]=i*e+m*d,a[4]=j*e-f*d,a[5]=k*e-g*d,a[6]=l*e-h*d,a[7]=m*e-i*d,a},i.fromRotationTranslation=function(a,b,c){var d=b[0],e=b[1],f=b[2],g=b[3],h=d+d,i=e+e,j=f+f,k=d*h,l=d*i,m=d*j,n=e*i,o=e*j,p=f*j,q=g*h,r=g*i,s=g*j;return a[0]=1-(n+p),a[1]=l+s,a[2]=m-r,a[3]=0,a[4]=l-s,a[5]=1-(k+p),a[6]=o+q,a[7]=0,a[8]=m+r,a[9]=o-q,a[10]=1-(k+n),a[11]=0,a[12]=c[0],a[13]=c[1],a[14]=c[2],a[15]=1,a},i.fromQuat=function(a,b){var c=b[0],d=b[1],e=b[2],f=b[3],g=c+c,h=d+d,i=e+e,j=c*g,k=c*h,l=c*i,m=d*h,n=d*i,o=e*i,p=f*g,q=f*h,r=f*i;return a[0]=1-(m+o),a[1]=k+r,a[2]=l-q,a[3]=0,a[4]=k-r,a[5]=1-(j+o),a[6]=n+p,a[7]=0,a[8]=l+q,a[9]=n-p,a[10]=1-(j+m),a[11]=0,a[12]=0,a[13]=0,a[14]=0,a[15]=1,a},i.frustum=function(a,b,c,d,e,f,g){var h=1/(c-b),i=1/(e-d),j=1/(f-g);return a[0]=2*f*h,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=2*f*i,a[6]=0,a[7]=0,a[8]=(c+b)*h,a[9]=(e+d)*i,a[10]=(g+f)*j,a[11]=-1,a[12]=0,a[13]=0,a[14]=g*f*2*j,a[15]=0,a},i.perspective=function(a,b,c,d,e){var f=1/Math.tan(b/2),g=1/(d-e);return a[0]=f/c,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=f,a[6]=0,a[7]=0,a[8]=0,a[9]=0,a[10]=(e+d)*g,a[11]=-1,a[12]=0,a[13]=0,a[14]=2*e*d*g,a[15]=0,a},i.ortho=function(a,b,c,d,e,f,g){var h=1/(b-c),i=1/(d-e),j=1/(f-g);return a[0]=-2*h,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=-2*i,a[6]=0,a[7]=0,a[8]=0,a[9]=0,a[10]=2*j,a[11]=0,a[12]=(b+c)*h,a[13]=(e+d)*i,a[14]=(g+f)*j,a[15]=1,a},i.lookAt=function(a,c,d,e){var f,g,h,j,k,l,m,n,o,p,q=c[0],r=c[1],s=c[2],t=e[0],u=e[1],v=e[2],w=d[0],x=d[1],y=d[2];return Math.abs(q-w)<b&&Math.abs(r-x)<b&&Math.abs(s-y)<b?i.identity(a):(m=q-w,n=r-x,o=s-y,p=1/Math.sqrt(m*m+n*n+o*o),m*=p,n*=p,o*=p,f=u*o-v*n,g=v*m-t*o,h=t*n-u*m,p=Math.sqrt(f*f+g*g+h*h),p?(p=1/p,f*=p,g*=p,h*=p):(f=0,g=0,h=0),j=n*h-o*g,k=o*f-m*h,l=m*g-n*f,p=Math.sqrt(j*j+k*k+l*l),p?(p=1/p,j*=p,k*=p,l*=p):(j=0,k=0,l=0),a[0]=f,a[1]=j,a[2]=m,a[3]=0,a[4]=g,a[5]=k,a[6]=n,a[7]=0,a[8]=h,a[9]=l,a[10]=o,a[11]=0,a[12]=-(f*q+g*r+h*s),a[13]=-(j*q+k*r+l*s),a[14]=-(m*q+n*r+o*s),a[15]=1,a)},i.str=function(a){return"mat4("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+", "+a[9]+", "+a[10]+", "+a[11]+", "+a[12]+", "+a[13]+", "+a[14]+", "+a[15]+")"},a.mat4=i;var j={};return j.create=function(){var a=new c(4);return a[0]=0,a[1]=0,a[2]=0,a[3]=1,a},j.rotationTo=function(){var a=f.create(),b=f.fromValues(1,0,0),c=f.fromValues(0,1,0);return function(d,e,g){var h=f.dot(e,g);return-.999999>h?(f.cross(a,b,e),f.length(a)<1e-6&&f.cross(a,c,e),f.normalize(a,a),j.setAxisAngle(d,a,Math.PI),d):h>.999999?(d[0]=0,d[1]=0,d[2]=0,d[3]=1,d):(f.cross(a,e,g),d[0]=a[0],d[1]=a[1],d[2]=a[2],d[3]=1+h,j.normalize(d,d))}}(),j.setAxes=function(){var a=h.create();return function(b,c,d,e){return a[0]=d[0],a[3]=d[1],a[6]=d[2],a[1]=e[0],a[4]=e[1],a[7]=e[2],a[2]=c[0],a[5]=c[1],a[8]=c[2],j.normalize(b,j.fromMat3(b,a))}}(),j.clone=g.clone,j.fromValues=g.fromValues,j.copy=g.copy,j.set=g.set,j.identity=function(a){return a[0]=0,a[1]=0,a[2]=0,a[3]=1,a},j.setAxisAngle=function(a,b,c){c=.5*c;var d=Math.sin(c);return a[0]=d*b[0],a[1]=d*b[1],a[2]=d*b[2],a[3]=Math.cos(c),a},j.add=g.add,j.multiply=function(a,b,c){var d=b[0],e=b[1],f=b[2],g=b[3],h=c[0],i=c[1],j=c[2],k=c[3];return a[0]=d*k+g*h+e*j-f*i,a[1]=e*k+g*i+f*h-d*j,a[2]=f*k+g*j+d*i-e*h,a[3]=g*k-d*h-e*i-f*j,a},j.mul=j.multiply,j.scale=g.scale,j.rotateX=function(a,b,c){c*=.5;var d=b[0],e=b[1],f=b[2],g=b[3],h=Math.sin(c),i=Math.cos(c);return a[0]=d*i+g*h,a[1]=e*i+f*h,a[2]=f*i-e*h,a[3]=g*i-d*h,a},j.rotateY=function(a,b,c){c*=.5;var d=b[0],e=b[1],f=b[2],g=b[3],h=Math.sin(c),i=Math.cos(c);return a[0]=d*i-f*h,a[1]=e*i+g*h,a[2]=f*i+d*h,a[3]=g*i-e*h,a},j.rotateZ=function(a,b,c){c*=.5;var d=b[0],e=b[1],f=b[2],g=b[3],h=Math.sin(c),i=Math.cos(c);return a[0]=d*i+e*h,a[1]=e*i-d*h,a[2]=f*i+g*h,a[3]=g*i-f*h,a},j.calculateW=function(a,b){var c=b[0],d=b[1],e=b[2];return a[0]=c,a[1]=d,a[2]=e,a[3]=-Math.sqrt(Math.abs(1-c*c-d*d-e*e)),a},j.dot=g.dot,j.lerp=g.lerp,j.slerp=function(a,b,c,d){var e,f,g,h,i,j=b[0],k=b[1],l=b[2],m=b[3],n=c[0],o=c[1],p=c[2],q=c[3];return f=j*n+k*o+l*p+m*q,0>f&&(f=-f,n=-n,o=-o,p=-p,q=-q),1-f>1e-6?(e=Math.acos(f),g=Math.sin(e),h=Math.sin((1-d)*e)/g,i=Math.sin(d*e)/g):(h=1-d,i=d),a[0]=h*j+i*n,a[1]=h*k+i*o,a[2]=h*l+i*p,a[3]=h*m+i*q,a},j.invert=function(a,b){var c=b[0],d=b[1],e=b[2],f=b[3],g=c*c+d*d+e*e+f*f,h=g?1/g:0;return a[0]=-c*h,a[1]=-d*h,a[2]=-e*h,a[3]=f*h,a},j.conjugate=function(a,b){return a[0]=-b[0],a[1]=-b[1],a[2]=-b[2],a[3]=b[3],a},j.length=g.length,j.len=j.length,j.squaredLength=g.squaredLength,j.sqrLen=j.squaredLength,j.normalize=g.normalize,j.fromMat3=function(){var a="undefined"!=typeof Int8Array?new Int8Array([1,2,0]):[1,2,0];return function(b,c){var d,e=c[0]+c[4]+c[8];if(e>0)d=Math.sqrt(e+1),b[3]=.5*d,d=.5/d,b[0]=(c[7]-c[5])*d,b[1]=(c[2]-c[6])*d,b[2]=(c[3]-c[1])*d;else{var f=0;c[4]>c[0]&&(f=1),c[8]>c[3*f+f]&&(f=2);var g=a[f],h=a[g];d=Math.sqrt(c[3*f+f]-c[3*g+g]-c[3*h+h]+1),b[f]=.5*d,d=.5/d,b[3]=(c[3*h+g]-c[3*g+h])*d,b[g]=(c[3*g+f]+c[3*f+g])*d,b[h]=(c[3*h+f]+c[3*f+h])*d}return b}}(),j.str=function(a){return"quat("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"},a.quat=j,a}(),b=function(){function b(a,b){this._6=a;for(var c=0;c<this._6.length;++c)this._6[c]=g.forceRGB(this._6[c]);this._Q=b}function c(a,b,c){this.colorFor=a,this._dw=b,this._do=c}function d(a,b,c){var d=null,e=null;return a[b](function(a){var b=a.prop(c);return null===d&&null===e?void(d=e=b):(d=Math.min(d,b),void(e=Math.max(e,b)))}),{min:d,max:e}}function e(a,b,e,f,g){return b||(b=k("rainbow")),new c(function(c,d,e){var f=0;this._y!==this._A&&(f=(g(c).prop(a)-this._y)/(this._A-this._y)),m(d,e,b,f)},function(b){return void 0!==e?(this._y=e[0],void(this._A=e[1])):(e=d(b,f,a),this._y=e.min,void(this._A=e.max))},function(){})}var f=a.vec4,g={};g.rgb={};var h=g.rgb;g.rgb.create=f.create,g.rgb.scale=f.scale,g.rgb.copy=f.copy,g.rgb.fromValues=f.fromValues,g.rgb.mix=function(a,b,c,d){var e=1-d;return a[0]=b[0]*d+c[0]*e,a[1]=b[1]*d+c[1]*e,a[2]=b[2]*d+c[2]*e,a[3]=b[3]*d+c[3]*e,a};var i={white:h.fromValues(1,1,1,1),black:h.fromValues(0,0,0,1),grey:h.fromValues(.5,.5,.5,1),lightgrey:h.fromValues(.8,.8,.8,1),darkgrey:h.fromValues(.3,.3,.3,1),red:h.fromValues(1,0,0,1),darkred:h.fromValues(.5,0,0,1),lightred:h.fromValues(1,.5,.5,1),green:h.fromValues(0,1,0,1),darkgreen:h.fromValues(0,.5,0,1),lightgreen:h.fromValues(.5,1,.5,1),blue:h.fromValues(0,0,1,1),darkblue:h.fromValues(0,0,.5,1),lightblue:h.fromValues(.5,.5,1,1),yellow:h.fromValues(1,1,0,1),darkyellow:h.fromValues(.5,.5,0,1),lightyellow:h.fromValues(1,1,.5,1),cyan:h.fromValues(0,1,1,1),darkcyan:h.fromValues(0,.5,.5,1),lightcyan:h.fromValues(.5,1,1,1),magenta:h.fromValues(1,0,1,1),darkmagenta:h.fromValues(.5,0,.5,1),lightmagenta:h.fromValues(1,.5,1,1),orange:h.fromValues(1,.5,0,1),darkorange:h.fromValues(.5,.25,0,1),lightorange:h.fromValues(1,.75,.5,1)};g.hex2rgb=function(a){var b,c,d,e;if(4===a.length||5===a.length){b=parseInt(a[1],16),c=parseInt(a[2],16),d=parseInt(a[3],16),e=15,5===a.length&&(e=parseInt(a[4],16));var f=1/15;return h.fromValues(f*b,f*c,f*d,f*e)}if(7===a.length||9===a.length){b=parseInt(a.substr(1,2),16),c=parseInt(a.substr(3,2),16),d=parseInt(a.substr(5,2),16),e=255,9===a.length&&(e=parseInt(a.substr(7,2),16));var g=1/255;return h.fromValues(g*b,g*c,g*d,g*e)}},g.setColorPalette=function(a){i=a,g.initGradients()},g.forceRGB=function(a){if("string"==typeof a){var b=i[a];if(void 0!==b)return b;if(a.length>0&&"#"===a[0])return g.hex2rgb(a)}return 3===a.length?[a[0],a[1],a[2],1]:a},b.prototype={colorAt:function(a,b){if(b<=this._Q[0])return f.copy(a,this._6[0]);if(b>=this._Q[this._Q.length-1])return f.copy(a,this._6[this._Q.length-1]);for(var c=0,d=1;d<this._Q.length&&!(this._Q[d]>b);++d)c=d;var e=c+1,g=this._Q[c],i=this._Q[e],j=(b-g)/(i-g);return h.mix(a,this._6[e],this._6[c],j)}};var j={};g.gradient=function(a,c){if("string"==typeof a)return j[a];if(c=c||"equal","equal"===c){c=[];for(var d=0;d<a.length;++d)c.push(1*d/(a.length-1))}return new b(a,c)};var k=g.gradient;g.initGradients=function(){j.rainbow=k(["red","yellow","green","blue"]),j.reds=k(["lightred","darkred"]),j.greens=k(["lightgreen","darkgreen"]),j.blues=k(["lightblue","darkblue"]),j.trafficlight=k(["green","yellow","red"]),j.heatmap=k(["red","white","blue"])},c.prototype={begin:function(a){this._dw&&this._dw(a)},end:function(a){this._do&&this._do(a)}},g.ColorOp=c,g.uniform=function(a){return a=g.forceRGB(a||"white"),new c(function(b,c,d){c[d+0]=a[0],c[d+1]=a[1],c[d+2]=a[2],c[d+3]=a[3]},null,null)};var l={H:[1,1,1],C:[.83,.83,.83],N:[.13,.2,1],O:[1,.13,0],F:[.12,.94,.12],CL:[.12,.94,.12],BR:[.6,.13,0],I:[.4,0,.73],HE:[0,1,1],NE:[0,1,1],AR:[0,1,1],XE:[0,1,1],KR:[0,1,1],P:[1,.6,0],S:[.87,.87,0],B:[1,.67,.47],LI:[.47,0,1],NA:[.47,0,1],K:[.47,0,1],RB:[.47,0,1],CS:[.47,0,1],FR:[.47,0,1],BE:[0,.47,0],MG:[0,.47,0],SR:[0,.47,0],BA:[0,.47,0],RA:[0,.47,0],TI:[.6,.6,.6],FE:[.87,.47,0]};g.byElement=function(){return new c(function(a,b,c){var d=a.element(),e=l[d];return void 0!==e?(b[c]=e[0],b[c+1]=e[1],b[c+2]=e[2],b[c+3]=1,b):(b[c]=1,b[c+1]=0,b[c+2]=1,b[c+3]=1,b)},null,null)},g.bySS=function(){return new c(function(a,b,c){switch(a.residue().ss()){case"C":return b[c]=.8,b[c+1]=.8,b[c+2]=.8,void(b[c+3]=1);case"H":return b[c]=.6,b[c+1]=.6,b[c+2]=.9,void(b[c+3]=1);case"E":return b[c]=.2,b[c+1]=.8,b[c+2]=.2,void(b[c+3]=1)}},null,null)},g.rainbow=function(a){a||(a=k("rainbow"));var b=new c(function(b,c,d){var e=0,f=this.chainLimits[b.residue().chain().name()];if(void 0!==f){var g=b.residue().index();e=(g-f[0])/(f[1]-f[0])}var h=[1,1,1,1];a.colorAt(h,e),c[d]=h[0],c[d+1]=h[1],c[d+2]=h[2],c[d+3]=h[3]},function(a){var b=a.chains();this.chainLimits={};for(var c=0;c<b.length;++c){var d=b[c].backboneTraces();if(0!==d.length){for(var e=d[0].residueAt(0).index(),f=d[0].residueAt(d[0].length()-1).index(),g=1;g<d.length;++g){var h=d[g];e=Math.min(e,h.residueAt(0).index()),f=Math.max(f,h.residueAt(h.length()-1).index())}e!==f&&(this.chainLimits[b[c].name()]=[e,f])}}},function(){this.chainLimits=null});return b},g.ssSuccession=function(a,b){a||(a=k("rainbow")),b||(b=g.forceRGB("lightgrey"));var d=new c(function(c,d,e){var f=c.residue().index(),g=this.chainLimits[c.residue().chain().name()],h=g.indices[f];if(-1===h)return d[e]=b[0],d[e+1]=b[1],d[e+2]=b[2],void(d[e+3]=b[3]);var i=0;null===g.max,null!==g.max&&(i=h/(g.max>0?g.max:1));var j=[0,0,0,0];a.colorAt(j,i),d[e]=j[0],d[e+1]=j[1],d[e+2]=j[2],d[e+3]=j[3]},function(a){var b=a.chains();this.chainLimits={};for(var c=0;c<b.length;++c){for(var d=b[c].residues(),e=null,f={},g=0,h="C",i=0;i<d.length;++i){var j=d[i].ss();"C"===j?("C"!==h&&g++,f[d[i].index()]=-1):(e=g,f[d[i].index()]=g),h=j}this.chainLimits[b[c].name()]={indices:f,max:e}}},function(){this.chainLimits=null});return d},g.byChain=function(a){a||(a=k("rainbow"));var b=new c(function(b,c,d){var e=this.chainIndices[b.residue().chain().name()],f=e*this.scale,g=[0,0,0,0];a.colorAt(g,f),c[d+0]=g[0],c[d+1]=g[1],c[d+2]=g[2],c[d+3]=g[3]},function(a){var b=a.chains();this.chainIndices={};for(var c=0;c<b.length;++c)this.chainIndices[b[c].name()]=c;this.scale=b.length>1?1/(b.length-1):1},function(){this.chainIndices=null});return b};var m=function(){var a=f.create();return function(b,c,d,e){d.colorAt(a,e),b[c+0]=a[0],b[c+1]=a[1],b[c+2]=a[2],b[c+3]=a[3]}}();return g.byAtomProp=function(a,b,c){return e(a,b,c,"eachAtom",function(a){return a})},g.byResidueProp=function(a,b,c){return e(a,b,c,"eachResidue",function(a){return a.residue()})},g.interpolateColor=function(a,b){for(var c=new Float32Array(4*(b*(a.length/4-1)+1)),d=0,e=f.create(),g=f.create(),h=1/b,i=0;i<a.length/4-1;++i){f.set(e,a[4*i+0],a[4*i+1],a[4*i+2],a[4*i+3]),f.set(g,a[4*i+4],a[4*i+5],a[4*i+6],a[4*i+7]);for(var j=0;b>j;++j){var k=h*j;c[d+0]=e[0]*(1-k)+g[0]*k,c[d+1]=e[1]*(1-k)+g[1]*k,c[d+2]=e[2]*(1-k)+g[2]*k,c[d+3]=e[3]*(1-k)+g[3]*k,d+=4}}return c[d+0]=g[0],c[d+1]=g[1],c[d+2]=g[2],c[d+3]=g[3],c},g.initGradients(),g}(),c=function(){function a(a,b,c){this._cW=a,this._bq=b,this._bx=b,this._dp=c}function b(){this.clear()}return a.prototype={nextId:function(a){var b=this._bx;return this._bx++,this._cW._m[b]=a,b},hasLeft:function(){return this._bx<this._dp},recycle:function(){this._cW.recycle(this)},length:function(){return this._dp-this._bq}},b.prototype={MAX_ID:16777216,getContinuousRange:function(b){for(var c=-1,d=null,e=0;e<this._bg.length;++e){var f=this._bg[e],g=f.length();g>=b&&(null===d||d>g)&&(d=g,c=e)}if(-1!==c){var h=this._bg[c];return this._bg.splice(c,1),this._bH++,h}var i=this._cG,j=i+b;if(j>this.MAX_ID)return null;this._cG=j;var k=new a(this,i,j);return this._bH++,k},clear:function(){this._m={},this._cG=1,this._bg=[],this._bH=0},recycle:function(a){for(var b=a._bq;b<a._bx;++b)delete this._m[b];a._bx=a._bq,this._bg.push(a),this._bH--,this._bg.length>0&&0===this._bH&&this.clear()},objectForId:function(a){return this._m[a]}},b}(),d=function(){function a(a,b){return b>a}function b(a,b){void 0===a||void 0===b?(this._bT=!0,this._y=this._A=null):(this._bT=!1,this._y=a,this._A=b)}var c={};return c.derive=function(a,b,c){for(var d in b.prototype)a.prototype[d]=b.prototype[d];if(void 0!==c)for(var e in c)a.prototype[e]=c[e]},c.bind=function(a,b){return function(){return b.apply(a,arguments)}},c.copy=function(a){a=a||{};var b={};for(var c in a)a.hasOwnProperty(c)&&(b[c]=a[c]);return b},c.binarySearch=function(b,c,d){if(0===b.length)return-1;d=d||a;for(var e=0,f=b.length,g=e+f>>1;;){var h=b[g];if(d(c,h))f=g;else{if(!d(h,c))return g;e=g}var i=e+f>>1;if(i===g)return-1;g=i}return-1},c.indexFirstLargerEqualThan=function(b,c,d){if(d=d||a,0===b.length||d(b[b.length-1],c))return-1;for(var e=0,f=b.length,g=e+f>>1;;){var h=b[g];d(c,h)?f=g:d(h,c)?e=g+1:f=g;var i=e+f>>1;if(i===g)return g;g=i}},c.indexLastSmallerThan=function(b,c,d){if(d=d||a,0===b.length||d(b[b.length-1],c))return b.length-1;if(d(c,b[0])||!d(b[0],c))return-1;for(var e=0,f=b.length,g=e+f>>1;;){var h=b[g];d(c,h)||!d(h,c)?f=g:e=g;var i=e+f>>1;if(i===g)return g;g=i}},c.indexLastSmallerEqualThan=function(b,c,d){if(d=d||a,0===b.length||d(b[b.length-1],c))return b.length-1;if(d(c,b[0]))return-1;for(var e=0,f=b.length,g=e+f>>1;;){var h=b[g];d(c,h)?f=g:e=g;var i=e+f>>1;if(i===g)return g;g=i}},b.prototype={min:function(){return this._y},max:function(){return this._A},length:function(){return this._A-this._y},empty:function(){return this._bT},center:function(){return.5*(this._A+this._y)},extend:function(a){this._y-=a,this._A+=a},update:function(a){return this._bT?(this._y=this._A=a,void(this._bT=!1)):void(a<this._y?this._y=a:a>this._A&&(this._A=a))}},c.Range=b,c}(),e=function(){function a(a){if("complete"!==document.readyState&&"loaded"!==document.readyState&&"interactive"!==document.readyState)return!1;if(void 0===a)try{var b=document.createElement("canvas");return!(!window.WebGLRenderingContext||!b.getContext("experimental-webgl"))}catch(c){return!1}return!!a}function b(a,b){this._k=b.width,this._dy=b.antialias,this._l=b.height,this._2=!1,this._d9=null,this._E=a,this._cj(),this._cB=b.backgroundColor,this._dh=b.forceManualAntialiasing}return b.prototype={_cs:function(){if(this._2){this._2=!1;var a=this._k*this._br,b=this._l*this._br;this._bb=a,this._bc=b,this._b.viewport(0,0,a,b),this._c.width=a,this._c.height=b,this._br>1&&this._dd(this._br)}},resize:function(a,b){(a!==this._k||b!==this._l)&&(this._2=!0,this._k=a,this._l=b)},fitParent:function(){var a=this._E.getBoundingClientRect();this.resize(a.width,a.height)},gl:function(){return this._b},imageData:function(){return this._c.toDataURL()
},_eh:function(){try{var a={antialias:this._dy&&!this._dh,preserveDrawingBuffer:!0};this._b=this._c.getContext("experimental-webgl",a)}catch(b){return!1}return this._b?!0:!1},_dd:function(a){var b=1/a,c=.5*-(1-b)*this._bb,d=.5*-(1-b)*this._bc,e="translate("+c+"px, "+d+"px)",f="scale("+b+", "+b+")",g=e+" "+f;this._c.style.webkitTransform=g,this._c.style.transform=g,this._c.style.ieTransform=g,this._c.width=this._bb,this._c.height=this._bc},initGL:function(){var a=1;if(!this._eh())return!1;var b=this._b;return b.getContextAttributes().antialias&&!this._dh||!this._dy||(a=2),this._bb=this._k*a,this._bc=this._l*a,this._br=a,a>1&&this._dd(a),b.viewportWidth=this._bb,b.viewportHeight=this._bc,b.clearColor(this._cB[0],this._cB[1],this._cB[2],1),b.lineWidth(2),b.cullFace(b.FRONT),b.enable(b.CULL_FACE),b.enable(b.DEPTH_TEST),!0},_cM:function(a,b,c){var d,e=this._b;if("fragment"===b)d=e.createShader(e.FRAGMENT_SHADER);else{if("vertex"!==b)return null;d=e.createShader(e.VERTEX_SHADER)}var f=a.replace("${PRECISION}",c);return e.shaderSource(d,f),e.compileShader(d),e.getShaderParameter(d,e.COMPILE_STATUS)?d:null},initShader:function(a,b,c){var e=this._b,f=this._cM(b,"fragment",c),g=this._cM(a,"vertex",c),h=e.createProgram();if(e.attachShader(h,g),e.attachShader(h,f),e.linkProgram(h),!e.getProgramParameter(h,e.LINK_STATUS))return null;var i=d.bind(e,e.getAttribLocation),j=d.bind(e,e.getUniformLocation);return h.posAttrib=i(h,"attrPos"),h.colorAttrib=i(h,"attrColor"),h.normalAttrib=i(h,"attrNormal"),h.objIdAttrib=i(h,"attrObjId"),h.selectAttrib=i(h,"attrSelect"),h.symId=j(h,"symId"),h.projection=j(h,"projectionMat"),h.modelview=j(h,"modelviewMat"),h.rotation=j(h,"rotationMat"),h.fog=j(h,"fog"),h.fogFar=j(h,"fogFar"),h.fogNear=j(h,"fogNear"),h.fogColor=j(h,"fogColor"),h.outlineColor=j(h,"outlineColor"),h.outlineWidth=j(h,"outlineWidth"),h.relativePixelSize=j(h,"relativePixelSize"),h.screenDoorTransparency=j(h,"screenDoorTransparency"),h.selectionColor=j(h,"selectionColor"),h.pointSize=j(h,"pointSize"),h.zoom=j(h,"zoom"),h},on:function(a,b){this._c.addEventListener(a,b,!1)},removeEventListener:function(a,b){this._c.removeEventListener(a,b,!1)},onWheel:function(a,b){"onwheel"in this._c?this.on("wheel",a):this.on("mousewheel",b)},domElement:function(){return this._c},bind:function(){this._cs(),this._b.viewport(0,0,this._bb,this._bc)},superSamplingFactor:function(){return this._br},viewportWidth:function(){return this._bb},viewportHeight:function(){return this._bc},width:function(){return this._k},height:function(){return this._l},_cj:function(){this._c=document.createElement("canvas"),this._c.width=this._k,this._c.height=this._l,this._E.appendChild(this._c)},isWebGLSupported:function(){return a(this._b)},destroy:function(){this._c.width=1,this._c.height=1,this._c.parentElement.removeChild(this._c),this._c=null}},{Canvas:b,isWebGLSupported:a}}(),f=function(){function a(a,b){this._k=b.width,this._l=b.height,this._dt=this._k,this._du=this._l,this._b=a,this._ds=a.createFramebuffer(),a.bindFramebuffer(a.FRAMEBUFFER,this._ds),this._bB=a.createRenderbuffer(),a.bindRenderbuffer(a.RENDERBUFFER,this._bB),a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_COMPONENT16,this._k,this._l),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.RENDERBUFFER,this._bB),this._bD=a.createTexture(),this._ei()}return a.prototype={width:function(){return this._k},height:function(){return this._l},bind:function(){var a=this._b;a.bindFramebuffer(a.FRAMEBUFFER,this._ds),a.bindRenderbuffer(a.RENDERBUFFER,this._bB),(this._dt!==this._k||this._du!==this._l)&&this._dN(),a.viewport(0,0,this._k,this._l)},colorTexture:function(){return this._bD},_ei:function(){this.bind();var a=this._b;a.bindTexture(a.TEXTURE_2D,this._bD),a.texImage2D(a.TEXTURE_2D,0,a.RGBA,this._k,this._l,0,a.RGBA,a.UNSIGNED_BYTE,null),a.framebufferTexture2D(a.FRAMEBUFFER,a.COLOR_ATTACHMENT0,a.TEXTURE_2D,this._bD,0),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MIN_FILTER,a.LINEAR),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.LINEAR),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),a.bindTexture(a.TEXTURE_2D,null),this.release()},_dN:function(){var a=this._b;a.bindRenderbuffer(a.RENDERBUFFER,this._bB),a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_COMPONENT16,this._k,this._l),a.bindTexture(a.TEXTURE_2D,this._bD),a.texImage2D(a.TEXTURE_2D,0,a.RGBA,this._k,this._l,0,a.RGBA,a.UNSIGNED_BYTE,null),a.framebufferTexture2D(a.FRAMEBUFFER,a.COLOR_ATTACHMENT0,a.TEXTURE_2D,this._bD,0),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.RENDERBUFFER,this._bB),a.bindTexture(a.TEXTURE_2D,null),this._dt=this._k,this._du=this._l},resize:function(a,b){this._k=a,this._l=b},release:function(){var a=this._b;a.bindFramebuffer(a.FRAMEBUFFER,null),a.bindRenderbuffer(a.RENDERBUFFER,null)}},a}(),g=function(){function a(a){this._bA=[],this._ev=a}return a.prototype.request=function(a){for(var b=-1,c=null,d=0;d<this._bA.length;++d){var e=this._bA[d],f=e.length;f>=a&&(null===c||c>f)&&(c=f,b=d)}if(-1!==b){var g=this._bA[b];return this._bA.splice(b,1),g}return new this._ev(a)},a.prototype.release=function(a){this._bA.push(a)},a}(),h=function(){function b(a){this._b7=d.create(),this._N=d.create(),this._c6=d.create(),this._o=d.create(),this._bI=d.create(),this._bd=.1,this._5=4e3,this._di=-5,this._dj=50,this._bS=!0,this._cp=45*Math.PI/180,this._dk=c.fromValues(1,1,1),this._c0=c.fromValues(.1,.1,.1),this._ca=1,this._cO=c.fromValues(.1,1,.1),this._U=c.create(),this._L=50,this._cP=!1,this._7=!0,this._F=!0,this._0=1,this._b=a,this._bU=null,this._bp=0,this.setViewportSize(a.viewportWidth,a.viewportHeight)}var c=a.vec3,d=a.mat4;return b.prototype={_bz:function(){this._bp+=1,this._bp>68719476735&&(this._bp=0)},setScreenDoorTransparency:function(a){this._cP=a,this._bz()},setOutlineWidth:function(a){this._ca!==a&&(this._ca=a,this._bz())},setRotation:function(a){16===a.length?d.copy(this._o,a):d.fromMat3(this._o,a),this._F=!0},upsamplingFactor:function(){return this._0},setUpsamplingFactor:function(a){if(this._0!==a){this._bz(),this._0=a;var b=this._0/this._k,c=this._0/this._l;this._cS=new Float32Array([b,c])}},mainAxes:function(){return[c.fromValues(this._o[0],this._o[4],this._o[8]),c.fromValues(this._o[1],this._o[5],this._o[9]),c.fromValues(this._o[2],this._o[6],this._o[10])]},fieldOfViewY:function(){return this._cp},setFieldOfViewY:function(a){this._cp=a,this._7=!0},aspectRatio:function(){return this._k/this._l},rotation:function(){return this._o},_dE:function(){var a=!1;return this._F&&(d.identity(this._N),d.translate(this._N,this._N,[-this._U[0],-this._U[1],-this._U[2]]),d.mul(this._N,this._o,this._N),d.identity(this._bI),d.translate(this._bI,this._bI,[0,0,-this._L]),d.mul(this._N,this._bI,this._N),a=!0),this._7&&(d.identity(this._b7),d.perspective(this._b7,this._cp,this._k/this._l,this._bd,this._5),a=!0),this._7=!1,this._F=!1,a&&this._bz(),a},setViewportSize:function(a,b){this._7=!0,this._k=a,this._l=b,this._cS=new Float32Array([this._0/a,this._0/b])},viewportWidth:function(){return this._k},viewportHeight:function(){return this._l},setCenter:function(a){this._F=!0,c.copy(this._U,a)},fog:function(a){return void 0!==a&&a!==this._bS&&(this._bS=a,this._bz()),this._bS},rotateZ:function(){var a=d.create();return function(b){d.identity(a),this._F=!0,d.rotate(a,a,b,[0,0,1]),d.mul(this._o,a,this._o)}}(),rotateX:function(){var a=d.create();return function(b){d.identity(a),this._F=!0,d.rotate(a,a,b,[1,0,0]),d.mul(this._o,a,this._o)}}(),rotateY:function(){var a=d.create();return function(b){d.identity(a),this._F=!0,d.rotate(a,a,b,[0,1,0]),d.mul(this._o,a,this._o)}}(),panX:function(a){return this.panXY(a,0)},panY:function(a){return this.panXY(0,a)},panXY:function(){var a=d.create(),b=c.create();return function(e,f){d.transpose(a,this._o),this._F=!0,c.set(b,-e,f,0),c.transformMat4(b,b,a),c.add(b,b,this._U),this.setCenter(b)}}(),nearOffset:function(){return this._bd},farOffset:function(){return this._5},setNearFar:function(a,b){(a!==this._bd||b!==this._5)&&(this._bd=a,this._5=b,this._7=!0)},setFogNearFar:function(a,b){this._di=a,this._dj=b,this._7=!0},setZoom:function(a){return this._F=!0,this._L=a,this._L},zoom:function(a){if(void 0===a)return this._L;this._F=!0;var b=1+.1*a;return this._L=Math.min(1e3,Math.max(2,b*this._L)),this._L},center:function(){return this._U},setFogColor:function(a){this._dk=c.clone(a)},currentShader:function(){return this._bU},invalidateCurrentShader:function(){this._bU=null},setOutlineColor:function(a){this._c0=c.clone(a)},setSelectionColor:function(a){this._cO=c.clone(a)},bind:function(a,b){var c=!1,e=this._b;if(this._bU!==a&&(this._bU=a,e.useProgram(a),c=!0),c=this._dE()||c,b?(d.mul(this._c6,this._N,b),e.uniformMatrix4fv(a.modelview,!1,this._c6)):e.uniformMatrix4fv(a.modelview,!1,this._N),this._bp!==a.stateId){a.stateId=this._bp,e.uniformMatrix4fv(a.projection,!1,this._b7),a.rotation&&e.uniformMatrix4fv(a.rotation,!1,this._o),e.uniform1i(a.fog,this._bS);var f=this._L;e.uniform1f(a.fogFar,this._dj+f),e.uniform1f(a.zoom,this._L),e.uniform1f(a.fogNear,this._di+f),e.uniform3fv(a.fogColor,this._dk),e.uniform3fv(a.outlineColor,this._c0),e.uniform3fv(a.selectionColor,this._cO),e.uniform2fv(a.relativePixelSize,this._cS),e.uniform1f(a.outlineWidth,this._ca),e.uniform1i(a.screenDoorTransparency,this._cP)}}},b}(),i={PRELUDE_FS:"\nprecision ${PRECISION} float;\nuniform bool screenDoorTransparency;\nvec4 handleAlpha(vec4 inColor) {\n if (screenDoorTransparency) {\n ivec2 pxCoord = ivec2(gl_FragCoord.xy);\n ivec2 mod = pxCoord - (pxCoord/2) * 2;\n if (inColor.a < 0.99 &&\n (inColor.a < 0.01 || mod.x != 0 || mod.y != 0)) { discard; }\n return vec4(inColor.rgb, 1.0);\n } else {\n if (inColor.a == 0.0) { discard; }\n return inColor;\n } \n} \nuniform vec3 selectionColor;\n\nvec3 handleSelect(vec3 inColor, float vertSelect) { \n return mix(inColor, selectionColor, step(0.5, vertSelect) * 0.7); \n} \n\nuniform bool fog;\nuniform float fogNear;\nuniform float fogFar;\nuniform vec3 fogColor;\nvec3 handleFog(vec3 inColor) {\n if (fog) {\n float depth = gl_FragCoord.z / gl_FragCoord.w;\n float fogFactor = smoothstep(fogNear, fogFar, depth);\n return mix(inColor, fogColor, fogFactor);\n } else {\n return inColor;\n }\n}",LINES_FS:"\nvarying vec4 vertColor;\nvarying vec3 vertNormal;\n\nvoid main(void) {\n gl_FragColor = handleAlpha(vertColor);\n gl_FragColor.rgb = handleFog(gl_FragColor.rgb);\n}",SELECT_LINES_FS:"\nprecision ${PRECISION} float;\n\nvarying float vertSelect;\nvarying vec3 vertNormal;\nuniform float fogNear;\nuniform float fogFar;\nuniform vec3 fogColor;\nuniform bool fog;\nuniform vec3 selectionColor;\n\nvoid main(void) {\n gl_FragColor = mix(vec4(0.0, 0.0, 0.0, 0.0), vec4(selectionColor, 1.0), \n vertSelect);\n gl_FragColor.a = step(0.5, vertSelect);\n if (gl_FragColor.a == 0.0) { discard; }\n float depth = gl_FragCoord.z / gl_FragCoord.w;\n if (fog) {\n float fog_factor = smoothstep(fogNear, fogFar, depth);\n gl_FragColor = mix(gl_FragColor, vec4(fogColor, gl_FragColor.w),\n fog_factor);\n }\n}",SELECT_LINES_VS:"\nattribute vec3 attrPos;\nattribute float attrSelect;\n\nuniform mat4 projectionMat;\nuniform mat4 modelviewMat;\nuniform float pointSize;\nvarying float vertSelect;\nvoid main(void) {\n gl_Position = projectionMat * modelviewMat * vec4(attrPos, 1.0);\n gl_Position.z += gl_Position.w * 0.000001; \n float distToCamera = vec4(modelviewMat * vec4(attrPos, 1.0)).z;\n gl_PointSize = pointSize * 200.0 / abs(distToCamera); \n vertSelect = attrSelect;\n}",SELECT_VS:"\nprecision ${PRECISION} float;\nuniform mat4 projectionMat;\nuniform mat4 modelviewMat;\nuniform float pointSize;\nattribute vec3 attrPos;\nattribute float attrObjId;\n\nvarying float objId;\n\nvoid main(void) {\n gl_Position = projectionMat * modelviewMat * vec4(attrPos, 1.0);\n float distToCamera = vec4(modelviewMat * vec4(attrPos, 1.0)).z;\n gl_PointSize = pointSize * 200.0 / abs(distToCamera); \n objId = attrObjId;\n}",SELECT_FS:"\nprecision ${PRECISION} float;\n\nvarying float objId;\nuniform int symId;\n\nint intMod(int x, int y) { \n int z = x/y;\n return x-y*z;\n}\nvoid main(void) {\n // ints are only required to be 7bit...\n int integralObjId = int(objId+0.5);\n int red = intMod(integralObjId, 256);\n integralObjId/=256;\n int green = intMod(integralObjId, 256);\n integralObjId/=256;\n int blue = intMod(integralObjId, 256);\n int alpha = symId;\n gl_FragColor = vec4(float(red), float(green), \n float(blue), float(alpha))/255.0;\n}",LINES_VS:"\nattribute vec3 attrPos;\nattribute vec4 attrColor;\n\nuniform mat4 projectionMat;\nuniform mat4 modelviewMat;\nvarying vec4 vertColor;\nuniform float pointSize;\nvoid main(void) {\n gl_Position = projectionMat * modelviewMat * vec4(attrPos, 1.0);\n float distToCamera = vec4(modelviewMat * vec4(attrPos, 1.0)).z;\n gl_PointSize = pointSize * 200.0 / abs(distToCamera); \n vertColor = attrColor;\n}",HEMILIGHT_FS:"\nvarying vec4 vertColor;\nvarying vec3 vertNormal;\nvarying float vertSelect;\n\nvoid main(void) {\n float dp = dot(vertNormal, vec3(0.0, 0.0, 1.0));\n float hemi = min(1.0, max(0.0, dp)*0.6+0.5);\n gl_FragColor = vec4(vertColor.rgb*hemi, vertColor.a);\n gl_FragColor.rgb = handleFog(handleSelect(gl_FragColor.rgb, vertSelect));\n gl_FragColor = handleAlpha(gl_FragColor);\n}",PHONG_FS:"\nvarying vec4 vertColor;\nvarying vec3 vertNormal;\nvarying vec3 vertPos;\nuniform float zoom;\nvarying float vertSelect;\n\nvoid main(void) {\n vec3 eyePos = vec3(0.0, 0.0, zoom);\n float dp = dot(vertNormal, normalize(eyePos - vertPos));\n float hemi = min(1.0, max(0.3, dp)+0.2);\n //hemi *= vertColor.a;\n vec3 rgbColor = vertColor.rgb * hemi; \n rgbColor += min(vertColor.rgb, 0.8) * pow(max(0.0, dp), 18.0);\n rgbColor = handleSelect(rgbColor, vertSelect);\n gl_FragColor = vec4(clamp(rgbColor, 0.0, 1.0), vertColor.a);\n gl_FragColor.rgb = handleFog(gl_FragColor.rgb);\n gl_FragColor = handleAlpha(gl_FragColor);\n}",HEMILIGHT_VS:"\nattribute vec3 attrPos;\nattribute vec4 attrColor;\nattribute vec3 attrNormal;\nattribute float attrSelect;\n\nuniform mat4 projectionMat;\nuniform mat4 modelviewMat;\nvarying vec4 vertColor;\nvarying vec3 vertNormal;\nvarying vec3 vertPos;\nvarying float vertSelect;\nvoid main(void) {\n vertPos = (modelviewMat * vec4(attrPos, 1.0)).xyz;\n gl_Position = projectionMat * modelviewMat * vec4(attrPos, 1.0);\n vec4 n = (modelviewMat * vec4(attrNormal, 0.0));\n vertNormal = n.xyz;\n vertColor = attrColor;\n vertSelect = attrSelect;\n}",OUTLINE_FS:"\nvarying float vertAlpha;\nvarying float vertSelect;\n\nuniform vec3 outlineColor;\n\nvoid main() {\n gl_FragColor = vec4(mix(outlineColor, selectionColor, \n step(0.5, vertSelect)), \n vertAlpha);\n gl_FragColor.rgb = handleFog(gl_FragColor.rgb);\n gl_FragColor = handleAlpha(gl_FragColor);\n}",OUTLINE_VS:"\nprecision ${PRECISION} float;\n\nattribute vec3 attrPos;\nattribute vec3 attrNormal;\nattribute vec4 attrColor;\nattribute float attrSelect;\n\nuniform vec3 outlineColor;\nuniform mat4 projectionMat;\nuniform mat4 modelviewMat;\nvarying float vertAlpha;\nvarying float vertSelect;\nuniform vec2 relativePixelSize;\nuniform float outlineWidth;\n\nvoid main(void) {\n gl_Position = projectionMat * modelviewMat * vec4(attrPos, 1.0);\n vec4 normal = modelviewMat * vec4(attrNormal, 0.0);\n vertAlpha = attrColor.a;\n vertSelect = attrSelect;\n vec2 expansion = relativePixelSize * \n (outlineWidth + 2.0 * step(0.5, attrSelect));\n vec2 offset = normal.xy * expansion;\n gl_Position.xy += gl_Position.w * offset;\n}",TEXT_VS:"\nprecision ${PRECISION} float;\n\nattribute vec3 attrCenter;\nattribute vec2 attrCorner;\nuniform mat4 projectionMat;\nuniform mat4 modelviewMat;\nuniform mat4 rotationMat;\nvarying vec2 vertTex;\nuniform float width;\nuniform float height;\nvoid main() { \n vec4 pos = modelviewMat* vec4(attrCenter, 1.0);\n pos.z += 4.0;\n gl_Position = projectionMat * pos;\n gl_Position.xy += vec2(width,height)*attrCorner*gl_Position.w; \n vertTex = (attrCorner+abs(attrCorner))/(2.0*abs(attrCorner)); \n}",TEXT_FS:"\nprecision ${PRECISION} float;\n\nuniform mat4 projectionMat;\nuniform mat4 modelviewMat;\nuniform sampler2D sampler;\nuniform float xScale;\nuniform float yScale;\nvarying vec2 vertTex;\nvoid main() { \n vec2 texCoord = vec2(vertTex.x*xScale, vertTex.y*yScale);\n gl_FragColor = texture2D(sampler, texCoord);\n if (gl_FragColor.a == 0.0) { discard; }\n}"},j=function(){function a(a,b,c){this._bh=a,this._bh.addEventListener("touchmove",d.bind(this,this._dG)),this._bh.addEventListener("touchstart",d.bind(this,this._dF)),this._bh.addEventListener("touchend",d.bind(this,this._cH)),this._bh.addEventListener("touchcancel",d.bind(this,this._cH)),this._8={scale:1,rotation:0,center:null},this._bP=null,this._w=b,this._d=c}function b(a){for(var b=0,c=0,d=0;d<a.length;++d)b+=a[d].clientX,c+=a[d].clientY;return b/=a.length,c/=a.length,{x:b,y:c}}function c(a,b){var c=b.x-a.x,d=b.y-a.y;return Math.sqrt(c*c+d*d)}function e(a,b){var d=c(a[0],a[1]),e=c(b[0],b[1]);return e/(0===d?1:d)}function f(a,b){var c=b.x-a.x,d=b.y-a.y;return Math.atan2(d,c)}function g(a,b){return f(b[1],b[0])-f(a[1],a[0])}return a.prototype={_dm:function(a,c){var d={};d.center=b(c.targetTouches),d.pointers=[];for(var f=0;f<c.targetTouches.length;++f){var h=c.targetTouches[f];d.pointers.push({x:h.clientX,y:h.clientY})}return d.numTouches=c.targetTouches.length,d.rotation=0,d.scale=1,d.deltaScale=0,d.deltaRotation=0,a.center&&(d.deltaCenter={x:d.center.x-a.center.x,y:d.center.y-a.center.y}),2!==a.numTouches||2!==d.numTouches?d:(d.initialPointers=a.initialPointers?a.initialPointers:a.pointers,d.scale=e(d.initialPointers,d.pointers),d.deltaScale=d.scale-a.scale,d.rotation=g(d.initialPointers,d.pointers),d.deltaRotation=d.rotation-a.rotation,d)},_dG:function(a){a.preventDefault();var b=this._dm(this._8,a),c=4*-b.deltaScale;if(0!==c&&this._d.zoom(c),2===b.numTouches&&2===this._8.numTouches){var d=.002*Math.tan(.5*this._d.fieldOfViewY())*this._d.zoom();this._d.panXY(b.deltaCenter.x*d,b.deltaCenter.y*d)}var e=-b.deltaRotation;this._d.rotateZ(e),1===b.numTouches&&1===this._8.numTouches&&(this._d.rotateX(.005*b.delta