* Copyright (c) 2011 Sencha Labs (http://sencha.com)
* Licensed under the MIT (http://raphaeljs.com/license.html) license.
*/
-(function(){function c$(c,d,e,g,h){e=P(e);var i,j,k,l=[],m,n,o,p=c.ms,r={},s={},t={};if(g)for(v=0,w=cU.length;v<w;v++){var u=cU[v];if(u.el.id==d.id&&u.anim==c){u.percent!=e?(cU.splice(v,1),k=1):j=u,d.attr(u.totalOrigin);break}}else g=NaN;for(var v=0,w=c.percents.length;v<w;v++){if(c.percents[v]==e||c.percents[v]>g*c.top){e=c.percents[v],n=c.percents[v-1]||0,p=p/c.top*(e-n),m=c.percents[v+1],i=c.anim[e];break}g&&d.attr(c.anim[c.percents[v]])}if(!!i){if(!j){for(attr in i)if(i[f](attr))if(U[f](attr)||d.paper.customAttributes[f](attr)){r[attr]=d.attr(attr),r[attr]==null&&(r[attr]=T[attr]),s[attr]=i[attr];switch(U[attr]){case B:t[attr]=(s[attr]-r[attr])/p;break;case"colour":r[attr]=a.getRGB(r[attr]);var x=a.getRGB(s[attr]);t[attr]={r:(x.r-r[attr].r)/p,g:(x.g-r[attr].g)/p,b:(x.b-r[attr].b)/p};break;case"path":var y=bC(r[attr],s[attr]),z=y[1];r[attr]=y[0],t[attr]=[];for(v=0,w=r[attr].length;v<w;v++){t[attr][v]=[0];for(var A=1,C=r[attr][v].length;A<C;A++)t[attr][v][A]=(z[v][A]-r[attr][v][A])/p}break;case"transform":var D=d._,E=bO(D[attr],s[attr]);if(E){r[attr]=E.from,s[attr]=E.to,t[attr]=[],t[attr].real=!0;for(v=0,w=r[attr].length;v<w;v++){t[attr][v]=[r[attr][v][0]];for(A=1,C=r[attr][v].length;A<C;A++)t[attr][v][A]=(s[attr][v][A]-r[attr][v][A])/p}}else{var F=(d.matrix||new bP).m,G={_:{transform:D.transform},getBBox:function(){return d.getBBox()}};r[attr]=[F[0][0],F[1][0],F[0][1],F[1][1],F[0][2],F[1][2]],bM(G,s[attr]),s[attr]=G._.transform,t[attr]=[(G.matrix.m[0][0]-F[0][0])/p,(G.matrix.m[1][0]-F[1][0])/p,(G.matrix.m[0][1]-F[0][1])/p,(G.matrix.m[1][1]-F[1][1])/p,(G.matrix.m[0][2]-F[0][2])/p,(G.matrix.m[1][2]-F[1][2])/p]}break;case"csv":var H=q(i[attr]).split(b),I=q(r[attr]).split(b);if(attr=="clip-rect"){r[attr]=I,t[attr]=[],v=I.length;while(v--)t[attr][v]=(H[v]-r[attr][v])/p}s[attr]=H;break;default:H=[].concat(i[attr]),I=[].concat(r[attr]),t[attr]=[],v=d.paper.customAttributes[attr].length;while(v--)t[attr][v]=((H[v]||0)-(I[v]||0))/p}}var J=i.easing,K=a.easing_formulas[J];if(!K){K=q(J).match(M);if(K&&K.length==5){var L=K;K=function(a){return cY(a,+L[1],+L[2],+L[3],+L[4],p)}}else K=bd}o=i.start||c.start||+(new Date),u={anim:c,percent:e,timestamp:o,start:o+(c.del||0),status:0,initstatus:g||0,stop:!1,ms:p,easing:K,from:r,diff:t,to:s,el:d,callback:i.callback,prev:n,next:m,repeat:c.times,origin:d.attr(),totalOrigin:h},cU.push(u);if(g&&!j){u.stop=!0,u.start=new Date-p*g;if(cU.length==1)return cW()}cU.length==1&&cV(cW)}else j.initstatus=g,j.start=new Date-j.ms*g;dc("anim.start."+d.id,d,c)}}function cZ(a,b){var c=[];this.anim=a,this.ms=b,this.times=1;if(this.anim){for(var d in this.anim)this.anim[f](d)&&c.push(+d);c.sort(bb)}this.top=c[c.length-1],this.percents=c}function cY(a,b,c,d,e,f){function o(a,b){var c,d,e,f,j,k;for(e=a,k=0;k<8;k++){f=m(e)-a;if(y(f)<b)return e;j=(3*i*e+2*h)*e+g;if(y(j)<1e-6)break;e=e-f/j}c=0,d=1,e=a;if(e<c)return c;if(e>d)return d;while(c<d){f=m(e);if(y(f-a)<b)return e;a>f?c=e:d=e,e=(d-c)/2+c}return e}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function m(a){return((i*a+h)*a+g)*a}var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;return n(a,1/(200*f))}function cM(){return this.x+p+this.y+p+this.width+"×"+this.height}function cL(){return this.x+p+this.y}function bP(a,b,c,d,e,f){a!=null?this.m=[[a,c,e],[b,d,f],[0,0,1]]:this.m=[[1,0,0],[0,1,0],[0,0,1]]}function bs(a,b){var c=g.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top-9999em",c.onload=function(){b.call(this),this.onload=null,g.doc.body.removeChild(this)},c.onerror=function(){g.doc.body.removeChild(this)},g.doc.body.appendChild(c),c.src=a}function br(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),g=e.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];if(h[f](g))return c?c(h[g]):h[g];i.length>=1e3&&delete h[i.shift()],i.push(g),h[g]=a[l](b,e);return c?c(h[g]):h[g]}return d}function a(b){if(a.is(b,"function"))return dc.on("DOMload",b);if(a.is(b,D)){var d=b,e=cl[l](a,d.splice(0,3+a.is(d[0],B))),g=e.set(),h=0,i=d.length,j;for(;h<i;h++)j=d[h]||{},c[f](j.type)&&g.push(e[j.type]().attr(j));return g}return cl[l](a,arguments)}a.version="2.0.0";var b=/[, ]+/,c={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},d=/\{(\d+)\}/g,e="prototype",f="hasOwnProperty",g={doc:document,win:window},h={was:Object.prototype[f].call(g.win,"Raphael"),is:g.win.Raphael},i=function(){},j,k="appendChild",l="apply",m="concat",n="createTouch"in g.doc,o="",p=" ",q=String,r="split",s="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend".split(p),t={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},u=q.prototype.toLowerCase,v=Math,w=v.max,x=v.min,y=v.abs,z=v.pow,A=v.PI,B="number",C="string",D="array",E="toString",F="fill",G=Object.prototype.toString,H={},I="push",J=/^url\(['"]?([^\)]+?)['"]?\)$/i,K=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,L={NaN:1,Infinity:1,"-Infinity":1},M=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,N=v.round,O="setAttribute",P=parseFloat,Q=parseInt,R=" progid:DXImageTransform.Microsoft",S=q.prototype.toUpperCase,T={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/",opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},U={blur:B,"clip-rect":"csv",cx:B,cy:B,fill:"colour","fill-opacity":B,"font-size":B,height:B,opacity:B,path:"path",r:B,rx:B,ry:B,stroke:"colour","stroke-opacity":B,"stroke-width":B,transform:"transform",width:B,x:B,y:B},V=/\s*,\s*/,W={hs:1,rg:1},X=/,?([achlmqrstvxz]),?/gi,Y=/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,Z=/([rstm])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,$=/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,_=/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,ba=function(a,b){return a.key-b.key},bb=function(a,b){return a-b},bc=function(){},bd=function(a){return a},be=function(a,b,c,d,e){if(e)return[["M",a+e,b],["l",c-e*2,0],["a",e,e,0,0,1,e,e],["l",0,d-e*2],["a",e,e,0,0,1,-e,e],["l",e*2-c,0],["a",e,e,0,0,1,-e,-e],["l",0,e*2-d],["a",e,e,0,0,1,e,-e],["z"]];return[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]]},bf=function(a,b,c,d){d==null&&(d=c);return[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]]},bg={path:function(a){return a.attr("path")},circle:function(a){var b=a.attrs;return bf(b.cx,b.cy,b.r)},ellipse:function(a){var b=a.attrs;return bf(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=a.attrs;return be(b.x,b.y,b.width,b.height,b.r)},image:function(a){var b=a.attrs;return be(b.x,b.y,b.width,b.height)},text:function(a){var b=a._getBBox();return be(b.x,b.y,b.width,b.height)}},bh=function(a,b){if(!b)return a;var c,d,e,f,g;a=bC(a);for(e=0,ii=a.length;e<ii;e++){g=a[e];for(f=1,jj=g.length;f<jj;f+=2)c=b.x(g[f],g[f+1]),d=b.y(g[f],g[f+1]),g[f]=c,g[f+1]=d}return a};a.type=g.win.SVGAngle||g.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML";if(a.type=="VML"){var bi=g.doc.createElement("div"),bj;bi.innerHTML='<v:shape adj="1"/>',bj=bi.firstChild,bj.style.behavior="url(#default#VML)";if(!bj||typeof bj.adj!="object")return a.type=o;bi=null}a.svg=!(a.vml=a.type=="VML"),j=i.prototype=a.prototype,j.customAttributes={},a._id=0,a._oid=0,a.fn={},a.is=function(a,b){b=u.call(b);if(b=="finite")return!L[f](+a);return b=="null"&&a===null||b==typeof a||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||G.call(a).slice(8,-1).toLowerCase()==b},a.angle=function(b,c,d,e,f,g){if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return(180+v.atan2(-i,-h)*180/A+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)},a.rad=function(a){return a%360*A/180},a.deg=function(a){return a*180/A%360},a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,D)){var e=b.length;while(e--)if(y(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(f<d)return c-f;if(f>b-d)return c-f+b}return c};var bk=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=v.random()*16|0,c=a=="x"?b:b&3|8;return c.toString(16)});a.setWindow=function(b){dc("setWindow",a,g.win,b),g.win=b,g.doc=g.win.document,cz&&cz(g.win)};var bl=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write("<body>"),e.close(),d=e.body}catch(f){d=createPopup().document.body}var h=d.createTextRange();bl=br(function(a){try{d.style.color=q(a).replace(c,o);var b=h.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=g.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",g.doc.body.appendChild(i),bl=br(function(a){i.style.color=a;return g.doc.defaultView.getComputedStyle(i,o).getPropertyValue("color")})}return bl(b)},bm=function(){return"hsb("+[this.h,this.s,this.b]+")"},bn=function(){return"hsl("+[this.h,this.s,this.l]+")"},bo=function(){return this.hex},bp=function(b,c,d){c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b&&(d=b.b,c=b.g,b=b.r);if(c==null&&a.is(b,C)){var e=a.getRGB(b);b=e.r,c=e.g,d=e.b}if(b>1||c>1||d>1)b/=255,c/=255,d/=255;return[b,c,d]},bq=function(b,c,d,e){b*=255,c*=255,d*=255;var f={r:b,g:c,b:d,hex:a.rgb(b,c,d),toString:bo};a.is(e,"finite")&&(f.opacity=e);return f};a.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;a=a%360/60,i=c*b,h=i*(1-y(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bq(e,f,g,d)},a.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h);if(a>1||b>1||c>1)a/=360,b/=100,c/=100;a*=360;var e,f,g,h,i;a=a%360/60,i=2*b*(c<.5?c:1-c),h=i*(1-y(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bq(e,f,g,d)},a.rgb2hsb=function(a,b,c){c=bp(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;f=w(a,b,c),g=f-x(a,b,c),d=g==0?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=d%6*60,e=g==0?0:g/f;return{h:d,s:e,b:f,toString:bm}},a.rgb2hsl=function(a,b,c){c=bp(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;g=w(a,b,c),h=x(a,b,c),i=g-h,d=i==0?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=d%6*60,f=(g+h)/2,e=i==0?0:f<.5?i/(2*f):i/(2-2*f);return{h:d,s:e,l:f,toString:bn}},a._path2string=function(){return this.join(",").replace(X,"$1")},a.getRGB=br(function(b){if(!b||!!((b=q(b)).indexOf("-")+1))return{r:-1,g:-1,b:-1,hex:"none",error:1};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none"};!W[f](b.toLowerCase().substring(0,2))&&b.charAt()!="#"&&(b=bl(b));var c,d,e,g,h,i,j,k=b.match(K);if(k){k[2]&&(g=Q(k[2].substring(5),16),e=Q(k[2].substring(3,5),16),d=Q(k[2].substring(1,3),16)),k[3]&&(g=Q((i=k[3].charAt(3))+i,16),e=Q((i=k[3].charAt(2))+i,16),d=Q((i=k[3].charAt(1))+i,16)),k[4]&&(j=k[4].split(V),d=P(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=P(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),g=P(j[2]),j[2].slice(-1)=="%"&&(g*=2.55),k[1].toLowerCase().slice(0,4)=="rgba"&&(h=P(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100));if(k[5]){j=k[5].split(V),d=P(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=P(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),g=P(j[2]),j[2].slice(-1)=="%"&&(g*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsba"&&(h=P(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,g,h)}if(k[6]){j=k[6].split(V),d=P(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=P(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),g=P(j[2]),j[2].slice(-1)=="%"&&(g*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsla"&&(h=P(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,g,h)}k={r:d,g:e,b:g},k.hex="#"+(16777216|g|e<<8|d<<16).toString(16).slice(1),a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1}},a),a.hsb=br(function(b,c,d){return a.hsb2rgb(b,c,d).hex}),a.hsl=br(function(b,c,d){return a.hsl2rgb(b,c,d).hex}),a.rgb=br(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b}));return c.hex},a.getColor.reset=function(){delete this.start},a.parsePathString=br(function(b){if(!b)return null;var c={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},d=[];a.is(b,D)&&a.is(b[0],D)&&(d=bu(b)),d.length||q(b).replace(Y,function(a,b,e){var f=[],g=u.call(b);e.replace($,function(a,b){b&&f.push(+b)}),g=="m"&&f.length>2&&(d.push([b][m](f.splice(0,2))),g="l",b=b=="m"?"l":"L");while(f.length>=c[g]){d.push([b][m](f.splice(0,c[g])));if(!c[g])break}}),d.toString=a._path2string;return d}),a.parseTransformString=br(function(b){if(!b)return null;var c={r:3,s:4,t:2,m:6},d=[];a.is(b,D)&&a.is(b[0],D)&&(d=bu(b)),d.length||q(b).replace(Z,function(a,b,c){var e=[],f=u.call(b);c.replace($,function(a,b){b&&e.push(+b)}),d.push([f][m](e))}),d.toString=a._path2string;return d}),a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=z(j,3)*a+z(j,2)*3*i*c+j*3*i*i*e+z(i,3)*g,l=z(j,3)*b+z(j,2)*3*i*d+j*3*i*i*f+z(i,3)*h,m=a+2*i*(c-a)+i*i*(e-2*c+a),n=b+2*i*(d-b)+i*i*(f-2*d+b),o=c+2*i*(e-c)+i*i*(g-2*e+c),p=d+2*i*(f-d)+i*i*(h-2*f+d),q=(1-i)*a+i*c,r=(1-i)*b+i*d,s=(1-i)*e+i*g,t=(1-i)*f+i*h,u=90-v.atan2(m-o,n-p)*180/A;(m>o||n<p)&&(u+=180);return{x:k,y:l,m:{x:m,y:n},n:{x:o,y:p},start:{x:q,y:r},end:{x:s,y:t},alpha:u}};var bt=br(function(a){if(!a)return{x:0,y:0,width:0,height:0};a=bC(a);var b=0,c=0,d=[],e=[],f;for(var g=0,h=a.length;g<h;g++){f=a[g];if(f[0]=="M")b=f[1],c=f[2],d.push(b),e.push(c);else{var i=bB(b,c,f[1],f[2],f[3],f[4],f[5],f[6]);d=d[m](i.min.x,i.max.x),e=e[m](i.min.y,i.max.y),b=f[5],c=f[6]}}var j=x[l](0,d),k=x[l](0,e);return{x:j,y:k,width:w[l](0,d)-j,height:w[l](0,e)-k}}),bu=function(b){var c=[];if(!a.is(b,D)||!a.is(b&&b[0],D))b=a.parsePathString(b);for(var d=0,e=b.length;d<e;d++){c[d]=[];for(var f=0,g=b[d].length;f<g;f++)c[d][f]=b[d][f]}c.toString=a._path2string;return c},bv=br(function(b){if(!a.is(b,D)||!a.is(b&&b[0],D))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;b[0][0]=="M"&&(d=b[0][1],e=b[0][2],f=d,g=e,h++,c.push(["M",d,e]));for(var i=h,j=b.length;i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=u.call(l[0])){k[0]=u.call(l[0]);switch(k[0]){case"a":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]-d).toFixed(3),k[7]=+(l[7]-e).toFixed(3);break;case"v":k[1]=+(l[1]-e).toFixed(3);break;case"m":f=l[1],g=l[2];default:for(var m=1,n=l.length;m<n;m++)k[m]=+(l[m]-(m%2?d:e)).toFixed(3)}}else{k=c[i]=[],l[0]=="m"&&(f=l[1]+d,g=l[2]+e);for(var o=0,p=l.length;o<p;o++)c[i][o]=l[o]}var q=c[i].length;switch(c[i][0]){case"z":d=f,e=g;break;case"h":d+=+c[i][q-1];break;case"v":e+=+c[i][q-1];break;default:d+=+c[i][q-2],e+=+c[i][q-1]}}c.toString=a._path2string;return c},0,bu),bw=br(function(b){if(!a.is(b,D)||!a.is(b&&b[0],D))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;b[0][0]=="M"&&(d=+b[0][1],e=+b[0][2],f=d,g=e,h++,c[0]=["M",d,e]);for(var i=h,j=b.length;i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=S.call(l[0])){k[0]=S.call(l[0]);switch(k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+d),k[7]=+(l[7]+e);break;case"V":k[1]=+l[1]+e;break;case"H":k[1]=+l[1]+d;break;case"M":f=+l[1]+d,g=+l[2]+e;default:for(var m=1,n=l.length;m<n;m++)k[m]=+l[m]+(m%2?d:e)}}else for(var o=0,p=l.length;o<p;o++)c[i][o]=l[o];switch(k[0]){case"Z":d=f,e=g;break;case"H":d=k[1];break;case"V":e=k[1];break;case"M":f=c[i][c[i].length-2],g=c[i][c[i].length-1];default:d=c[i][c[i].length-2],e=c[i][c[i].length-1]}}c.toString=a._path2string;return c},null,bu),bx=function(a,b,c,d){return[a,b,c,d,c,d]},by=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},bz=function(a,b,c,d,e,f,g,h,i,j){var k=A*120/180,l=A/180*(+e||0),n=[],o,p=br(function(a,b,c){var d=a*v.cos(c)-b*v.sin(c),e=a*v.sin(c)+b*v.cos(c);return{x:d,y:e}});if(!j){o=p(a,b,-l),a=o.x,b=o.y,o=p(h,i,-l),h=o.x,i=o.y;var q=v.cos(A/180*e),r=v.sin(A/180*e),s=(a-h)/2,t=(b-i)/2,u=s*s/(c*c)+t*t/(d*d);u>1&&(u=v.sqrt(u),c=u*c,d=u*d);var w=c*c,x=d*d,z=(f==g?-1:1)*v.sqrt(y((w*x-w*t*t-x*s*s)/(w*t*t+x*s*s))),B=z*c*t/d+(a+h)/2,C=z*-d*s/c+(b+i)/2,D=v.asin(((b-C)/d).toFixed(9)),E=v.asin(((i-C)/d).toFixed(9));D=a<B?A-D:D,E=h<B?A-E:E,D<0&&(D=A*2+D),E<0&&(E=A*2+E),g&&D>E&&(D=D-A*2),!g&&E>D&&(E=E-A*2)}else D=j[0],E=j[1],B=j[2],C=j[3];var F=E-D;if(y(F)>k){var G=E,H=h,I=i;E=D+k*(g&&E>D?1:-1),h=B+c*v.cos(E),i=C+d*v.sin(E),n=bz(h,i,c,d,e,0,g,H,I,[E,G,B,C])}F=E-D;var J=v.cos(D),K=v.sin(D),L=v.cos(E),M=v.sin(E),N=v.tan(F/4),O=4/3*c*N,P=4/3*d*N,Q=[a,b],R=[a+O*K,b-P*J],S=[h+O*M,i-P*L],T=[h,i];R[0]=2*Q[0]-R[0],R[1]=2*Q[1]-R[1];if(j)return[R,S,T][m](n);n=[R,S,T][m](n).join().split(",");var U=[];for(var V=0,W=n.length;V<W;V++)U[V]=V%2?p(n[V-1],n[V],l).y:p(n[V],n[V+1],l).x;return U},bA=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:z(j,3)*a+z(j,2)*3*i*c+j*3*i*i*e+z(i,3)*g,y:z(j,3)*b+z(j,2)*3*i*d+j*3*i*i*f+z(i,3)*h}},bB=br(function(a,b,c,d,e,f,g,h){var i=e-2*c+a-(g-2*e+c),j=2*(c-a)-2*(e-c),k=a-c,m=(-j+v.sqrt(j*j-4*i*k))/2/i,n=(-j-v.sqrt(j*j-4*i*k))/2/i,o=[b,h],p=[a,g],q;y(m)>"1e12"&&(m=.5),y(n)>"1e12"&&(n=.5),m>0&&m<1&&(q=bA(a,b,c,d,e,f,g,h,m),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bA(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y)),i=f-2*d+b-(h-2*f+d),j=2*(d-b)-2*(f-d),k=b-d,m=(-j+v.sqrt(j*j-4*i*k))/2/i,n=(-j-v.sqrt(j*j-4*i*k))/2/i,y(m)>"1e12"&&(m=.5),y(n)>"1e12"&&(n=.5),m>0&&m<1&&(q=bA(a,b,c,d,e,f,g,h,m),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bA(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y));return{min:{x:x[l](0,p),y:x[l](0,o)},max:{x:w[l](0,p),y:w[l](0,o)}}}),bC=br(function(a,b){var c=bw(a),d=b&&bw(b),e={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][m](bz[l](0,[b.x,b.y][m](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x)),d=b.y+(b.y-(b.by||b.y)),a=["C",c,d][m](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x)),b.qy=b.y+(b.y-(b.qy||b.y)),a=["C"][m](by(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][m](by(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][m](bx(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][m](bx(b.x,b.y,a[1],b.y));break;case"V":a=["C"][m](bx(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][m](bx(b.x,b.y,b.X,b.Y))}return a},h=function(a,b){if(a[b].length>7){a[b].shift();var e=a[b];while(e.length)a.splice(b++,0,["C"][m](e.splice(0,6)));a.splice(b,1),k=w(c.length,d&&d.length||0)}},i=function(a,b,e,f,g){a&&b&&a[g][0]=="M"&&b[g][0]!="M"&&(b.splice(g,0,["M",f.x,f.y]),e.bx=0,e.by=0,e.x=a[g][1],e.y=a[g][2],k=w(c.length,d&&d.length||0))};for(var j=0,k=w(c.length,d&&d.length||0);j<k;j++){c[j]=g(c[j],e),h(c,j),d&&(d[j]=g(d[j],f)),d&&h(d,j),i(c,d,e,f,j),i(d,c,f,e,j);var n=c[j],o=d&&d[j],p=n.length,q=d&&o.length;e.x=n[p-2],e.y=n[p-1],e.bx=P(n[p-4])||e.x,e.by=P(n[p-3])||e.y,f.bx=d&&(P(o[q-4])||f.x),f.by=d&&(P(o[q-3])||f.y),f.x=d&&o[q-2],f.y=d&&o[q-1]}return d?[c,d]:c},null,bu),bD=br(function(b){var c=[];for(var d=0,e=b.length;d<e;d++){var f={},g=b[d].match(/^([^:]*):?([\d\.]*)/);f.color=a.getRGB(g[1]);if(f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),c.push(f)}for(d=1,e=c.length-1;d<e;d++)if(!c[d].offset){var h=P(c[d-1].offset||0),i=0;for(var j=d+1;j<e;j++)if(c[j].offset){i=c[j].offset;break}i||(i=100,j=e),i=P(i);var k=(i-h)/(j-d+1);for(;d<j;d++)h+=k,c[d].offset=h+"%"}return c}),bE=function(b,c,d,e){var f;f=e==null&&!a.is(b,"object")?g.doc.getElementById(b):b;if(f!=null){if(f.tagName)return c==null?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d};return{container:1,x:b,y:c,width:d,height:e}}},bF=function(a,b){var c=this;for(var d in b)if(b[f](d)&&!(d in a))switch(typeof b[d]){case"function":(function(b){a[d]=a===c?b:function(){return b[l](c,arguments)}})(b[d]);break;case"object":a[d]=a[d]||{},bF.call(this,a[d],b[d]);break;default:a[d]=b[d]}},bG=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)},bH=function(a,b){b.top!==a&&(bG(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},bI=function(a,b){b.bottom!==a&&(bG(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},bJ=function(a,b,c){bG(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},bK=function(a,b,c){bG(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},bL=function(a){return function(){throw new Error("Raphaël: you are calling to method “"+a+"” of removed object")}},bM=function(b,c){if(c==null)return b._.transform;c=q(c).replace(/\.{3}|\u2026/g,b._.transform||o);var d=a.parseTransformString(c),e=0,f=0,g=0,h=1,i=1,j=b._,k=new bP;j.transform=d||[];if(d)for(var l=0,m=d.length;l<m;l++){var n=d[l],p=n.length,r;n[0]=q(n[0]).toLowerCase(),n[0]=="t"&&p==3?k.translate(n[1],n[2]):n[0]=="r"?p==2?(r=r||b.getBBox(1),k.rotate(n[1],r.x+r.width/2,r.y+r.height/2),e+=n[1]):p==4&&(k.rotate(n[1],n[2],n[3]),e+=n[1]):n[0]=="s"?p==2||p==3?(r=r||b.getBBox(1),k.scale(n[1],n[p-1],r.x+r.width/2,r.y+r.height/2),h*=n[1],i*=n[p-1]):p==5&&(k.scale(n[1],n[2],n[3],n[4]),h*=n[1],i*=n[2]):n[0]=="m"&&p==7&&k.add(n[1],n[2],n[3],n[4],n[5],n[6]),j.dirtyT=1,b.matrix=k}b.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.m[0][2],j.dy=g=k.m[1][2],h==1&&i==1&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1},bN=function(a){switch(a[0]){case"t":return["t",0,0];case"m":return["m",1,0,0,1,0,0];case"r":return a.length==4?["r",0,a[2],a[3]]:["r",0];case"s":return a.length==5?["s",1,1,a[3],a[4]]:a.length==3?["s",1,1]:["s",1]}},bO=function(b,c){b=a.parseTransformString(b)||[],c=a.parseTransformString(c)||[];var d=w(b.length,c.length),e=[],f=[],g=0,h,i,j,k;for(;g<d;g++){j=b[g]||bN(c[g]),k=c[g]||bN(j);if(j[0]!=k[0]||j[0]=="r"&&(j[2]!=k[2]||j[3]!=k[3])||j[0]=="s"&&(j[3]!=k[3]||j[4]!=k[4]))return;e[g]=[],f[g]=[];for(h=0,i=w(j.length,k.length);h<i;h++)h in j&&(e[g][h]=j[h]),h in k&&(f[g][h]=k[h])}return{from:e,to:f}};a.pathToRelative=bv,a.path2curve=bC;var bQ=bP.prototype;bQ.add=function(a,b,c,d,e,f){var g=[[],[],[]],h=[[a,c,e],[b,d,f],[0,0,1]],i,j,k,l;for(i=0;i<3;i++)for(j=0;j<3;j++){l=0;for(k=0;k<3;k++)l+=this.m[i][k]*h[k][j];g[i][j]=l}this.m=g},bQ.invert=function(){var a=this.m[0][0],b=this.m[1][0],c=this.m[0][1],d=this.m[1][1],e=this.m[0][2],f=this.m[1][2],g=a*d-b*c;return new bP(d/g,-b/g,-c/g,a/g,(c*f-d*e)/g,(b*e-a*f)/g)},bQ.clone=function(){var a=this.m[0][0],b=this.m[1][0],c=this.m[0][1],d=this.m[1][1],e=this.m[0][2],f=this.m[1][2];return new bP(a,b,c,d,e,f)},bQ.translate=function(a,b){this.add(1,0,0,1,a,b)},bQ.scale=function(a,b,c,d){b==null&&(b=a),this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),this.add(1,0,0,1,-c,-d)},bQ.rotate=function(b,c,d){b=a.rad(b);var e=+v.cos(b).toFixed(9),f=+v.sin(b).toFixed(9);this.add(e,f,-f,e,c,d),this.add(1,0,0,1,-c,-d)},bQ.x=function(a,b){return a*this.m[0][0]+b*this.m[0][1]+this.m[0][2]},bQ.y=function(a,b){return a*this.m[1][0]+b*this.m[1][1]+this.m[1][2]},bQ.get=function(a,b){return+this.m[a][b].toFixed(4)},bQ.toString=function(){return a.svg?"matrix("+[this.get(0,0),this.get(1,0),this.get(0,1),this.get(1,1),this.get(0,2),this.get(1,2)].join()+")":[this.get(0,0),this.get(0,1),this.get(1,0),this.get(1,1),0,0].join()},bQ.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0,0)+", M12="+this.get(0,1)+", M21="+this.get(1,0)+", M22="+this.get(1,1)+", Dx="+this.get(0,2)+", Dy="+this.get(1,2)+", sizingmedthod='auto expand')"},bQ.offset=function(){return[this.m[0][2].toFixed(4),this.m[1][2].toFixed(4)]},a.Matrix=bP;if(a.svg){var bR="http://www.w3.org/1999/xlink",bS={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},bT={};a.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var bU=function(a,b){if(b){typeof a=="string"&&(a=bU(a));for(var c in b)b[f](c)&&(c.substring(0,6)=="xlink:"?a.setAttributeNS(bR,c.substring(6),q(b[c])):a[O](c,q(b[c])))}else a=g.doc.createElementNS("http://www.w3.org/2000/svg",a),a.style&&(a.style.webkitTapHighlightColor="rgba(0,0,0,0)");return a},bV=function(a,b){var c=bU("path");b.canvas&&b.canvas.appendChild(c);var d=new cd(c,b);d.type="path",ca(d,{fill:"none",stroke:"#000",path:a});return d},bW={},bX=/^url\(#(.*)\)$/,bY=function(a,b){var c=a.getAttribute(F);c=c&&c.match(bX),c&&!--bW[c[1]]&&(delete bW[c[1]],b.defs.removeChild(g.doc.getElementById(c[1])))},bZ=function(b,c){var d="linear",e=b.id+c,f=.5,h=.5,i=b.node,j=b.paper,k=i.style,l=g.doc.getElementById(e);if(!l){c=q(c).replace(_,function(a,b,c){d="radial";if(b&&c){f=P(b),h=P(c);var e=(h>.5)*2-1;z(f-.5,2)+z(h-.5,2)>.25&&(h=v.sqrt(.25-z(f-.5,2))*e+.5)&&h!=.5&&(h=h.toFixed(5)-1e-5*e)}return o}),c=c.split(/\s*\-\s*/);if(d=="linear"){var m=c.shift();m=-P(m);if(isNaN(m))return null;var n=[0,0,v.cos(a.rad(m)),v.sin(a.rad(m))],p=1/(w(y(n[2]),y(n[3]))||1);n[2]*=p,n[3]*=p,n[2]<0&&(n[0]=-n[2],n[2]=0),n[3]<0&&(n[1]=-n[3],n[3]=0)}var r=bD(c);if(!r)return null;b.gradient&&(j.defs.removeChild(b.gradient),delete b.gradient),l=bU(d+"Gradient",{id:e}),b.gradient=l,bU(l,d=="radial"?{fx:f,fy:h}:{x1:n[0],y1:n[1],x2:n[2],y2:n[3],gradientTransform:b.matrix.invert()}),j.defs.appendChild(l);for(var s=0,t=r.length;s<t;s++)l.appendChild(bU("stop",{offset:r[s].offset?r[s].offset:s?"100%":"0%","stop-color":r[s].color||"#fff"}))}bU(i,{fill:"url(#"+e+")",opacity:1,"fill-opacity":1}),k.fill=o,k.opacity=1,k.fillOpacity=1;return 1},b$=function(a){var b=a.getBBox(1);bU(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},b_=function(b,c,d){if(b.type=="path"){var e=q(c).toLowerCase().split("-"),h=b.paper,i=d?"end":"start",j=b.node,k=b.attrs,l=k["stroke-width"],m=e.length,n="classic",o,r,s,t,u,v=3,w=3,x=5;while(m--)switch(e[m]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":n=e[m];break;case"wide":w=5;break;case"narrow":w=2;break;case"long":v=5;break;case"short":v=2}n=="open"?(v+=2,w+=2,x+=2,s=1,t=d?4:1,u={fill:"none",stroke:k.stroke}):(t=s=v/2,u={fill:k.stroke,stroke:"none"}),b._.arrows?d?(b._.arrows.endPath&&bT[b._.arrows.endPath]--,b._.arrows.endMarker&&bT[b._.arrows.endMarker]--):(b._.arrows.startPath&&bT[b._.arrows.startPath]--,b._.arrows.startMarker&&bT[b._.arrows.startMarker]--):b._.arrows={};if(n!="none"){var y="raphael-marker-"+n,z="raphael-marker-"+i+n+v+w;g.doc.getElementById(y)?bT[y]++:(h.defs.appendChild(bU(bU("path"),{"stroke-linecap":"round",d:bS[n],id:y})),bT[y]=1);var A=g.doc.getElementById(z),B;A?(bT[z]++,B=A.getElementsByTagName("use")[0]):(A=bU(bU("marker"),{id:z,markerHeight:w,markerWidth:v,orient:"auto",refX:t,refY:w/2}),B=bU(bU("use"),{"xlink:href":"#"+y,transform:(d?" rotate(180 "+v/2+" "+w/2+") ":p)+"scale("+v/x+","+w/x+")","stroke-width":1/((v/x+w/x)/2)}),A.appendChild(B),h.defs.appendChild(A),bT[z]=1),bU(B,u);var C=s*(n!="diamond"&&n!="oval");d?(o=b._.arrows.startdx*l||0,r=a.getTotalLength(k.path)-C*l):(o=C*l,r=a.getTotalLength(k.path)-(b._.arrows.enddx*l||0)),u={},u["marker-"+i]="url(#"+z+")";if(r||o)u.d=Raphael.getSubpath(k.path,o,r);bU(j,u),b._.arrows[i+"Path"]=y,b._.arrows[i+"Marker"]=z,b._.arrows[i+"dx"]=C,b._.arrows[i+"Type"]=n,b._.arrows[i+"String"]=c}else d?(o=b._.arrows.startdx*l||0,r=a.getTotalLength(k.path)-o):(o=0,r=a.getTotalLength(k.path)-(b._.arrows.enddx*l||0)),b._.arrows[i+"Path"]&&bU(j,{d:Raphael.getSubpath(k.path,o,r)}),delete b._.arrows[i+"Path"],delete b._.arrows[i+"Marker"],delete b._.arrows[i+"dx"],delete b._.arrows[i+"Type"],delete b._.arrows[i+"String"];for(u in bT)if(bT[f](u)&&!bT[u]){var D=g.doc.getElementById(u);D&&D.parentNode.removeChild(D)}}},ca=function(c,d){var e={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},h=c.node,i=c.attrs,j=function(a,b){b=e[u.call(b)];if(b){var c=a.attrs["stroke-width"]||"1",f=({round:c,square:c,butt:0})[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],i=b.length;while(i--)g[i]=b[i]*c+(i%2?1:-1)*f;bU(h,{"stroke-dasharray":g.join(",")})}};for(var k in d)if(d[f](k)){if(!T[f](k))continue;var l=d[k];i[k]=l;switch(k){case"blur":c.blur(l);break;case"href":case"title":case"target":var m=h.parentNode;if(u.call(m.tagName)!="a"){var n=bU("a");m.insertBefore(n,h),n.appendChild(h),m=n}k=="target"&&l=="blank"?m.setAttributeNS(bR,"show","new"):m.setAttributeNS(bR,k,l);break;case"cursor":h.style.cursor=l;break;case"transform":c.transform(l);break;case"arrow-start":b_(c,l);break;case"arrow-end":b_(c,l,1);break;case"clip-rect":var p=q(l).split(b);if(p.length==4){c.clip&&c.clip.parentNode.parentNode.removeChild(c.clip.parentNode);var r=bU("clipPath"),s=bU("rect");r.id=bk(),bU(s,{x:p[0],y:p[1],width:p[2],height:p[3]}),r.appendChild(s),c.paper.defs.appendChild(r),bU(h,{"clip-path":"url(#"+r.id+")"}),c.clip=s}if(!l){var t=g.doc.getElementById(h.getAttribute("clip-path").replace(/(^url\(#|\)$)/g,o));t&&t.parentNode.removeChild(t),bU(h,{"clip-path":o}),delete c.clip}break;case"path":c.type=="path"&&(bU(h,{d:l?i.path=bw(l):"M0,0"}),c._.dirty=1,c._.arrows&&("startString"in c._.arrows&&b_(c,c._.arrows.startString),"endString"in c._.arrows&&b_(c,c._.arrows.endString,1)));break;case"width":h[O](k,l),c._.dirty=1;if(i.fx)k="x",l=i.x;else break;case"x":i.fx&&(l=-i.x-(i.width||0));case"rx":if(k=="rx"&&c.type=="rect")break;case"cx":h[O](k,l),c.pattern&&b$(c),c._.dirty=1;break;case"height":h[O](k,l),c._.dirty=1;if(i.fy)k="y",l=i.y;else break;case"y":i.fy&&(l=-i.y-(i.height||0));case"ry":if(k=="ry"&&c.type=="rect")break;case"cy":h[O](k,l),c.pattern&&b$(c),c._.dirty=1;break;case"r":c.type=="rect"?bU(h,{rx:l,ry:l}):h[O](k,l),c._.dirty=1;break;case"src":c.type=="image"&&h.setAttributeNS(bR,"href",l);break;case"stroke-width":if(c._.sx!=1||c._.sy!=1)l/=w(y(c._.sx),y(c._.sy))||1;c.paper._vbSize&&(l*=c.paper._vbSize),h[O](k,l),i["stroke-dasharray"]&&j(c,i["stroke-dasharray"]),c._.arrows&&("startString"in c._.arrows&&b_(c,c._.arrows.startString),"endString"in c._.arrows&&b_(c,c._.arrows.endString,1));break;case"stroke-dasharray":j(c,l);break;case F:var v=q(l).match(J);if(v){r=bU("pattern");var x=bU("image");r.id=bk(),bU(r,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),bU(x,{x:0,y:0,"xlink:href":v[1]}),r.appendChild(x),function(a){bs(v[1],function(){var b=this.offsetWidth,d=this.offsetHeight;bU(a,{width:b,height:d}),bU(x,{width:b,height:d}),c.paper.safari()})}(r),c.paper.defs.appendChild(r),h.style.fill="url(#"+r.id+")",bU(h,{fill:"url(#"+r.id+")"}),c.pattern=r,c.pattern&&b$(c);break}var z=a.getRGB(l);if(!z.error)delete d.gradient,delete i.gradient,!a.is(i.opacity,"undefined")&&a.is(d.opacity,"undefined")&&bU(h,{opacity:i.opacity}),!a.is(i["fill-opacity"],"undefined")&&a.is(d["fill-opacity"],"undefined")&&bU(h,{"fill-opacity":i["fill-opacity"]});else if((c.type=="circle"||c.type=="ellipse"||q(l).charAt()!="r")&&bZ(c,l)){if("opacity"in i||"fill-opacity"in i){var A=g.doc.getElementById(h.getAttribute(F).replace(/^url\(#|\)$/g,o));if(A){var B=A.getElementsByTagName("stop");bU(B[B.length-1],{"stop-opacity":("opacity"in i?i.opacity:1)*("fill-opacity"in i?i["fill-opacity"]:1)})}}i.gradient=l,i.fill="none";break}z[f]("opacity")&&bU(h,{"fill-opacity":z.opacity>1?z.opacity/100:z.opacity});case"stroke":z=a.getRGB(l),h[O](k,z.hex),k=="stroke"&&z[f]("opacity")&&bU(h,{"stroke-opacity":z.opacity>1?z.opacity/100:z.opacity}),k=="stroke"&&c._.arrows&&("startString"in c._.arrows&&b_(c,c._.arrows.startString),"endString"in c._.arrows&&b_(c,c._.arrows.endString,1));break;case"gradient":(c.type=="circle"||c.type=="ellipse"||q(l).charAt()!="r")&&bZ(c,l);break;case"opacity":i.gradient&&!i[f]("stroke-opacity")&&bU(h,{"stroke-opacity":l>1?l/100:l});case"fill-opacity":if(i.gradient){A=g.doc.getElementById(h.getAttribute(F).replace(/^url\(#|\)$/g,o)),A&&(B=A.getElementsByTagName("stop"),bU(B[B.length-1],{"stop-opacity":l}));break};default:k=="font-size"&&(l=Q(l,10)+"px");var C=k.replace(/(\-.)/g,function(a){return S.call(a.substring(1))});h.style[C]=l,c._.dirty=1,h[O](k,l)}}cc(c,d)},cb=1.2,cc=function(b,c){if(b.type=="text"&&!!(c[f]("text")||c[f]("font")||c[f]("font-size")||c[f]("x")||c[f]("y"))){var d=b.attrs,e=b.node,h=e.firstChild?Q(g.doc.defaultView.getComputedStyle(e.firstChild,o).getPropertyValue("font-size"),10):10;if(c[f]("text")){d.text=c.text;while(e.firstChild)e.removeChild(e.firstChild);var i=q(c.text).split("\n"),j=[],k;for(var l=0,m=i.length;l<m;l++)i[l]&&(k=bU("tspan"),l&&bU(k,{dy:h*cb,x:d.x}),k.appendChild(g.doc.createTextNode(i[l])),e.appendChild(k),j[l]=k)}else{j=e.getElementsByTagName("tspan");for(l=0,m=j.length;l<m;l++)l&&bU(j[l],{dy:h*cb,x:d.x})}bU(e,{y:d.y}),b._.dirty=1;var n=b._getBBox(),p=d.y-(n.y+n.height/2);p&&a.is(p,"finite")&&bU(j[0],{dy:d.y+p})}},cd=function(b,c){var d=0,e=0;this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.matrix=new bP,this.realPath=null,this.paper=c,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},ce=cd.prototype;ce.rotate=function(a,c,d){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1]),d=P(a[2])),a=P(a[0]),d==null&&(c=d);if(c==null||d==null){var e=this.getBBox(1);c=e.x+e.width/2,d=e.y+e.height/2}this.transform(this._.transform.concat([["r",a,c,d]]));return this},ce.scale=function(a,c,d,e){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1]),d=P(a[2]),e=P(a[3])),a=P(a[0]),c==null&&(c=a),e==null&&(d=e);if(d==null||e==null)var f=this.getBBox(1);d=d==null?f.x+f.width/2:d,e=e==null?f.y+f.height/2:e,this.transform(this._.transform.concat([["s",a,c,d,e]]));return this},ce.translate=function(a,c){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1])),a=P(a[0])||0,c=+c||0,this.transform(this._.transform.concat([["t",a,c]]));return this},ce.transform=function(a){var b=this._;if(!a)return b.transform;bM(this,a),this.clip&&bU(this.clip,{transform:this.matrix.invert()}),this.pattern&&b$(this),this.node&&bU(this.node,{transform:this.matrix});if(b.sx!=1||b.sy!=1){var c=this.attrs[f]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":c})}return this},ce.hide=function(){!this.removed&&this.paper.safari(this.node.style.display="none");return this},ce.show=function(){!this.removed&&this.paper.safari(this.node.style.display="");return this},ce.remove=function(){if(!this.removed){dc.unbind("*.*."+this.id),bG(this,this.paper),this.node.parentNode.removeChild(this.node);for(var a in this)delete this[a];this.removed=!0}},ce._getBBox=function(){if(this.node.style.display=="none"){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}a&&this.hide();return b},ce.attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient,d.transform=this._.transform;return d}if(c==null&&a.is(b,C)){if(b==F&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;if(b=="transform")return this._.transform;return b in this.attrs?this.attrs[b]:a.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:T[b]}if(c==null&&a.is(b,D)){var g={};for(var h=0,i=b.length;h<i;h++)g[b[h]]=this.attr(b[h]);return g}if(c!=null){var j={};j[b]=c}else b!=null&&a.is(b,"object")&&(j=b);for(var k in this.paper.customAttributes)if(this.paper.customAttributes[f](k)&&j[f](k)&&a.is(this.paper.customAttributes[k],"function")){var l=this.paper.customAttributes[k].apply(this,[][m](j[k]));this.attrs[k]=j[k];for(var n in l)l[f](n)&&(j[n]=l[n])}ca(this,j);return this},ce.toFront=function(){if(this.removed)return this;this.node.parentNode.appendChild(this.node);var a=this.paper;a.top!=this&&bH(this,a);return this},ce.toBack=function(){if(this.removed)return this;if(this.node.parentNode.firstChild!=this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),bI(this,this.paper);var a=this.paper}return this},ce.insertAfter=function(a){if(this.removed)return this;var b=a.node||a[a.length-1].node;b.nextSibling?b.parentNode.insertBefore(this.node,b.nextSibling):b.parentNode.appendChild(this.node),bJ(this,a,this.paper);return this},ce.insertBefore=function(a){if(this.removed)return this;var b=a.node||a[0].node;b.parentNode.insertBefore(this.node,b),bK(this,a,this.paper);return this},ce.blur=function(a){var b=this;if(+a!==0){var c=bU("filter"),d=bU("feGaussianBlur");b.attrs.blur=a,c.id=bk(),bU(d,{stdDeviation:+a||1.5}),c.appendChild(d),b.paper.defs.appendChild(c),b._blur=c,bU(b.node,{filter:"url(#"+c.id+")"})}else b._blur&&(b._blur.parentNode.removeChild(b._blur),delete b._blur,delete b.attrs.blur),b.node.removeAttribute("filter")};var cf=function(a,b,c,d){var e=bU("circle");a.canvas&&a.canvas.appendChild(e);var f=new cd(e,a);f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",bU(e,f.attrs);return f},cg=function(a,b,c,d,e,f){var g=bU("rect");a.canvas&&a.canvas.appendChild(g);var h=new cd(g,a);h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",bU(g,h.attrs);return h},ch=function(a,b,c,d,e){var f=bU("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new cd(f,a);g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",bU(f,g.attrs);return g},ci=function(a,b,c,d,e,f){var g=bU("image");bU(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(bR,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new cd(g,a);h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image";return h},cj=function(a,b,c,d){var e=bU("text");bU(e,{x:b,y:c,"text-anchor":"middle"}),a.canvas&&a.canvas.appendChild(e);var f=new cd(e,a);f.attrs={x:b,y:c,"text-anchor":"middle",text:d,font:T.font,stroke:"none",fill:"#000"},f.type="text",ca(f,f.attrs);return f},ck=function(a,b){this.width=a||this.width,this.height=b||this.height,this.canvas[O]("width",this.width),this.canvas[O]("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox);return this},cl=function(){var b=bE[l](0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,h=b.height;if(!c)throw new Error("SVG container not found.");var j=bU("svg"),k="overflow:hidden;";d=d||0,e=e||0,f=f||512,h=h||342,bU(j,{height:h,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg"}),c==1?(j.style.cssText=k+"position:absolute;left:"+d+"px;top:"+e+"px",g.doc.body.appendChild(j)):(j.style.cssText=k,c.firstChild?c.insertBefore(j,c.firstChild):c.appendChild(j)),c=new i,c.width=f,c.height=h,c.canvas=j,bF.call(c,c,a.fn),c.clear();return c},cm=function(a,b,c,d,e){dc("setViewBox",this,this._viewBox,[a,b,c,d,e]);var f=w(c/this.width,d/this.height),g=this.top,h=e?"meet":"xMinYMin",i,j;a==null?(this._vbSize&&(f=1),delete this._vbSize,i="0 0 "+this.width+p+this.height):(this._vbSize=f,i=a+p+b+p+c+p+d),bU(this.canvas,{viewBox:i,preserveAspectRatio:h});while(f&&g)j="stroke-width"in g.attrs?g.attrs["stroke-width"]:1,g.attr({"stroke-width":j}),g._.dirty=1,g._.dirtyT=1,g=g.prev;this._viewBox=[a,b,c,d,!!e];return this};j.clear=function(){dc("clear",this);var b=this.canvas;while(b.firstChild)b.removeChild(b.firstChild);this.bottom=this.top=null,(this.desc=bU("desc")).appendChild(g.doc.createTextNode("Created with Raphaël "+a.version)),b.appendChild(this.desc),b.appendChild(this.defs=bU("defs"))},j.remove=function(){dc("remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bL(a)}}if(a.vml){var cn={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},co=/([clmz]),?([^clmz]*)/gi,cp=/ progid:\S+Blur\([^\)]+\)/g,cq=/-?[^,\s-]+/g,cr="position:absolute;left:0;top:0;width:1px;height:1px",cs=21600,ct={path:1,rect:1},cu={circle:1,ellipse:1},cv=function(a){var b=/[ahqstv]/ig,c=bw;q(a).match(b)&&(c=bC),b=/[clmz]/g;if(c==bw&&!q(a).match(b)){var d=q(a).replace(co,function(a,b,c){var d=[],e=u.call(b)=="m",f=cn[b];c.replace(cq,function(a){e&&d.length==2&&(f+=d+cn[b=="m"?"l":"L"],d=[]),d.push(N(a*cs))});return f+d});return d}var e=c(a),f,g;d=[];for(var h=0,i=e.length;h<i;h++){f=e[h],g=u.call(e[h][0]),g=="z"&&(g="x");for(var j=1,k=f.length;j<k;j++)g+=N(f[j]*cs)+(j!=k-1?",":o);d.push(g)}return d.join(p)},cw=function(a,b,c){var d=new bP;d.rotate(-a,.5,.5);return{dx:d.x(b,c),dy:d.y(b,c)}},cx=function(a){var b=a._,c=b.sx,d=b.sy,e=b.deg,f=b.dx,g=b.dy,h=b.fillpos,i=a.node,j=i.style,k=1,l=a.matrix,m="",n,o=cs/c,q=cs/d;j.visibility="hidden",i.coordsize=y(o)+p+y(q),j.rotation=e*(c*d<0?-1:1);if(e){var r=cw(e,f,g);f=r.dx,g=r.dy}c<0&&(m+="x"),d<0&&(m+=" y")&&(k=-1),j.flip=m,i.coordorigin=f*-o+p+g*-q;if(h||b.fillsize){var s=i.getElementsByTagName(F);s=s&&s[0],i.removeChild(s),h&&(r=cw(e,l.x(h[0],h[1]),l.y(h[0],h[1])),s.position=r.dx*k+p+r.dy*k),b.fillsize&&(s.size=b.fillsize[0]*y(c)+p+b.fillsize[1]*y(d)),i.appendChild(s)}j.visibility="visible"};a.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version},b_=function(a,b,c){var d=q(b).toLowerCase().split("-"),e=c?"end":"start",f=d.length,g="classic",h="medium",i="medium";while(f--)switch(d[f]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":g=d[f];break;case"wide":case"narrow":i=d[f];break;case"long":case"short":h=d[f]}var j=a.node.getElementsByTagName("stroke")[0];j[e+"arrow"]=g,j[e+"arrowlength"]=h,j[e+"arrowwidth"]=i},ca=function(c,d){c.paper.canvas.style.display="none",c.attrs=c.attrs||{};var e=c.node,h=c.attrs,i=e.style,j,k=ct[c.type]&&(d.x!=h.x||d.y!=h.y||d.width!=h.width||d.height!=h.height||d.cx!=h.cx||d.cy!=h.cy||d.rx!=h.rx||d.ry!=h.ry||d.r!=h.r),l=cu[c.type]&&(h.cx!=d.cx||h.cy!=d.cy||h.r!=d.r||h.rx!=d.rx||h.ry!=d.ry),m=c;for(var n in d)d[f](n)&&(h[n]=d[n]);k&&(h.path=bg[c.type](c),c._.dirty=1),d.href&&(e.href=d.href),d.title&&(e.title=d.title),d.target&&(e.target=d.target),d.cursor&&(i.cursor=d.cursor),"blur"in d&&c.blur(d.blur),"transform"in d&&c.transform(d.transform);if(d.path&&c.type=="path"||k)e.path=cv(h.path);if(l){var r=h.cx,s=h.cy,t=h.rx||h.r||0,u=h.ry||h.r||0;e.path=a.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",N((r-t)*cs),N((s-u)*cs),N((r+t)*cs),N((s+u)*cs),N(r*cs))}if("clip-rect"in d){var v=q(d["clip-rect"]).split(b);if(v.length==4){v[2]=+v[2]+ +v[0],v[3]=+v[3]+ +v[1];var y=e.clipRect||g.doc.createElement("div"),z=y.style,A=e.parentNode;z.clip=a.format("rect({1}px {2}px {3}px {0}px)",v),e.clipRect||(z.position="absolute",z.top=0,z.left=0,z.width=c.paper.width+"px",z.height=c.paper.height+"px",A.parentNode.insertBefore(y,A),y.appendChild(A),e.clipRect=y)}d["clip-rect"]||e.clipRect&&(e.clipRect.style.clip=o)}if(c.textpath){var B=c.textpath.style;d.font&&(B.font=d.font),d["font-family"]&&(B.fontFamily='"'+d["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),d["font-size"]&&(B.fontSize=d["font-size"]),d["font-weight"]&&(B.fontWeight=d["font-weight"]),d["font-style"]&&(B.fontStyle=d["font-style"])}"arrow-start"in d&&b_(m,d["arrow-start"]),"arrow-end"in d&&b_(m,d["arrow-end"],1);if(d.opacity!=null||d["stroke-width"]!=null||d.fill!=null||d.src!=null||d.stroke!=null||d["stroke-width"]!=null||d["stroke-opacity"]!=null||d["fill-opacity"]!=null||d["stroke-dasharray"]!=null||d["stroke-miterlimit"]!=null||d["stroke-linejoin"]!=null||d["stroke-linecap"]!=null){var C=e.getElementsByTagName(F),D=!1;C=C&&C[0],!C&&(D=C=cy(F)),c.type=="image"&&d.src&&(C.src=d.src);if("fill-opacity"in d||"opacity"in d){var E=((+h["fill-opacity"]+1||2)-1)*((+h.opacity+1||2)-1)*((+a.getRGB(d.fill).o+1||2)-1);E=x(w(E,0),1),C.opacity=E}d.fill&&(C.on=!0);if(C.on==null||d.fill=="none"||d.fill===null)C.on=!1;if(C.on&&d.fill){var G=d.fill.match(J);if(G){C.parentNode==e&&e.removeChild(C),C.rotate=!0,C.src=G[1],C.type="tile";var H=c.getBBox(1);C.position=H.x+p+H.y,c._.fillpos=[H.x,H.y],bs(G[1],function(){c._.fillsize=[this.offsetWidth,this.offsetHeight]})}else C.color=a.getRGB(d.fill).hex,C.src=o,C.type="solid",a.getRGB(d.fill).error&&(m.type in{circle:1,ellipse:1}||q(d.fill).charAt()!="r")&&bZ(m,d.fill,C)&&(h.fill="none",h.gradient=d.fill,C.rotate=!1)}e.appendChild(C);var I=e.getElementsByTagName("stroke")&&e.getElementsByTagName("stroke")[0],K=!1;!I&&(K=I=cy("stroke"));if(d.stroke&&d.stroke!="none"||d["stroke-width"]||d["stroke-opacity"]!=null||d["stroke-dasharray"]||d["stroke-miterlimit"]||d["stroke-linejoin"]||d["stroke-linecap"])I.on=!0;(d.stroke=="none"||d.stroke===null||I.on==null||d.stroke==0||d["stroke-width"]==0)&&(I.on=!1);var L=a.getRGB(d.stroke);I.on&&d.stroke&&(I.color=L.hex),E=((+h["stroke-opacity"]+1||2)-1)*((+h.opacity+1||2)-1)*((+L.o+1||2)-1);var M=(P(d["stroke-width"])||1)*.75;E=x(w(E,0),1),d["stroke-width"]==null&&(M=h["stroke-width"]),d["stroke-width"]&&(I.weight=M),M&&M<1&&(E*=M)&&(I.weight=1),I.opacity=E,d["stroke-linejoin"]&&(I.joinstyle=d["stroke-linejoin"]||"miter"),I.miterlimit=d["stroke-miterlimit"]||8,d["stroke-linecap"]&&(I.endcap=d["stroke-linecap"]=="butt"?"flat":d["stroke-linecap"]=="square"?"square":"round");if(d["stroke-dasharray"]){var O={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};I.dashstyle=O[f](d["stroke-dasharray"])?O[d["stroke-dasharray"]]:o}K&&e.appendChild(I)}if(m.type=="text"){m.paper.canvas.style.display=o;var Q=m.paper.span,R=100,S=h.font&&h.font.match(/\d+(?:\.\d*)?(?=px)/);i=Q.style,h.font&&(i.font=h.font),h["font-family"]&&(i.fontFamily=h["font-family"]),h["font-weight"]&&(i.fontWeight=h["font-weight"]),h["font-style"]&&(i.fontStyle=h["font-style"]),S=P(S?S[0]:h["font-size"]),i.fontSize=S*R+"px",m.textpath.string&&(Q.innerHTML=q(m.textpath.string).replace(/</g,"<").replace(/&/g,"&").replace(/\n/g,"<br>"));var T=Q.getBoundingClientRect();m.W=h.w=(T.right-T.left)/R,m.H=h.h=(T.bottom-T.top)/R,m.paper.canvas.style.display="none",m.X=h.x,m.Y=h.y+m.H/2,("x"in d||"y"in d)&&(m.path.v=a.format("m{0},{1}l{2},{1}",N(h.x*cs),N(h.y*cs),N(h.x*cs)+1));var U=["x","y","text","font","font-family","font-weight","font-style","font-size"];for(var V=0,W=U.length;V<W;V++)if(U[V]in d){m._.dirty=1;break}switch(h["text-anchor"]){case"start":m.textpath.style["v-text-align"]="left",m.bbx=m.W/2;break;case"end":m.textpath.style["v-text-align"]="right",m.bbx=-m.W/2;break;default:m.textpath.style["v-text-align"]="center",m.bbx=0}m.textpath.style["v-text-kern"]=!0}m.paper.canvas.style.display=o},bZ=function(a,b,c){a.attrs=a.attrs||{};var d=a.attrs,e="linear",f=".5 .5";a.attrs.gradient=b,b=q(b).replace(_,function(a,b,c){e="radial",b&&c&&(b=P(b),c=P(c),z(b-.5,2)+z(c-.5,2)>.25&&(c=v.sqrt(.25-z(b-.5,2))*((c>.5)*2-1)+.5),f=b+p+c);return o}),b=b.split(/\s*\-\s*/);if(e=="linear"){var g=b.shift();g=-P(g);if(isNaN(g))return null}var h=bD(b);if(!h)return null;a=a.shape||a.node;if(h.length){a.removeChild(c),c.on=!0,c.method="none",c.color=h[0].color,c.color2=h[h.length-1].color;var i=[];for(var j=0,k=h.length;j<k;j++)h[j].offset&&i.push(h[j].offset+p+h[j].color);c.colors&&(c.colors.value=i.length?i.join():"0% "+c.color),e=="radial"?(c.type="gradientTitle",c.focus="100%",c.focussize="0 0",c.focusposition=f,c.angle=0):(c.type="gradient",c.angle=(270-g)%360),a.appendChild(c)}return 1},cd=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=c,this.matrix=new bP,this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},ce=cd.prototype,ce.transform=function(a){if(a==null)return this._.transform;bM(this,a);var b=this.matrix.clone(),c=this.skew;b.translate(-0.5,-0.5);if(this.type=="image")if(q(a).indexOf("m")+1){this.node.style.filter=b.toFilter();var d=this.getBBox(),e=this.getBBox(1),f=b.invert(),g=f.x(d.x,d.y)-f.x(e.x,e.y),h=f.y(d.x,d.y)-f.y(e.x,e.y)}else this.node.style.filter=o,cx(this);else this.node.style.filter=o,c.matrix=b,c.offset=b.offset();return this},ce.rotate=function(a,c,d){if(this.removed)return this;if(a!=null){a=q(a).split(b),a.length-1&&(c=P(a[1]),d=P(a[2])),a=P(a[0]),d==null&&(c=d);if(c==null||d==null){var e=this.getBBox(1);c=e.x+e.width/2,d=e.y+e.height/2}this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,c,d]]));return this}},ce.translate=function(a,c){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1])),a=P(a[0])||0,c=+c||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=c),this.transform(this._.transform.concat([["t",a,c]]));return this},ce.scale=function(a,c,d,e){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1]),d=P(a[2]),e=P(a[3]),isNaN(d)&&(d=null),isNaN(e)&&(e=null)),a=P(a[0]),c==null&&(c=a),e==null&&(d=e);if(d==null||e==null)var f=this.getBBox(1);d=d==null?f.x+f.width/2:d,e=e==null?f.y+f.height/2:e,this.transform(this._.transform.concat([["s",a,c,d,e]])),this._.dirtyT=1;return this},ce.hide=function(){!this.removed&&(this.node.style.display="none");return this},ce.show=function(){!this.removed&&(this.node.style.display=o);return this},ce._getBBox=function(){if(this.removed)return{};return this.type=="text"?{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}:bt(this.attrs.path)},ce.remove=function(){if(!this.removed){dc.unbind("*.*."+this.id),bG(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var a in this)delete this[a];this.removed=!0}},ce.attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient;return d}if(c==null&&a.is(b,"string")){if(b==F&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;return b in this.attrs?this.attrs[b]:a.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:T[b]}if(this.attrs&&c==null&&a.is(b,D)){var g,h={};for(e=0,g=b.length;e<g;e++)h[b[e]]=this.attr(b[e]);return h}var i;c!=null&&(i={},i[b]=c),c==null&&a.is(b,"object")&&(i=b);for(var j in i)dc("attr."+j+"."+this.id,this,i[j]);if(i){for(j in this.paper.customAttributes)if(this.paper.customAttributes[f](j)&&i[f](j)&&a.is(this.paper.customAttributes[j],"function")){var k=this.paper.customAttributes[j].apply(this,[][m](i[j]));this.attrs[j]=i[j];for(var l in k)k[f](l)&&(i[l]=k[l])}i.text&&this.type=="text"&&(this.textpath.string=i.text),ca(this,i)}return this},ce.toFront=function(){!this.removed&&this.node.parentNode.appendChild(this.node),this.paper.top!=this&&bH(this,this.paper);return this},ce.toBack=function(){if(this.removed)return this;this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),bI(this,this.paper));return this},ce.insertAfter=function(a){if(this.removed)return this;a.constructor==c_&&(a=a[a.length-1]),a.node.nextSibling?a.node.parentNode.insertBefore(this.node,a.node.nextSibling):a.node.parentNode.appendChild(this.node),bJ(this,a,this.paper);return this},ce.insertBefore=function(a){if(this.removed)return this;a.constructor==c_&&(a=a[0]),a.node.parentNode.insertBefore(this.node,a.node),bK(this,a,this.paper);return this},ce.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;d=d.replace(cp,o),+b!==0?(this.attrs.blur=b,c.filter=d+p+R+".Blur(pixelradius="+(+b||1.5)+")",c.margin=a.format("-{0}px 0 0 -{0}px",N(+b||1.5))):(c.filter=d,c.margin=0,delete this.attrs.blur)},bV=function(a,b){var c=cy("shape");c.style.cssText=cr,c.coordsize=cs+p+cs,c.coordorigin=b.coordorigin;var d=new cd(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,ca(d,e),b.canvas.appendChild(c);var f=cy("skew");f.on=!0,c.appendChild(f),d.skew=f,d.transform(o);return d},cg=function(a,b,c,d,e,f){var g=be(b,c,d,e,f),h=a.path(g),i=h.attrs;h.X=i.x=b,h.Y=i.y=c,h.W=i.width=d,h.H=i.height=e,i.r=f,i.path=g,h.type="rect";return h},ch=function(a,b,c,d,e){var f=a.path(),g=f.attrs;f.X=b-d,f.Y=c-e,f.W=d*2,f.H=e*2,f.type="ellipse",ca(f,{cx:b,cy:c,rx:d,ry:e});return f},cf=function(a,b,c,d){var e=a.path(),f=e.attrs;e.X=b-d,e.Y=c-d,e.W=e.H=d*2,e.type="circle",ca(e,{cx:b,cy:c,r:d});return e},ci=function(a,b,c,d,e,f){var g=be(c,d,e,f),h=a.path(g).attr({stroke:"none"}),i=h.attrs,j=h.node,k=j.getElementsByTagName(F)[0];i.src=b,h.X=i.x=c,h.Y=i.y=d,h.W=i.width=e,h.H=i.height=f,i.path=g,h.type="image",k.parentNode==j&&j.removeChild(k),k.rotate=!0,k.src=b,k.type="tile",h._.fillpos=[c,d],h._.fillsize=[e,f],j.appendChild(k),cx(h);return h},cj=function(b,c,d,e){var f=cy("shape"),g=cy("path"),h=cy("textpath");c=c||0,d=d||0,e=e||"",g.v=a.format("m{0},{1}l{2},{1}",N(c*cs),N(d*cs),N(c*cs)+1),g.textpathok=!0,h.string=q(e),h.on=!0,f.style.cssText="position:absolute;left:0;top:0;width:1;height:1",f.coordsize=cs+p+cs,f.coordorigin="0 0";var i=new cd(f,b),j={fill:"#000",stroke:"none",font:T.font,text:e};i.shape=f,i.path=g,i.textpath=h,i.type="text",i.attrs.text=q(e),i.attrs.x=c,i.attrs.y=d,i.attrs.w=1,i.attrs.h=1,ca(i,j),f.appendChild(h),f.appendChild(g),b.canvas.appendChild(f);var k=cy("skew");k.on=!0,f.appendChild(k),i.skew=k,i.transform(o);return i},ck=function(a,b){var c=this.canvas.style;this.width=a,this.height=b,a==+a&&(a+="px"),b==+b&&(b+="px"),c.width=a,c.height=b,c.clip="rect(0 "+a+" "+b+" 0)",this._viewBox&&cm.apply(this,this._viewBox);return this},cm=function(a,b,c,d,e){dc("setViewBox",this,this._viewBox,[a,b,c,d,e]);var f=this.width,g=this.height,h=1e3*w(c/f,d/g),i,j;e&&(i=g/d,j=f/c,c*i<f&&(a-=(f-c*i)/2/i),d*j<g&&(b-=(g-d*j)/2/j)),this._viewBox=[a,b,c,d,!!e],this.forEach(function(a){a.transform("...")});return this};var cy,cz=function(a){var b=a.document;b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),cy=function(a){return b.createElement("<rvml:"+a+' class="rvml">')}}catch(c){cy=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}};cz(g.win),cl=function(){var b=bE[l](0,arguments),c=b.container,d=b.height,e,f=b.width,h=b.x,j=b.y;if(!c)throw new Error("VML container not found.");var k=new i,m=k.canvas=g.doc.createElement("div"),n=m.style;h=h||0,j=j||0,f=f||512,d=d||342,k.width=f,k.height=d,f==+f&&(f+="px"),d==+d&&(d+="px"),k.coordsize=cs*1e3+p+cs*1e3,k.coordorigin="0 0",k.span=g.doc.createElement("span"),k.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",m.appendChild(k.span),n.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d),c==1?(g.doc.body.appendChild(m),n.left=h+"px",n.top=j+"px",n.position="absolute"):c.firstChild?c.insertBefore(m,c.firstChild):c.appendChild(m),bF.call(k,k,a.fn);return k},j.clear=function(){dc("clear",this),this.canvas.innerHTML=o,this.span=g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},j.remove=function(){dc("remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bL(a);return!0}}var cA=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);navigator.vendor=="Apple Computer, Inc."&&(cA&&cA[1]<4||navigator.platform.slice(0,2)=="iP")||navigator.vendor=="Google Inc."&&cA&&cA[1]<8?j.safari=function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:j.safari=bc;var cB=function(){this.returnValue=!1},cC=function(){return this.originalEvent.preventDefault()},cD=function(){this.cancelBubble=!0},cE=function(){return this.originalEvent.stopPropagation()},cF=function(){if(g.doc.addEventListener)return function(a,b,c,d){var e=n&&t[b]?t[b]:b,g=function(e){if(n&&t[f](b))for(var g=0,h=e.targetTouches&&e.targetTouches.length;g<h;g++)if(e.targetTouches[g].target==a){var i=e;e=e.targetTouches[g],e.originalEvent=i,e.preventDefault=cC,e.stopPropagation=cE;break}return c.call(d,e)};a.addEventListener(e,g,!1);return function(){a.removeEventListener(e,g,!1);return!0}};if(g.doc.attachEvent)return function(a,b,c,d){var e=function(a){a=a||g.win.event,a.preventDefault=a.preventDefault||cB,a.stopPropagation=a.stopPropagation||cD;return c.call(d,a)};a.attachEvent("on"+b,e);var f=function(){a.detachEvent("on"+b,e);return!0};return f}}(),cG=[],cH=function(a){var b=a.clientX,c=a.clientY,d=g.doc.documentElement.scrollTop||g.doc.body.scrollTop,e=g.doc.documentElement.scrollLeft||g.doc.body.scrollLeft,f,h=cG.length;while(h--){f=cG[h];if(n){var i=a.touches.length,j;while(i--){j=a.touches[i];if(j.identifier==f.el._drag.id){b=j.clientX,c=j.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}}else a.preventDefault();var k=f.el.node,l,m=k.nextSibling,o=k.parentNode,p=k.style.display;g.win.opera&&o.removeChild(k),k.style.display="none",l=f.el.paper.getElementByPoint(b,c),k.style.display=p,g.win.opera&&(m?o.insertBefore(k,m):o.appendChild(k)),l&&dc("drag.over."+f.el.id,f.el,l),b+=e,c+=d,dc("drag.move."+f.el.id,f.move_scope||f.el,b-f.el._drag.x,c-f.el._drag.y,b,c,a)}},cI=function(b){a.unmousemove(cH).unmouseup(cI);var c=cG.length,d;while(c--)d=cG[c],d.el._drag={},dc("drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,b);cG=[]};for(var cJ=s.length;cJ--;)(function(b){a[b]=cd.prototype[b]=function(c,d){a.is(c,"function")&&(this.events=this.events||[],this.events.push({name:b,f:c,unbind:cF(this.shape||this.node||g.doc,b,c,d||this)}));return this},a["un"+b]=cd.prototype["un"+b]=function(a){var c=this.events,d=c.length;while(d--)if(c[d].name==b&&c[d].f==a){c[d].unbind(),c.splice(d,1),!c.length&&delete this.events;return this}return this}})(s[cJ]);ce.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},ce.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)},ce.drag=function(b,c,d,e,f,h){function i(i){(i.originalEvent||i).preventDefault();var j=g.doc.documentElement.scrollTop||g.doc.body.scrollTop,k=g.doc.documentElement.scrollLeft||g.doc.body.scrollLeft;this._drag.x=i.clientX+k,this._drag.y=i.clientY+j,this._drag.id=i.identifier,!cG.length&&a.mousemove(cH).mouseup(cI),cG.push({el:this,move_scope:e,start_scope:f,end_scope:h}),c&&dc.on("drag.start."+this.id,c),b&&dc.on("drag.move."+this.id,b),d&&dc.on("drag.end."+this.id,d),dc("drag.start."+this.id,f||e||this,i.clientX+k,i.clientY+j,i)}this._drag={},this.mousedown(i);return this},ce.onDragOver=function(a){a?dc.on("drag.over."+this.id,a):dc.unbind("drag.over."+this.id)},ce.undrag=function(){var b=cG.length;while(b--)cG[b].el==this&&(a.unmousedown(cG[b].start),cG.splice(b++,1),dc.unbind("drag.*."+this.id));!cG.length&&a.unmousemove(cH).unmouseup(cI)},j.circle=function(a,b,c){return cf(this,a||0,b||0,c||0)},j.rect=function(a,b,c,d,e){return cg(this,a||0,b||0,c||0,d||0,e||0)},j.ellipse=function(a,b,c,d){return ch(this,a||0,b||0,c||0,d||0)},j.path=function(b){b&&!a.is(b,C)&&!a.is(b[0],D)&&(b+=o);return bV(a.format[l](a,arguments),this)},j.image=function(a,b,c,d,e){return ci(this,a||"about:blank",b||0,c||0,d||0,e||0)},j.text=function(a,b,c){return cj(this,a||0,b||0,q(c))},j.set=function(a){arguments.length>1&&(a=Array.prototype.splice.call(arguments,0,arguments.length));return new c_(a)},j.setSize=ck,j.setViewBox=cm,j.top=j.bottom=null,j.raphael=a;var cK=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,h=e.clientLeft||d.clientLeft||0,i=b.top+(g.win.pageYOffset||e.scrollTop||d.scrollTop)-f,j=b.left+(g.win.pageXOffset||e.scrollLeft||d.scrollLeft)-h;return{y:i,x:j}};j.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=g.doc.elementFromPoint(a,b);if(g.win.opera&&e.tagName=="svg"){var f=cK(d),h=d.createSVGRect();h.x=a-f.x,h.y=b-f.y,h.width=h.height=1;var i=d.getIntersectionList(h,null);i.length&&(e=i[i.length-1])}if(!e)return null;while(e.parentNode&&e!=d.parentNode&&!e.raphael)e=e.parentNode;e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null;return e},j.getById=function(a){var b=this.bottom;while(b){if(b.id==a)return b;b=b.next}return null},j.forEach=function(a,b){var c=this.bottom;while(c){if(a.call(b,c)===!1)return this;c=c.next}return this},ce.getBBox=function(a){if(this.removed)return{};var b=this._;if(a){if(b.dirty||!b.bboxwt)this.realPath=bg[this.type](this),b.bboxwt=bt(this.realPath),b.bboxwt.toString=cM,b.dirty=0;return b.bboxwt}if(b.dirty||b.dirtyT||!b.bbox){if(b.dirty||!this.realPath)b.bboxwt=0,this.realPath=bg[this.type](this);b.bbox=bt(bh(this.realPath,this.matrix)),b.bbox.toString=cM,b.dirty=b.dirtyT=0}return b.bbox},ce.clone=function(){if(this.removed)return null;var a=this.attr();delete a.scale,delete a.translation;return this.paper[this.type]().attr(a)},ce.glow=function(a){if(this.type=="text")return null;a=a||{};var b={width:a.width||10,fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||bg[this.type](this);f=this.matrix?bh(f,this.matrix):f;for(var g=1;g<c+1;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cN={},cO=function(b,c,d,e,f,g,h,i,j){var k=0,l=100,m=[b,c,d,e,f,g,h,i].join(),n=cN[m],o,p;!n&&(cN[m]=n={data:[]}),n.timer&&clearTimeout(n.timer),n.timer=setTimeout(function(){delete cN[m]},2e3);if(j!=null&&!n.precision){var q=cO(b,c,d,e,f,g,h,i);n.precision=~~q*10,n.data=[]}l=n.precision||l;for(var r=0;r<l+1;r++){n.data[r*l]?p=n.data[r*l]:(p=a.findDotsAtSegment(b,c,d,e,f,g,h,i,r/l),n.data[r*l]=p),r&&(k+=z(z(o.x-p.x,2)+z(o.y-p.y,2),.5));if(j!=null&&k>=j)return p;o=p}if(j==null)return k},cP=function(b,c){return function(d,e,f){d=bC(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;o<p;o++){i=d[o];if(i[0]=="M")g=+i[1],h=+i[2];else{j=cO(g,h,i[1],i[2],i[3],i[4],i[5],i[6]);if(n+j>e){if(c&&!l.start){m=cO(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),k+=["C"+m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k,k=["M"+m.x,m.y+"C"+m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!b&&!c){m=cO(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j,g=+i[5],h=+i[6]}k+=i.shift()+i}l.end=k,m=b?n:c?l:a.findDotsAtSegment(g,h,i[1],i[2],i[3],i[4],i[5],i[6],1),m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},cQ=cP(1),cR=cP(),cS=cP(0,1);a.getTotalLength=cQ,a.getPointAtLength=cR,a.getSubpath=function(a,b,c){if(y(this.getTotalLength(a)-c)<1e-6)return cS(a,b).end;var d=cS(a,c,1);return b?cS(d,b).end:d},ce.getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return cQ(this.attrs.path)}},ce.getPointAtLength=function(a){if(this.type=="path")return cR(this.attrs.path,a)},ce.getSubpath=function(b,c){if(this.type=="path")return a.getSubpath(this.attrs.path,b,c)};var cT=a.easing_formulas={linear:function(a){return a},"<":function(a){return z(a,1.7)},">":function(a){return z(a,.48)},"<>":function(a){var b=.48-a/1.04,c=v.sqrt(.1734+b*b),d=c-b,e=z(y(d),1/3)*(d<0?-1:1),f=-c-b,g=z(y(f),1/3)*(f<0?-1:1),h=e+g+.5;return(1-h)*3*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==!!a)return a;return z(2,-10*a)*v.sin((a-.075)*2*A/.3)+1},bounce:function(a){var b=7.5625,c=2.75,d;a<1/c?d=b*a*a:a<2/c?(a-=1.5/c,d=b*a*a+.75):a<2.5/c?(a-=2.25/c,d=b*a*a+.9375):(a-=2.625/c,d=b*a*a+.984375);return d}};cT.easeIn=cT["ease-in"]=cT["<"],cT.easeOut=cT["ease-out"]=cT[">"],cT.easeInOut=cT["ease-in-out"]=cT["<>"],cT["back-in"]=cT.backIn,cT["back-out"]=cT.backOut;var cU=[],cV=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},cW=function(){var b=+(new Date),c=0;for(;c<cU.length;c++){var d=cU[c];if(d.el.removed||d.paused)continue;var e=b-d.start,g=d.ms,h=d.easing,i=d.from,j=d.diff,k=d.to,l=d.t,m=d.el,n={},o;d.initstatus?(e=(d.initstatus*d.anim.top-d.prev)/(d.percent-d.prev)*g,d.status=d.initstatus,delete d.initstatus,d.stop&&cU.splice(c--,1)):d.status=(d.prev+(d.percent-d.prev)*(e/g))/d.anim.top;if(e<0)continue;if(e<g){var q=h(e/g);for(var r in i)if(i[f](r)){switch(U[r]){case B:o=+i[r]+q*g*j[r];break;case"colour":o="rgb("+[cX(N(i[r].r+q*g*j[r].r)),cX(N(i[r].g+q*g*j[r].g)),cX(N(i[r].b+q*g*j[r].b))].join(",")+")";break;case"path":o=[];for(var s=0,t=i[r].length;s<t;s++){o[s]=[i[r][s][0]];for(var u=1,v=i[r][s].length;u<v;u++)o[s][u]=+i[r][s][u]+q*g*j[r][s][u];o[s]=o[s].join(p)}o=o.join(p);break;case"transform":if(j[r].real){o=[];for(s=0,t=i[r].length;s<t;s++){o[s]=[i[r][s][0]];for(u=1,v=i[r][s].length;u<v;u++)o[s][u]=i[r][s][u]+q*g*j[r][s][u]}}else{var w=function(a){return+i[r][a]+q*g*j[r][a]};o=[["m",w(0),w(1),w(2),w(3),w(4),w(5)]]}break;case"csv":if(r=="clip-rect"){o=[],s=4;while(s--)o[s]=+i[r][s]+q*g*j[r][s]}break;default:var x=[].concat(i[r]);o=[],s=m.paper.customAttributes[r].length;while(s--)o[s]=+x[s]+q*g*j[r][s]}n[r]=o}m.attr(n),function(a,b,c){setTimeout(function(){dc("anim.frame."+a,b,c)})}(m.id,m,d.anim)}else(function(b,c,d){setTimeout(function(){dc("anim.finish."+c.id,c,d),a.is(b,"function")&&b.call(c)})})(d.callback,m,d.anim),--d.repeat?(m.attr(d.origin),d.start=b):(m.attr(k),cU.splice(c--,1)),d.next&&!d.stop&&c$(d.anim,d.el,d.next,null,d.totalOrigin)}a.svg&&m&&m.paper&&m.paper.safari(),cU.length&&cV(cW)},cX=function(a){return w(x(a,255),0)};ce.animateWith=function(a,b,c,d,e){for(var f=0,g=cU.length;f<g;f++)if(cU[f].el.id==a.id){b.start=cU[f].timestamp;break}return this.animate(b,c,d,e)},ce.onAnimation=function(a){a?dc.on("anim.frame."+this.id,a):dc.unbind("anim.frame."+this.id);return this},cZ.prototype.delay=function(a){var b=new cZ(this.anim,this.ms);b.times=this.times,b.del=+a||0;return b},cZ.prototype.repeat=function(a){var b=new cZ(this.anim,this.ms);b.del=this.del,b.times=v.floor(w(a,0))||1;return b},a.animation=function(b,c,d,e){if(a.is(d,"function")||!d)e=e||d||null,d=null;b=Object(b),c=+c||0;var g={},h,i;for(i in b)b[f](i)&&P(i)!=i&&(h=!0,g[i]=b[i]);if(!h)return new cZ(b,c);d&&(g.easing=d),e&&(g.callback=e);return new cZ({100:g},c)},ce.animate=function(b,c,d,e){var f=this;if(f.removed){e&&e.call(f);return f}var g=b instanceof cZ?b:a.animation(b,c,d,e);c$(g,f,g.percents[0],null,f.attr());return f},ce.setTime=function(a,b){a&&b!=null&&this.status(a,x(b,a.ms)/a.ms);return this},ce.status=function(a,b){var c=[],d=0,e,f;if(b!=null){c$(a,this,-1,x(b,1));return this}e=cU.length;for(;d<e;d++){f=cU[d];if(f.el.id==this.id&&(!a||f.anim==a)){if(a)return f.status;c.push({anim:f.anim,status:f.status})}}if(a)return 0;return c},ce.pause=function(a){for(var b=0;b<cU.length;b++)cU[b].el.id==this.id&&(!a||cU[b].anim==a)&&dc("anim.pause."+this.id,this,cU[b].anim)!==!1&&(cU[b].paused=!0);return this},ce.resume=function(a){for(var b=0;b<cU.length;b++)if(cU[b].el.id==this.id&&(!a||cU[b].anim==a)){var c=cU[b];dc("anim.resume."+this.id,this,c.anim)!==!1&&(delete c.paused,this.status(c.anim,c.status))}return this},ce.stop=function(a){for(var b=0;b<cU.length;b++)cU[b].el.id==this.id&&(!a||cU[b].anim==a)&&dc("anim.stop."+this.id,this,cU[b].anim)!==!1&&cU.splice(b--,1);return this},ce.toString=function(){return"Raphaël’s object"};var c_=function(a){this.items=[],this.length=0,this.type="set";if(a)for(var b=0,c=a.length;b<c;b++)a[b]&&(a[b].constructor==cd||a[b].constructor==c_)&&(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},da=c_.prototype;da.push=function(){var a,b;for(var c=0,d=arguments.length;c<d;c++)a=arguments[c],a&&(a.constructor==cd||a.constructor==c_)&&(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},da.pop=function(){this.length&&delete this[this.length--];return this.items.pop()},da.forEach=function(a,b){for(var c=0,d=this.items.length;c<d;c++)if(a.call(b,this.items[c])===!1)return this;return this};for(var db in ce)ce[f](db)&&(da[db]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][l](c,b)})}}(db));da.attr=function(b,c){if(b&&a.is(b,D)&&a.is(b[0],"object"))for(var d=0,e=b.length;d<e;d++)this.items[d].attr(b[d]);else for(var f=0,g=this.items.length;f<g;f++)this.items[f].attr(b,c);return this},da.animate=function(b,c,d,e){(a.is(d,"function")||!d)&&(e=d||null);var f=this.items.length,g=f,h,i=this,j;e&&(j=function(){!--f&&e.call(i)}),d=a.is(d,C)?d:j;var k=b instanceof cZ?b:a.animation(b,c,d,j);h=this.items[--g].animate(k);while(g--)this.items[g]&&!this.items[g].removed&&this.items[g].animateWith(h,k);return this},da.insertAfter=function(a){var b=this.items.length;while(b--)this.items[b].insertAfter(a);return this},da.getBBox=function(){var a=[],b=[],c=[],d=[];for(var e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}a=x[l](0,a),b=x[l](0,b);return{x:a,y:b,width:w[l](0,c)-a,height:w[l](0,d)-b}},da.clone=function(a){a=new c_;for(var b=0,c=this.items.length;b<c;b++)a.push(this.items[b].clone());return a},da.toString=function(){return"Raphaël‘s set"},a.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[f](d)&&(b.face[d]=a.face[d]);this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b];if(!a.svg){b.face["units-per-em"]=Q(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[f](e)){var g=a.glyphs[e];b.glyphs[e]={w:g.w,k:{},d:g.d&&"M"+g.d.replace(/[mlcxtrv]/g,function(a){return({l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"})[a]||"M"})+"z"};if(g.k)for(var h in g.k)g[f](h)&&(b.glyphs[e].k[h]=g.k[h])}}return a},j.getFont=function(b,c,d,e){e=e||"normal",d=d||"normal",c=+c||({normal:400,bold:700,lighter:300,bolder:800})[c]||400;if(!!a.fonts){var g=a.fonts[b];if(!g){var h=new RegExp("(^|\\s)"+b.replace(/[^\w\d\s+!~.:_-]/g,o)+"(\\s|$)","i");for(var i in a.fonts)if(a.fonts[f](i)&&h.test(i)){g=a.fonts[i];break}}var j;if(g)for(var k=0,l=g.length;k<l;k++){j=g[k];if(j.face["font-weight"]==c&&(j.face["font-style"]==d||!j.face["font-style"])&&j.face["font-stretch"]==e)break}return j}},j.print=function(c,d,e,f,g,h,i){h=h||"middle",i=w(x(i||0,1),-1);var j=this.set(),k=q(e).split(o),l=0,m=o,n;a.is(f,e)&&(f=this.getFont(f));if(f){n=(g||16)/f.face["units-per-em"];var p=f.face.bbox.split(b),r=+p[0],s=+p[1]+(h=="baseline"?p[3]-p[1]+ +f.face.descent:(p[3]-p[1])/2);for(var t=0,u=k.length;t<u;t++){var v=t&&f.glyphs[k[t-1]]||{},y=f.glyphs[k[t]];l+=t?(v.w||f.w)+(v.k&&v.k[k[t]]||0)+f.w*i:0,y&&y.d&&j.push(this.path(y.d).attr({fill:"#000",stroke:"none",transform:[["t",l,0]]}))}j.scale(n,n,r,s).translate(c-r,d-s)}return j},a.format=function(b,c){var e=a.is(c,D)?[0][m](c):arguments;b&&a.is(b,C)&&e.length-1&&(b=b.replace(d,function(a,b){return e[++b]==null?o:e[b]}));return b||o},a.ninja=function(){h.was?g.win.Raphael=h.is:delete Raphael;return a},a.el=ce,a.st=da,function(a,b,c){function d(){/in/.test(a.readyState)?setTimeout(d,9):dc("DOMload")}a.readyState==null&&a.addEventListener&&(a.addEventListener(b,c=function(){a.removeEventListener(b,c,!1),a.readyState="complete"},!1),a.readyState="loading"),d()}(document,"DOMContentLoaded"),h.was?g.win.Raphael=a:Raphael=a;var dc=a.eve=function(){var a="0.2.1",b="hasOwnProperty",c=/[\.\/]/,d="*",e={n:{}},f=function(a,b){var c=e,d=Array.prototype.slice.call(arguments,2),g=f.listeners(a),h=[];for(var i=0,j=g.length;i<j;i++)try{g[i].apply(b,d)}catch(k){h.push({error:k&&k.message||k,func:g[i]})}if(h.length)return h};f.listeners=function(a){var b=a.split(c),f=e,g,h,i,j,k,l,m,n,o=[f],p=[];for(j=0,k=b.length;j<k;j++){n=[];for(l=0,m=o.length;l<m;l++){f=o[l].n,h=[f[b[j]],f[d]],i=2;while(i--)g=h[i],g&&(n.push(g),p=p.concat(g.f||[]))}o=n}return p},f.on=function(a,b){var d=a.split(c),f=e;for(var g=0,h=d.length;g<h;g++)f=f.n,!f[d[g]]&&(f[d[g]]={n:{}}),f=f[d[g]];f.f=f.f||[];for(g=0,h=f.f.length;g<h;g++)if(f.f[g]==b)return!1;f.f.push(b)},f.unbind=function(a,f){var g=a.split(c),h,i,j,k=[e];for(var l=0,m=g.length;l<m;l++)for(var n=0;n<k.length;n+=j.length-2){j=[n,1],h=k[n].n;if(g[l]!=d)h[g[l]]&&j.push(h[g[l]]);else for(i in h)h[b](i)&&j.push(h[i]);k.splice.apply(k,j)}for(l=0,m=k.length;l<m;l++){h=k[l];while(h.n){if(f){if(h.f){for(l=0,m=h.f.length;l<m;l++)if(h.f[l]==f){h.f.splice(l,1);break}!h.f.length&&delete h.f}for(i in h.n)if(h.n[b](i)&&h.n[i].f){var o=h.n[i].f;for(l=0,m=o.length;l<m;l++)if(o[l]==f){o.splice(l,1);break}!o.length&&delete h.n[i].f}}else{delete h.f;for(i in h.n)h.n[b](i)&&h.n[i].f&&delete h.n[i].f}h=h.n}}return!0},f.version=a,f.toString=function(){return"You are running Eve "+a};return f}()})()
\ No newline at end of file
+(function(){function c$(c,d,e,g,h){e=P(e);var i,j,k,l=[],m,n,o,p=c.ms,r={},s={},t={};if(g)for(v=0,w=cU.length;v<w;v++){var u=cU[v];if(u.el.id==d.id&&u.anim==c){u.percent!=e?(cU.splice(v,1),k=1):j=u,d.attr(u.totalOrigin);break}}else g=+s;for(var v=0,w=c.percents.length;v<w;v++){if(c.percents[v]==e||c.percents[v]>g*c.top){e=c.percents[v],n=c.percents[v-1]||0,p=p/c.top*(e-n),m=c.percents[v+1],i=c.anim[e];break}g&&d.attr(c.anim[c.percents[v]])}if(!!i){if(!j){for(attr in i)if(i[f](attr))if(U[f](attr)||d.paper.customAttributes[f](attr)){r[attr]=d.attr(attr),r[attr]==null&&(r[attr]=T[attr]),s[attr]=i[attr];switch(U[attr]){case B:t[attr]=(s[attr]-r[attr])/p;break;case"colour":r[attr]=a.getRGB(r[attr]);var x=a.getRGB(s[attr]);t[attr]={r:(x.r-r[attr].r)/p,g:(x.g-r[attr].g)/p,b:(x.b-r[attr].b)/p};break;case"path":var y=bC(r[attr],s[attr]),z=y[1];r[attr]=y[0],t[attr]=[];for(v=0,w=r[attr].length;v<w;v++){t[attr][v]=[0];for(var A=1,C=r[attr][v].length;A<C;A++)t[attr][v][A]=(z[v][A]-r[attr][v][A])/p}break;case"transform":var D=d._,E=bO(D[attr],s[attr]);if(E){r[attr]=E.from,s[attr]=E.to,t[attr]=[],t[attr].real=!0;for(v=0,w=r[attr].length;v<w;v++){t[attr][v]=[r[attr][v][0]];for(A=1,C=r[attr][v].length;A<C;A++)t[attr][v][A]=(s[attr][v][A]-r[attr][v][A])/p}}else{var F=(d.matrix||new bP).m,G={_:{transform:D.transform},getBBox:function(){return d.getBBox()}};r[attr]=[F[0][0],F[1][0],F[0][1],F[1][1],F[0][2],F[1][2]],bM(G,s[attr]),s[attr]=G._.transform,t[attr]=[(G.matrix.m[0][0]-F[0][0])/p,(G.matrix.m[1][0]-F[1][0])/p,(G.matrix.m[0][1]-F[0][1])/p,(G.matrix.m[1][1]-F[1][1])/p,(G.matrix.m[0][2]-F[0][2])/p,(G.matrix.m[1][2]-F[1][2])/p]}break;case"csv":var H=q(i[attr]).split(b),I=q(r[attr]).split(b);if(attr=="clip-rect"){r[attr]=I,t[attr]=[],v=I.length;while(v--)t[attr][v]=(H[v]-r[attr][v])/p}s[attr]=H;break;default:H=[].concat(i[attr]),I=[].concat(r[attr]),t[attr]=[],v=d.paper.customAttributes[attr].length;while(v--)t[attr][v]=((H[v]||0)-(I[v]||0))/p}}var J=i.easing,K=a.easing_formulas[J];if(!K){K=q(J).match(M);if(K&&K.length==5){var L=K;K=function(a){return cY(a,+L[1],+L[2],+L[3],+L[4],p)}}else K=bd}o=i.start||c.start||+(new Date),u={anim:c,percent:e,timestamp:o,start:o+(c.del||0),status:0,initstatus:g||0,stop:!1,ms:p,easing:K,from:r,diff:t,to:s,el:d,callback:i.callback,prev:n,next:m,repeat:c.times,origin:d.attr(),totalOrigin:h},cU.push(u);if(g&&!j){u.stop=!0,u.start=new Date-p*g;if(cU.length==1)return cW()}cU.length==1&&cV(cW)}else j.initstatus=g,j.start=new Date-j.ms*g;dc("anim.start."+d.id,d,c)}}function cZ(a,b){var c=[];this.anim=a,this.ms=b,this.times=1;if(this.anim){for(var d in this.anim)this.anim[f](d)&&c.push(+d);c.sort(bb)}this.top=c[c.length-1],this.percents=c}function cY(a,b,c,d,e,f){function o(a,b){var c,d,e,f,j,k;for(e=a,k=0;k<8;k++){f=m(e)-a;if(y(f)<b)return e;j=(3*i*e+2*h)*e+g;if(y(j)<1e-6)break;e=e-f/j}c=0,d=1,e=a;if(e<c)return c;if(e>d)return d;while(c<d){f=m(e);if(y(f-a)<b)return e;a>f?c=e:d=e,e=(d-c)/2+c}return e}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function m(a){return((i*a+h)*a+g)*a}var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;return n(a,1/(200*f))}function cM(){return this.x+p+this.y+p+this.width+"×"+this.height}function cL(){return this.x+p+this.y}function bP(a,b,c,d,e,f){a!=null?this.m=[[a,c,e],[b,d,f],[0,0,1]]:this.m=[[1,0,0],[0,1,0],[0,0,1]]}function bs(a,b){var c=g.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top-9999em",c.onload=function(){b.call(this),this.onload=null,g.doc.body.removeChild(this)},c.onerror=function(){g.doc.body.removeChild(this)},g.doc.body.appendChild(c),c.src=a}function br(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),g=e.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];if(h[f](g))return c?c(h[g]):h[g];i.length>=1e3&&delete h[i.shift()],i.push(g),h[g]=a[l](b,e);return c?c(h[g]):h[g]}return d}function a(b){if(a.is(b,"function"))return dc.on("DOMload",b);if(a.is(b,D)){var d=b,e=cl[l](a,d.splice(0,3+a.is(d[0],B))),g=e.set(),h=0,i=d.length,j;for(;h<i;h++)j=d[h]||{},c[f](j.type)&&g.push(e[j.type]().attr(j));return g}return cl[l](a,arguments)}a.version="2.0.0";var b=/[, ]+/,c={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},d=/\{(\d+)\}/g,e="prototype",f="hasOwnProperty",g={doc:document,win:window},h={was:Object.prototype[f].call(g.win,"Raphael"),is:g.win.Raphael},i=function(){},j,k="appendChild",l="apply",m="concat",n="createTouch"in g.doc,o="",p=" ",q=String,r="split",s="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend".split(p),t={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},u=q.prototype.toLowerCase,v=Math,w=v.max,x=v.min,y=v.abs,z=v.pow,A=v.PI,B="number",C="string",D="array",E="toString",F="fill",G=Object.prototype.toString,H={},I="push",J=/^url\(['"]?([^\)]+?)['"]?\)$/i,K=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,L={NaN:1,Infinity:1,"-Infinity":1},M=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,N=v.round,O="setAttribute",P=parseFloat,Q=parseInt,R=" progid:DXImageTransform.Microsoft",S=q.prototype.toUpperCase,T={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/",opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},U={blur:B,"clip-rect":"csv",cx:B,cy:B,fill:"colour","fill-opacity":B,"font-size":B,height:B,opacity:B,path:"path",r:B,rx:B,ry:B,stroke:"colour","stroke-opacity":B,"stroke-width":B,transform:"transform",width:B,x:B,y:B},V=/\s*,\s*/,W={hs:1,rg:1},X=/,?([achlmqrstvxz]),?/gi,Y=/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,Z=/([rstm])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,$=/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,_=/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,ba=function(a,b){return a.key-b.key},bb=function(a,b){return a-b},bc=function(){},bd=function(a){return a},be=function(a,b,c,d,e){if(e)return[["M",a+e,b],["l",c-e*2,0],["a",e,e,0,0,1,e,e],["l",0,d-e*2],["a",e,e,0,0,1,-e,e],["l",e*2-c,0],["a",e,e,0,0,1,-e,-e],["l",0,e*2-d],["a",e,e,0,0,1,e,-e],["z"]];return[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]]},bf=function(a,b,c,d){d==null&&(d=c);return[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]]},bg={path:function(a){return a.attr("path")},circle:function(a){var b=a.attrs;return bf(b.cx,b.cy,b.r)},ellipse:function(a){var b=a.attrs;return bf(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=a.attrs;return be(b.x,b.y,b.width,b.height,b.r)},image:function(a){var b=a.attrs;return be(b.x,b.y,b.width,b.height)},text:function(a){var b=a._getBBox();return be(b.x,b.y,b.width,b.height)}},bh=function(a,b){if(!b)return a;var c,d,e,f,g;a=bC(a);for(e=0,ii=a.length;e<ii;e++){g=a[e];for(f=1,jj=g.length;f<jj;f+=2)c=b.x(g[f],g[f+1]),d=b.y(g[f],g[f+1]),g[f]=c,g[f+1]=d}return a};a.type=g.win.SVGAngle||g.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML";if(a.type=="VML"){var bi=g.doc.createElement("div"),bj;bi.innerHTML='<v:shape adj="1"/>',bj=bi.firstChild,bj.style.behavior="url(#default#VML)";if(!bj||typeof bj.adj!="object")return a.type=o;bi=null}a.svg=!(a.vml=a.type=="VML"),j=i.prototype=a.prototype,j.customAttributes={},a._id=0,a._oid=0,a.fn={},a.is=function(a,b){b=u.call(b);if(b=="finite")return!L[f](+a);return b=="null"&&a===null||b==typeof a||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||G.call(a).slice(8,-1).toLowerCase()==b},a.angle=function(b,c,d,e,f,g){if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return(180+v.atan2(-i,-h)*180/A+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)},a.rad=function(a){return a%360*A/180},a.deg=function(a){return a*180/A%360},a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,D)){var e=b.length;while(e--)if(y(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(f<d)return c-f;if(f>b-d)return c-f+b}return c};var bk=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=v.random()*16|0,c=a=="x"?b:b&3|8;return c.toString(16)});a.setWindow=function(b){dc("setWindow",a,g.win,b),g.win=b,g.doc=g.win.document,cz&&cz(g.win)};var bl=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write("<body>"),e.close(),d=e.body}catch(f){d=createPopup().document.body}var h=d.createTextRange();bl=br(function(a){try{d.style.color=q(a).replace(c,o);var b=h.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=g.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",g.doc.body.appendChild(i),bl=br(function(a){i.style.color=a;return g.doc.defaultView.getComputedStyle(i,o).getPropertyValue("color")})}return bl(b)},bm=function(){return"hsb("+[this.h,this.s,this.b]+")"},bn=function(){return"hsl("+[this.h,this.s,this.l]+")"},bo=function(){return this.hex},bp=function(b,c,d){c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b&&(d=b.b,c=b.g,b=b.r);if(c==null&&a.is(b,C)){var e=a.getRGB(b);b=e.r,c=e.g,d=e.b}if(b>1||c>1||d>1)b/=255,c/=255,d/=255;return[b,c,d]},bq=function(b,c,d,e){b*=255,c*=255,d*=255;var f={r:b,g:c,b:d,hex:a.rgb(b,c,d),toString:bo};a.is(e,"finite")&&(f.opacity=e);return f};a.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;a=a%360/60,i=c*b,h=i*(1-y(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bq(e,f,g,d)},a.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h);if(a>1||b>1||c>1)a/=360,b/=100,c/=100;a*=360;var e,f,g,h,i;a=a%360/60,i=2*b*(c<.5?c:1-c),h=i*(1-y(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bq(e,f,g,d)},a.rgb2hsb=function(a,b,c){c=bp(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;f=w(a,b,c),g=f-x(a,b,c),d=g==0?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=d%6*60,e=g==0?0:g/f;return{h:d,s:e,b:f,toString:bm}},a.rgb2hsl=function(a,b,c){c=bp(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;g=w(a,b,c),h=x(a,b,c),i=g-h,d=i==0?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=d%6*60,f=(g+h)/2,e=i==0?0:f<.5?i/(2*f):i/(2-2*f);return{h:d,s:e,l:f,toString:bn}},a._path2string=function(){return this.join(",").replace(X,"$1")},a.getRGB=br(function(b){if(!b||!!((b=q(b)).indexOf("-")+1))return{r:-1,g:-1,b:-1,hex:"none",error:1};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none"};!W[f](b.toLowerCase().substring(0,2))&&b.charAt()!="#"&&(b=bl(b));var c,d,e,g,h,i,j,k=b.match(K);if(k){k[2]&&(g=Q(k[2].substring(5),16),e=Q(k[2].substring(3,5),16),d=Q(k[2].substring(1,3),16)),k[3]&&(g=Q((i=k[3].charAt(3))+i,16),e=Q((i=k[3].charAt(2))+i,16),d=Q((i=k[3].charAt(1))+i,16)),k[4]&&(j=k[4].split(V),d=P(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=P(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),g=P(j[2]),j[2].slice(-1)=="%"&&(g*=2.55),k[1].toLowerCase().slice(0,4)=="rgba"&&(h=P(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100));if(k[5]){j=k[5].split(V),d=P(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=P(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),g=P(j[2]),j[2].slice(-1)=="%"&&(g*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsba"&&(h=P(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,g,h)}if(k[6]){j=k[6].split(V),d=P(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=P(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),g=P(j[2]),j[2].slice(-1)=="%"&&(g*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsla"&&(h=P(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,g,h)}k={r:d,g:e,b:g},k.hex="#"+(16777216|g|e<<8|d<<16).toString(16).slice(1),a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1}},a),a.hsb=br(function(b,c,d){return a.hsb2rgb(b,c,d).hex}),a.hsl=br(function(b,c,d){return a.hsl2rgb(b,c,d).hex}),a.rgb=br(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b}));return c.hex},a.getColor.reset=function(){delete this.start},a.parsePathString=br(function(b){if(!b)return null;var c={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},d=[];a.is(b,D)&&a.is(b[0],D)&&(d=bu(b)),d.length||q(b).replace(Y,function(a,b,e){var f=[],g=u.call(b);e.replace($,function(a,b){b&&f.push(+b)}),g=="m"&&f.length>2&&(d.push([b][m](f.splice(0,2))),g="l",b=b=="m"?"l":"L");while(f.length>=c[g]){d.push([b][m](f.splice(0,c[g])));if(!c[g])break}}),d.toString=a._path2string;return d}),a.parseTransformString=br(function(b){if(!b)return null;var c={r:3,s:4,t:2,m:6},d=[];a.is(b,D)&&a.is(b[0],D)&&(d=bu(b)),d.length||q(b).replace(Z,function(a,b,c){var e=[],f=u.call(b);c.replace($,function(a,b){b&&e.push(+b)}),d.push([f][m](e))}),d.toString=a._path2string;return d}),a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=z(j,3)*a+z(j,2)*3*i*c+j*3*i*i*e+z(i,3)*g,l=z(j,3)*b+z(j,2)*3*i*d+j*3*i*i*f+z(i,3)*h,m=a+2*i*(c-a)+i*i*(e-2*c+a),n=b+2*i*(d-b)+i*i*(f-2*d+b),o=c+2*i*(e-c)+i*i*(g-2*e+c),p=d+2*i*(f-d)+i*i*(h-2*f+d),q=(1-i)*a+i*c,r=(1-i)*b+i*d,s=(1-i)*e+i*g,t=(1-i)*f+i*h,u=90-v.atan2(m-o,n-p)*180/A;(m>o||n<p)&&(u+=180);return{x:k,y:l,m:{x:m,y:n},n:{x:o,y:p},start:{x:q,y:r},end:{x:s,y:t},alpha:u}};var bt=br(function(a){if(!a)return{x:0,y:0,width:0,height:0};a=bC(a);var b=0,c=0,d=[],e=[],f;for(var g=0,h=a.length;g<h;g++){f=a[g];if(f[0]=="M")b=f[1],c=f[2],d.push(b),e.push(c);else{var i=bB(b,c,f[1],f[2],f[3],f[4],f[5],f[6]);d=d[m](i.min.x,i.max.x),e=e[m](i.min.y,i.max.y),b=f[5],c=f[6]}}var j=x[l](0,d),k=x[l](0,e);return{x:j,y:k,width:w[l](0,d)-j,height:w[l](0,e)-k}}),bu=function(b){var c=[];if(!a.is(b,D)||!a.is(b&&b[0],D))b=a.parsePathString(b);for(var d=0,e=b.length;d<e;d++){c[d]=[];for(var f=0,g=b[d].length;f<g;f++)c[d][f]=b[d][f]}c.toString=a._path2string;return c},bv=br(function(b){if(!a.is(b,D)||!a.is(b&&b[0],D))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;b[0][0]=="M"&&(d=b[0][1],e=b[0][2],f=d,g=e,h++,c.push(["M",d,e]));for(var i=h,j=b.length;i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=u.call(l[0])){k[0]=u.call(l[0]);switch(k[0]){case"a":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]-d).toFixed(3),k[7]=+(l[7]-e).toFixed(3);break;case"v":k[1]=+(l[1]-e).toFixed(3);break;case"m":f=l[1],g=l[2];default:for(var m=1,n=l.length;m<n;m++)k[m]=+(l[m]-(m%2?d:e)).toFixed(3)}}else{k=c[i]=[],l[0]=="m"&&(f=l[1]+d,g=l[2]+e);for(var o=0,p=l.length;o<p;o++)c[i][o]=l[o]}var q=c[i].length;switch(c[i][0]){case"z":d=f,e=g;break;case"h":d+=+c[i][q-1];break;case"v":e+=+c[i][q-1];break;default:d+=+c[i][q-2],e+=+c[i][q-1]}}c.toString=a._path2string;return c},0,bu),bw=br(function(b){if(!a.is(b,D)||!a.is(b&&b[0],D))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;b[0][0]=="M"&&(d=+b[0][1],e=+b[0][2],f=d,g=e,h++,c[0]=["M",d,e]);for(var i=h,j=b.length;i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=S.call(l[0])){k[0]=S.call(l[0]);switch(k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+d),k[7]=+(l[7]+e);break;case"V":k[1]=+l[1]+e;break;case"H":k[1]=+l[1]+d;break;case"M":f=+l[1]+d,g=+l[2]+e;default:for(var m=1,n=l.length;m<n;m++)k[m]=+l[m]+(m%2?d:e)}}else for(var o=0,p=l.length;o<p;o++)c[i][o]=l[o];switch(k[0]){case"Z":d=f,e=g;break;case"H":d=k[1];break;case"V":e=k[1];break;case"M":f=c[i][c[i].length-2],g=c[i][c[i].length-1];default:d=c[i][c[i].length-2],e=c[i][c[i].length-1]}}c.toString=a._path2string;return c},null,bu),bx=function(a,b,c,d){return[a,b,c,d,c,d]},by=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},bz=function(a,b,c,d,e,f,g,h,i,j){var k=A*120/180,l=A/180*(+e||0),n=[],o,p=br(function(a,b,c){var d=a*v.cos(c)-b*v.sin(c),e=a*v.sin(c)+b*v.cos(c);return{x:d,y:e}});if(!j){o=p(a,b,-l),a=o.x,b=o.y,o=p(h,i,-l),h=o.x,i=o.y;var q=v.cos(A/180*e),r=v.sin(A/180*e),s=(a-h)/2,t=(b-i)/2,u=s*s/(c*c)+t*t/(d*d);u>1&&(u=v.sqrt(u),c=u*c,d=u*d);var w=c*c,x=d*d,z=(f==g?-1:1)*v.sqrt(y((w*x-w*t*t-x*s*s)/(w*t*t+x*s*s))),B=z*c*t/d+(a+h)/2,C=z*-d*s/c+(b+i)/2,D=v.asin(((b-C)/d).toFixed(9)),E=v.asin(((i-C)/d).toFixed(9));D=a<B?A-D:D,E=h<B?A-E:E,D<0&&(D=A*2+D),E<0&&(E=A*2+E),g&&D>E&&(D=D-A*2),!g&&E>D&&(E=E-A*2)}else D=j[0],E=j[1],B=j[2],C=j[3];var F=E-D;if(y(F)>k){var G=E,H=h,I=i;E=D+k*(g&&E>D?1:-1),h=B+c*v.cos(E),i=C+d*v.sin(E),n=bz(h,i,c,d,e,0,g,H,I,[E,G,B,C])}F=E-D;var J=v.cos(D),K=v.sin(D),L=v.cos(E),M=v.sin(E),N=v.tan(F/4),O=4/3*c*N,P=4/3*d*N,Q=[a,b],R=[a+O*K,b-P*J],S=[h+O*M,i-P*L],T=[h,i];R[0]=2*Q[0]-R[0],R[1]=2*Q[1]-R[1];if(j)return[R,S,T][m](n);n=[R,S,T][m](n).join().split(",");var U=[];for(var V=0,W=n.length;V<W;V++)U[V]=V%2?p(n[V-1],n[V],l).y:p(n[V],n[V+1],l).x;return U},bA=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:z(j,3)*a+z(j,2)*3*i*c+j*3*i*i*e+z(i,3)*g,y:z(j,3)*b+z(j,2)*3*i*d+j*3*i*i*f+z(i,3)*h}},bB=br(function(a,b,c,d,e,f,g,h){var i=e-2*c+a-(g-2*e+c),j=2*(c-a)-2*(e-c),k=a-c,m=(-j+v.sqrt(j*j-4*i*k))/2/i,n=(-j-v.sqrt(j*j-4*i*k))/2/i,o=[b,h],p=[a,g],q;y(m)>"1e12"&&(m=.5),y(n)>"1e12"&&(n=.5),m>0&&m<1&&(q=bA(a,b,c,d,e,f,g,h,m),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bA(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y)),i=f-2*d+b-(h-2*f+d),j=2*(d-b)-2*(f-d),k=b-d,m=(-j+v.sqrt(j*j-4*i*k))/2/i,n=(-j-v.sqrt(j*j-4*i*k))/2/i,y(m)>"1e12"&&(m=.5),y(n)>"1e12"&&(n=.5),m>0&&m<1&&(q=bA(a,b,c,d,e,f,g,h,m),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bA(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y));return{min:{x:x[l](0,p),y:x[l](0,o)},max:{x:w[l](0,p),y:w[l](0,o)}}}),bC=br(function(a,b){var c=bw(a),d=b&&bw(b),e={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][m](bz[l](0,[b.x,b.y][m](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x)),d=b.y+(b.y-(b.by||b.y)),a=["C",c,d][m](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x)),b.qy=b.y+(b.y-(b.qy||b.y)),a=["C"][m](by(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][m](by(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][m](bx(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][m](bx(b.x,b.y,a[1],b.y));break;case"V":a=["C"][m](bx(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][m](bx(b.x,b.y,b.X,b.Y))}return a},h=function(a,b){if(a[b].length>7){a[b].shift();var e=a[b];while(e.length)a.splice(b++,0,["C"][m](e.splice(0,6)));a.splice(b,1),k=w(c.length,d&&d.length||0)}},i=function(a,b,e,f,g){a&&b&&a[g][0]=="M"&&b[g][0]!="M"&&(b.splice(g,0,["M",f.x,f.y]),e.bx=0,e.by=0,e.x=a[g][1],e.y=a[g][2],k=w(c.length,d&&d.length||0))};for(var j=0,k=w(c.length,d&&d.length||0);j<k;j++){c[j]=g(c[j],e),h(c,j),d&&(d[j]=g(d[j],f)),d&&h(d,j),i(c,d,e,f,j),i(d,c,f,e,j);var n=c[j],o=d&&d[j],p=n.length,q=d&&o.length;e.x=n[p-2],e.y=n[p-1],e.bx=P(n[p-4])||e.x,e.by=P(n[p-3])||e.y,f.bx=d&&(P(o[q-4])||f.x),f.by=d&&(P(o[q-3])||f.y),f.x=d&&o[q-2],f.y=d&&o[q-1]}return d?[c,d]:c},null,bu),bD=br(function(b){var c=[];for(var d=0,e=b.length;d<e;d++){var f={},g=b[d].match(/^([^:]*):?([\d\.]*)/);f.color=a.getRGB(g[1]);if(f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),c.push(f)}for(d=1,e=c.length-1;d<e;d++)if(!c[d].offset){var h=P(c[d-1].offset||0),i=0;for(var j=d+1;j<e;j++)if(c[j].offset){i=c[j].offset;break}i||(i=100,j=e),i=P(i);var k=(i-h)/(j-d+1);for(;d<j;d++)h+=k,c[d].offset=h+"%"}return c}),bE=function(b,c,d,e){var f;f=e==null&&!a.is(b,"object")?g.doc.getElementById(b):b;if(f!=null){if(f.tagName)return c==null?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d};return{container:1,x:b,y:c,width:d,height:e}}},bF=function(a,b){var c=this;for(var d in b)if(b[f](d)&&!(d in a))switch(typeof b[d]){case"function":(function(b){a[d]=a===c?b:function(){return b[l](c,arguments)}})(b[d]);break;case"object":a[d]=a[d]||{},bF.call(this,a[d],b[d]);break;default:a[d]=b[d]}},bG=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)},bH=function(a,b){b.top!==a&&(bG(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},bI=function(a,b){b.bottom!==a&&(bG(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},bJ=function(a,b,c){bG(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},bK=function(a,b,c){bG(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},bL=function(a){return function(){throw new Error("Raphaël: you are calling to method “"+a+"” of removed object")}},bM=function(b,c){if(c==null)return b._.transform;c=q(c).replace(/\.{3}|\u2026/g,b._.transform||o);var d=a.parseTransformString(c),e=0,f=0,g=0,h=1,i=1,j=b._,k=new bP;j.transform=d||[];if(d)for(var l=0,m=d.length;l<m;l++){var n=d[l],p=n.length,r;n[0]=q(n[0]).toLowerCase(),n[0]=="t"&&p==3?k.translate(n[1],n[2]):n[0]=="r"?p==2?(r=r||b.getBBox(1),k.rotate(n[1],r.x+r.width/2,r.y+r.height/2),e+=n[1]):p==4&&(k.rotate(n[1],n[2],n[3]),e+=n[1]):n[0]=="s"?p==2||p==3?(r=r||b.getBBox(1),k.scale(n[1],n[p-1],r.x+r.width/2,r.y+r.height/2),h*=n[1],i*=n[p-1]):p==5&&(k.scale(n[1],n[2],n[3],n[4]),h*=n[1],i*=n[2]):n[0]=="m"&&p==7&&k.add(n[1],n[2],n[3],n[4],n[5],n[6]),j.dirtyT=1,b.matrix=k}b.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.m[0][2],j.dy=g=k.m[1][2],h==1&&i==1&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1},bN=function(a){switch(a[0]){case"t":return["t",0,0];case"m":return["m",1,0,0,1,0,0];case"r":return a.length==4?["r",0,a[2],a[3]]:["r",0];case"s":return a.length==5?["s",1,1,a[3],a[4]]:a.length==3?["s",1,1]:["s",1]}},bO=function(b,c){b=a.parseTransformString(b)||[],c=a.parseTransformString(c)||[];var d=w(b.length,c.length),e=[],f=[],g=0,h,i,j,k;for(;g<d;g++){j=b[g]||bN(c[g]),k=c[g]||bN(j);if(j[0]!=k[0]||j[0]=="r"&&(j[2]!=k[2]||j[3]!=k[3])||j[0]=="s"&&(j[3]!=k[3]||j[4]!=k[4]))return;e[g]=[],f[g]=[];for(h=0,i=w(j.length,k.length);h<i;h++)h in j&&(e[g][h]=j[h]),h in k&&(f[g][h]=k[h])}return{from:e,to:f}};a.pathToRelative=bv,a.path2curve=bC;var bQ=bP.prototype;bQ.add=function(a,b,c,d,e,f){var g=[[],[],[]],h=[[a,c,e],[b,d,f],[0,0,1]],i,j,k,l;for(i=0;i<3;i++)for(j=0;j<3;j++){l=0;for(k=0;k<3;k++)l+=this.m[i][k]*h[k][j];g[i][j]=l}this.m=g},bQ.invert=function(){var a=this.m[0][0],b=this.m[1][0],c=this.m[0][1],d=this.m[1][1],e=this.m[0][2],f=this.m[1][2],g=a*d-b*c;return new bP(d/g,-b/g,-c/g,a/g,(c*f-d*e)/g,(b*e-a*f)/g)},bQ.clone=function(){var a=this.m[0][0],b=this.m[1][0],c=this.m[0][1],d=this.m[1][1],e=this.m[0][2],f=this.m[1][2];return new bP(a,b,c,d,e,f)},bQ.translate=function(a,b){this.add(1,0,0,1,a,b)},bQ.scale=function(a,b,c,d){b==null&&(b=a),this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),this.add(1,0,0,1,-c,-d)},bQ.rotate=function(b,c,d){b=a.rad(b);var e=+v.cos(b).toFixed(9),f=+v.sin(b).toFixed(9);this.add(e,f,-f,e,c,d),this.add(1,0,0,1,-c,-d)},bQ.x=function(a,b){return a*this.m[0][0]+b*this.m[0][1]+this.m[0][2]},bQ.y=function(a,b){return a*this.m[1][0]+b*this.m[1][1]+this.m[1][2]},bQ.get=function(a,b){return+this.m[a][b].toFixed(4)},bQ.toString=function(){return a.svg?"matrix("+[this.get(0,0),this.get(1,0),this.get(0,1),this.get(1,1),this.get(0,2),this.get(1,2)].join()+")":[this.get(0,0),this.get(0,1),this.get(1,0),this.get(1,1),0,0].join()},bQ.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0,0)+", M12="+this.get(0,1)+", M21="+this.get(1,0)+", M22="+this.get(1,1)+", Dx="+this.get(0,2)+", Dy="+this.get(1,2)+", sizingmedthod='auto expand')"},bQ.offset=function(){return[this.m[0][2].toFixed(4),this.m[1][2].toFixed(4)]},a.Matrix=bP;if(a.svg){var bR="http://www.w3.org/1999/xlink",bS={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},bT={};a.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var bU=function(a,b){if(b){typeof a=="string"&&(a=bU(a));for(var c in b)b[f](c)&&(c.substring(0,6)=="xlink:"?a.setAttributeNS(bR,c.substring(6),q(b[c])):a[O](c,q(b[c])))}else a=g.doc.createElementNS("http://www.w3.org/2000/svg",a),a.style&&(a.style.webkitTapHighlightColor="rgba(0,0,0,0)");return a},bV=function(a,b){var c=bU("path");b.canvas&&b.canvas.appendChild(c);var d=new cd(c,b);d.type="path",ca(d,{fill:"none",stroke:"#000",path:a});return d},bW={},bX=/^url\(#(.*)\)$/,bY=function(a,b){var c=a.getAttribute(F);c=c&&c.match(bX),c&&!--bW[c[1]]&&(delete bW[c[1]],b.defs.removeChild(g.doc.getElementById(c[1])))},bZ=function(b,c){var d="linear",e=b.id+c,f=.5,h=.5,i=b.node,j=b.paper,k=i.style,l=g.doc.getElementById(e);if(!l){c=q(c).replace(_,function(a,b,c){d="radial";if(b&&c){f=P(b),h=P(c);var e=(h>.5)*2-1;z(f-.5,2)+z(h-.5,2)>.25&&(h=v.sqrt(.25-z(f-.5,2))*e+.5)&&h!=.5&&(h=h.toFixed(5)-1e-5*e)}return o}),c=c.split(/\s*\-\s*/);if(d=="linear"){var m=c.shift();m=-P(m);if(isNaN(m))return null;var n=[0,0,v.cos(a.rad(m)),v.sin(a.rad(m))],p=1/(w(y(n[2]),y(n[3]))||1);n[2]*=p,n[3]*=p,n[2]<0&&(n[0]=-n[2],n[2]=0),n[3]<0&&(n[1]=-n[3],n[3]=0)}var r=bD(c);if(!r)return null;b.gradient&&(j.defs.removeChild(b.gradient),delete b.gradient),l=bU(d+"Gradient",{id:e}),b.gradient=l,bU(l,d=="radial"?{fx:f,fy:h}:{x1:n[0],y1:n[1],x2:n[2],y2:n[3],gradientTransform:b.matrix.invert()}),j.defs.appendChild(l);for(var s=0,t=r.length;s<t;s++)l.appendChild(bU("stop",{offset:r[s].offset?r[s].offset:s?"100%":"0%","stop-color":r[s].color||"#fff"}))}bU(i,{fill:"url(#"+e+")",opacity:1,"fill-opacity":1}),k.fill=o,k.opacity=1,k.fillOpacity=1;return 1},b$=function(a){var b=a.getBBox(1);bU(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},b_=function(b,c,d){if(b.type=="path"){var e=q(c).toLowerCase().split("-"),h=b.paper,i=d?"end":"start",j=b.node,k=b.attrs,l=k["stroke-width"],m=e.length,n="classic",o,r,s,t,u,v=3,w=3,x=5;while(m--)switch(e[m]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":n=e[m];break;case"wide":w=5;break;case"narrow":w=2;break;case"long":v=5;break;case"short":v=2}n=="open"?(v+=2,w+=2,x+=2,s=1,t=d?4:1,u={fill:"none",stroke:k.stroke}):(t=s=v/2,u={fill:k.stroke,stroke:"none"}),b._.arrows?d?(b._.arrows.endPath&&bT[b._.arrows.endPath]--,b._.arrows.endMarker&&bT[b._.arrows.endMarker]--):(b._.arrows.startPath&&bT[b._.arrows.startPath]--,b._.arrows.startMarker&&bT[b._.arrows.startMarker]--):b._.arrows={};if(n!="none"){var y="raphael-marker-"+n,z="raphael-marker-"+i+n+v+w;g.doc.getElementById(y)?bT[y]++:(h.defs.appendChild(bU(bU("path"),{"stroke-linecap":"round",d:bS[n],id:y})),bT[y]=1);var A=g.doc.getElementById(z),B;A?(bT[z]++,B=A.getElementsByTagName("use")[0]):(A=bU(bU("marker"),{id:z,markerHeight:w,markerWidth:v,orient:"auto",refX:t,refY:w/2}),B=bU(bU("use"),{"xlink:href":"#"+y,transform:(d?" rotate(180 "+v/2+" "+w/2+") ":p)+"scale("+v/x+","+w/x+")","stroke-width":1/((v/x+w/x)/2)}),A.appendChild(B),h.defs.appendChild(A),bT[z]=1),bU(B,u);var C=s*(n!="diamond"&&n!="oval");d?(o=b._.arrows.startdx*l||0,r=a.getTotalLength(k.path)-C*l):(o=C*l,r=a.getTotalLength(k.path)-(b._.arrows.enddx*l||0)),u={},u["marker-"+i]="url(#"+z+")";if(r||o)u.d=Raphael.getSubpath(k.path,o,r);bU(j,u),b._.arrows[i+"Path"]=y,b._.arrows[i+"Marker"]=z,b._.arrows[i+"dx"]=C,b._.arrows[i+"Type"]=n,b._.arrows[i+"String"]=c}else d?(o=b._.arrows.startdx*l||0,r=a.getTotalLength(k.path)-o):(o=0,r=a.getTotalLength(k.path)-(b._.arrows.enddx*l||0)),b._.arrows[i+"Path"]&&bU(j,{d:Raphael.getSubpath(k.path,o,r)}),delete b._.arrows[i+"Path"],delete b._.arrows[i+"Marker"],delete b._.arrows[i+"dx"],delete b._.arrows[i+"Type"],delete b._.arrows[i+"String"];for(u in bT)if(bT[f](u)&&!bT[u]){var D=g.doc.getElementById(u);D&&D.parentNode.removeChild(D)}}},ca=function(c,d){var e={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},h=c.node,i=c.attrs,j=function(a,b){b=e[u.call(b)];if(b){var c=a.attrs["stroke-width"]||"1",f=({round:c,square:c,butt:0})[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],i=b.length;while(i--)g[i]=b[i]*c+(i%2?1:-1)*f;bU(h,{"stroke-dasharray":g.join(",")})}};for(var k in d)if(d[f](k)){if(!T[f](k))continue;var l=d[k];i[k]=l;switch(k){case"blur":c.blur(l);break;case"href":case"title":case"target":var m=h.parentNode;if(u.call(m.tagName)!="a"){var n=bU("a");m.insertBefore(n,h),n.appendChild(h),m=n}k=="target"&&l=="blank"?m.setAttributeNS(bR,"show","new"):m.setAttributeNS(bR,k,l);break;case"cursor":h.style.cursor=l;break;case"transform":c.transform(l);break;case"arrow-start":b_(c,l);break;case"arrow-end":b_(c,l,1);break;case"clip-rect":var p=q(l).split(b);if(p.length==4){c.clip&&c.clip.parentNode.parentNode.removeChild(c.clip.parentNode);var r=bU("clipPath"),s=bU("rect");r.id=bk(),bU(s,{x:p[0],y:p[1],width:p[2],height:p[3]}),r.appendChild(s),c.paper.defs.appendChild(r),bU(h,{"clip-path":"url(#"+r.id+")"}),c.clip=s}if(!l){var t=g.doc.getElementById(h.getAttribute("clip-path").replace(/(^url\(#|\)$)/g,o));t&&t.parentNode.removeChild(t),bU(h,{"clip-path":o}),delete c.clip}break;case"path":c.type=="path"&&(bU(h,{d:l?i.path=bw(l):"M0,0"}),c._.dirty=1,c._.arrows&&("startString"in c._.arrows&&b_(c,c._.arrows.startString),"endString"in c._.arrows&&b_(c,c._.arrows.endString,1)));break;case"width":h[O](k,l),c._.dirty=1;if(i.fx)k="x",l=i.x;else break;case"x":i.fx&&(l=-i.x-(i.width||0));case"rx":if(k=="rx"&&c.type=="rect")break;case"cx":h[O](k,l),c.pattern&&b$(c),c._.dirty=1;break;case"height":h[O](k,l),c._.dirty=1;if(i.fy)k="y",l=i.y;else break;case"y":i.fy&&(l=-i.y-(i.height||0));case"ry":if(k=="ry"&&c.type=="rect")break;case"cy":h[O](k,l),c.pattern&&b$(c),c._.dirty=1;break;case"r":c.type=="rect"?bU(h,{rx:l,ry:l}):h[O](k,l),c._.dirty=1;break;case"src":c.type=="image"&&h.setAttributeNS(bR,"href",l);break;case"stroke-width":if(c._.sx!=1||c._.sy!=1)l/=w(y(c._.sx),y(c._.sy))||1;c.paper._vbSize&&(l*=c.paper._vbSize),h[O](k,l),i["stroke-dasharray"]&&j(c,i["stroke-dasharray"]),c._.arrows&&("startString"in c._.arrows&&b_(c,c._.arrows.startString),"endString"in c._.arrows&&b_(c,c._.arrows.endString,1));break;case"stroke-dasharray":j(c,l);break;case F:var v=q(l).match(J);if(v){r=bU("pattern");var x=bU("image");r.id=bk(),bU(r,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),bU(x,{x:0,y:0,"xlink:href":v[1]}),r.appendChild(x),function(a){bs(v[1],function(){var b=this.offsetWidth,d=this.offsetHeight;bU(a,{width:b,height:d}),bU(x,{width:b,height:d}),c.paper.safari()})}(r),c.paper.defs.appendChild(r),h.style.fill="url(#"+r.id+")",bU(h,{fill:"url(#"+r.id+")"}),c.pattern=r,c.pattern&&b$(c);break}var z=a.getRGB(l);if(!z.error)delete d.gradient,delete i.gradient,!a.is(i.opacity,"undefined")&&a.is(d.opacity,"undefined")&&bU(h,{opacity:i.opacity}),!a.is(i["fill-opacity"],"undefined")&&a.is(d["fill-opacity"],"undefined")&&bU(h,{"fill-opacity":i["fill-opacity"]});else if((c.type=="circle"||c.type=="ellipse"||q(l).charAt()!="r")&&bZ(c,l)){if("opacity"in i||"fill-opacity"in i){var A=g.doc.getElementById(h.getAttribute(F).replace(/^url\(#|\)$/g,o));if(A){var B=A.getElementsByTagName("stop");bU(B[B.length-1],{"stop-opacity":("opacity"in i?i.opacity:1)*("fill-opacity"in i?i["fill-opacity"]:1)})}}i.gradient=l,i.fill="none";break}z[f]("opacity")&&bU(h,{"fill-opacity":z.opacity>1?z.opacity/100:z.opacity});case"stroke":z=a.getRGB(l),h[O](k,z.hex),k=="stroke"&&z[f]("opacity")&&bU(h,{"stroke-opacity":z.opacity>1?z.opacity/100:z.opacity}),k=="stroke"&&c._.arrows&&("startString"in c._.arrows&&b_(c,c._.arrows.startString),"endString"in c._.arrows&&b_(c,c._.arrows.endString,1));break;case"gradient":(c.type=="circle"||c.type=="ellipse"||q(l).charAt()!="r")&&bZ(c,l);break;case"opacity":i.gradient&&!i[f]("stroke-opacity")&&bU(h,{"stroke-opacity":l>1?l/100:l});case"fill-opacity":if(i.gradient){A=g.doc.getElementById(h.getAttribute(F).replace(/^url\(#|\)$/g,o)),A&&(B=A.getElementsByTagName("stop"),bU(B[B.length-1],{"stop-opacity":l}));break};default:k=="font-size"&&(l=Q(l,10)+"px");var C=k.replace(/(\-.)/g,function(a){return S.call(a.substring(1))});h.style[C]=l,c._.dirty=1,h[O](k,l)}}cc(c,d)},cb=1.2,cc=function(b,c){if(b.type=="text"&&!!(c[f]("text")||c[f]("font")||c[f]("font-size")||c[f]("x")||c[f]("y"))){var d=b.attrs,e=b.node,h=e.firstChild?Q(g.doc.defaultView.getComputedStyle(e.firstChild,o).getPropertyValue("font-size"),10):10;if(c[f]("text")){d.text=c.text;while(e.firstChild)e.removeChild(e.firstChild);var i=q(c.text).split("\n"),j=[],k;for(var l=0,m=i.length;l<m;l++)i[l]&&(k=bU("tspan"),l&&bU(k,{dy:h*cb,x:d.x}),k.appendChild(g.doc.createTextNode(i[l])),e.appendChild(k),j[l]=k)}else{j=e.getElementsByTagName("tspan");for(l=0,m=j.length;l<m;l++)l&&bU(j[l],{dy:h*cb,x:d.x})}bU(e,{y:d.y}),b._.dirty=1;var n=b._getBBox(),p=d.y-(n.y+n.height/2);p&&a.is(p,"finite")&&bU(j[0],{dy:d.y+p})}},cd=function(b,c){var d=0,e=0;this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.matrix=new bP,this.realPath=null,this.paper=c,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},ce=cd.prototype;ce.rotate=function(a,c,d){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1]),d=P(a[2])),a=P(a[0]),d==null&&(c=d);if(c==null||d==null){var e=this.getBBox(1);c=e.x+e.width/2,d=e.y+e.height/2}this.transform(this._.transform.concat([["r",a,c,d]]));return this},ce.scale=function(a,c,d,e){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1]),d=P(a[2]),e=P(a[3])),a=P(a[0]),c==null&&(c=a),e==null&&(d=e);if(d==null||e==null)var f=this.getBBox(1);d=d==null?f.x+f.width/2:d,e=e==null?f.y+f.height/2:e,this.transform(this._.transform.concat([["s",a,c,d,e]]));return this},ce.translate=function(a,c){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1])),a=P(a[0])||0,c=+c||0,this.transform(this._.transform.concat([["t",a,c]]));return this},ce.transform=function(a){var b=this._;if(!a)return b.transform;bM(this,a),this.clip&&bU(this.clip,{transform:this.matrix.invert()}),this.pattern&&b$(this),this.node&&bU(this.node,{transform:this.matrix});if(b.sx!=1||b.sy!=1){var c=this.attrs[f]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":c})}return this},ce.hide=function(){!this.removed&&this.paper.safari(this.node.style.display="none");return this},ce.show=function(){!this.removed&&this.paper.safari(this.node.style.display="");return this},ce.remove=function(){if(!this.removed){dc.unbind("*.*."+this.id),bG(this,this.paper),this.node.parentNode.removeChild(this.node);for(var a in this)delete this[a];this.removed=!0}},ce._getBBox=function(){if(this.node.style.display=="none"){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}a&&this.hide();return b},ce.attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient,d.transform=this._.transform;return d}if(c==null&&a.is(b,C)){if(b==F&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;if(b=="transform")return this._.transform;return b in this.attrs?this.attrs[b]:a.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:T[b]}if(c==null&&a.is(b,D)){var g={};for(var h=0,i=b.length;h<i;h++)g[b[h]]=this.attr(b[h]);return g}if(c!=null){var j={};j[b]=c}else b!=null&&a.is(b,"object")&&(j=b);for(var k in this.paper.customAttributes)if(this.paper.customAttributes[f](k)&&j[f](k)&&a.is(this.paper.customAttributes[k],"function")){var l=this.paper.customAttributes[k].apply(this,[][m](j[k]));this.attrs[k]=j[k];for(var n in l)l[f](n)&&(j[n]=l[n])}ca(this,j);return this},ce.toFront=function(){if(this.removed)return this;this.node.parentNode.appendChild(this.node);var a=this.paper;a.top!=this&&bH(this,a);return this},ce.toBack=function(){if(this.removed)return this;if(this.node.parentNode.firstChild!=this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),bI(this,this.paper);var a=this.paper}return this},ce.insertAfter=function(a){if(this.removed)return this;var b=a.node||a[a.length-1].node;b.nextSibling?b.parentNode.insertBefore(this.node,b.nextSibling):b.parentNode.appendChild(this.node),bJ(this,a,this.paper);return this},ce.insertBefore=function(a){if(this.removed)return this;var b=a.node||a[0].node;b.parentNode.insertBefore(this.node,b),bK(this,a,this.paper);return this},ce.blur=function(a){var b=this;if(+a!==0){var c=bU("filter"),d=bU("feGaussianBlur");b.attrs.blur=a,c.id=bk(),bU(d,{stdDeviation:+a||1.5}),c.appendChild(d),b.paper.defs.appendChild(c),b._blur=c,bU(b.node,{filter:"url(#"+c.id+")"})}else b._blur&&(b._blur.parentNode.removeChild(b._blur),delete b._blur,delete b.attrs.blur),b.node.removeAttribute("filter")};var cf=function(a,b,c,d){var e=bU("circle");a.canvas&&a.canvas.appendChild(e);var f=new cd(e,a);f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",bU(e,f.attrs);return f},cg=function(a,b,c,d,e,f){var g=bU("rect");a.canvas&&a.canvas.appendChild(g);var h=new cd(g,a);h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",bU(g,h.attrs);return h},ch=function(a,b,c,d,e){var f=bU("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new cd(f,a);g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",bU(f,g.attrs);return g},ci=function(a,b,c,d,e,f){var g=bU("image");bU(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(bR,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new cd(g,a);h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image";return h},cj=function(a,b,c,d){var e=bU("text");bU(e,{x:b,y:c,"text-anchor":"middle"}),a.canvas&&a.canvas.appendChild(e);var f=new cd(e,a);f.attrs={x:b,y:c,"text-anchor":"middle",text:d,font:T.font,stroke:"none",fill:"#000"},f.type="text",ca(f,f.attrs);return f},ck=function(a,b){this.width=a||this.width,this.height=b||this.height,this.canvas[O]("width",this.width),this.canvas[O]("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox);return this},cl=function(){var b=bE[l](0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,h=b.height;if(!c)throw new Error("SVG container not found.");var j=bU("svg"),k="overflow:hidden;",m;d=d||0,e=e||0,f=f||512,h=h||342,bU(j,{height:h,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg"}),c==1?(j.style.cssText=k+"position:absolute;left:"+d+"px;top:"+e+"px",g.doc.body.appendChild(j),m=1):(j.style.cssText=k+"position:relative",c.firstChild?c.insertBefore(j,c.firstChild):c.appendChild(j)),c=new i,c.width=f,c.height=h,c.canvas=j,bF.call(c,c,a.fn),c.clear(),c._left=c._top=0,m&&(c.renderfix=bc),c.renderfix();return c},cm=function(a,b,c,d,e){dc("setViewBox",this,this._viewBox,[a,b,c,d,e]);var f=w(c/this.width,d/this.height),g=this.top,h=e?"meet":"xMinYMin",i,j;a==null?(this._vbSize&&(f=1),delete this._vbSize,i="0 0 "+this.width+p+this.height):(this._vbSize=f,i=a+p+b+p+c+p+d),bU(this.canvas,{viewBox:i,preserveAspectRatio:h});while(f&&g)j="stroke-width"in g.attrs?g.attrs["stroke-width"]:1,g.attr({"stroke-width":j}),g._.dirty=1,g._.dirtyT=1,g=g.prev;this._viewBox=[a,b,c,d,!!e];return this};j.renderfix=function(){var a=this.canvas,b=a.style,c=a.getScreenCTM(),d=-c.e%1,e=-c.f%1;if(d||e)d&&(this._left=(this._left+d)%1,b.left=this._left+"px"),e&&(this._top=(this._top+e)%1,b.top=this._top+"px")},j.clear=function(){dc("clear",this);var b=this.canvas;while(b.firstChild)b.removeChild(b.firstChild);this.bottom=this.top=null,(this.desc=bU("desc")).appendChild(g.doc.createTextNode("Created with Raphaël "+a.version)),b.appendChild(this.desc),b.appendChild(this.defs=bU("defs"))},j.remove=function(){dc("remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bL(a)}}if(a.vml){var cn={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},co=/([clmz]),?([^clmz]*)/gi,cp=/ progid:\S+Blur\([^\)]+\)/g,cq=/-?[^,\s-]+/g,cr="position:absolute;left:0;top:0;width:1px;height:1px",cs=21600,ct={path:1,rect:1},cu={circle:1,ellipse:1},cv=function(a){var b=/[ahqstv]/ig,c=bw;q(a).match(b)&&(c=bC),b=/[clmz]/g;if(c==bw&&!q(a).match(b)){var d=q(a).replace(co,function(a,b,c){var d=[],e=u.call(b)=="m",f=cn[b];c.replace(cq,function(a){e&&d.length==2&&(f+=d+cn[b=="m"?"l":"L"],d=[]),d.push(N(a*cs))});return f+d});return d}var e=c(a),f,g;d=[];for(var h=0,i=e.length;h<i;h++){f=e[h],g=u.call(e[h][0]),g=="z"&&(g="x");for(var j=1,k=f.length;j<k;j++)g+=N(f[j]*cs)+(j!=k-1?",":o);d.push(g)}return d.join(p)},cw=function(a,b,c){var d=new bP;d.rotate(-a,.5,.5);return{dx:d.x(b,c),dy:d.y(b,c)}},cx=function(a){var b=a._,c=b.sx,d=b.sy,e=b.deg,f=b.dx,g=b.dy,h=b.fillpos,i=a.node,j=i.style,k=1,l=a.matrix,m="",n,o=cs/c,q=cs/d;j.visibility="hidden",i.coordsize=y(o)+p+y(q),j.rotation=e*(c*d<0?-1:1);if(e){var r=cw(e,f,g);f=r.dx,g=r.dy}c<0&&(m+="x"),d<0&&(m+=" y")&&(k=-1),j.flip=m,i.coordorigin=f*-o+p+g*-q;if(h||b.fillsize){var s=i.getElementsByTagName(F);s=s&&s[0],i.removeChild(s),h&&(r=cw(e,l.x(h[0],h[1]),l.y(h[0],h[1])),s.position=r.dx*k+p+r.dy*k),b.fillsize&&(s.size=b.fillsize[0]*y(c)+p+b.fillsize[1]*y(d)),i.appendChild(s)}j.visibility="visible"};a.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version},b_=function(a,b,c){var d=q(b).toLowerCase().split("-"),e=c?"end":"start",f=d.length,g="classic",h="medium",i="medium";while(f--)switch(d[f]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":g=d[f];break;case"wide":case"narrow":i=d[f];break;case"long":case"short":h=d[f]}var j=a.node.getElementsByTagName("stroke")[0];j[e+"arrow"]=g,j[e+"arrowlength"]=h,j[e+"arrowwidth"]=i},ca=function(c,d){c.paper.canvas.style.display="none",c.attrs=c.attrs||{};var e=c.node,h=c.attrs,i=e.style,j,k=ct[c.type]&&(d.x!=h.x||d.y!=h.y||d.width!=h.width||d.height!=h.height||d.cx!=h.cx||d.cy!=h.cy||d.rx!=h.rx||d.ry!=h.ry||d.r!=h.r),l=cu[c.type]&&(h.cx!=d.cx||h.cy!=d.cy||h.r!=d.r||h.rx!=d.rx||h.ry!=d.ry),m=c;for(var n in d)d[f](n)&&(h[n]=d[n]);k&&(h.path=bg[c.type](c),c._.dirty=1),d.href&&(e.href=d.href),d.title&&(e.title=d.title),d.target&&(e.target=d.target),d.cursor&&(i.cursor=d.cursor),"blur"in d&&c.blur(d.blur),"transform"in d&&c.transform(d.transform);if(d.path&&c.type=="path"||k)e.path=cv(h.path);if(l){var r=h.cx,s=h.cy,t=h.rx||h.r||0,u=h.ry||h.r||0;e.path=a.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",N((r-t)*cs),N((s-u)*cs),N((r+t)*cs),N((s+u)*cs),N(r*cs))}if("clip-rect"in d){var v=q(d["clip-rect"]).split(b);if(v.length==4){v[2]=+v[2]+ +v[0],v[3]=+v[3]+ +v[1];var y=e.clipRect||g.doc.createElement("div"),z=y.style,A=e.parentNode;z.clip=a.format("rect({1}px {2}px {3}px {0}px)",v),e.clipRect||(z.position="absolute",z.top=0,z.left=0,z.width=c.paper.width+"px",z.height=c.paper.height+"px",A.parentNode.insertBefore(y,A),y.appendChild(A),e.clipRect=y)}d["clip-rect"]||e.clipRect&&(e.clipRect.style.clip=o)}if(c.textpath){var B=c.textpath.style;d.font&&(B.font=d.font),d["font-family"]&&(B.fontFamily='"'+d["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),d["font-size"]&&(B.fontSize=d["font-size"]),d["font-weight"]&&(B.fontWeight=d["font-weight"]),d["font-style"]&&(B.fontStyle=d["font-style"])}"arrow-start"in d&&b_(m,d["arrow-start"]),"arrow-end"in d&&b_(m,d["arrow-end"],1);if(d.opacity!=null||d["stroke-width"]!=null||d.fill!=null||d.src!=null||d.stroke!=null||d["stroke-width"]!=null||d["stroke-opacity"]!=null||d["fill-opacity"]!=null||d["stroke-dasharray"]!=null||d["stroke-miterlimit"]!=null||d["stroke-linejoin"]!=null||d["stroke-linecap"]!=null){var C=e.getElementsByTagName(F),D=!1;C=C&&C[0],!C&&(D=C=cy(F)),c.type=="image"&&d.src&&(C.src=d.src);if("fill-opacity"in d||"opacity"in d){var E=((+h["fill-opacity"]+1||2)-1)*((+h.opacity+1||2)-1)*((+a.getRGB(d.fill).o+1||2)-1);E=x(w(E,0),1),C.opacity=E}d.fill&&(C.on=!0);if(C.on==null||d.fill=="none"||d.fill===null)C.on=!1;if(C.on&&d.fill){var G=d.fill.match(J);if(G){C.parentNode==e&&e.removeChild(C),C.rotate=!0,C.src=G[1],C.type="tile";var H=c.getBBox(1);C.position=H.x+p+H.y,c._.fillpos=[H.x,H.y],bs(G[1],function(){c._.fillsize=[this.offsetWidth,this.offsetHeight]})}else C.color=a.getRGB(d.fill).hex,C.src=o,C.type="solid",a.getRGB(d.fill).error&&(m.type in{circle:1,ellipse:1}||q(d.fill).charAt()!="r")&&bZ(m,d.fill,C)&&(h.fill="none",h.gradient=d.fill,C.rotate=!1)}e.appendChild(C);var I=e.getElementsByTagName("stroke")&&e.getElementsByTagName("stroke")[0],K=!1;!I&&(K=I=cy("stroke"));if(d.stroke&&d.stroke!="none"||d["stroke-width"]||d["stroke-opacity"]!=null||d["stroke-dasharray"]||d["stroke-miterlimit"]||d["stroke-linejoin"]||d["stroke-linecap"])I.on=!0;(d.stroke=="none"||d.stroke===null||I.on==null||d.stroke==0||d["stroke-width"]==0)&&(I.on=!1);var L=a.getRGB(d.stroke);I.on&&d.stroke&&(I.color=L.hex),E=((+h["stroke-opacity"]+1||2)-1)*((+h.opacity+1||2)-1)*((+L.o+1||2)-1);var M=(P(d["stroke-width"])||1)*.75;E=x(w(E,0),1),d["stroke-width"]==null&&(M=h["stroke-width"]),d["stroke-width"]&&(I.weight=M),M&&M<1&&(E*=M)&&(I.weight=1),I.opacity=E,d["stroke-linejoin"]&&(I.joinstyle=d["stroke-linejoin"]||"miter"),I.miterlimit=d["stroke-miterlimit"]||8,d["stroke-linecap"]&&(I.endcap=d["stroke-linecap"]=="butt"?"flat":d["stroke-linecap"]=="square"?"square":"round");if(d["stroke-dasharray"]){var O={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};I.dashstyle=O[f](d["stroke-dasharray"])?O[d["stroke-dasharray"]]:o}K&&e.appendChild(I)}if(m.type=="text"){m.paper.canvas.style.display=o;var Q=m.paper.span,R=100,S=h.font&&h.font.match(/\d+(?:\.\d*)?(?=px)/);i=Q.style,h.font&&(i.font=h.font),h["font-family"]&&(i.fontFamily=h["font-family"]),h["font-weight"]&&(i.fontWeight=h["font-weight"]),h["font-style"]&&(i.fontStyle=h["font-style"]),S=P(S?S[0]:h["font-size"]),i.fontSize=S*R+"px",m.textpath.string&&(Q.innerHTML=q(m.textpath.string).replace(/</g,"<").replace(/&/g,"&").replace(/\n/g,"<br>"));var T=Q.getBoundingClientRect();m.W=h.w=(T.right-T.left)/R,m.H=h.h=(T.bottom-T.top)/R,m.paper.canvas.style.display="none",m.X=h.x,m.Y=h.y+m.H/2,("x"in d||"y"in d)&&(m.path.v=a.format("m{0},{1}l{2},{1}",N(h.x*cs),N(h.y*cs),N(h.x*cs)+1));var U=["x","y","text","font","font-family","font-weight","font-style","font-size"];for(var V=0,W=U.length;V<W;V++)if(U[V]in d){m._.dirty=1;break}switch(h["text-anchor"]){case"start":m.textpath.style["v-text-align"]="left",m.bbx=m.W/2;break;case"end":m.textpath.style["v-text-align"]="right",m.bbx=-m.W/2;break;default:m.textpath.style["v-text-align"]="center",m.bbx=0}m.textpath.style["v-text-kern"]=!0}m.paper.canvas.style.display=o},bZ=function(a,b,c){a.attrs=a.attrs||{};var d=a.attrs,e="linear",f=".5 .5";a.attrs.gradient=b,b=q(b).replace(_,function(a,b,c){e="radial",b&&c&&(b=P(b),c=P(c),z(b-.5,2)+z(c-.5,2)>.25&&(c=v.sqrt(.25-z(b-.5,2))*((c>.5)*2-1)+.5),f=b+p+c);return o}),b=b.split(/\s*\-\s*/);if(e=="linear"){var g=b.shift();g=-P(g);if(isNaN(g))return null}var h=bD(b);if(!h)return null;a=a.shape||a.node;if(h.length){a.removeChild(c),c.on=!0,c.method="none",c.color=h[0].color,c.color2=h[h.length-1].color;var i=[];for(var j=0,k=h.length;j<k;j++)h[j].offset&&i.push(h[j].offset+p+h[j].color);c.colors&&(c.colors.value=i.length?i.join():"0% "+c.color),e=="radial"?(c.type="gradientTitle",c.focus="100%",c.focussize="0 0",c.focusposition=f,c.angle=0):(c.type="gradient",c.angle=(270-g)%360),a.appendChild(c)}return 1},cd=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=c,this.matrix=new bP,this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},ce=cd.prototype,ce.transform=function(a){if(a==null)return this._.transform;bM(this,a);var b=this.matrix.clone(),c=this.skew;b.translate(-0.5,-0.5);if(this.type=="image")if(q(a).indexOf("m")+1){this.node.style.filter=b.toFilter();var d=this.getBBox(),e=this.getBBox(1),f=b.invert(),g=f.x(d.x,d.y)-f.x(e.x,e.y),h=f.y(d.x,d.y)-f.y(e.x,e.y)}else this.node.style.filter=o,cx(this);else this.node.style.filter=o,c.matrix=b,c.offset=b.offset();return this},ce.rotate=function(a,c,d){if(this.removed)return this;if(a!=null){a=q(a).split(b),a.length-1&&(c=P(a[1]),d=P(a[2])),a=P(a[0]),d==null&&(c=d);if(c==null||d==null){var e=this.getBBox(1);c=e.x+e.width/2,d=e.y+e.height/2}this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,c,d]]));return this}},ce.translate=function(a,c){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1])),a=P(a[0])||0,c=+c||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=c),this.transform(this._.transform.concat([["t",a,c]]));return this},ce.scale=function(a,c,d,e){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1]),d=P(a[2]),e=P(a[3]),isNaN(d)&&(d=null),isNaN(e)&&(e=null)),a=P(a[0]),c==null&&(c=a),e==null&&(d=e);if(d==null||e==null)var f=this.getBBox(1);d=d==null?f.x+f.width/2:d,e=e==null?f.y+f.height/2:e,this.transform(this._.transform.concat([["s",a,c,d,e]])),this._.dirtyT=1;return this},ce.hide=function(){!this.removed&&(this.node.style.display="none");return this},ce.show=function(){!this.removed&&(this.node.style.display=o);return this},ce._getBBox=function(){if(this.removed)return{};return this.type=="text"?{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}:bt(this.attrs.path)},ce.remove=function(){if(!this.removed){dc.unbind("*.*."+this.id),bG(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var a in this)delete this[a];this.removed=!0}},ce.attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient;return d}if(c==null&&a.is(b,"string")){if(b==F&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;return b in this.attrs?this.attrs[b]:a.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:T[b]}if(this.attrs&&c==null&&a.is(b,D)){var g,h={};for(e=0,g=b.length;e<g;e++)h[b[e]]=this.attr(b[e]);return h}var i;c!=null&&(i={},i[b]=c),c==null&&a.is(b,"object")&&(i=b);for(var j in i)dc("attr."+j+"."+this.id,this,i[j]);if(i){for(j in this.paper.customAttributes)if(this.paper.customAttributes[f](j)&&i[f](j)&&a.is(this.paper.customAttributes[j],"function")){var k=this.paper.customAttributes[j].apply(this,[][m](i[j]));this.attrs[j]=i[j];for(var l in k)k[f](l)&&(i[l]=k[l])}i.text&&this.type=="text"&&(this.textpath.string=i.text),ca(this,i)}return this},ce.toFront=function(){!this.removed&&this.node.parentNode.appendChild(this.node),this.paper.top!=this&&bH(this,this.paper);return this},ce.toBack=function(){if(this.removed)return this;this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),bI(this,this.paper));return this},ce.insertAfter=function(a){if(this.removed)return this;a.constructor==c_&&(a=a[a.length-1]),a.node.nextSibling?a.node.parentNode.insertBefore(this.node,a.node.nextSibling):a.node.parentNode.appendChild(this.node),bJ(this,a,this.paper);return this},ce.insertBefore=function(a){if(this.removed)return this;a.constructor==c_&&(a=a[0]),a.node.parentNode.insertBefore(this.node,a.node),bK(this,a,this.paper);return this},ce.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;d=d.replace(cp,o),+b!==0?(this.attrs.blur=b,c.filter=d+p+R+".Blur(pixelradius="+(+b||1.5)+")",c.margin=a.format("-{0}px 0 0 -{0}px",N(+b||1.5))):(c.filter=d,c.margin=0,delete this.attrs.blur)},bV=function(a,b){var c=cy("shape");c.style.cssText=cr,c.coordsize=cs+p+cs,c.coordorigin=b.coordorigin;var d=new cd(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,ca(d,e),b.canvas.appendChild(c);var f=cy("skew");f.on=!0,c.appendChild(f),d.skew=f,d.transform(o);return d},cg=function(a,b,c,d,e,f){var g=be(b,c,d,e,f),h=a.path(g),i=h.attrs;h.X=i.x=b,h.Y=i.y=c,h.W=i.width=d,h.H=i.height=e,i.r=f,i.path=g,h.type="rect";return h},ch=function(a,b,c,d,e){var f=a.path(),g=f.attrs;f.X=b-d,f.Y=c-e,f.W=d*2,f.H=e*2,f.type="ellipse",ca(f,{cx:b,cy:c,rx:d,ry:e});return f},cf=function(a,b,c,d){var e=a.path(),f=e.attrs;e.X=b-d,e.Y=c-d,e.W=e.H=d*2,e.type="circle",ca(e,{cx:b,cy:c,r:d});return e},ci=function(a,b,c,d,e,f){var g=be(c,d,e,f),h=a.path(g).attr({stroke:"none"}),i=h.attrs,j=h.node,k=j.getElementsByTagName(F)[0];i.src=b,h.X=i.x=c,h.Y=i.y=d,h.W=i.width=e,h.H=i.height=f,i.path=g,h.type="image",k.parentNode==j&&j.removeChild(k),k.rotate=!0,k.src=b,k.type="tile",h._.fillpos=[c,d],h._.fillsize=[e,f],j.appendChild(k),cx(h);return h},cj=function(b,c,d,e){var f=cy("shape"),g=cy("path"),h=cy("textpath");c=c||0,d=d||0,e=e||"",g.v=a.format("m{0},{1}l{2},{1}",N(c*cs),N(d*cs),N(c*cs)+1),g.textpathok=!0,h.string=q(e),h.on=!0,f.style.cssText="position:absolute;left:0;top:0;width:1;height:1",f.coordsize=cs+p+cs,f.coordorigin="0 0";var i=new cd(f,b),j={fill:"#000",stroke:"none",font:T.font,text:e};i.shape=f,i.path=g,i.textpath=h,i.type="text",i.attrs.text=q(e),i.attrs.x=c,i.attrs.y=d,i.attrs.w=1,i.attrs.h=1,ca(i,j),f.appendChild(h),f.appendChild(g),b.canvas.appendChild(f);var k=cy("skew");k.on=!0,f.appendChild(k),i.skew=k,i.transform(o);return i},ck=function(a,b){var c=this.canvas.style;this.width=a,this.height=b,a==+a&&(a+="px"),b==+b&&(b+="px"),c.width=a,c.height=b,c.clip="rect(0 "+a+" "+b+" 0)",this._viewBox&&cm.apply(this,this._viewBox);return this},cm=function(a,b,c,d,e){dc("setViewBox",this,this._viewBox,[a,b,c,d,e]);var f=this.width,g=this.height,h=1e3*w(c/f,d/g),i,j;e&&(i=g/d,j=f/c,c*i<f&&(a-=(f-c*i)/2/i),d*j<g&&(b-=(g-d*j)/2/j)),this._viewBox=[a,b,c,d,!!e],this.forEach(function(a){a.transform("...")});return this};var cy,cz=function(a){var b=a.document;b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),cy=function(a){return b.createElement("<rvml:"+a+' class="rvml">')}}catch(c){cy=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}};cz(g.win),cl=function(){var b=bE[l](0,arguments),c=b.container,d=b.height,e,f=b.width,h=b.x,j=b.y;if(!c)throw new Error("VML container not found.");var k=new i,m=k.canvas=g.doc.createElement("div"),n=m.style;h=h||0,j=j||0,f=f||512,d=d||342,k.width=f,k.height=d,f==+f&&(f+="px"),d==+d&&(d+="px"),k.coordsize=cs*1e3+p+cs*1e3,k.coordorigin="0 0",k.span=g.doc.createElement("span"),k.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",m.appendChild(k.span),n.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d),c==1?(g.doc.body.appendChild(m),n.left=h+"px",n.top=j+"px",n.position="absolute"):c.firstChild?c.insertBefore(m,c.firstChild):c.appendChild(m),bF.call(k,k,a.fn),k.renderfix=bc;return k},j.clear=function(){dc("clear",this),this.canvas.innerHTML=o,this.span=g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},j.remove=function(){dc("remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bL(a);return!0}}var cA=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);navigator.vendor=="Apple Computer, Inc."&&(cA&&cA[1]<4||navigator.platform.slice(0,2)=="iP")||navigator.vendor=="Google Inc."&&cA&&cA[1]<8?j.safari=function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:j.safari=bc;var cB=function(){this.returnValue=!1},cC=function(){return this.originalEvent.preventDefault()},cD=function(){this.cancelBubble=!0},cE=function(){return this.originalEvent.stopPropagation()},cF=function(){if(g.doc.addEventListener)return function(a,b,c,d){var e=n&&t[b]?t[b]:b,g=function(e){if(n&&t[f](b))for(var g=0,h=e.targetTouches&&e.targetTouches.length;g<h;g++)if(e.targetTouches[g].target==a){var i=e;e=e.targetTouches[g],e.originalEvent=i,e.preventDefault=cC,e.stopPropagation=cE;break}return c.call(d,e)};a.addEventListener(e,g,!1);return function(){a.removeEventListener(e,g,!1);return!0}};if(g.doc.attachEvent)return function(a,b,c,d){var e=function(a){a=a||g.win.event,a.preventDefault=a.preventDefault||cB,a.stopPropagation=a.stopPropagation||cD;return c.call(d,a)};a.attachEvent("on"+b,e);var f=function(){a.detachEvent("on"+b,e);return!0};return f}}(),cG=[],cH=function(a){var b=a.clientX,c=a.clientY,d=g.doc.documentElement.scrollTop||g.doc.body.scrollTop,e=g.doc.documentElement.scrollLeft||g.doc.body.scrollLeft,f,h=cG.length;while(h--){f=cG[h];if(n){var i=a.touches.length,j;while(i--){j=a.touches[i];if(j.identifier==f.el._drag.id){b=j.clientX,c=j.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}}else a.preventDefault();var k=f.el.node,l,m=k.nextSibling,o=k.parentNode,p=k.style.display;g.win.opera&&o.removeChild(k),k.style.display="none",l=f.el.paper.getElementByPoint(b,c),k.style.display=p,g.win.opera&&(m?o.insertBefore(k,m):o.appendChild(k)),l&&dc("drag.over."+f.el.id,f.el,l),b+=e,c+=d,dc("drag.move."+f.el.id,f.move_scope||f.el,b-f.el._drag.x,c-f.el._drag.y,b,c,a)}},cI=function(b){a.unmousemove(cH).unmouseup(cI);var c=cG.length,d;while(c--)d=cG[c],d.el._drag={},dc("drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,b);cG=[]};for(var cJ=s.length;cJ--;)(function(b){a[b]=cd.prototype[b]=function(c,d){a.is(c,"function")&&(this.events=this.events||[],this.events.push({name:b,f:c,unbind:cF(this.shape||this.node||g.doc,b,c,d||this)}));return this},a["un"+b]=cd.prototype["un"+b]=function(a){var c=this.events,d=c.length;while(d--)if(c[d].name==b&&c[d].f==a){c[d].unbind(),c.splice(d,1),!c.length&&delete this.events;return this}return this}})(s[cJ]);ce.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},ce.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)},ce.drag=function(b,c,d,e,f,h){function i(i){(i.originalEvent||i).preventDefault();var j=g.doc.documentElement.scrollTop||g.doc.body.scrollTop,k=g.doc.documentElement.scrollLeft||g.doc.body.scrollLeft;this._drag.x=i.clientX+k,this._drag.y=i.clientY+j,this._drag.id=i.identifier,!cG.length&&a.mousemove(cH).mouseup(cI),cG.push({el:this,move_scope:e,start_scope:f,end_scope:h}),c&&dc.on("drag.start."+this.id,c),b&&dc.on("drag.move."+this.id,b),d&&dc.on("drag.end."+this.id,d),dc("drag.start."+this.id,f||e||this,i.clientX+k,i.clientY+j,i)}this._drag={},this.mousedown(i);return this},ce.onDragOver=function(a){a?dc.on("drag.over."+this.id,a):dc.unbind("drag.over."+this.id)},ce.undrag=function(){var b=cG.length;while(b--)cG[b].el==this&&(a.unmousedown(cG[b].start),cG.splice(b++,1),dc.unbind("drag.*."+this.id));!cG.length&&a.unmousemove(cH).unmouseup(cI)},j.circle=function(a,b,c){return cf(this,a||0,b||0,c||0)},j.rect=function(a,b,c,d,e){return cg(this,a||0,b||0,c||0,d||0,e||0)},j.ellipse=function(a,b,c,d){return ch(this,a||0,b||0,c||0,d||0)},j.path=function(b){b&&!a.is(b,C)&&!a.is(b[0],D)&&(b+=o);return bV(a.format[l](a,arguments),this)},j.image=function(a,b,c,d,e){return ci(this,a||"about:blank",b||0,c||0,d||0,e||0)},j.text=function(a,b,c){return cj(this,a||0,b||0,q(c))},j.set=function(a){arguments.length>1&&(a=Array.prototype.splice.call(arguments,0,arguments.length));return new c_(a)},j.setSize=ck,j.setViewBox=cm,j.top=j.bottom=null,j.raphael=a;var cK=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,h=e.clientLeft||d.clientLeft||0,i=b.top+(g.win.pageYOffset||e.scrollTop||d.scrollTop)-f,j=b.left+(g.win.pageXOffset||e.scrollLeft||d.scrollLeft)-h;return{y:i,x:j}};j.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=g.doc.elementFromPoint(a,b);if(g.win.opera&&e.tagName=="svg"){var f=cK(d),h=d.createSVGRect();h.x=a-f.x,h.y=b-f.y,h.width=h.height=1;var i=d.getIntersectionList(h,null);i.length&&(e=i[i.length-1])}if(!e)return null;while(e.parentNode&&e!=d.parentNode&&!e.raphael)e=e.parentNode;e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null;return e},j.getById=function(a){var b=this.bottom;while(b){if(b.id==a)return b;b=b.next}return null},j.forEach=function(a,b){var c=this.bottom;while(c){if(a.call(b,c)===!1)return this;c=c.next}return this},ce.getBBox=function(a){if(this.removed)return{};var b=this._;if(a){if(b.dirty||!b.bboxwt)this.realPath=bg[this.type](this),b.bboxwt=bt(this.realPath),b.bboxwt.toString=cM,b.dirty=0;return b.bboxwt}if(b.dirty||b.dirtyT||!b.bbox){if(b.dirty||!this.realPath)b.bboxwt=0,this.realPath=bg[this.type](this);b.bbox=bt(bh(this.realPath,this.matrix)),b.bbox.toString=cM,b.dirty=b.dirtyT=0}return b.bbox},ce.clone=function(){if(this.removed)return null;var a=this.attr();delete a.scale,delete a.translation;return this.paper[this.type]().attr(a)},ce.glow=function(a){if(this.type=="text")return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||bg[this.type](this);f=this.matrix?bh(f,this.matrix):f;for(var g=1;g<c+1;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cN={},cO=function(b,c,d,e,f,g,h,i,j){var k=0,l=100,m=[b,c,d,e,f,g,h,i].join(),n=cN[m],o,p;!n&&(cN[m]=n={data:[]}),n.timer&&clearTimeout(n.timer),n.timer=setTimeout(function(){delete cN[m]},2e3);if(j!=null&&!n.precision){var q=cO(b,c,d,e,f,g,h,i);n.precision=~~q*10,n.data=[]}l=n.precision||l;for(var r=0;r<l+1;r++){n.data[r*l]?p=n.data[r*l]:(p=a.findDotsAtSegment(b,c,d,e,f,g,h,i,r/l),n.data[r*l]=p),r&&(k+=z(z(o.x-p.x,2)+z(o.y-p.y,2),.5));if(j!=null&&k>=j)return p;o=p}if(j==null)return k},cP=function(b,c){return function(d,e,f){d=bC(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;o<p;o++){i=d[o];if(i[0]=="M")g=+i[1],h=+i[2];else{j=cO(g,h,i[1],i[2],i[3],i[4],i[5],i[6]);if(n+j>e){if(c&&!l.start){m=cO(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),k+=["C"+m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k,k=["M"+m.x,m.y+"C"+m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!b&&!c){m=cO(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j,g=+i[5],h=+i[6]}k+=i.shift()+i}l.end=k,m=b?n:c?l:a.findDotsAtSegment(g,h,i[1],i[2],i[3],i[4],i[5],i[6],1),m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},cQ=cP(1),cR=cP(),cS=cP(0,1);a.getTotalLength=cQ,a.getPointAtLength=cR,a.getSubpath=function(a,b,c){if(y(this.getTotalLength(a)-c)<1e-6)return cS(a,b).end;var d=cS(a,c,1);return b?cS(d,b).end:d},ce.getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return cQ(this.attrs.path)}},ce.getPointAtLength=function(a){if(this.type=="path")return cR(this.attrs.path,a)},ce.getSubpath=function(b,c){if(this.type=="path")return a.getSubpath(this.attrs.path,b,c)};var cT=a.easing_formulas={linear:function(a){return a},"<":function(a){return z(a,1.7)},">":function(a){return z(a,.48)},"<>":function(a){var b=.48-a/1.04,c=v.sqrt(.1734+b*b),d=c-b,e=z(y(d),1/3)*(d<0?-1:1),f=-c-b,g=z(y(f),1/3)*(f<0?-1:1),h=e+g+.5;return(1-h)*3*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==!!a)return a;return z(2,-10*a)*v.sin((a-.075)*2*A/.3)+1},bounce:function(a){var b=7.5625,c=2.75,d;a<1/c?d=b*a*a:a<2/c?(a-=1.5/c,d=b*a*a+.75):a<2.5/c?(a-=2.25/c,d=b*a*a+.9375):(a-=2.625/c,d=b*a*a+.984375);return d}};cT.easeIn=cT["ease-in"]=cT["<"],cT.easeOut=cT["ease-out"]=cT[">"],cT.easeInOut=cT["ease-in-out"]=cT["<>"],cT["back-in"]=cT.backIn,cT["back-out"]=cT.backOut;var cU=[],cV=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},cW=function(){var b=+(new Date),c=0;for(;c<cU.length;c++){var d=cU[c];if(d.el.removed||d.paused)continue;var e=b-d.start,g=d.ms,h=d.easing,i=d.from,j=d.diff,k=d.to,l=d.t,m=d.el,n={},o;d.initstatus?(e=(d.initstatus*d.anim.top-d.prev)/(d.percent-d.prev)*g,d.status=d.initstatus,delete d.initstatus,d.stop&&cU.splice(c--,1)):d.status=(d.prev+(d.percent-d.prev)*(e/g))/d.anim.top;if(e<0)continue;if(e<g){var q=h(e/g);for(var r in i)if(i[f](r)){switch(U[r]){case B:o=+i[r]+q*g*j[r];break;case"colour":o="rgb("+[cX(N(i[r].r+q*g*j[r].r)),cX(N(i[r].g+q*g*j[r].g)),cX(N(i[r].b+q*g*j[r].b))].join(",")+")";break;case"path":o=[];for(var s=0,t=i[r].length;s<t;s++){o[s]=[i[r][s][0]];for(var u=1,v=i[r][s].length;u<v;u++)o[s][u]=+i[r][s][u]+q*g*j[r][s][u];o[s]=o[s].join(p)}o=o.join(p);break;case"transform":if(j[r].real){o=[];for(s=0,t=i[r].length;s<t;s++){o[s]=[i[r][s][0]];for(u=1,v=i[r][s].length;u<v;u++)o[s][u]=i[r][s][u]+q*g*j[r][s][u]}}else{var w=function(a){return+i[r][a]+q*g*j[r][a]};o=[["m",w(0),w(1),w(2),w(3),w(4),w(5)]]}break;case"csv":if(r=="clip-rect"){o=[],s=4;while(s--)o[s]=+i[r][s]+q*g*j[r][s]}break;default:var x=[].concat(i[r]);o=[],s=m.paper.customAttributes[r].length;while(s--)o[s]=+x[s]+q*g*j[r][s]}n[r]=o}m.attr(n),function(a,b,c){setTimeout(function(){dc("anim.frame."+a,b,c)})}(m.id,m,d.anim)}else(function(b,c,d){setTimeout(function(){dc("anim.finish."+c.id,c,d),a.is(b,"function")&&b.call(c)})})(d.callback,m,d.anim),console.log(d.repeat),--d.repeat?(m.attr(d.origin),d.start=b):(m.attr(k),cU.splice(c--,1)),d.next&&!d.stop&&c$(d.anim,d.el,d.next,null,d.totalOrigin)}a.svg&&m&&m.paper&&m.paper.safari(),cU.length&&cV(cW)},cX=function(a){return w(x(a,255),0)};ce.animateWith=function(a,b,c,d,e){this.animate(b,c,d,e);var f,g;for(var h=0,i=cU.length;h<i;h++)g=cU[h],g.el.id==a.id?f=g.timestamp:g.el.id==this.id&&(g.start=f);return this.animate(b,c,d,e)},ce.onAnimation=function(a){a?dc.on("anim.frame."+this.id,a):dc.unbind("anim.frame."+this.id);return this},cZ.prototype.delay=function(a){var b=new cZ(this.anim,this.ms);b.times=this.times,b.del=+a||0;return b},cZ.prototype.repeat=function(a){var b=new cZ(this.anim,this.ms);b.del=this.del,b.times=v.floor(w(a,0))||1;return b},a.animation=function(b,c,d,e){if(a.is(d,"function")||!d)e=e||d||null,d=null;b=Object(b),c=+c||0;var g={},h,i;for(i in b)b[f](i)&&P(i)!=i&&(h=!0,g[i]=b[i]);if(!h)return new cZ(b,c);d&&(g.easing=d),e&&(g.callback=e);return new cZ({100:g},c)},ce.animate=function(b,c,d,e){var f=this;if(f.removed){e&&e.call(f);return f}var g=b instanceof cZ?b:a.animation(b,c,d,e);c$(g,f,g.percents[0],null,f.attr());return f},ce.setTime=function(a,b){a&&b!=null&&this.status(a,x(b,a.ms)/a.ms);return this},ce.status=function(a,b){var c=[],d=0,e,f;if(b!=null){c$(a,this,-1,x(b,1));return this}e=cU.length;for(;d<e;d++){f=cU[d];if(f.el.id==this.id&&(!a||f.anim==a)){if(a)return f.status;c.push({anim:f.anim,status:f.status})}}if(a)return 0;return c},ce.pause=function(a){for(var b=0;b<cU.length;b++)cU[b].el.id==this.id&&(!a||cU[b].anim==a)&&dc("anim.pause."+this.id,this,cU[b].anim)!==!1&&(cU[b].paused=!0);return this},ce.resume=function(a){for(var b=0;b<cU.length;b++)if(cU[b].el.id==this.id&&(!a||cU[b].anim==a)){var c=cU[b];dc("anim.resume."+this.id,this,c.anim)!==!1&&(delete c.paused,this.status(c.anim,c.status))}return this},ce.stop=function(a){for(var b=0;b<cU.length;b++)cU[b].el.id==this.id&&(!a||cU[b].anim==a)&&dc("anim.stop."+this.id,this,cU[b].anim)!==!1&&cU.splice(b--,1);return this},ce.toString=function(){return"Raphaël’s object"};var c_=function(a){this.items=[],this.length=0,this.type="set";if(a)for(var b=0,c=a.length;b<c;b++)a[b]&&(a[b].constructor==cd||a[b].constructor==c_)&&(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},da=c_.prototype;da.push=function(){var a,b;for(var c=0,d=arguments.length;c<d;c++)a=arguments[c],a&&(a.constructor==cd||a.constructor==c_)&&(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},da.pop=function(){this.length&&delete this[this.length--];return this.items.pop()},da.forEach=function(a,b){for(var c=0,d=this.items.length;c<d;c++)if(a.call(b,this.items[c])===!1)return this;return this};for(var db in ce)ce[f](db)&&(da[db]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][l](c,b)})}}(db));da.attr=function(b,c){if(b&&a.is(b,D)&&a.is(b[0],"object"))for(var d=0,e=b.length;d<e;d++)this.items[d].attr(b[d]);else for(var f=0,g=this.items.length;f<g;f++)this.items[f].attr(b,c);return this},da.animate=function(b,c,d,e){(a.is(d,"function")||!d)&&(e=d||null);var f=this.items.length,g=f,h,i=this,j;e&&(j=function(){!--f&&e.call(i)}),d=a.is(d,C)?d:j;var k=b instanceof cZ?b:a.animation(b,c,d,j);h=this.items[--g].animate(k);while(g--)this.items[g]&&!this.items[g].removed&&this.items[g].animateWith(h,k);return this},da.insertAfter=function(a){var b=this.items.length;while(b--)this.items[b].insertAfter(a);return this},da.getBBox=function(){var a=[],b=[],c=[],d=[];for(var e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}a=x[l](0,a),b=x[l](0,b);return{x:a,y:b,width:w[l](0,c)-a,height:w[l](0,d)-b}},da.clone=function(a){a=new c_;for(var b=0,c=this.items.length;b<c;b++)a.push(this.items[b].clone());return a},da.toString=function(){return"Raphaël‘s set"},a.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[f](d)&&(b.face[d]=a.face[d]);this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b];if(!a.svg){b.face["units-per-em"]=Q(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[f](e)){var g=a.glyphs[e];b.glyphs[e]={w:g.w,k:{},d:g.d&&"M"+g.d.replace(/[mlcxtrv]/g,function(a){return({l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"})[a]||"M"})+"z"};if(g.k)for(var h in g.k)g[f](h)&&(b.glyphs[e].k[h]=g.k[h])}}return a},j.getFont=function(b,c,d,e){e=e||"normal",d=d||"normal",c=+c||({normal:400,bold:700,lighter:300,bolder:800})[c]||400;if(!!a.fonts){var g=a.fonts[b];if(!g){var h=new RegExp("(^|\\s)"+b.replace(/[^\w\d\s+!~.:_-]/g,o)+"(\\s|$)","i");for(var i in a.fonts)if(a.fonts[f](i)&&h.test(i)){g=a.fonts[i];break}}var j;if(g)for(var k=0,l=g.length;k<l;k++){j=g[k];if(j.face["font-weight"]==c&&(j.face["font-style"]==d||!j.face["font-style"])&&j.face["font-stretch"]==e)break}return j}},j.print=function(c,d,e,f,g,h,i){h=h||"middle",i=w(x(i||0,1),-1);var j=this.set(),k=q(e).split(o),l=0,m=o,n;a.is(f,e)&&(f=this.getFont(f));if(f){n=(g||16)/f.face["units-per-em"];var p=f.face.bbox.split(b),r=+p[0],s=+p[1]+(h=="baseline"?p[3]-p[1]+ +f.face.descent:(p[3]-p[1])/2);for(var t=0,u=k.length;t<u;t++){var v=t&&f.glyphs[k[t-1]]||{},y=f.glyphs[k[t]];l+=t?(v.w||f.w)+(v.k&&v.k[k[t]]||0)+f.w*i:0,y&&y.d&&j.push(this.path(y.d).attr({fill:"#000",stroke:"none",transform:[["t",l,0]]}))}j.scale(n,n,r,s).translate(c-r,d-s)}return j},a.format=function(b,c){var e=a.is(c,D)?[0][m](c):arguments;b&&a.is(b,C)&&e.length-1&&(b=b.replace(d,function(a,b){return e[++b]==null?o:e[b]}));return b||o},a.ninja=function(){h.was?g.win.Raphael=h.is:delete Raphael;return a},a.el=ce,a.st=da,function(a,b,c){function d(){/in/.test(a.readyState)?setTimeout(d,9):dc("DOMload")}a.readyState==null&&a.addEventListener&&(a.addEventListener(b,c=function(){a.removeEventListener(b,c,!1),a.readyState="complete"},!1),a.readyState="loading"),d()}(document,"DOMContentLoaded"),h.was?g.win.Raphael=a:Raphael=a;var dc=a.eve=function(){var a="0.2.1",b="hasOwnProperty",c=/[\.\/]/,d="*",e={n:{}},f=function(a,b){var c=e,d=Array.prototype.slice.call(arguments,2),g=f.listeners(a),h=[];for(var i=0,j=g.length;i<j;i++)try{g[i].apply(b,d)}catch(k){h.push({error:k&&k.message||k,func:g[i]})}if(h.length)return h};f.listeners=function(a){var b=a.split(c),f=e,g,h,i,j,k,l,m,n,o=[f],p=[];for(j=0,k=b.length;j<k;j++){n=[];for(l=0,m=o.length;l<m;l++){f=o[l].n,h=[f[b[j]],f[d]],i=2;while(i--)g=h[i],g&&(n.push(g),p=p.concat(g.f||[]))}o=n}return p},f.on=function(a,b){var d=a.split(c),f=e;for(var g=0,h=d.length;g<h;g++)f=f.n,!f[d[g]]&&(f[d[g]]={n:{}}),f=f[d[g]];f.f=f.f||[];for(g=0,h=f.f.length;g<h;g++)if(f.f[g]==b)return!1;f.f.push(b)},f.unbind=function(a,f){var g=a.split(c),h,i,j,k=[e];for(var l=0,m=g.length;l<m;l++)for(var n=0;n<k.length;n+=j.length-2){j=[n,1],h=k[n].n;if(g[l]!=d)h[g[l]]&&j.push(h[g[l]]);else for(i in h)h[b](i)&&j.push(h[i]);k.splice.apply(k,j)}for(l=0,m=k.length;l<m;l++){h=k[l];while(h.n){if(f){if(h.f){for(l=0,m=h.f.length;l<m;l++)if(h.f[l]==f){h.f.splice(l,1);break}!h.f.length&&delete h.f}for(i in h.n)if(h.n[b](i)&&h.n[i].f){var o=h.n[i].f;for(l=0,m=o.length;l<m;l++)if(o[l]==f){o.splice(l,1);break}!o.length&&delete h.n[i].f}}else{delete h.f;for(i in h.n)h.n[b](i)&&h.n[i].f&&delete h.n[i].f}h=h.n}}return!0},f.version=a,f.toString=function(){return"You are running Eve "+a};return f}()})()
\ No newline at end of file
</code><code id="L2922"><span class="ln">2922</span> <b>throw</b> <b>new</b> Error(<i>"SVG container not found."</i>);
</code><code id="L2923"><span class="ln">2923</span> }
</code><code id="L2924"><span class="ln">2924</span> <b>var</b> cnvs<span class="s"> = </span>$(<i>"svg"</i>),
-</code><code id="L2925"><span class="ln">2925</span> css<span class="s"> = </span><i>"overflow:hidden;"</i>;
-</code><code id="L2926"><span class="ln">2926</span> x<span class="s"> = </span>x<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L2927"><span class="ln">2927</span> y<span class="s"> = </span>y<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L2928"><span class="ln">2928</span> width<span class="s"> = </span>width<span class="s"> || </span><span class="d">512</span>;
-</code><code id="L2929"><span class="ln">2929</span> height<span class="s"> = </span>height<span class="s"> || </span><span class="d">342</span>;
-</code><code id="L2930"><span class="ln">2930</span> $(cnvs, {
-</code><code id="L2931"><span class="ln">2931</span> height: height,
-</code><code id="L2932"><span class="ln">2932</span> version: <span class="d">1.1</span>,
-</code><code id="L2933"><span class="ln">2933</span> width: width,
-</code><code id="L2934"><span class="ln">2934</span> xmlns: <i>"http:<span class="c">//www.w3.org/<span class="d">2000</span>/svg"</i></span>
-</code><code id="L2935"><span class="ln">2935</span> });
-</code><code id="L2936"><span class="ln">2936</span> <b>if</b> (container<span class="s"> == </span><span class="d">1</span>) {
-</code><code id="L2937"><span class="ln">2937</span> cnvs.style.cssText<span class="s"> = </span>css<span class="s"> + </span><i>"position:absolute;left:"</i><span class="s"> + </span>x<span class="s"> + </span><i>"px;top:"</i><span class="s"> + </span>y<span class="s"> + </span><i>"px"</i>;
-</code><code id="L2938"><span class="ln">2938</span> g.doc.body.appendChild(cnvs);
-</code><code id="L2939"><span class="ln">2939</span> } <b>else</b> {
-</code><code id="L2940"><span class="ln">2940</span> cnvs.style.cssText<span class="s"> = </span>css;
-</code><code id="L2941"><span class="ln">2941</span> <b>if</b> (container.firstChild) {
-</code><code id="L2942"><span class="ln">2942</span> container.insertBefore(cnvs, container.firstChild);
-</code><code id="L2943"><span class="ln">2943</span> } <b>else</b> {
-</code><code id="L2944"><span class="ln">2944</span> container.appendChild(cnvs);
-</code><code id="L2945"><span class="ln">2945</span> }
-</code><code id="L2946"><span class="ln">2946</span> }
-</code><code id="L2947"><span class="ln">2947</span> container<span class="s"> = </span><b>new</b> Paper;
-</code><code id="L2948"><span class="ln">2948</span> container.width<span class="s"> = </span>width;
-</code><code id="L2949"><span class="ln">2949</span> container.height<span class="s"> = </span>height;
-</code><code id="L2950"><span class="ln">2950</span> container.canvas<span class="s"> = </span>cnvs;
-</code><code id="L2951"><span class="ln">2951</span> plugins.call(container, container, R.fn);
-</code><code id="L2952"><span class="ln">2952</span> container.clear();
-</code><code id="L2953"><span class="ln">2953</span> <b>return</b> container;
-</code><code id="L2954"><span class="ln">2954</span> },
-</code><code id="L2955"><span class="ln">2955</span> setViewBox<span class="s"> = </span><b>function</b> (x, y, w, h, fit) {
-</code><code id="L2956"><span class="ln">2956</span> eve(<i>"setViewBox"</i>, <b>this</b>, <b>this</b>._viewBox, [x, y, w, h, fit]);
-</code><code id="L2957"><span class="ln">2957</span> <b>var</b> size<span class="s"> = </span>mmax(w<span class="s"> / </span><b>this</b>.width, h<span class="s"> / </span><b>this</b>.height),
-</code><code id="L2958"><span class="ln">2958</span> top<span class="s"> = </span><b>this</b>.top,
-</code><code id="L2959"><span class="ln">2959</span> aspectRatio<span class="s"> = </span>fit ? <i>"meet"</i> : <i>"xMinYMin"</i>,
-</code><code id="L2960"><span class="ln">2960</span> vb,
-</code><code id="L2961"><span class="ln">2961</span> sw;
-</code><code id="L2962"><span class="ln">2962</span> <b>if</b> (x<span class="s"> == </span><b>null</b>) {
-</code><code id="L2963"><span class="ln">2963</span> <b>if</b> (<b>this</b>._vbSize) {
-</code><code id="L2964"><span class="ln">2964</span> size<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2965"><span class="ln">2965</span> }
-</code><code id="L2966"><span class="ln">2966</span> <b>delete</b> <b>this</b>._vbSize;
-</code><code id="L2967"><span class="ln">2967</span> vb<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span> "</i><span class="s"> + </span><b>this</b>.width<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.height;
-</code><code id="L2968"><span class="ln">2968</span> } <b>else</b> {
-</code><code id="L2969"><span class="ln">2969</span> <b>this</b>._vbSize<span class="s"> = </span>size;
-</code><code id="L2970"><span class="ln">2970</span> vb<span class="s"> = </span>x<span class="s"> + </span>S<span class="s"> + </span>y<span class="s"> + </span>S<span class="s"> + </span>w<span class="s"> + </span>S<span class="s"> + </span>h;
-</code><code id="L2971"><span class="ln">2971</span> }
-</code><code id="L2972"><span class="ln">2972</span> $(<b>this</b>.canvas, {
-</code><code id="L2973"><span class="ln">2973</span> viewBox: vb,
-</code><code id="L2974"><span class="ln">2974</span> preserveAspectRatio: aspectRatio
-</code><code id="L2975"><span class="ln">2975</span> });
-</code><code id="L2976"><span class="ln">2976</span> <b>while</b> (size<span class="s"> && </span>top) {
-</code><code id="L2977"><span class="ln">2977</span> sw<span class="s"> = </span><i>"stroke-width"</i> <b>in</b> top.attrs ? top.attrs[<i>"stroke-width"</i>] : <span class="d">1</span>;
-</code><code id="L2978"><span class="ln">2978</span> top.attr({<i>"stroke-width"</i>: sw});
-</code><code id="L2979"><span class="ln">2979</span> top._.dirty<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2980"><span class="ln">2980</span> top._.dirtyT<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2981"><span class="ln">2981</span> top<span class="s"> = </span>top.prev;
-</code><code id="L2982"><span class="ln">2982</span> }
-</code><code id="L2983"><span class="ln">2983</span> <b>this</b>._viewBox<span class="s"> = </span>[x, y, w, h, !!fit];
-</code><code id="L2984"><span class="ln">2984</span> <b>return</b> <b>this</b>;
-</code><code id="L2985"><span class="ln">2985</span> };
-</code><code id="L2986"><span class="ln">2986</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2987"><span class="ln">2987</span><span class="c"> <span class="s"> * </span>Paper.clear
-</span></code><code id="L2988"><span class="ln">2988</span><span class="c"> [ method ]
-</span></code><code id="L2989"><span class="ln">2989</span><span class="c"> **
-</span></code><code id="L2990"><span class="ln">2990</span><span class="c"> <span class="s"> * </span>Clears the paper, i.e. removes all the elements.
-</span></code><code id="L2991"><span class="ln">2991</span><span class="c"> \*/</span>
-</code><code id="L2992"><span class="ln">2992</span> paperproto.clear<span class="s"> = </span><b>function</b> () {
-</code><code id="L2993"><span class="ln">2993</span> eve(<i>"clear"</i>, <b>this</b>);
-</code><code id="L2994"><span class="ln">2994</span> <b>var</b> c<span class="s"> = </span><b>this</b>.canvas;
-</code><code id="L2995"><span class="ln">2995</span> <b>while</b> (c.firstChild) {
-</code><code id="L2996"><span class="ln">2996</span> c.removeChild(c.firstChild);
-</code><code id="L2997"><span class="ln">2997</span> }
-</code><code id="L2998"><span class="ln">2998</span> <b>this</b>.bottom<span class="s"> = </span><b>this</b>.top<span class="s"> = </span><b>null</b>;
-</code><code id="L2999"><span class="ln">2999</span> (<b>this</b>.desc<span class="s"> = </span>$(<i>"desc"</i>)).appendChild(g.doc.createTextNode(<i>"Created <b>with</b> Rapha\xebl "</i><span class="s"> + </span>R.version));
-</code><code id="L3000"><span class="ln">3000</span> c.appendChild(<b>this</b>.desc);
-</code><code id="L3001"><span class="ln">3001</span> c.appendChild(<b>this</b>.defs<span class="s"> = </span>$(<i>"defs"</i>));
-</code><code id="L3002"><span class="ln">3002</span> };
-</code><code id="L3003"><span class="ln">3003</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L3004"><span class="ln">3004</span><span class="c"> <span class="s"> * </span>Paper.remove
-</span></code><code id="L3005"><span class="ln">3005</span><span class="c"> [ method ]
-</span></code><code id="L3006"><span class="ln">3006</span><span class="c"> **
-</span></code><code id="L3007"><span class="ln">3007</span><span class="c"> <span class="s"> * </span>Removes the paper from the DOM.
-</span></code><code id="L3008"><span class="ln">3008</span><span class="c"> \*/</span>
-</code><code id="L3009"><span class="ln">3009</span> paperproto.remove<span class="s"> = </span><b>function</b> () {
-</code><code id="L3010"><span class="ln">3010</span> eve(<i>"remove"</i>, <b>this</b>);
-</code><code id="L3011"><span class="ln">3011</span> <b>this</b>.canvas.parentNode<span class="s"> && </span><b>this</b>.canvas.parentNode.removeChild(<b>this</b>.canvas);
-</code><code id="L3012"><span class="ln">3012</span> <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>) {
-</code><code id="L3013"><span class="ln">3013</span> <b>this</b>[i]<span class="s"> = </span>removed(i);
-</code><code id="L3014"><span class="ln">3014</span> }
-</code><code id="L3015"><span class="ln">3015</span> };
-</code><code id="L3016"><span class="ln">3016</span> }
-</code><code id="L3017"><span class="ln">3017</span>
-</code><code id="L3018"><span class="ln">3018</span> <span class="c">// VML</span>
-</code><code id="L3019"><span class="ln">3019</span> <b>if</b> (R.vml) {
-</code><code id="L3020"><span class="ln">3020</span> <b>var</b> map<span class="s"> = </span>{M: <i>"m"</i>, L: <i>"l"</i>, C: <i>"c"</i>, Z: <i>"x"</i>, m: <i>"t"</i>, l: <i>"r"</i>, c: <i>"v"</i>, z: <i>"x"</i>},
-</code><code id="L3021"><span class="ln">3021</span> bites<span class="s"> = </span>/([clmz]),?([^clmz]*)/gi,
-</code><code id="L3022"><span class="ln">3022</span> blurregexp<span class="s"> = </span>/ progid:\S+Blur\([^\)]+\)/g,
-</code><code id="L3023"><span class="ln">3023</span> val<span class="s"> = </span>/-?[^,\s-]+/g,
-</code><code id="L3024"><span class="ln">3024</span> cssDot<span class="s"> = </span><i>"position:absolute;left:<span class="d">0</span>;top:<span class="d">0</span>;width:1px;height:1px"</i>,
-</code><code id="L3025"><span class="ln">3025</span> zoom<span class="s"> = </span><span class="d">21600</span>,
-</code><code id="L3026"><span class="ln">3026</span> pathTypes<span class="s"> = </span>{path: <span class="d">1</span>, rect: <span class="d">1</span>},
-</code><code id="L3027"><span class="ln">3027</span> ovalTypes<span class="s"> = </span>{circle: <span class="d">1</span>, ellipse: <span class="d">1</span>},
-</code><code id="L3028"><span class="ln">3028</span> path2vml<span class="s"> = </span><b>function</b> (path) {
-</code><code id="L3029"><span class="ln">3029</span> <b>var</b> total<span class="s"> = </span> /[ahqstv]/ig,
-</code><code id="L3030"><span class="ln">3030</span> command<span class="s"> = </span>pathToAbsolute;
-</code><code id="L3031"><span class="ln">3031</span> Str(path).match(total)<span class="s"> && </span>(command<span class="s"> = </span>path2curve);
-</code><code id="L3032"><span class="ln">3032</span> total<span class="s"> = </span>/[clmz]/g;
-</code><code id="L3033"><span class="ln">3033</span> <b>if</b> (command<span class="s"> == </span>pathToAbsolute<span class="s"> && </span>!Str(path).match(total)) {
-</code><code id="L3034"><span class="ln">3034</span> <b>var</b> res<span class="s"> = </span>Str(path).replace(bites, <b>function</b> (all, command, args) {
-</code><code id="L3035"><span class="ln">3035</span> <b>var</b> vals<span class="s"> = </span>[],
-</code><code id="L3036"><span class="ln">3036</span> isMove<span class="s"> = </span>lowerCase.call(command)<span class="s"> == </span><i>"m"</i>,
-</code><code id="L3037"><span class="ln">3037</span> res<span class="s"> = </span>map[command];
-</code><code id="L3038"><span class="ln">3038</span> args.replace(val, <b>function</b> (value) {
-</code><code id="L3039"><span class="ln">3039</span> <b>if</b> (isMove<span class="s"> && </span>vals.length<span class="s"> == </span><span class="d">2</span>) {
-</code><code id="L3040"><span class="ln">3040</span> res += vals<span class="s"> + </span>map[command<span class="s"> == </span><i>"m"</i> ? <i>"l"</i> : <i>"L"</i>];
-</code><code id="L3041"><span class="ln">3041</span> vals<span class="s"> = </span>[];
-</code><code id="L3042"><span class="ln">3042</span> }
-</code><code id="L3043"><span class="ln">3043</span> vals.push(round(value<span class="s"> * </span>zoom));
-</code><code id="L3044"><span class="ln">3044</span> });
-</code><code id="L3045"><span class="ln">3045</span> <b>return</b> res<span class="s"> + </span>vals;
-</code><code id="L3046"><span class="ln">3046</span> });
-</code><code id="L3047"><span class="ln">3047</span> <b>return</b> res;
-</code><code id="L3048"><span class="ln">3048</span> }
-</code><code id="L3049"><span class="ln">3049</span> <b>var</b> pa<span class="s"> = </span>command(path), p, r;
-</code><code id="L3050"><span class="ln">3050</span> res<span class="s"> = </span>[];
-</code><code id="L3051"><span class="ln">3051</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>pa.length; i < ii; i++) {
-</code><code id="L3052"><span class="ln">3052</span> p<span class="s"> = </span>pa[i];
-</code><code id="L3053"><span class="ln">3053</span> r<span class="s"> = </span>lowerCase.call(pa[i][<span class="d">0</span>]);
-</code><code id="L3054"><span class="ln">3054</span> r<span class="s"> == </span><i>"z"</i><span class="s"> && </span>(r<span class="s"> = </span><i>"x"</i>);
-</code><code id="L3055"><span class="ln">3055</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>p.length; j < jj; j++) {
-</code><code id="L3056"><span class="ln">3056</span> r += round(p[j]<span class="s"> * </span>zoom)<span class="s"> + </span>(j != jj<span class="s"> - </span><span class="d">1</span> ? <i>","</i> : E);
-</code><code id="L3057"><span class="ln">3057</span> }
-</code><code id="L3058"><span class="ln">3058</span> res.push(r);
-</code><code id="L3059"><span class="ln">3059</span> }
-</code><code id="L3060"><span class="ln">3060</span> <b>return</b> res.join(S);
-</code><code id="L3061"><span class="ln">3061</span> },
-</code><code id="L3062"><span class="ln">3062</span> compensation<span class="s"> = </span><b>function</b> (deg, dx, dy) {
-</code><code id="L3063"><span class="ln">3063</span> <b>var</b> m<span class="s"> = </span><b>new</b> Matrix;
-</code><code id="L3064"><span class="ln">3064</span> m.rotate(-deg, <span class="d">.5</span>, <span class="d">.5</span>);
-</code><code id="L3065"><span class="ln">3065</span> <b>return</b> {
-</code><code id="L3066"><span class="ln">3066</span> dx: m.x(dx, dy),
-</code><code id="L3067"><span class="ln">3067</span> dy: m.y(dx, dy)
-</code><code id="L3068"><span class="ln">3068</span> };
-</code><code id="L3069"><span class="ln">3069</span> },
-</code><code id="L3070"><span class="ln">3070</span> setCoords<span class="s"> = </span><b>function</b> (p) {
-</code><code id="L3071"><span class="ln">3071</span> <b>var</b> _<span class="s"> = </span>p._,
-</code><code id="L3072"><span class="ln">3072</span> sx<span class="s"> = </span>_.sx,
-</code><code id="L3073"><span class="ln">3073</span> sy<span class="s"> = </span>_.sy,
-</code><code id="L3074"><span class="ln">3074</span> deg<span class="s"> = </span>_.deg,
-</code><code id="L3075"><span class="ln">3075</span> dx<span class="s"> = </span>_.dx,
-</code><code id="L3076"><span class="ln">3076</span> dy<span class="s"> = </span>_.dy,
-</code><code id="L3077"><span class="ln">3077</span> fillpos<span class="s"> = </span>_.fillpos,
-</code><code id="L3078"><span class="ln">3078</span> o<span class="s"> = </span>p.node,
-</code><code id="L3079"><span class="ln">3079</span> s<span class="s"> = </span>o.style,
-</code><code id="L3080"><span class="ln">3080</span> y<span class="s"> = </span><span class="d">1</span>,
-</code><code id="L3081"><span class="ln">3081</span> m<span class="s"> = </span>p.matrix,
-</code><code id="L3082"><span class="ln">3082</span> flip<span class="s"> = </span><i>""</i>,
-</code><code id="L3083"><span class="ln">3083</span> dxdy,
-</code><code id="L3084"><span class="ln">3084</span> kx<span class="s"> = </span>zoom<span class="s"> / </span>sx,
-</code><code id="L3085"><span class="ln">3085</span> ky<span class="s"> = </span>zoom<span class="s"> / </span>sy;
-</code><code id="L3086"><span class="ln">3086</span> s.visibility<span class="s"> = </span><i>"hidden"</i>;
-</code><code id="L3087"><span class="ln">3087</span> o.coordsize<span class="s"> = </span>abs(kx)<span class="s"> + </span>S<span class="s"> + </span>abs(ky);
-</code><code id="L3088"><span class="ln">3088</span> s.rotation<span class="s"> = </span>deg<span class="s"> * </span>(sx<span class="s"> * </span>sy < <span class="d">0</span> ? -<span class="d">1</span> : <span class="d">1</span>);
-</code><code id="L3089"><span class="ln">3089</span> <b>if</b> (deg) {
-</code><code id="L3090"><span class="ln">3090</span> <b>var</b> c<span class="s"> = </span>compensation(deg, dx, dy);
-</code><code id="L3091"><span class="ln">3091</span> dx<span class="s"> = </span>c.dx;
-</code><code id="L3092"><span class="ln">3092</span> dy<span class="s"> = </span>c.dy;
-</code><code id="L3093"><span class="ln">3093</span> }
-</code><code id="L3094"><span class="ln">3094</span> sx < <span class="d">0</span><span class="s"> && </span>(flip += <i>"x"</i>);
-</code><code id="L3095"><span class="ln">3095</span> sy < <span class="d">0</span><span class="s"> && </span>(flip += <i>" y"</i>)<span class="s"> && </span>(y<span class="s"> = </span>-<span class="d">1</span>);
-</code><code id="L3096"><span class="ln">3096</span> s.flip<span class="s"> = </span>flip;
-</code><code id="L3097"><span class="ln">3097</span> o.coordorigin<span class="s"> = </span>(dx<span class="s"> * </span>-kx)<span class="s"> + </span>S<span class="s"> + </span>(dy<span class="s"> * </span>-ky);
-</code><code id="L3098"><span class="ln">3098</span> <b>if</b> (fillpos<span class="s"> || </span>_.fillsize) {
-</code><code id="L3099"><span class="ln">3099</span> <b>var</b> fill<span class="s"> = </span>o.getElementsByTagName(fillString);
-</code><code id="L3100"><span class="ln">3100</span> fill<span class="s"> = </span>fill<span class="s"> && </span>fill[<span class="d">0</span>];
-</code><code id="L3101"><span class="ln">3101</span> o.removeChild(fill);
-</code><code id="L3102"><span class="ln">3102</span> <b>if</b> (fillpos) {
-</code><code id="L3103"><span class="ln">3103</span> c<span class="s"> = </span>compensation(deg, m.x(fillpos[<span class="d">0</span>], fillpos[<span class="d">1</span>]), m.y(fillpos[<span class="d">0</span>], fillpos[<span class="d">1</span>]));
-</code><code id="L3104"><span class="ln">3104</span> fill.position<span class="s"> = </span>c.dx<span class="s"> * </span>y<span class="s"> + </span>S<span class="s"> + </span>c.dy<span class="s"> * </span>y;
-</code><code id="L3105"><span class="ln">3105</span> }
-</code><code id="L3106"><span class="ln">3106</span> <b>if</b> (_.fillsize) {
-</code><code id="L3107"><span class="ln">3107</span> fill.size<span class="s"> = </span>_.fillsize[<span class="d">0</span>]<span class="s"> * </span>abs(sx)<span class="s"> + </span>S<span class="s"> + </span>_.fillsize[<span class="d">1</span>]<span class="s"> * </span>abs(sy);
-</code><code id="L3108"><span class="ln">3108</span> }
-</code><code id="L3109"><span class="ln">3109</span> o.appendChild(fill);
-</code><code id="L3110"><span class="ln">3110</span> }
-</code><code id="L3111"><span class="ln">3111</span> s.visibility<span class="s"> = </span><i>"visible"</i>;
-</code><code id="L3112"><span class="ln">3112</span> };
-</code><code id="L3113"><span class="ln">3113</span> R.toString<span class="s"> = </span><b>function</b> () {
-</code><code id="L3114"><span class="ln">3114</span> <b>return</b> <i>"Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl "</i><span class="s"> + </span><b>this</b>.version;
-</code><code id="L3115"><span class="ln">3115</span> };
-</code><code id="L3116"><span class="ln">3116</span> addArrow<span class="s"> = </span><b>function</b> (o, value, isEnd) {
-</code><code id="L3117"><span class="ln">3117</span> <b>var</b> values<span class="s"> = </span>Str(value).toLowerCase().split(<i>"-"</i>),
-</code><code id="L3118"><span class="ln">3118</span> se<span class="s"> = </span>isEnd ? <i>"end"</i> : <i>"start"</i>,
-</code><code id="L3119"><span class="ln">3119</span> i<span class="s"> = </span>values.length,
-</code><code id="L3120"><span class="ln">3120</span> type<span class="s"> = </span><i>"classic"</i>,
-</code><code id="L3121"><span class="ln">3121</span> w<span class="s"> = </span><i>"medium"</i>,
-</code><code id="L3122"><span class="ln">3122</span> h<span class="s"> = </span><i>"medium"</i>;
-</code><code id="L3123"><span class="ln">3123</span> <b>while</b> (i--) {
-</code><code id="L3124"><span class="ln">3124</span> <b>switch</b> (values[i]) {
-</code><code id="L3125"><span class="ln">3125</span> <b>case</b> <i>"block"</i>:
-</code><code id="L3126"><span class="ln">3126</span> <b>case</b> <i>"classic"</i>:
-</code><code id="L3127"><span class="ln">3127</span> <b>case</b> <i>"oval"</i>:
-</code><code id="L3128"><span class="ln">3128</span> <b>case</b> <i>"diamond"</i>:
-</code><code id="L3129"><span class="ln">3129</span> <b>case</b> <i>"open"</i>:
-</code><code id="L3130"><span class="ln">3130</span> <b>case</b> <i>"none"</i>:
-</code><code id="L3131"><span class="ln">3131</span> type<span class="s"> = </span>values[i];
-</code><code id="L3132"><span class="ln">3132</span> <b>break</b>;
-</code><code id="L3133"><span class="ln">3133</span> <b>case</b> <i>"wide"</i>:
-</code><code id="L3134"><span class="ln">3134</span> <b>case</b> <i>"narrow"</i>: h<span class="s"> = </span>values[i]; <b>break</b>;
-</code><code id="L3135"><span class="ln">3135</span> <b>case</b> <i>"<b>long</b>"</i>:
-</code><code id="L3136"><span class="ln">3136</span> <b>case</b> <i>"<b>short</b>"</i>: w<span class="s"> = </span>values[i]; <b>break</b>;
-</code><code id="L3137"><span class="ln">3137</span> }
-</code><code id="L3138"><span class="ln">3138</span> }
-</code><code id="L3139"><span class="ln">3139</span> <b>var</b> stroke<span class="s"> = </span>o.node.getElementsByTagName(<i>"stroke"</i>)[<span class="d">0</span>];
-</code><code id="L3140"><span class="ln">3140</span> stroke[se<span class="s"> + </span><i>"arrow"</i>]<span class="s"> = </span>type;
-</code><code id="L3141"><span class="ln">3141</span> stroke[se<span class="s"> + </span><i>"arrowlength"</i>]<span class="s"> = </span>w;
-</code><code id="L3142"><span class="ln">3142</span> stroke[se<span class="s"> + </span><i>"arrowwidth"</i>]<span class="s"> = </span>h;
-</code><code id="L3143"><span class="ln">3143</span> };
-</code><code id="L3144"><span class="ln">3144</span> setFillAndStroke<span class="s"> = </span><b>function</b> (o, params) {
-</code><code id="L3145"><span class="ln">3145</span> o.paper.canvas.style.display<span class="s"> = </span><i>"none"</i>;
-</code><code id="L3146"><span class="ln">3146</span> o.attrs<span class="s"> = </span>o.attrs<span class="s"> || </span>{};
-</code><code id="L3147"><span class="ln">3147</span> <b>var</b> node<span class="s"> = </span>o.node,
-</code><code id="L3148"><span class="ln">3148</span> a<span class="s"> = </span>o.attrs,
-</code><code id="L3149"><span class="ln">3149</span> s<span class="s"> = </span>node.style,
-</code><code id="L3150"><span class="ln">3150</span> xy,
-</code><code id="L3151"><span class="ln">3151</span> newpath<span class="s"> = </span>pathTypes[o.type]<span class="s"> && </span>(params.x != a.x<span class="s"> || </span>params.y != a.y<span class="s"> || </span>params.width != a.width<span class="s"> || </span>params.height != a.height<span class="s"> || </span>params.cx != a.cx<span class="s"> || </span>params.cy != a.cy<span class="s"> || </span>params.rx != a.rx<span class="s"> || </span>params.ry != a.ry<span class="s"> || </span>params.r != a.r),
-</code><code id="L3152"><span class="ln">3152</span> isOval<span class="s"> = </span>ovalTypes[o.type]<span class="s"> && </span>(a.cx != params.cx<span class="s"> || </span>a.cy != params.cy<span class="s"> || </span>a.r != params.r<span class="s"> || </span>a.rx != params.rx<span class="s"> || </span>a.ry != params.ry),
-</code><code id="L3153"><span class="ln">3153</span> res<span class="s"> = </span>o;
-</code><code id="L3154"><span class="ln">3154</span>
-</code><code id="L3155"><span class="ln">3155</span>
-</code><code id="L3156"><span class="ln">3156</span> <b>for</b> (<b>var</b> par <b>in</b> params) <b>if</b> (params[has](par)) {
-</code><code id="L3157"><span class="ln">3157</span> a[par]<span class="s"> = </span>params[par];
-</code><code id="L3158"><span class="ln">3158</span> }
-</code><code id="L3159"><span class="ln">3159</span> <b>if</b> (newpath) {
-</code><code id="L3160"><span class="ln">3160</span> a.path<span class="s"> = </span>getPath[o.type](o);
-</code><code id="L3161"><span class="ln">3161</span> o._.dirty<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L3162"><span class="ln">3162</span> }
-</code><code id="L3163"><span class="ln">3163</span> params.href<span class="s"> && </span>(node.href<span class="s"> = </span>params.href);
-</code><code id="L3164"><span class="ln">3164</span> params.title<span class="s"> && </span>(node.title<span class="s"> = </span>params.title);
-</code><code id="L3165"><span class="ln">3165</span> params.target<span class="s"> && </span>(node.target<span class="s"> = </span>params.target);
-</code><code id="L3166"><span class="ln">3166</span> params.cursor<span class="s"> && </span>(s.cursor<span class="s"> = </span>params.cursor);
-</code><code id="L3167"><span class="ln">3167</span> <i>"blur"</i> <b>in</b> params<span class="s"> && </span>o.blur(params.blur);
-</code><code id="L3168"><span class="ln">3168</span> <i>"transform"</i> <b>in</b> params<span class="s"> && </span>o.transform(params.transform);
-</code><code id="L3169"><span class="ln">3169</span> <b>if</b> (params.path<span class="s"> && </span>o.type<span class="s"> == </span><i>"path"</i><span class="s"> || </span>newpath) {
-</code><code id="L3170"><span class="ln">3170</span> node.path<span class="s"> = </span>path2vml(a.path);
-</code><code id="L3171"><span class="ln">3171</span> }
-</code><code id="L3172"><span class="ln">3172</span> <b>if</b> (isOval) {
-</code><code id="L3173"><span class="ln">3173</span> <b>var</b> cx<span class="s"> = </span>a.cx,
-</code><code id="L3174"><span class="ln">3174</span> cy<span class="s"> = </span>a.cy,
-</code><code id="L3175"><span class="ln">3175</span> rx<span class="s"> = </span>a.rx<span class="s"> || </span>a.r<span class="s"> || </span><span class="d">0</span>,
-</code><code id="L3176"><span class="ln">3176</span> ry<span class="s"> = </span>a.ry<span class="s"> || </span>a.r<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L3177"><span class="ln">3177</span> node.path<span class="s"> = </span>R.format(<i>"ar{<span class="d">0</span>},{<span class="d">1</span>},{<span class="d">2</span>},{<span class="d">3</span>},{<span class="d">4</span>},{<span class="d">1</span>},{<span class="d">4</span>},{<span class="d">1</span>}x"</i>, round((cx<span class="s"> - </span>rx)<span class="s"> * </span>zoom), round((cy<span class="s"> - </span>ry)<span class="s"> * </span>zoom), round((cx<span class="s"> + </span>rx)<span class="s"> * </span>zoom), round((cy<span class="s"> + </span>ry)<span class="s"> * </span>zoom), round(cx<span class="s"> * </span>zoom));
-</code><code id="L3178"><span class="ln">3178</span> }
-</code><code id="L3179"><span class="ln">3179</span> <b>if</b> (<i>"clip-rect"</i> <b>in</b> params) {
-</code><code id="L3180"><span class="ln">3180</span> <b>var</b> rect<span class="s"> = </span>Str(params[<i>"clip-rect"</i>]).split(separator);
-</code><code id="L3181"><span class="ln">3181</span> <b>if</b> (rect.length<span class="s"> == </span><span class="d">4</span>) {
-</code><code id="L3182"><span class="ln">3182</span> rect[<span class="d">2</span>]<span class="s"> = </span>+rect[<span class="d">2</span>]<span class="s"> + </span>(+rect[<span class="d">0</span>]);
-</code><code id="L3183"><span class="ln">3183</span> rect[<span class="d">3</span>]<span class="s"> = </span>+rect[<span class="d">3</span>]<span class="s"> + </span>(+rect[<span class="d">1</span>]);
-</code><code id="L3184"><span class="ln">3184</span> <b>var</b> div<span class="s"> = </span>node.clipRect<span class="s"> || </span>g.doc.createElement(<i>"div"</i>),
-</code><code id="L3185"><span class="ln">3185</span> dstyle<span class="s"> = </span>div.style,
-</code><code id="L3186"><span class="ln">3186</span> group<span class="s"> = </span>node.parentNode;
-</code><code id="L3187"><span class="ln">3187</span> dstyle.clip<span class="s"> = </span>R.format(<i>"rect({<span class="d">1</span>}px {<span class="d">2</span>}px {<span class="d">3</span>}px {<span class="d">0</span>}px)"</i>, rect);
-</code><code id="L3188"><span class="ln">3188</span> <b>if</b> (!node.clipRect) {
-</code><code id="L3189"><span class="ln">3189</span> dstyle.position<span class="s"> = </span><i>"absolute"</i>;
-</code><code id="L3190"><span class="ln">3190</span> dstyle.top<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L3191"><span class="ln">3191</span> dstyle.left<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L3192"><span class="ln">3192</span> dstyle.width<span class="s"> = </span>o.paper.width<span class="s"> + </span><i>"px"</i>;
-</code><code id="L3193"><span class="ln">3193</span> dstyle.height<span class="s"> = </span>o.paper.height<span class="s"> + </span><i>"px"</i>;
-</code><code id="L3194"><span class="ln">3194</span> group.parentNode.insertBefore(div, group);
-</code><code id="L3195"><span class="ln">3195</span> div.appendChild(group);
-</code><code id="L3196"><span class="ln">3196</span> node.clipRect<span class="s"> = </span>div;
-</code><code id="L3197"><span class="ln">3197</span> }
-</code><code id="L3198"><span class="ln">3198</span> }
-</code><code id="L3199"><span class="ln">3199</span> <b>if</b> (!params[<i>"clip-rect"</i>]) {
-</code><code id="L3200"><span class="ln">3200</span> node.clipRect<span class="s"> && </span>(node.clipRect.style.clip<span class="s"> = </span>E);
-</code><code id="L3201"><span class="ln">3201</span> }
-</code><code id="L3202"><span class="ln">3202</span> }
-</code><code id="L3203"><span class="ln">3203</span> <b>if</b> (o.textpath) {
-</code><code id="L3204"><span class="ln">3204</span> <b>var</b> textpathStyle<span class="s"> = </span>o.textpath.style;
-</code><code id="L3205"><span class="ln">3205</span> params.font<span class="s"> && </span>(textpathStyle.font<span class="s"> = </span>params.font);
-</code><code id="L3206"><span class="ln">3206</span> params[<i>"font-family"</i>]<span class="s"> && </span>(textpathStyle.fontFamily<span class="s"> = </span><i>'"'</i><span class="s"> + </span>params[<i>"font-family"</i>].split(<i>","</i>)[<span class="d">0</span>].replace(/^[<i>'"]+|['</i><i>"]+$/g, E)<span class="s"> + </span>'"</i>');
-</code><code id="L3207"><span class="ln">3207</span> params[<i>"font-size"</i>]<span class="s"> && </span>(textpathStyle.fontSize<span class="s"> = </span>params[<i>"font-size"</i>]);
-</code><code id="L3208"><span class="ln">3208</span> params[<i>"font-weight"</i>]<span class="s"> && </span>(textpathStyle.fontWeight<span class="s"> = </span>params[<i>"font-weight"</i>]);
-</code><code id="L3209"><span class="ln">3209</span> params[<i>"font-style"</i>]<span class="s"> && </span>(textpathStyle.fontStyle<span class="s"> = </span>params[<i>"font-style"</i>]);
+</code><code id="L2925"><span class="ln">2925</span> css<span class="s"> = </span><i>"overflow:hidden;"</i>,
+</code><code id="L2926"><span class="ln">2926</span> isFloating;
+</code><code id="L2927"><span class="ln">2927</span> x<span class="s"> = </span>x<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L2928"><span class="ln">2928</span> y<span class="s"> = </span>y<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L2929"><span class="ln">2929</span> width<span class="s"> = </span>width<span class="s"> || </span><span class="d">512</span>;
+</code><code id="L2930"><span class="ln">2930</span> height<span class="s"> = </span>height<span class="s"> || </span><span class="d">342</span>;
+</code><code id="L2931"><span class="ln">2931</span> $(cnvs, {
+</code><code id="L2932"><span class="ln">2932</span> height: height,
+</code><code id="L2933"><span class="ln">2933</span> version: <span class="d">1.1</span>,
+</code><code id="L2934"><span class="ln">2934</span> width: width,
+</code><code id="L2935"><span class="ln">2935</span> xmlns: <i>"http:<span class="c">//www.w3.org/<span class="d">2000</span>/svg"</i></span>
+</code><code id="L2936"><span class="ln">2936</span> });
+</code><code id="L2937"><span class="ln">2937</span> <b>if</b> (container<span class="s"> == </span><span class="d">1</span>) {
+</code><code id="L2938"><span class="ln">2938</span> cnvs.style.cssText<span class="s"> = </span>css<span class="s"> + </span><i>"position:absolute;left:"</i><span class="s"> + </span>x<span class="s"> + </span><i>"px;top:"</i><span class="s"> + </span>y<span class="s"> + </span><i>"px"</i>;
+</code><code id="L2939"><span class="ln">2939</span> g.doc.body.appendChild(cnvs);
+</code><code id="L2940"><span class="ln">2940</span> isFloating<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2941"><span class="ln">2941</span> } <b>else</b> {
+</code><code id="L2942"><span class="ln">2942</span> cnvs.style.cssText<span class="s"> = </span>css<span class="s"> + </span><i>"position:relative"</i>;
+</code><code id="L2943"><span class="ln">2943</span> <b>if</b> (container.firstChild) {
+</code><code id="L2944"><span class="ln">2944</span> container.insertBefore(cnvs, container.firstChild);
+</code><code id="L2945"><span class="ln">2945</span> } <b>else</b> {
+</code><code id="L2946"><span class="ln">2946</span> container.appendChild(cnvs);
+</code><code id="L2947"><span class="ln">2947</span> }
+</code><code id="L2948"><span class="ln">2948</span> }
+</code><code id="L2949"><span class="ln">2949</span> container<span class="s"> = </span><b>new</b> Paper;
+</code><code id="L2950"><span class="ln">2950</span> container.width<span class="s"> = </span>width;
+</code><code id="L2951"><span class="ln">2951</span> container.height<span class="s"> = </span>height;
+</code><code id="L2952"><span class="ln">2952</span> container.canvas<span class="s"> = </span>cnvs;
+</code><code id="L2953"><span class="ln">2953</span> plugins.call(container, container, R.fn);
+</code><code id="L2954"><span class="ln">2954</span> container.clear();
+</code><code id="L2955"><span class="ln">2955</span> container._left<span class="s"> = </span>container._top<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L2956"><span class="ln">2956</span> isFloating<span class="s"> && </span>(container.renderfix<span class="s"> = </span>fun);
+</code><code id="L2957"><span class="ln">2957</span> container.renderfix();
+</code><code id="L2958"><span class="ln">2958</span> <b>return</b> container;
+</code><code id="L2959"><span class="ln">2959</span> },
+</code><code id="L2960"><span class="ln">2960</span> setViewBox<span class="s"> = </span><b>function</b> (x, y, w, h, fit) {
+</code><code id="L2961"><span class="ln">2961</span> eve(<i>"setViewBox"</i>, <b>this</b>, <b>this</b>._viewBox, [x, y, w, h, fit]);
+</code><code id="L2962"><span class="ln">2962</span> <b>var</b> size<span class="s"> = </span>mmax(w<span class="s"> / </span><b>this</b>.width, h<span class="s"> / </span><b>this</b>.height),
+</code><code id="L2963"><span class="ln">2963</span> top<span class="s"> = </span><b>this</b>.top,
+</code><code id="L2964"><span class="ln">2964</span> aspectRatio<span class="s"> = </span>fit ? <i>"meet"</i> : <i>"xMinYMin"</i>,
+</code><code id="L2965"><span class="ln">2965</span> vb,
+</code><code id="L2966"><span class="ln">2966</span> sw;
+</code><code id="L2967"><span class="ln">2967</span> <b>if</b> (x<span class="s"> == </span><b>null</b>) {
+</code><code id="L2968"><span class="ln">2968</span> <b>if</b> (<b>this</b>._vbSize) {
+</code><code id="L2969"><span class="ln">2969</span> size<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2970"><span class="ln">2970</span> }
+</code><code id="L2971"><span class="ln">2971</span> <b>delete</b> <b>this</b>._vbSize;
+</code><code id="L2972"><span class="ln">2972</span> vb<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span> "</i><span class="s"> + </span><b>this</b>.width<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.height;
+</code><code id="L2973"><span class="ln">2973</span> } <b>else</b> {
+</code><code id="L2974"><span class="ln">2974</span> <b>this</b>._vbSize<span class="s"> = </span>size;
+</code><code id="L2975"><span class="ln">2975</span> vb<span class="s"> = </span>x<span class="s"> + </span>S<span class="s"> + </span>y<span class="s"> + </span>S<span class="s"> + </span>w<span class="s"> + </span>S<span class="s"> + </span>h;
+</code><code id="L2976"><span class="ln">2976</span> }
+</code><code id="L2977"><span class="ln">2977</span> $(<b>this</b>.canvas, {
+</code><code id="L2978"><span class="ln">2978</span> viewBox: vb,
+</code><code id="L2979"><span class="ln">2979</span> preserveAspectRatio: aspectRatio
+</code><code id="L2980"><span class="ln">2980</span> });
+</code><code id="L2981"><span class="ln">2981</span> <b>while</b> (size<span class="s"> && </span>top) {
+</code><code id="L2982"><span class="ln">2982</span> sw<span class="s"> = </span><i>"stroke-width"</i> <b>in</b> top.attrs ? top.attrs[<i>"stroke-width"</i>] : <span class="d">1</span>;
+</code><code id="L2983"><span class="ln">2983</span> top.attr({<i>"stroke-width"</i>: sw});
+</code><code id="L2984"><span class="ln">2984</span> top._.dirty<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2985"><span class="ln">2985</span> top._.dirtyT<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2986"><span class="ln">2986</span> top<span class="s"> = </span>top.prev;
+</code><code id="L2987"><span class="ln">2987</span> }
+</code><code id="L2988"><span class="ln">2988</span> <b>this</b>._viewBox<span class="s"> = </span>[x, y, w, h, !!fit];
+</code><code id="L2989"><span class="ln">2989</span> <b>return</b> <b>this</b>;
+</code><code id="L2990"><span class="ln">2990</span> };
+</code><code id="L2991"><span class="ln">2991</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2992"><span class="ln">2992</span><span class="c"> <span class="s"> * </span>Paper.renderfix
+</span></code><code id="L2993"><span class="ln">2993</span><span class="c"> [ method ]
+</span></code><code id="L2994"><span class="ln">2994</span><span class="c"> **
+</span></code><code id="L2995"><span class="ln">2995</span><span class="c"> <span class="s"> * </span>Fixes the issue of Firefox and IE9 regarding subpixel rendering. If paper is dependant
+</span></code><code id="L2996"><span class="ln">2996</span><span class="c"> <span class="s"> * </span>on other elements after reflow it could shift half pixel which cause <b>for</b> lines to lost their crispness.
+</span></code><code id="L2997"><span class="ln">2997</span><span class="c"> <span class="s"> * </span>This method fixes the issue.
+</span></code><code id="L2998"><span class="ln">2998</span><span class="c"> **
+</span></code><code id="L2999"><span class="ln">2999</span><span class="c"> Special thanks to Mariusz Nowak (http:<span class="c">//www.medikoo.com/) <b>for</b> <b>this</b> method.</span>
+</span></code><code id="L3000"><span class="ln">3000</span><span class="c"> \*/</span>
+</code><code id="L3001"><span class="ln">3001</span> paperproto.renderfix<span class="s"> = </span><b>function</b> () {
+</code><code id="L3002"><span class="ln">3002</span> <b>var</b> cnvs<span class="s"> = </span><b>this</b>.canvas,
+</code><code id="L3003"><span class="ln">3003</span> s<span class="s"> = </span>cnvs.style,
+</code><code id="L3004"><span class="ln">3004</span> pos<span class="s"> = </span>cnvs.getScreenCTM(),
+</code><code id="L3005"><span class="ln">3005</span> left<span class="s"> = </span>-pos.e<span class="s"> % </span><span class="d">1</span>,
+</code><code id="L3006"><span class="ln">3006</span> top<span class="s"> = </span>-pos.f<span class="s"> % </span><span class="d">1</span>;
+</code><code id="L3007"><span class="ln">3007</span> <b>if</b> (left<span class="s"> || </span>top) {
+</code><code id="L3008"><span class="ln">3008</span> <b>if</b> (left) {
+</code><code id="L3009"><span class="ln">3009</span> <b>this</b>._left<span class="s"> = </span>(<b>this</b>._left<span class="s"> + </span>left)<span class="s"> % </span><span class="d">1</span>;
+</code><code id="L3010"><span class="ln">3010</span> s.left<span class="s"> = </span><b>this</b>._left<span class="s"> + </span><i>"px"</i>;
+</code><code id="L3011"><span class="ln">3011</span> }
+</code><code id="L3012"><span class="ln">3012</span> <b>if</b> (top) {
+</code><code id="L3013"><span class="ln">3013</span> <b>this</b>._top<span class="s"> = </span>(<b>this</b>._top<span class="s"> + </span>top)<span class="s"> % </span><span class="d">1</span>;
+</code><code id="L3014"><span class="ln">3014</span> s.top<span class="s"> = </span><b>this</b>._top<span class="s"> + </span><i>"px"</i>;
+</code><code id="L3015"><span class="ln">3015</span> }
+</code><code id="L3016"><span class="ln">3016</span> }
+</code><code id="L3017"><span class="ln">3017</span> };
+</code><code id="L3018"><span class="ln">3018</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L3019"><span class="ln">3019</span><span class="c"> <span class="s"> * </span>Paper.clear
+</span></code><code id="L3020"><span class="ln">3020</span><span class="c"> [ method ]
+</span></code><code id="L3021"><span class="ln">3021</span><span class="c"> **
+</span></code><code id="L3022"><span class="ln">3022</span><span class="c"> <span class="s"> * </span>Clears the paper, i.e. removes all the elements.
+</span></code><code id="L3023"><span class="ln">3023</span><span class="c"> \*/</span>
+</code><code id="L3024"><span class="ln">3024</span> paperproto.clear<span class="s"> = </span><b>function</b> () {
+</code><code id="L3025"><span class="ln">3025</span> eve(<i>"clear"</i>, <b>this</b>);
+</code><code id="L3026"><span class="ln">3026</span> <b>var</b> c<span class="s"> = </span><b>this</b>.canvas;
+</code><code id="L3027"><span class="ln">3027</span> <b>while</b> (c.firstChild) {
+</code><code id="L3028"><span class="ln">3028</span> c.removeChild(c.firstChild);
+</code><code id="L3029"><span class="ln">3029</span> }
+</code><code id="L3030"><span class="ln">3030</span> <b>this</b>.bottom<span class="s"> = </span><b>this</b>.top<span class="s"> = </span><b>null</b>;
+</code><code id="L3031"><span class="ln">3031</span> (<b>this</b>.desc<span class="s"> = </span>$(<i>"desc"</i>)).appendChild(g.doc.createTextNode(<i>"Created <b>with</b> Rapha\xebl "</i><span class="s"> + </span>R.version));
+</code><code id="L3032"><span class="ln">3032</span> c.appendChild(<b>this</b>.desc);
+</code><code id="L3033"><span class="ln">3033</span> c.appendChild(<b>this</b>.defs<span class="s"> = </span>$(<i>"defs"</i>));
+</code><code id="L3034"><span class="ln">3034</span> };
+</code><code id="L3035"><span class="ln">3035</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L3036"><span class="ln">3036</span><span class="c"> <span class="s"> * </span>Paper.remove
+</span></code><code id="L3037"><span class="ln">3037</span><span class="c"> [ method ]
+</span></code><code id="L3038"><span class="ln">3038</span><span class="c"> **
+</span></code><code id="L3039"><span class="ln">3039</span><span class="c"> <span class="s"> * </span>Removes the paper from the DOM.
+</span></code><code id="L3040"><span class="ln">3040</span><span class="c"> \*/</span>
+</code><code id="L3041"><span class="ln">3041</span> paperproto.remove<span class="s"> = </span><b>function</b> () {
+</code><code id="L3042"><span class="ln">3042</span> eve(<i>"remove"</i>, <b>this</b>);
+</code><code id="L3043"><span class="ln">3043</span> <b>this</b>.canvas.parentNode<span class="s"> && </span><b>this</b>.canvas.parentNode.removeChild(<b>this</b>.canvas);
+</code><code id="L3044"><span class="ln">3044</span> <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>) {
+</code><code id="L3045"><span class="ln">3045</span> <b>this</b>[i]<span class="s"> = </span>removed(i);
+</code><code id="L3046"><span class="ln">3046</span> }
+</code><code id="L3047"><span class="ln">3047</span> };
+</code><code id="L3048"><span class="ln">3048</span> }
+</code><code id="L3049"><span class="ln">3049</span>
+</code><code id="L3050"><span class="ln">3050</span> <span class="c">// VML</span>
+</code><code id="L3051"><span class="ln">3051</span> <b>if</b> (R.vml) {
+</code><code id="L3052"><span class="ln">3052</span> <b>var</b> map<span class="s"> = </span>{M: <i>"m"</i>, L: <i>"l"</i>, C: <i>"c"</i>, Z: <i>"x"</i>, m: <i>"t"</i>, l: <i>"r"</i>, c: <i>"v"</i>, z: <i>"x"</i>},
+</code><code id="L3053"><span class="ln">3053</span> bites<span class="s"> = </span>/([clmz]),?([^clmz]*)/gi,
+</code><code id="L3054"><span class="ln">3054</span> blurregexp<span class="s"> = </span>/ progid:\S+Blur\([^\)]+\)/g,
+</code><code id="L3055"><span class="ln">3055</span> val<span class="s"> = </span>/-?[^,\s-]+/g,
+</code><code id="L3056"><span class="ln">3056</span> cssDot<span class="s"> = </span><i>"position:absolute;left:<span class="d">0</span>;top:<span class="d">0</span>;width:1px;height:1px"</i>,
+</code><code id="L3057"><span class="ln">3057</span> zoom<span class="s"> = </span><span class="d">21600</span>,
+</code><code id="L3058"><span class="ln">3058</span> pathTypes<span class="s"> = </span>{path: <span class="d">1</span>, rect: <span class="d">1</span>},
+</code><code id="L3059"><span class="ln">3059</span> ovalTypes<span class="s"> = </span>{circle: <span class="d">1</span>, ellipse: <span class="d">1</span>},
+</code><code id="L3060"><span class="ln">3060</span> path2vml<span class="s"> = </span><b>function</b> (path) {
+</code><code id="L3061"><span class="ln">3061</span> <b>var</b> total<span class="s"> = </span> /[ahqstv]/ig,
+</code><code id="L3062"><span class="ln">3062</span> command<span class="s"> = </span>pathToAbsolute;
+</code><code id="L3063"><span class="ln">3063</span> Str(path).match(total)<span class="s"> && </span>(command<span class="s"> = </span>path2curve);
+</code><code id="L3064"><span class="ln">3064</span> total<span class="s"> = </span>/[clmz]/g;
+</code><code id="L3065"><span class="ln">3065</span> <b>if</b> (command<span class="s"> == </span>pathToAbsolute<span class="s"> && </span>!Str(path).match(total)) {
+</code><code id="L3066"><span class="ln">3066</span> <b>var</b> res<span class="s"> = </span>Str(path).replace(bites, <b>function</b> (all, command, args) {
+</code><code id="L3067"><span class="ln">3067</span> <b>var</b> vals<span class="s"> = </span>[],
+</code><code id="L3068"><span class="ln">3068</span> isMove<span class="s"> = </span>lowerCase.call(command)<span class="s"> == </span><i>"m"</i>,
+</code><code id="L3069"><span class="ln">3069</span> res<span class="s"> = </span>map[command];
+</code><code id="L3070"><span class="ln">3070</span> args.replace(val, <b>function</b> (value) {
+</code><code id="L3071"><span class="ln">3071</span> <b>if</b> (isMove<span class="s"> && </span>vals.length<span class="s"> == </span><span class="d">2</span>) {
+</code><code id="L3072"><span class="ln">3072</span> res += vals<span class="s"> + </span>map[command<span class="s"> == </span><i>"m"</i> ? <i>"l"</i> : <i>"L"</i>];
+</code><code id="L3073"><span class="ln">3073</span> vals<span class="s"> = </span>[];
+</code><code id="L3074"><span class="ln">3074</span> }
+</code><code id="L3075"><span class="ln">3075</span> vals.push(round(value<span class="s"> * </span>zoom));
+</code><code id="L3076"><span class="ln">3076</span> });
+</code><code id="L3077"><span class="ln">3077</span> <b>return</b> res<span class="s"> + </span>vals;
+</code><code id="L3078"><span class="ln">3078</span> });
+</code><code id="L3079"><span class="ln">3079</span> <b>return</b> res;
+</code><code id="L3080"><span class="ln">3080</span> }
+</code><code id="L3081"><span class="ln">3081</span> <b>var</b> pa<span class="s"> = </span>command(path), p, r;
+</code><code id="L3082"><span class="ln">3082</span> res<span class="s"> = </span>[];
+</code><code id="L3083"><span class="ln">3083</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>pa.length; i < ii; i++) {
+</code><code id="L3084"><span class="ln">3084</span> p<span class="s"> = </span>pa[i];
+</code><code id="L3085"><span class="ln">3085</span> r<span class="s"> = </span>lowerCase.call(pa[i][<span class="d">0</span>]);
+</code><code id="L3086"><span class="ln">3086</span> r<span class="s"> == </span><i>"z"</i><span class="s"> && </span>(r<span class="s"> = </span><i>"x"</i>);
+</code><code id="L3087"><span class="ln">3087</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>p.length; j < jj; j++) {
+</code><code id="L3088"><span class="ln">3088</span> r += round(p[j]<span class="s"> * </span>zoom)<span class="s"> + </span>(j != jj<span class="s"> - </span><span class="d">1</span> ? <i>","</i> : E);
+</code><code id="L3089"><span class="ln">3089</span> }
+</code><code id="L3090"><span class="ln">3090</span> res.push(r);
+</code><code id="L3091"><span class="ln">3091</span> }
+</code><code id="L3092"><span class="ln">3092</span> <b>return</b> res.join(S);
+</code><code id="L3093"><span class="ln">3093</span> },
+</code><code id="L3094"><span class="ln">3094</span> compensation<span class="s"> = </span><b>function</b> (deg, dx, dy) {
+</code><code id="L3095"><span class="ln">3095</span> <b>var</b> m<span class="s"> = </span><b>new</b> Matrix;
+</code><code id="L3096"><span class="ln">3096</span> m.rotate(-deg, <span class="d">.5</span>, <span class="d">.5</span>);
+</code><code id="L3097"><span class="ln">3097</span> <b>return</b> {
+</code><code id="L3098"><span class="ln">3098</span> dx: m.x(dx, dy),
+</code><code id="L3099"><span class="ln">3099</span> dy: m.y(dx, dy)
+</code><code id="L3100"><span class="ln">3100</span> };
+</code><code id="L3101"><span class="ln">3101</span> },
+</code><code id="L3102"><span class="ln">3102</span> setCoords<span class="s"> = </span><b>function</b> (p) {
+</code><code id="L3103"><span class="ln">3103</span> <b>var</b> _<span class="s"> = </span>p._,
+</code><code id="L3104"><span class="ln">3104</span> sx<span class="s"> = </span>_.sx,
+</code><code id="L3105"><span class="ln">3105</span> sy<span class="s"> = </span>_.sy,
+</code><code id="L3106"><span class="ln">3106</span> deg<span class="s"> = </span>_.deg,
+</code><code id="L3107"><span class="ln">3107</span> dx<span class="s"> = </span>_.dx,
+</code><code id="L3108"><span class="ln">3108</span> dy<span class="s"> = </span>_.dy,
+</code><code id="L3109"><span class="ln">3109</span> fillpos<span class="s"> = </span>_.fillpos,
+</code><code id="L3110"><span class="ln">3110</span> o<span class="s"> = </span>p.node,
+</code><code id="L3111"><span class="ln">3111</span> s<span class="s"> = </span>o.style,
+</code><code id="L3112"><span class="ln">3112</span> y<span class="s"> = </span><span class="d">1</span>,
+</code><code id="L3113"><span class="ln">3113</span> m<span class="s"> = </span>p.matrix,
+</code><code id="L3114"><span class="ln">3114</span> flip<span class="s"> = </span><i>""</i>,
+</code><code id="L3115"><span class="ln">3115</span> dxdy,
+</code><code id="L3116"><span class="ln">3116</span> kx<span class="s"> = </span>zoom<span class="s"> / </span>sx,
+</code><code id="L3117"><span class="ln">3117</span> ky<span class="s"> = </span>zoom<span class="s"> / </span>sy;
+</code><code id="L3118"><span class="ln">3118</span> s.visibility<span class="s"> = </span><i>"hidden"</i>;
+</code><code id="L3119"><span class="ln">3119</span> o.coordsize<span class="s"> = </span>abs(kx)<span class="s"> + </span>S<span class="s"> + </span>abs(ky);
+</code><code id="L3120"><span class="ln">3120</span> s.rotation<span class="s"> = </span>deg<span class="s"> * </span>(sx<span class="s"> * </span>sy < <span class="d">0</span> ? -<span class="d">1</span> : <span class="d">1</span>);
+</code><code id="L3121"><span class="ln">3121</span> <b>if</b> (deg) {
+</code><code id="L3122"><span class="ln">3122</span> <b>var</b> c<span class="s"> = </span>compensation(deg, dx, dy);
+</code><code id="L3123"><span class="ln">3123</span> dx<span class="s"> = </span>c.dx;
+</code><code id="L3124"><span class="ln">3124</span> dy<span class="s"> = </span>c.dy;
+</code><code id="L3125"><span class="ln">3125</span> }
+</code><code id="L3126"><span class="ln">3126</span> sx < <span class="d">0</span><span class="s"> && </span>(flip += <i>"x"</i>);
+</code><code id="L3127"><span class="ln">3127</span> sy < <span class="d">0</span><span class="s"> && </span>(flip += <i>" y"</i>)<span class="s"> && </span>(y<span class="s"> = </span>-<span class="d">1</span>);
+</code><code id="L3128"><span class="ln">3128</span> s.flip<span class="s"> = </span>flip;
+</code><code id="L3129"><span class="ln">3129</span> o.coordorigin<span class="s"> = </span>(dx<span class="s"> * </span>-kx)<span class="s"> + </span>S<span class="s"> + </span>(dy<span class="s"> * </span>-ky);
+</code><code id="L3130"><span class="ln">3130</span> <b>if</b> (fillpos<span class="s"> || </span>_.fillsize) {
+</code><code id="L3131"><span class="ln">3131</span> <b>var</b> fill<span class="s"> = </span>o.getElementsByTagName(fillString);
+</code><code id="L3132"><span class="ln">3132</span> fill<span class="s"> = </span>fill<span class="s"> && </span>fill[<span class="d">0</span>];
+</code><code id="L3133"><span class="ln">3133</span> o.removeChild(fill);
+</code><code id="L3134"><span class="ln">3134</span> <b>if</b> (fillpos) {
+</code><code id="L3135"><span class="ln">3135</span> c<span class="s"> = </span>compensation(deg, m.x(fillpos[<span class="d">0</span>], fillpos[<span class="d">1</span>]), m.y(fillpos[<span class="d">0</span>], fillpos[<span class="d">1</span>]));
+</code><code id="L3136"><span class="ln">3136</span> fill.position<span class="s"> = </span>c.dx<span class="s"> * </span>y<span class="s"> + </span>S<span class="s"> + </span>c.dy<span class="s"> * </span>y;
+</code><code id="L3137"><span class="ln">3137</span> }
+</code><code id="L3138"><span class="ln">3138</span> <b>if</b> (_.fillsize) {
+</code><code id="L3139"><span class="ln">3139</span> fill.size<span class="s"> = </span>_.fillsize[<span class="d">0</span>]<span class="s"> * </span>abs(sx)<span class="s"> + </span>S<span class="s"> + </span>_.fillsize[<span class="d">1</span>]<span class="s"> * </span>abs(sy);
+</code><code id="L3140"><span class="ln">3140</span> }
+</code><code id="L3141"><span class="ln">3141</span> o.appendChild(fill);
+</code><code id="L3142"><span class="ln">3142</span> }
+</code><code id="L3143"><span class="ln">3143</span> s.visibility<span class="s"> = </span><i>"visible"</i>;
+</code><code id="L3144"><span class="ln">3144</span> };
+</code><code id="L3145"><span class="ln">3145</span> R.toString<span class="s"> = </span><b>function</b> () {
+</code><code id="L3146"><span class="ln">3146</span> <b>return</b> <i>"Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl "</i><span class="s"> + </span><b>this</b>.version;
+</code><code id="L3147"><span class="ln">3147</span> };
+</code><code id="L3148"><span class="ln">3148</span> addArrow<span class="s"> = </span><b>function</b> (o, value, isEnd) {
+</code><code id="L3149"><span class="ln">3149</span> <b>var</b> values<span class="s"> = </span>Str(value).toLowerCase().split(<i>"-"</i>),
+</code><code id="L3150"><span class="ln">3150</span> se<span class="s"> = </span>isEnd ? <i>"end"</i> : <i>"start"</i>,
+</code><code id="L3151"><span class="ln">3151</span> i<span class="s"> = </span>values.length,
+</code><code id="L3152"><span class="ln">3152</span> type<span class="s"> = </span><i>"classic"</i>,
+</code><code id="L3153"><span class="ln">3153</span> w<span class="s"> = </span><i>"medium"</i>,
+</code><code id="L3154"><span class="ln">3154</span> h<span class="s"> = </span><i>"medium"</i>;
+</code><code id="L3155"><span class="ln">3155</span> <b>while</b> (i--) {
+</code><code id="L3156"><span class="ln">3156</span> <b>switch</b> (values[i]) {
+</code><code id="L3157"><span class="ln">3157</span> <b>case</b> <i>"block"</i>:
+</code><code id="L3158"><span class="ln">3158</span> <b>case</b> <i>"classic"</i>:
+</code><code id="L3159"><span class="ln">3159</span> <b>case</b> <i>"oval"</i>:
+</code><code id="L3160"><span class="ln">3160</span> <b>case</b> <i>"diamond"</i>:
+</code><code id="L3161"><span class="ln">3161</span> <b>case</b> <i>"open"</i>:
+</code><code id="L3162"><span class="ln">3162</span> <b>case</b> <i>"none"</i>:
+</code><code id="L3163"><span class="ln">3163</span> type<span class="s"> = </span>values[i];
+</code><code id="L3164"><span class="ln">3164</span> <b>break</b>;
+</code><code id="L3165"><span class="ln">3165</span> <b>case</b> <i>"wide"</i>:
+</code><code id="L3166"><span class="ln">3166</span> <b>case</b> <i>"narrow"</i>: h<span class="s"> = </span>values[i]; <b>break</b>;
+</code><code id="L3167"><span class="ln">3167</span> <b>case</b> <i>"<b>long</b>"</i>:
+</code><code id="L3168"><span class="ln">3168</span> <b>case</b> <i>"<b>short</b>"</i>: w<span class="s"> = </span>values[i]; <b>break</b>;
+</code><code id="L3169"><span class="ln">3169</span> }
+</code><code id="L3170"><span class="ln">3170</span> }
+</code><code id="L3171"><span class="ln">3171</span> <b>var</b> stroke<span class="s"> = </span>o.node.getElementsByTagName(<i>"stroke"</i>)[<span class="d">0</span>];
+</code><code id="L3172"><span class="ln">3172</span> stroke[se<span class="s"> + </span><i>"arrow"</i>]<span class="s"> = </span>type;
+</code><code id="L3173"><span class="ln">3173</span> stroke[se<span class="s"> + </span><i>"arrowlength"</i>]<span class="s"> = </span>w;
+</code><code id="L3174"><span class="ln">3174</span> stroke[se<span class="s"> + </span><i>"arrowwidth"</i>]<span class="s"> = </span>h;
+</code><code id="L3175"><span class="ln">3175</span> };
+</code><code id="L3176"><span class="ln">3176</span> setFillAndStroke<span class="s"> = </span><b>function</b> (o, params) {
+</code><code id="L3177"><span class="ln">3177</span> o.paper.canvas.style.display<span class="s"> = </span><i>"none"</i>;
+</code><code id="L3178"><span class="ln">3178</span> o.attrs<span class="s"> = </span>o.attrs<span class="s"> || </span>{};
+</code><code id="L3179"><span class="ln">3179</span> <b>var</b> node<span class="s"> = </span>o.node,
+</code><code id="L3180"><span class="ln">3180</span> a<span class="s"> = </span>o.attrs,
+</code><code id="L3181"><span class="ln">3181</span> s<span class="s"> = </span>node.style,
+</code><code id="L3182"><span class="ln">3182</span> xy,
+</code><code id="L3183"><span class="ln">3183</span> newpath<span class="s"> = </span>pathTypes[o.type]<span class="s"> && </span>(params.x != a.x<span class="s"> || </span>params.y != a.y<span class="s"> || </span>params.width != a.width<span class="s"> || </span>params.height != a.height<span class="s"> || </span>params.cx != a.cx<span class="s"> || </span>params.cy != a.cy<span class="s"> || </span>params.rx != a.rx<span class="s"> || </span>params.ry != a.ry<span class="s"> || </span>params.r != a.r),
+</code><code id="L3184"><span class="ln">3184</span> isOval<span class="s"> = </span>ovalTypes[o.type]<span class="s"> && </span>(a.cx != params.cx<span class="s"> || </span>a.cy != params.cy<span class="s"> || </span>a.r != params.r<span class="s"> || </span>a.rx != params.rx<span class="s"> || </span>a.ry != params.ry),
+</code><code id="L3185"><span class="ln">3185</span> res<span class="s"> = </span>o;
+</code><code id="L3186"><span class="ln">3186</span>
+</code><code id="L3187"><span class="ln">3187</span>
+</code><code id="L3188"><span class="ln">3188</span> <b>for</b> (<b>var</b> par <b>in</b> params) <b>if</b> (params[has](par)) {
+</code><code id="L3189"><span class="ln">3189</span> a[par]<span class="s"> = </span>params[par];
+</code><code id="L3190"><span class="ln">3190</span> }
+</code><code id="L3191"><span class="ln">3191</span> <b>if</b> (newpath) {
+</code><code id="L3192"><span class="ln">3192</span> a.path<span class="s"> = </span>getPath[o.type](o);
+</code><code id="L3193"><span class="ln">3193</span> o._.dirty<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L3194"><span class="ln">3194</span> }
+</code><code id="L3195"><span class="ln">3195</span> params.href<span class="s"> && </span>(node.href<span class="s"> = </span>params.href);
+</code><code id="L3196"><span class="ln">3196</span> params.title<span class="s"> && </span>(node.title<span class="s"> = </span>params.title);
+</code><code id="L3197"><span class="ln">3197</span> params.target<span class="s"> && </span>(node.target<span class="s"> = </span>params.target);
+</code><code id="L3198"><span class="ln">3198</span> params.cursor<span class="s"> && </span>(s.cursor<span class="s"> = </span>params.cursor);
+</code><code id="L3199"><span class="ln">3199</span> <i>"blur"</i> <b>in</b> params<span class="s"> && </span>o.blur(params.blur);
+</code><code id="L3200"><span class="ln">3200</span> <i>"transform"</i> <b>in</b> params<span class="s"> && </span>o.transform(params.transform);
+</code><code id="L3201"><span class="ln">3201</span> <b>if</b> (params.path<span class="s"> && </span>o.type<span class="s"> == </span><i>"path"</i><span class="s"> || </span>newpath) {
+</code><code id="L3202"><span class="ln">3202</span> node.path<span class="s"> = </span>path2vml(a.path);
+</code><code id="L3203"><span class="ln">3203</span> }
+</code><code id="L3204"><span class="ln">3204</span> <b>if</b> (isOval) {
+</code><code id="L3205"><span class="ln">3205</span> <b>var</b> cx<span class="s"> = </span>a.cx,
+</code><code id="L3206"><span class="ln">3206</span> cy<span class="s"> = </span>a.cy,
+</code><code id="L3207"><span class="ln">3207</span> rx<span class="s"> = </span>a.rx<span class="s"> || </span>a.r<span class="s"> || </span><span class="d">0</span>,
+</code><code id="L3208"><span class="ln">3208</span> ry<span class="s"> = </span>a.ry<span class="s"> || </span>a.r<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L3209"><span class="ln">3209</span> node.path<span class="s"> = </span>R.format(<i>"ar{<span class="d">0</span>},{<span class="d">1</span>},{<span class="d">2</span>},{<span class="d">3</span>},{<span class="d">4</span>},{<span class="d">1</span>},{<span class="d">4</span>},{<span class="d">1</span>}x"</i>, round((cx<span class="s"> - </span>rx)<span class="s"> * </span>zoom), round((cy<span class="s"> - </span>ry)<span class="s"> * </span>zoom), round((cx<span class="s"> + </span>rx)<span class="s"> * </span>zoom), round((cy<span class="s"> + </span>ry)<span class="s"> * </span>zoom), round(cx<span class="s"> * </span>zoom));
</code><code id="L3210"><span class="ln">3210</span> }
-</code><code id="L3211"><span class="ln">3211</span> <b>if</b> (<i>"arrow-start"</i> <b>in</b> params) {
-</code><code id="L3212"><span class="ln">3212</span> addArrow(res, params[<i>"arrow-start"</i>]);
-</code><code id="L3213"><span class="ln">3213</span> }
-</code><code id="L3214"><span class="ln">3214</span> <b>if</b> (<i>"arrow-end"</i> <b>in</b> params) {
-</code><code id="L3215"><span class="ln">3215</span> addArrow(res, params[<i>"arrow-end"</i>], <span class="d">1</span>);
-</code><code id="L3216"><span class="ln">3216</span> }
-</code><code id="L3217"><span class="ln">3217</span> <b>if</b> (params.opacity != <b>null</b><span class="s"> || </span>
-</code><code id="L3218"><span class="ln">3218</span> params[<i>"stroke-width"</i>] != <b>null</b> ||
-</code><code id="L3219"><span class="ln">3219</span> params.fill != <b>null</b> ||
-</code><code id="L3220"><span class="ln">3220</span> params.src != <b>null</b> ||
-</code><code id="L3221"><span class="ln">3221</span> params.stroke != <b>null</b> ||
-</code><code id="L3222"><span class="ln">3222</span> params[<i>"stroke-width"</i>] != <b>null</b> ||
-</code><code id="L3223"><span class="ln">3223</span> params[<i>"stroke-opacity"</i>] != <b>null</b> ||
-</code><code id="L3224"><span class="ln">3224</span> params[<i>"fill-opacity"</i>] != <b>null</b> ||
-</code><code id="L3225"><span class="ln">3225</span> params[<i>"stroke-dasharray"</i>] != <b>null</b> ||
-</code><code id="L3226"><span class="ln">3226</span> params[<i>"stroke-miterlimit"</i>] != <b>null</b> ||
-</code><code id="L3227"><span class="ln">3227</span> params[<i>"stroke-linejoin"</i>] != <b>null</b> ||
-</code><code id="L3228"><span class="ln">3228</span> params[<i>"stroke-linecap"</i>] != <b>null</b>) {
-</code><code id="L3229"><span class="ln">3229</span> <b>var</b> fill<span class="s"> = </span>node.getElementsByTagName(fillString),
-</code><code id="L3230"><span class="ln">3230</span> newfill<span class="s"> = </span><b>false</b>;
-</code><code id="L3231"><span class="ln">3231</span> fill<span class="s"> = </span>fill<span class="s"> && </span>fill[<span class="d">0</span>];
-</code><code id="L3232"><span class="ln">3232</span> !fill<span class="s"> && </span>(newfill<span class="s"> = </span>fill<span class="s"> = </span>createNode(fillString));
-</code><code id="L3233"><span class="ln">3233</span> <b>if</b> (o.type<span class="s"> == </span><i>"image"</i><span class="s"> && </span>params.src) {
-</code><code id="L3234"><span class="ln">3234</span> fill.src<span class="s"> = </span>params.src;
-</code><code id="L3235"><span class="ln">3235</span> }
-</code><code id="L3236"><span class="ln">3236</span> <b>if</b> (<i>"fill-opacity"</i> <b>in</b> params<span class="s"> || </span><i>"opacity"</i> <b>in</b> params) {
-</code><code id="L3237"><span class="ln">3237</span> <b>var</b> opacity<span class="s"> = </span>((+a[<i>"fill-opacity"</i>]<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>)<span class="s"> * </span>((+a.opacity<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>)<span class="s"> * </span>((+R.getRGB(params.fill).o<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>);
-</code><code id="L3238"><span class="ln">3238</span> opacity<span class="s"> = </span>mmin(mmax(opacity, <span class="d">0</span>), <span class="d">1</span>);
-</code><code id="L3239"><span class="ln">3239</span> fill.opacity<span class="s"> = </span>opacity;
-</code><code id="L3240"><span class="ln">3240</span> }
-</code><code id="L3241"><span class="ln">3241</span> params.fill<span class="s"> && </span>(fill.on<span class="s"> = </span><b>true</b>);
-</code><code id="L3242"><span class="ln">3242</span> <b>if</b> (fill.on<span class="s"> == </span><b>null</b><span class="s"> || </span>params.fill<span class="s"> == </span><i>"none"</i><span class="s"> || </span>params.fill<span class="s"> === </span><b>null</b>) {
-</code><code id="L3243"><span class="ln">3243</span> fill.on<span class="s"> = </span><b>false</b>;
-</code><code id="L3244"><span class="ln">3244</span> }
-</code><code id="L3245"><span class="ln">3245</span> <b>if</b> (fill.on<span class="s"> && </span>params.fill) {
-</code><code id="L3246"><span class="ln">3246</span> <b>var</b> isURL<span class="s"> = </span>params.fill.match(ISURL);
-</code><code id="L3247"><span class="ln">3247</span> <b>if</b> (isURL) {
-</code><code id="L3248"><span class="ln">3248</span> fill.parentNode<span class="s"> == </span>node<span class="s"> && </span>node.removeChild(fill);
-</code><code id="L3249"><span class="ln">3249</span> fill.rotate<span class="s"> = </span><b>true</b>;
-</code><code id="L3250"><span class="ln">3250</span> fill.src<span class="s"> = </span>isURL[<span class="d">1</span>];
-</code><code id="L3251"><span class="ln">3251</span> fill.type<span class="s"> = </span><i>"tile"</i>;
-</code><code id="L3252"><span class="ln">3252</span> <b>var</b> bbox<span class="s"> = </span>o.getBBox(<span class="d">1</span>);
-</code><code id="L3253"><span class="ln">3253</span> fill.position<span class="s"> = </span>bbox.x<span class="s"> + </span>S<span class="s"> + </span>bbox.y;
-</code><code id="L3254"><span class="ln">3254</span> o._.fillpos<span class="s"> = </span>[bbox.x, bbox.y];
-</code><code id="L3255"><span class="ln">3255</span>
-</code><code id="L3256"><span class="ln">3256</span> preload(isURL[<span class="d">1</span>], <b>function</b> () {
-</code><code id="L3257"><span class="ln">3257</span> o._.fillsize<span class="s"> = </span>[<b>this</b>.offsetWidth, <b>this</b>.offsetHeight];
-</code><code id="L3258"><span class="ln">3258</span> });
-</code><code id="L3259"><span class="ln">3259</span> } <b>else</b> {
-</code><code id="L3260"><span class="ln">3260</span> fill.color<span class="s"> = </span>R.getRGB(params.fill).hex;
-</code><code id="L3261"><span class="ln">3261</span> fill.src<span class="s"> = </span>E;
-</code><code id="L3262"><span class="ln">3262</span> fill.type<span class="s"> = </span><i>"solid"</i>;
-</code><code id="L3263"><span class="ln">3263</span> <b>if</b> (R.getRGB(params.fill).error<span class="s"> && </span>(res.type <b>in</b> {circle: <span class="d">1</span>, ellipse: <span class="d">1</span>}<span class="s"> || </span>Str(params.fill).charAt() != <i>"r"</i>)<span class="s"> && </span>addGradientFill(res, params.fill, fill)) {
-</code><code id="L3264"><span class="ln">3264</span> a.fill<span class="s"> = </span><i>"none"</i>;
-</code><code id="L3265"><span class="ln">3265</span> a.gradient<span class="s"> = </span>params.fill;
-</code><code id="L3266"><span class="ln">3266</span> fill.rotate<span class="s"> = </span><b>false</b>;
-</code><code id="L3267"><span class="ln">3267</span> }
-</code><code id="L3268"><span class="ln">3268</span> }
-</code><code id="L3269"><span class="ln">3269</span> }
-</code><code id="L3270"><span class="ln">3270</span> node.appendChild(fill);
-</code><code id="L3271"><span class="ln">3271</span> <b>var</b> stroke<span class="s"> = </span>(node.getElementsByTagName(<i>"stroke"</i>)<span class="s"> && </span>node.getElementsByTagName(<i>"stroke"</i>)[<span class="d">0</span>]),
-</code><code id="L3272"><span class="ln">3272</span> newstroke<span class="s"> = </span><b>false</b>;
-</code><code id="L3273"><span class="ln">3273</span> !stroke<span class="s"> && </span>(newstroke<span class="s"> = </span>stroke<span class="s"> = </span>createNode(<i>"stroke"</i>));
-</code><code id="L3274"><span class="ln">3274</span> <b>if</b> ((params.stroke<span class="s"> && </span>params.stroke != <i>"none"</i>) ||
-</code><code id="L3275"><span class="ln">3275</span> params[<i>"stroke-width"</i>] ||
-</code><code id="L3276"><span class="ln">3276</span> params[<i>"stroke-opacity"</i>] != <b>null</b> ||
-</code><code id="L3277"><span class="ln">3277</span> params[<i>"stroke-dasharray"</i>] ||
-</code><code id="L3278"><span class="ln">3278</span> params[<i>"stroke-miterlimit"</i>] ||
-</code><code id="L3279"><span class="ln">3279</span> params[<i>"stroke-linejoin"</i>] ||
-</code><code id="L3280"><span class="ln">3280</span> params[<i>"stroke-linecap"</i>]) {
-</code><code id="L3281"><span class="ln">3281</span> stroke.on<span class="s"> = </span><b>true</b>;
-</code><code id="L3282"><span class="ln">3282</span> }
-</code><code id="L3283"><span class="ln">3283</span> (params.stroke<span class="s"> == </span><i>"none"</i><span class="s"> || </span>params.stroke<span class="s"> === </span><b>null</b><span class="s"> || </span>stroke.on<span class="s"> == </span><b>null</b><span class="s"> || </span>params.stroke<span class="s"> == </span><span class="d">0</span><span class="s"> || </span>params[<i>"stroke-width"</i>]<span class="s"> == </span><span class="d">0</span>)<span class="s"> && </span>(stroke.on<span class="s"> = </span><b>false</b>);
-</code><code id="L3284"><span class="ln">3284</span> <b>var</b> strokeColor<span class="s"> = </span>R.getRGB(params.stroke);
-</code><code id="L3285"><span class="ln">3285</span> stroke.on<span class="s"> && </span>params.stroke<span class="s"> && </span>(stroke.color<span class="s"> = </span>strokeColor.hex);
-</code><code id="L3286"><span class="ln">3286</span> opacity<span class="s"> = </span>((+a[<i>"stroke-opacity"</i>]<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>)<span class="s"> * </span>((+a.opacity<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>)<span class="s"> * </span>((+strokeColor.o<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>);
-</code><code id="L3287"><span class="ln">3287</span> <b>var</b> width<span class="s"> = </span>(toFloat(params[<i>"stroke-width"</i>])<span class="s"> || </span><span class="d">1</span>)<span class="s"> * </span><span class="d">.75</span>;
-</code><code id="L3288"><span class="ln">3288</span> opacity<span class="s"> = </span>mmin(mmax(opacity, <span class="d">0</span>), <span class="d">1</span>);
-</code><code id="L3289"><span class="ln">3289</span> params[<i>"stroke-width"</i>]<span class="s"> == </span><b>null</b><span class="s"> && </span>(width<span class="s"> = </span>a[<i>"stroke-width"</i>]);
-</code><code id="L3290"><span class="ln">3290</span> params[<i>"stroke-width"</i>]<span class="s"> && </span>(stroke.weight<span class="s"> = </span>width);
-</code><code id="L3291"><span class="ln">3291</span> width<span class="s"> && </span>width < <span class="d">1</span><span class="s"> && </span>(opacity *= width)<span class="s"> && </span>(stroke.weight<span class="s"> = </span><span class="d">1</span>);
-</code><code id="L3292"><span class="ln">3292</span> stroke.opacity<span class="s"> = </span>opacity;
-</code><code id="L3293"><span class="ln">3293</span>
-</code><code id="L3294"><span class="ln">3294</span> params[<i>"stroke-linejoin"</i>]<span class="s"> && </span>(stroke.joinstyle<span class="s"> = </span>params[<i>"stroke-linejoin"</i>]<span class="s"> || </span><i>"miter"</i>);
-</code><code id="L3295"><span class="ln">3295</span> stroke.miterlimit<span class="s"> = </span>params[<i>"stroke-miterlimit"</i>]<span class="s"> || </span><span class="d">8</span>;
-</code><code id="L3296"><span class="ln">3296</span> params[<i>"stroke-linecap"</i>]<span class="s"> && </span>(stroke.endcap<span class="s"> = </span>params[<i>"stroke-linecap"</i>]<span class="s"> == </span><i>"butt"</i> ? <i>"flat"</i> : params[<i>"stroke-linecap"</i>]<span class="s"> == </span><i>"square"</i> ? <i>"square"</i> : <i>"round"</i>);
-</code><code id="L3297"><span class="ln">3297</span> <b>if</b> (params[<i>"stroke-dasharray"</i>]) {
-</code><code id="L3298"><span class="ln">3298</span> <b>var</b> dasharray<span class="s"> = </span>{
-</code><code id="L3299"><span class="ln">3299</span> <i>"-"</i>: <i>"shortdash"</i>,
-</code><code id="L3300"><span class="ln">3300</span> <i>"."</i>: <i>"shortdot"</i>,
-</code><code id="L3301"><span class="ln">3301</span> <i>"-."</i>: <i>"shortdashdot"</i>,
-</code><code id="L3302"><span class="ln">3302</span> <i>"-.."</i>: <i>"shortdashdotdot"</i>,
-</code><code id="L3303"><span class="ln">3303</span> <i>". "</i>: <i>"dot"</i>,
-</code><code id="L3304"><span class="ln">3304</span> <i>"- "</i>: <i>"dash"</i>,
-</code><code id="L3305"><span class="ln">3305</span> <i>"--"</i>: <i>"longdash"</i>,
-</code><code id="L3306"><span class="ln">3306</span> <i>"- ."</i>: <i>"dashdot"</i>,
-</code><code id="L3307"><span class="ln">3307</span> <i>"--."</i>: <i>"longdashdot"</i>,
-</code><code id="L3308"><span class="ln">3308</span> <i>"--.."</i>: <i>"longdashdotdot"</i>
-</code><code id="L3309"><span class="ln">3309</span> };
-</code><code id="L3310"><span class="ln">3310</span> stroke.dashstyle<span class="s"> = </span>dasharray[has](params[<i>"stroke-dasharray"</i>]) ? dasharray[params[<i>"stroke-dasharray"</i>]] : E;
-</code><code id="L3311"><span class="ln">3311</span> }
-</code><code id="L3312"><span class="ln">3312</span> newstroke<span class="s"> && </span>node.appendChild(stroke);
-</code><code id="L3313"><span class="ln">3313</span> }
-</code><code id="L3314"><span class="ln">3314</span> <b>if</b> (res.type<span class="s"> == </span><i>"text"</i>) {
-</code><code id="L3315"><span class="ln">3315</span> res.paper.canvas.style.display<span class="s"> = </span>E;
-</code><code id="L3316"><span class="ln">3316</span> <b>var</b> span<span class="s"> = </span>res.paper.span,
-</code><code id="L3317"><span class="ln">3317</span> m<span class="s"> = </span><span class="d">100</span>,
-</code><code id="L3318"><span class="ln">3318</span> fontSize<span class="s"> = </span>a.font<span class="s"> && </span>a.font.match(/\d+(?:\.\d*)?(?=px)/);
-</code><code id="L3319"><span class="ln">3319</span> s<span class="s"> = </span>span.style;
-</code><code id="L3320"><span class="ln">3320</span> a.font<span class="s"> && </span>(s.font<span class="s"> = </span>a.font);
-</code><code id="L3321"><span class="ln">3321</span> a[<i>"font-family"</i>]<span class="s"> && </span>(s.fontFamily<span class="s"> = </span>a[<i>"font-family"</i>]);
-</code><code id="L3322"><span class="ln">3322</span> a[<i>"font-weight"</i>]<span class="s"> && </span>(s.fontWeight<span class="s"> = </span>a[<i>"font-weight"</i>]);
-</code><code id="L3323"><span class="ln">3323</span> a[<i>"font-style"</i>]<span class="s"> && </span>(s.fontStyle<span class="s"> = </span>a[<i>"font-style"</i>]);
-</code><code id="L3324"><span class="ln">3324</span> fontSize<span class="s"> = </span>toFloat(fontSize ? fontSize[<span class="d">0</span>] : a[<i>"font-size"</i>]);
-</code><code id="L3325"><span class="ln">3325</span> s.fontSize<span class="s"> = </span>fontSize<span class="s"> * </span>m<span class="s"> + </span><i>"px"</i>;
-</code><code id="L3326"><span class="ln">3326</span> res.textpath.string<span class="s"> && </span>(span.innerHTML<span class="s"> = </span>Str(res.textpath.string).replace(/</g, <i>"&#<span class="d">60</span>;"</i>).replace(/&/g, <i>"&#<span class="d">38</span>;"</i>).replace(/\n/g, <i>"<br>"</i>));
-</code><code id="L3327"><span class="ln">3327</span> <b>var</b> brect<span class="s"> = </span>span.getBoundingClientRect();
-</code><code id="L3328"><span class="ln">3328</span> res.W<span class="s"> = </span>a.w<span class="s"> = </span>(brect.right<span class="s"> - </span>brect.left)<span class="s"> / </span>m;
-</code><code id="L3329"><span class="ln">3329</span> res.H<span class="s"> = </span>a.h<span class="s"> = </span>(brect.bottom<span class="s"> - </span>brect.top)<span class="s"> / </span>m;
-</code><code id="L3330"><span class="ln">3330</span> res.paper.canvas.style.display<span class="s"> = </span><i>"none"</i>;
-</code><code id="L3331"><span class="ln">3331</span> res.X<span class="s"> = </span>a.x;
-</code><code id="L3332"><span class="ln">3332</span> res.Y<span class="s"> = </span>a.y<span class="s"> + </span>res.H<span class="s"> / </span><span class="d">2</span>;
-</code><code id="L3333"><span class="ln">3333</span>
-</code><code id="L3334"><span class="ln">3334</span> (<i>"x"</i> <b>in</b> params<span class="s"> || </span><i>"y"</i> <b>in</b> params)<span class="s"> && </span>(res.path.v<span class="s"> = </span>R.format(<i>"m{<span class="d">0</span>},{<span class="d">1</span>}l{<span class="d">2</span>},{<span class="d">1</span>}"</i>, round(a.x<span class="s"> * </span>zoom), round(a.y<span class="s"> * </span>zoom), round(a.x<span class="s"> * </span>zoom)<span class="s"> + </span><span class="d">1</span>));
-</code><code id="L3335"><span class="ln">3335</span> <b>var</b> dirtyattrs<span class="s"> = </span>[<i>"x"</i>, <i>"y"</i>, <i>"text"</i>, <i>"font"</i>, <i>"font-family"</i>, <i>"font-weight"</i>, <i>"font-style"</i>, <i>"font-size"</i>];
-</code><code id="L3336"><span class="ln">3336</span> <b>for</b> (<b>var</b> d<span class="s"> = </span><span class="d">0</span>, dd<span class="s"> = </span>dirtyattrs.length; d < dd; d++) <b>if</b> (dirtyattrs[d] <b>in</b> params) {
-</code><code id="L3337"><span class="ln">3337</span> res._.dirty<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L3338"><span class="ln">3338</span> <b>break</b>;
-</code><code id="L3339"><span class="ln">3339</span> }
-</code><code id="L3340"><span class="ln">3340</span>
-</code><code id="L3341"><span class="ln">3341</span> <span class="c">// text-anchor emulation</span>
-</code><code id="L3342"><span class="ln">3342</span> <b>switch</b> (a[<i>"text-anchor"</i>]) {
-</code><code id="L3343"><span class="ln">3343</span> <b>case</b> <i>"start"</i>:
-</code><code id="L3344"><span class="ln">3344</span> res.textpath.style[<i>"v-text-align"</i>]<span class="s"> = </span><i>"left"</i>;
-</code><code id="L3345"><span class="ln">3345</span> res.bbx<span class="s"> = </span>res.W<span class="s"> / </span><span class="d">2</span>;
-</code><code id="L3346"><span class="ln">3346</span> <b>break</b>;
-</code><code id="L3347"><span class="ln">3347</span> <b>case</b> <i>"end"</i>:
-</code><code id="L3348"><span class="ln">3348</span> res.textpath.style[<i>"v-text-align"</i>]<span class="s"> = </span><i>"right"</i>;
-</code><code id="L3349"><span class="ln">3349</span> res.bbx<span class="s"> = </span>-res.W<span class="s"> / </span><span class="d">2</span>;
-</code><code id="L3350"><span class="ln">3350</span> <b>break</b>;
-</code><code id="L3351"><span class="ln">3351</span> <b>default</b>:
-</code><code id="L3352"><span class="ln">3352</span> res.textpath.style[<i>"v-text-align"</i>]<span class="s"> = </span><i>"center"</i>;
-</code><code id="L3353"><span class="ln">3353</span> res.bbx<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L3354"><span class="ln">3354</span> <b>break</b>;
-</code><code id="L3355"><span class="ln">3355</span> }
-</code><code id="L3356"><span class="ln">3356</span> res.textpath.style[<i>"v-text-kern"</i>]<span class="s"> = </span><b>true</b>;
-</code><code id="L3357"><span class="ln">3357</span> }
-</code><code id="L3358"><span class="ln">3358</span> res.paper.canvas.style.display<span class="s"> = </span>E;
-</code><code id="L3359"><span class="ln">3359</span> };
-</code><code id="L3360"><span class="ln">3360</span> addGradientFill<span class="s"> = </span><b>function</b> (o, gradient, fill) {
-</code><code id="L3361"><span class="ln">3361</span> o.attrs<span class="s"> = </span>o.attrs<span class="s"> || </span>{};
-</code><code id="L3362"><span class="ln">3362</span> <b>var</b> attrs<span class="s"> = </span>o.attrs,
-</code><code id="L3363"><span class="ln">3363</span> type<span class="s"> = </span><i>"linear"</i>,
-</code><code id="L3364"><span class="ln">3364</span> fxfy<span class="s"> = </span><i>"<span class="d">.5</span> <span class="d">.5</span>"</i>;
-</code><code id="L3365"><span class="ln">3365</span> o.attrs.gradient<span class="s"> = </span>gradient;
-</code><code id="L3366"><span class="ln">3366</span> gradient<span class="s"> = </span>Str(gradient).replace(radial_gradient, <b>function</b> (all, fx, fy) {
-</code><code id="L3367"><span class="ln">3367</span> type<span class="s"> = </span><i>"radial"</i>;
-</code><code id="L3368"><span class="ln">3368</span> <b>if</b> (fx<span class="s"> && </span>fy) {
-</code><code id="L3369"><span class="ln">3369</span> fx<span class="s"> = </span>toFloat(fx);
-</code><code id="L3370"><span class="ln">3370</span> fy<span class="s"> = </span>toFloat(fy);
-</code><code id="L3371"><span class="ln">3371</span> pow(fx<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>)<span class="s"> + </span>pow(fy<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>) > <span class="d">.25</span><span class="s"> && </span>(fy<span class="s"> = </span>math.sqrt(<span class="d">.25</span><span class="s"> - </span>pow(fx<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>))<span class="s"> * </span>((fy > <span class="d">.5</span>)<span class="s"> * </span><span class="d">2</span><span class="s"> - </span><span class="d">1</span>)<span class="s"> + </span><span class="d">.5</span>);
-</code><code id="L3372"><span class="ln">3372</span> fxfy<span class="s"> = </span>fx<span class="s"> + </span>S<span class="s"> + </span>fy;
-</code><code id="L3373"><span class="ln">3373</span> }
-</code><code id="L3374"><span class="ln">3374</span> <b>return</b> E;
-</code><code id="L3375"><span class="ln">3375</span> });
-</code><code id="L3376"><span class="ln">3376</span> gradient<span class="s"> = </span>gradient.split(/\s*\-\s*/);
-</code><code id="L3377"><span class="ln">3377</span> <b>if</b> (type<span class="s"> == </span><i>"linear"</i>) {
-</code><code id="L3378"><span class="ln">3378</span> <b>var</b> angle<span class="s"> = </span>gradient.shift();
-</code><code id="L3379"><span class="ln">3379</span> angle<span class="s"> = </span>-toFloat(angle);
-</code><code id="L3380"><span class="ln">3380</span> <b>if</b> (isNaN(angle)) {
-</code><code id="L3381"><span class="ln">3381</span> <b>return</b> <b>null</b>;
-</code><code id="L3382"><span class="ln">3382</span> }
-</code><code id="L3383"><span class="ln">3383</span> }
-</code><code id="L3384"><span class="ln">3384</span> <b>var</b> dots<span class="s"> = </span>parseDots(gradient);
-</code><code id="L3385"><span class="ln">3385</span> <b>if</b> (!dots) {
-</code><code id="L3386"><span class="ln">3386</span> <b>return</b> <b>null</b>;
-</code><code id="L3387"><span class="ln">3387</span> }
-</code><code id="L3388"><span class="ln">3388</span> o<span class="s"> = </span>o.shape<span class="s"> || </span>o.node;
-</code><code id="L3389"><span class="ln">3389</span> <b>if</b> (dots.length) {
-</code><code id="L3390"><span class="ln">3390</span> o.removeChild(fill);
-</code><code id="L3391"><span class="ln">3391</span> fill.on<span class="s"> = </span><b>true</b>;
-</code><code id="L3392"><span class="ln">3392</span> fill.method<span class="s"> = </span><i>"none"</i>;
-</code><code id="L3393"><span class="ln">3393</span> fill.color<span class="s"> = </span>dots[<span class="d">0</span>].color;
-</code><code id="L3394"><span class="ln">3394</span> fill.color2<span class="s"> = </span>dots[dots.length<span class="s"> - </span><span class="d">1</span>].color;
-</code><code id="L3395"><span class="ln">3395</span> <b>var</b> clrs<span class="s"> = </span>[];
-</code><code id="L3396"><span class="ln">3396</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>dots.length; i < ii; i++) {
-</code><code id="L3397"><span class="ln">3397</span> dots[i].offset<span class="s"> && </span>clrs.push(dots[i].offset<span class="s"> + </span>S<span class="s"> + </span>dots[i].color);
-</code><code id="L3398"><span class="ln">3398</span> }
-</code><code id="L3399"><span class="ln">3399</span> fill.colors<span class="s"> && </span>(fill.colors.value<span class="s"> = </span>clrs.length ? clrs.join() : <i>"<span class="d">0</span>% "</i><span class="s"> + </span>fill.color);
-</code><code id="L3400"><span class="ln">3400</span> <b>if</b> (type<span class="s"> == </span><i>"radial"</i>) {
-</code><code id="L3401"><span class="ln">3401</span> fill.type<span class="s"> = </span><i>"gradientTitle"</i>;
-</code><code id="L3402"><span class="ln">3402</span> fill.focus<span class="s"> = </span><i>"<span class="d">100</span>%"</i>;
-</code><code id="L3403"><span class="ln">3403</span> fill.focussize<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span>"</i>;
-</code><code id="L3404"><span class="ln">3404</span> fill.focusposition<span class="s"> = </span>fxfy;
-</code><code id="L3405"><span class="ln">3405</span> fill.angle<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L3406"><span class="ln">3406</span> } <b>else</b> {
-</code><code id="L3407"><span class="ln">3407</span> <span class="c">// fill.rotate= <b>true</b>;</span>
-</code><code id="L3408"><span class="ln">3408</span> fill.type<span class="s"> = </span><i>"gradient"</i>;
-</code><code id="L3409"><span class="ln">3409</span> fill.angle<span class="s"> = </span>(<span class="d">270</span><span class="s"> - </span>angle)<span class="s"> % </span><span class="d">360</span>;
-</code><code id="L3410"><span class="ln">3410</span> }
-</code><code id="L3411"><span class="ln">3411</span> o.appendChild(fill);
-</code><code id="L3412"><span class="ln">3412</span> <span class="c">// alert(fill.outerHTML);</span>
-</code><code id="L3413"><span class="ln">3413</span> }
-</code><code id="L3414"><span class="ln">3414</span> <b>return</b> <span class="d">1</span>;
-</code><code id="L3415"><span class="ln">3415</span> };
-</code><code id="L3416"><span class="ln">3416</span> Element<span class="s"> = </span><b>function</b> (node, vml) {
-</code><code id="L3417"><span class="ln">3417</span> <b>this</b>[<span class="d">0</span>]<span class="s"> = </span><b>this</b>.node<span class="s"> = </span>node;
-</code><code id="L3418"><span class="ln">3418</span> node.raphael<span class="s"> = </span><b>true</b>;
-</code><code id="L3419"><span class="ln">3419</span> <b>this</b>.id<span class="s"> = </span>R._oid++;
-</code><code id="L3420"><span class="ln">3420</span> node.raphaelid<span class="s"> = </span><b>this</b>.id;
-</code><code id="L3421"><span class="ln">3421</span> <b>this</b>.X<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L3422"><span class="ln">3422</span> <b>this</b>.Y<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L3423"><span class="ln">3423</span> <b>this</b>.attrs<span class="s"> = </span>{};
-</code><code id="L3424"><span class="ln">3424</span> <b>this</b>.paper<span class="s"> = </span>vml;
-</code><code id="L3425"><span class="ln">3425</span> <b>this</b>.matrix<span class="s"> = </span><b>new</b> Matrix;
-</code><code id="L3426"><span class="ln">3426</span> <b>this</b>._<span class="s"> = </span>{
-</code><code id="L3427"><span class="ln">3427</span> transform: [],
-</code><code id="L3428"><span class="ln">3428</span> sx: <span class="d">1</span>,
-</code><code id="L3429"><span class="ln">3429</span> sy: <span class="d">1</span>,
-</code><code id="L3430"><span class="ln">3430</span> dx: <span class="d">0</span>,
-</code><code id="L3431"><span class="ln">3431</span> dy: <span class="d">0</span>,
-</code><code id="L3432"><span class="ln">3432</span> deg: <span class="d">0</span>,
-</code><code id="L3433"><span class="ln">3433</span> dirty: <span class="d">1</span>,
-</code><code id="L3434"><span class="ln">3434</span> dirtyT: <span class="d">1</span>
-</code><code id="L3435"><span class="ln">3435</span> };
-</code><code id="L3436"><span class="ln">3436</span> !vml.bottom<span class="s"> && </span>(vml.bottom<span class="s"> = </span><b>this</b>);
-</code><code id="L3437"><span class="ln">3437</span> <b>this</b>.prev<span class="s"> = </span>vml.top;
-</code><code id="L3438"><span class="ln">3438</span> vml.top<span class="s"> && </span>(vml.top.next<span class="s"> = </span><b>this</b>);
-</code><code id="L3439"><span class="ln">3439</span> vml.top<span class="s"> = </span><b>this</b>;
-</code><code id="L3440"><span class="ln">3440</span> <b>this</b>.next<span class="s"> = </span><b>null</b>;
-</code><code id="L3441"><span class="ln">3441</span> };
-</code><code id="L3442"><span class="ln">3442</span> elproto<span class="s"> = </span>Element.prototype;
-</code><code id="L3443"><span class="ln">3443</span> elproto.transform<span class="s"> = </span><b>function</b> (tstr) {
-</code><code id="L3444"><span class="ln">3444</span> <b>if</b> (tstr<span class="s"> == </span><b>null</b>) {
-</code><code id="L3445"><span class="ln">3445</span> <b>return</b> <b>this</b>._.transform;
-</code><code id="L3446"><span class="ln">3446</span> }
-</code><code id="L3447"><span class="ln">3447</span> extractTransform(<b>this</b>, tstr);
-</code><code id="L3448"><span class="ln">3448</span> <b>var</b> matrix<span class="s"> = </span><b>this</b>.matrix.clone(),
-</code><code id="L3449"><span class="ln">3449</span> skew<span class="s"> = </span><b>this</b>.skew;
-</code><code id="L3450"><span class="ln">3450</span> matrix.translate(-<span class="d">.5</span>, -<span class="d">.5</span>);
-</code><code id="L3451"><span class="ln">3451</span> <b>if</b> (<b>this</b>.type<span class="s"> == </span><i>"image"</i>) {
-</code><code id="L3452"><span class="ln">3452</span> <b>if</b> (Str(tstr).indexOf(<i>"m"</i>)<span class="s"> + </span><span class="d">1</span>) {
-</code><code id="L3453"><span class="ln">3453</span> <b>this</b>.node.style.filter<span class="s"> = </span>matrix.toFilter();
-</code><code id="L3454"><span class="ln">3454</span> <b>var</b> bb<span class="s"> = </span><b>this</b>.getBBox(),
-</code><code id="L3455"><span class="ln">3455</span> bbt<span class="s"> = </span><b>this</b>.getBBox(<span class="d">1</span>),
-</code><code id="L3456"><span class="ln">3456</span> im<span class="s"> = </span>matrix.invert(),
-</code><code id="L3457"><span class="ln">3457</span> dx<span class="s"> = </span>im.x(bb.x, bb.y)<span class="s"> - </span>im.x(bbt.x, bbt.y),
-</code><code id="L3458"><span class="ln">3458</span> dy<span class="s"> = </span>im.y(bb.x, bb.y)<span class="s"> - </span>im.y(bbt.x, bbt.y);
-</code><code id="L3459"><span class="ln">3459</span> <span class="c">// skew.offset<span class="s"> = </span>dx<span class="s"> + </span>S<span class="s"> + </span>dy;</span>
-</code><code id="L3460"><span class="ln">3460</span> <span class="c">// <b>this</b>.node.getElementsByTagName(fillString)[<span class="d">0</span>].position<span class="s"> = </span>skew.offset;</span>
-</code><code id="L3461"><span class="ln">3461</span> } <b>else</b> {
-</code><code id="L3462"><span class="ln">3462</span> <b>this</b>.node.style.filter<span class="s"> = </span>E;
-</code><code id="L3463"><span class="ln">3463</span> setCoords(<b>this</b>);
-</code><code id="L3464"><span class="ln">3464</span> }
-</code><code id="L3465"><span class="ln">3465</span> } <b>else</b> {
-</code><code id="L3466"><span class="ln">3466</span> <span class="c">// o<span class="s"> = </span><b>this</b>.node,</span>
-</code><code id="L3467"><span class="ln">3467</span> <span class="c">// _<span class="s"> = </span><b>this</b>._,</span>
-</code><code id="L3468"><span class="ln">3468</span> <span class="c">// fillpos<span class="s"> = </span>_.fillpos,</span>
-</code><code id="L3469"><span class="ln">3469</span> <span class="c">// deg,</span>
-</code><code id="L3470"><span class="ln">3470</span> <span class="c">// matrix<span class="s"> = </span><b>this</b>.matrix;</span>
-</code><code id="L3471"><span class="ln">3471</span> <span class="c">// fill<span class="s"> = </span>o.getElementsByTagName(fillString)[<span class="d">0</span>],</span>
-</code><code id="L3472"><span class="ln">3472</span> <span class="c">// angle<span class="s"> = </span>fill.angle;</span>
-</code><code id="L3473"><span class="ln">3473</span>
-</code><code id="L3474"><span class="ln">3474</span> <b>this</b>.node.style.filter<span class="s"> = </span>E;
-</code><code id="L3475"><span class="ln">3475</span> skew.matrix<span class="s"> = </span>matrix;
-</code><code id="L3476"><span class="ln">3476</span> skew.offset<span class="s"> = </span>matrix.offset();
-</code><code id="L3477"><span class="ln">3477</span>
-</code><code id="L3478"><span class="ln">3478</span> <span class="c">// <b>if</b> (<span class="d">0</span>&&angle) {</span>
-</code><code id="L3479"><span class="ln">3479</span> <span class="c">// angle<span class="s"> = </span>R.rad(<span class="d">270</span><span class="s"> - </span>angle);</span>
-</code><code id="L3480"><span class="ln">3480</span> <span class="c">// <b>var</b> dx<span class="s"> = </span><span class="d">100</span><span class="s"> * </span>math.cos(angle),</span>
-</code><code id="L3481"><span class="ln">3481</span> <span class="c">// dy<span class="s"> = </span><span class="d">100</span><span class="s"> * </span>math.sin(angle),</span>
-</code><code id="L3482"><span class="ln">3482</span> <span class="c">// zx<span class="s"> = </span>matrix.x(<span class="d">0</span>, <span class="d">0</span>),</span>
-</code><code id="L3483"><span class="ln">3483</span> <span class="c">// zy<span class="s"> = </span>matrix.y(<span class="d">0</span>, <span class="d">0</span>),</span>
-</code><code id="L3484"><span class="ln">3484</span> <span class="c">// mx<span class="s"> = </span>matrix.x(dx, dy),</span>
-</code><code id="L3485"><span class="ln">3485</span> <span class="c">// my<span class="s"> = </span>matrix.y(dx, dy);</span>
-</code><code id="L3486"><span class="ln">3486</span> <span class="c">// angle<span class="s"> = </span>R.angle(zx, zy, mx, my);</span>
-</code><code id="L3487"><span class="ln">3487</span> <span class="c">// fill.angle<span class="s"> = </span>(<span class="d">270</span><span class="s"> - </span>angle)<span class="s"> % </span><span class="d">360</span>;</span>
-</code><code id="L3488"><span class="ln">3488</span> <span class="c">// }</span>
-</code><code id="L3489"><span class="ln">3489</span> }
-</code><code id="L3490"><span class="ln">3490</span> <b>return</b> <b>this</b>;
-</code><code id="L3491"><span class="ln">3491</span> };
-</code><code id="L3492"><span class="ln">3492</span> elproto.rotate<span class="s"> = </span><b>function</b> (deg, cx, cy) {
-</code><code id="L3493"><span class="ln">3493</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3494"><span class="ln">3494</span> <b>return</b> <b>this</b>;
-</code><code id="L3495"><span class="ln">3495</span> }
-</code><code id="L3496"><span class="ln">3496</span> <b>if</b> (deg<span class="s"> == </span><b>null</b>) {
-</code><code id="L3497"><span class="ln">3497</span> <b>return</b>;
-</code><code id="L3498"><span class="ln">3498</span> }
-</code><code id="L3499"><span class="ln">3499</span> deg<span class="s"> = </span>Str(deg).split(separator);
-</code><code id="L3500"><span class="ln">3500</span> <b>if</b> (deg.length<span class="s"> - </span><span class="d">1</span>) {
-</code><code id="L3501"><span class="ln">3501</span> cx<span class="s"> = </span>toFloat(deg[<span class="d">1</span>]);
-</code><code id="L3502"><span class="ln">3502</span> cy<span class="s"> = </span>toFloat(deg[<span class="d">2</span>]);
-</code><code id="L3503"><span class="ln">3503</span> }
-</code><code id="L3504"><span class="ln">3504</span> deg<span class="s"> = </span>toFloat(deg[<span class="d">0</span>]);
-</code><code id="L3505"><span class="ln">3505</span> (cy<span class="s"> == </span><b>null</b>)<span class="s"> && </span>(cx<span class="s"> = </span>cy);
-</code><code id="L3506"><span class="ln">3506</span> <b>if</b> (cx<span class="s"> == </span><b>null</b><span class="s"> || </span>cy<span class="s"> == </span><b>null</b>) {
-</code><code id="L3507"><span class="ln">3507</span> <b>var</b> bbox<span class="s"> = </span><b>this</b>.getBBox(<span class="d">1</span>);
-</code><code id="L3508"><span class="ln">3508</span> cx<span class="s"> = </span>bbox.x<span class="s"> + </span>bbox.width<span class="s"> / </span><span class="d">2</span>;
-</code><code id="L3509"><span class="ln">3509</span> cy<span class="s"> = </span>bbox.y<span class="s"> + </span>bbox.height<span class="s"> / </span><span class="d">2</span>;
-</code><code id="L3510"><span class="ln">3510</span> }
-</code><code id="L3511"><span class="ln">3511</span> <b>this</b>._.dirtyT<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L3512"><span class="ln">3512</span> <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"r"</i>, deg, cx, cy]]));
-</code><code id="L3513"><span class="ln">3513</span> <b>return</b> <b>this</b>;
-</code><code id="L3514"><span class="ln">3514</span> };
-</code><code id="L3515"><span class="ln">3515</span> elproto.translate<span class="s"> = </span><b>function</b> (dx, dy) {
-</code><code id="L3516"><span class="ln">3516</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3517"><span class="ln">3517</span> <b>return</b> <b>this</b>;
-</code><code id="L3518"><span class="ln">3518</span> }
-</code><code id="L3519"><span class="ln">3519</span> dx<span class="s"> = </span>Str(dx).split(separator);
-</code><code id="L3520"><span class="ln">3520</span> <b>if</b> (dx.length<span class="s"> - </span><span class="d">1</span>) {
-</code><code id="L3521"><span class="ln">3521</span> dy<span class="s"> = </span>toFloat(dx[<span class="d">1</span>]);
-</code><code id="L3522"><span class="ln">3522</span> }
-</code><code id="L3523"><span class="ln">3523</span> dx<span class="s"> = </span>toFloat(dx[<span class="d">0</span>])<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L3524"><span class="ln">3524</span> dy<span class="s"> = </span>+dy<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L3525"><span class="ln">3525</span> <b>if</b> (<b>this</b>._.bbox) {
-</code><code id="L3526"><span class="ln">3526</span> <b>this</b>._.bbox.x += dx;
-</code><code id="L3527"><span class="ln">3527</span> <b>this</b>._.bbox.y += dy;
-</code><code id="L3528"><span class="ln">3528</span> }
-</code><code id="L3529"><span class="ln">3529</span> <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"t"</i>, dx, dy]]));
-</code><code id="L3530"><span class="ln">3530</span> <b>return</b> <b>this</b>;
-</code><code id="L3531"><span class="ln">3531</span> };
-</code><code id="L3532"><span class="ln">3532</span> elproto.scale<span class="s"> = </span><b>function</b> (sx, sy, cx, cy) {
-</code><code id="L3533"><span class="ln">3533</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3534"><span class="ln">3534</span> <b>return</b> <b>this</b>;
+</code><code id="L3211"><span class="ln">3211</span> <b>if</b> (<i>"clip-rect"</i> <b>in</b> params) {
+</code><code id="L3212"><span class="ln">3212</span> <b>var</b> rect<span class="s"> = </span>Str(params[<i>"clip-rect"</i>]).split(separator);
+</code><code id="L3213"><span class="ln">3213</span> <b>if</b> (rect.length<span class="s"> == </span><span class="d">4</span>) {
+</code><code id="L3214"><span class="ln">3214</span> rect[<span class="d">2</span>]<span class="s"> = </span>+rect[<span class="d">2</span>]<span class="s"> + </span>(+rect[<span class="d">0</span>]);
+</code><code id="L3215"><span class="ln">3215</span> rect[<span class="d">3</span>]<span class="s"> = </span>+rect[<span class="d">3</span>]<span class="s"> + </span>(+rect[<span class="d">1</span>]);
+</code><code id="L3216"><span class="ln">3216</span> <b>var</b> div<span class="s"> = </span>node.clipRect<span class="s"> || </span>g.doc.createElement(<i>"div"</i>),
+</code><code id="L3217"><span class="ln">3217</span> dstyle<span class="s"> = </span>div.style,
+</code><code id="L3218"><span class="ln">3218</span> group<span class="s"> = </span>node.parentNode;
+</code><code id="L3219"><span class="ln">3219</span> dstyle.clip<span class="s"> = </span>R.format(<i>"rect({<span class="d">1</span>}px {<span class="d">2</span>}px {<span class="d">3</span>}px {<span class="d">0</span>}px)"</i>, rect);
+</code><code id="L3220"><span class="ln">3220</span> <b>if</b> (!node.clipRect) {
+</code><code id="L3221"><span class="ln">3221</span> dstyle.position<span class="s"> = </span><i>"absolute"</i>;
+</code><code id="L3222"><span class="ln">3222</span> dstyle.top<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L3223"><span class="ln">3223</span> dstyle.left<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L3224"><span class="ln">3224</span> dstyle.width<span class="s"> = </span>o.paper.width<span class="s"> + </span><i>"px"</i>;
+</code><code id="L3225"><span class="ln">3225</span> dstyle.height<span class="s"> = </span>o.paper.height<span class="s"> + </span><i>"px"</i>;
+</code><code id="L3226"><span class="ln">3226</span> group.parentNode.insertBefore(div, group);
+</code><code id="L3227"><span class="ln">3227</span> div.appendChild(group);
+</code><code id="L3228"><span class="ln">3228</span> node.clipRect<span class="s"> = </span>div;
+</code><code id="L3229"><span class="ln">3229</span> }
+</code><code id="L3230"><span class="ln">3230</span> }
+</code><code id="L3231"><span class="ln">3231</span> <b>if</b> (!params[<i>"clip-rect"</i>]) {
+</code><code id="L3232"><span class="ln">3232</span> node.clipRect<span class="s"> && </span>(node.clipRect.style.clip<span class="s"> = </span>E);
+</code><code id="L3233"><span class="ln">3233</span> }
+</code><code id="L3234"><span class="ln">3234</span> }
+</code><code id="L3235"><span class="ln">3235</span> <b>if</b> (o.textpath) {
+</code><code id="L3236"><span class="ln">3236</span> <b>var</b> textpathStyle<span class="s"> = </span>o.textpath.style;
+</code><code id="L3237"><span class="ln">3237</span> params.font<span class="s"> && </span>(textpathStyle.font<span class="s"> = </span>params.font);
+</code><code id="L3238"><span class="ln">3238</span> params[<i>"font-family"</i>]<span class="s"> && </span>(textpathStyle.fontFamily<span class="s"> = </span><i>'"'</i><span class="s"> + </span>params[<i>"font-family"</i>].split(<i>","</i>)[<span class="d">0</span>].replace(/^[<i>'"]+|['</i><i>"]+$/g, E)<span class="s"> + </span>'"</i>');
+</code><code id="L3239"><span class="ln">3239</span> params[<i>"font-size"</i>]<span class="s"> && </span>(textpathStyle.fontSize<span class="s"> = </span>params[<i>"font-size"</i>]);
+</code><code id="L3240"><span class="ln">3240</span> params[<i>"font-weight"</i>]<span class="s"> && </span>(textpathStyle.fontWeight<span class="s"> = </span>params[<i>"font-weight"</i>]);
+</code><code id="L3241"><span class="ln">3241</span> params[<i>"font-style"</i>]<span class="s"> && </span>(textpathStyle.fontStyle<span class="s"> = </span>params[<i>"font-style"</i>]);
+</code><code id="L3242"><span class="ln">3242</span> }
+</code><code id="L3243"><span class="ln">3243</span> <b>if</b> (<i>"arrow-start"</i> <b>in</b> params) {
+</code><code id="L3244"><span class="ln">3244</span> addArrow(res, params[<i>"arrow-start"</i>]);
+</code><code id="L3245"><span class="ln">3245</span> }
+</code><code id="L3246"><span class="ln">3246</span> <b>if</b> (<i>"arrow-end"</i> <b>in</b> params) {
+</code><code id="L3247"><span class="ln">3247</span> addArrow(res, params[<i>"arrow-end"</i>], <span class="d">1</span>);
+</code><code id="L3248"><span class="ln">3248</span> }
+</code><code id="L3249"><span class="ln">3249</span> <b>if</b> (params.opacity != <b>null</b><span class="s"> || </span>
+</code><code id="L3250"><span class="ln">3250</span> params[<i>"stroke-width"</i>] != <b>null</b> ||
+</code><code id="L3251"><span class="ln">3251</span> params.fill != <b>null</b> ||
+</code><code id="L3252"><span class="ln">3252</span> params.src != <b>null</b> ||
+</code><code id="L3253"><span class="ln">3253</span> params.stroke != <b>null</b> ||
+</code><code id="L3254"><span class="ln">3254</span> params[<i>"stroke-width"</i>] != <b>null</b> ||
+</code><code id="L3255"><span class="ln">3255</span> params[<i>"stroke-opacity"</i>] != <b>null</b> ||
+</code><code id="L3256"><span class="ln">3256</span> params[<i>"fill-opacity"</i>] != <b>null</b> ||
+</code><code id="L3257"><span class="ln">3257</span> params[<i>"stroke-dasharray"</i>] != <b>null</b> ||
+</code><code id="L3258"><span class="ln">3258</span> params[<i>"stroke-miterlimit"</i>] != <b>null</b> ||
+</code><code id="L3259"><span class="ln">3259</span> params[<i>"stroke-linejoin"</i>] != <b>null</b> ||
+</code><code id="L3260"><span class="ln">3260</span> params[<i>"stroke-linecap"</i>] != <b>null</b>) {
+</code><code id="L3261"><span class="ln">3261</span> <b>var</b> fill<span class="s"> = </span>node.getElementsByTagName(fillString),
+</code><code id="L3262"><span class="ln">3262</span> newfill<span class="s"> = </span><b>false</b>;
+</code><code id="L3263"><span class="ln">3263</span> fill<span class="s"> = </span>fill<span class="s"> && </span>fill[<span class="d">0</span>];
+</code><code id="L3264"><span class="ln">3264</span> !fill<span class="s"> && </span>(newfill<span class="s"> = </span>fill<span class="s"> = </span>createNode(fillString));
+</code><code id="L3265"><span class="ln">3265</span> <b>if</b> (o.type<span class="s"> == </span><i>"image"</i><span class="s"> && </span>params.src) {
+</code><code id="L3266"><span class="ln">3266</span> fill.src<span class="s"> = </span>params.src;
+</code><code id="L3267"><span class="ln">3267</span> }
+</code><code id="L3268"><span class="ln">3268</span> <b>if</b> (<i>"fill-opacity"</i> <b>in</b> params<span class="s"> || </span><i>"opacity"</i> <b>in</b> params) {
+</code><code id="L3269"><span class="ln">3269</span> <b>var</b> opacity<span class="s"> = </span>((+a[<i>"fill-opacity"</i>]<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>)<span class="s"> * </span>((+a.opacity<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>)<span class="s"> * </span>((+R.getRGB(params.fill).o<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>);
+</code><code id="L3270"><span class="ln">3270</span> opacity<span class="s"> = </span>mmin(mmax(opacity, <span class="d">0</span>), <span class="d">1</span>);
+</code><code id="L3271"><span class="ln">3271</span> fill.opacity<span class="s"> = </span>opacity;
+</code><code id="L3272"><span class="ln">3272</span> }
+</code><code id="L3273"><span class="ln">3273</span> params.fill<span class="s"> && </span>(fill.on<span class="s"> = </span><b>true</b>);
+</code><code id="L3274"><span class="ln">3274</span> <b>if</b> (fill.on<span class="s"> == </span><b>null</b><span class="s"> || </span>params.fill<span class="s"> == </span><i>"none"</i><span class="s"> || </span>params.fill<span class="s"> === </span><b>null</b>) {
+</code><code id="L3275"><span class="ln">3275</span> fill.on<span class="s"> = </span><b>false</b>;
+</code><code id="L3276"><span class="ln">3276</span> }
+</code><code id="L3277"><span class="ln">3277</span> <b>if</b> (fill.on<span class="s"> && </span>params.fill) {
+</code><code id="L3278"><span class="ln">3278</span> <b>var</b> isURL<span class="s"> = </span>params.fill.match(ISURL);
+</code><code id="L3279"><span class="ln">3279</span> <b>if</b> (isURL) {
+</code><code id="L3280"><span class="ln">3280</span> fill.parentNode<span class="s"> == </span>node<span class="s"> && </span>node.removeChild(fill);
+</code><code id="L3281"><span class="ln">3281</span> fill.rotate<span class="s"> = </span><b>true</b>;
+</code><code id="L3282"><span class="ln">3282</span> fill.src<span class="s"> = </span>isURL[<span class="d">1</span>];
+</code><code id="L3283"><span class="ln">3283</span> fill.type<span class="s"> = </span><i>"tile"</i>;
+</code><code id="L3284"><span class="ln">3284</span> <b>var</b> bbox<span class="s"> = </span>o.getBBox(<span class="d">1</span>);
+</code><code id="L3285"><span class="ln">3285</span> fill.position<span class="s"> = </span>bbox.x<span class="s"> + </span>S<span class="s"> + </span>bbox.y;
+</code><code id="L3286"><span class="ln">3286</span> o._.fillpos<span class="s"> = </span>[bbox.x, bbox.y];
+</code><code id="L3287"><span class="ln">3287</span>
+</code><code id="L3288"><span class="ln">3288</span> preload(isURL[<span class="d">1</span>], <b>function</b> () {
+</code><code id="L3289"><span class="ln">3289</span> o._.fillsize<span class="s"> = </span>[<b>this</b>.offsetWidth, <b>this</b>.offsetHeight];
+</code><code id="L3290"><span class="ln">3290</span> });
+</code><code id="L3291"><span class="ln">3291</span> } <b>else</b> {
+</code><code id="L3292"><span class="ln">3292</span> fill.color<span class="s"> = </span>R.getRGB(params.fill).hex;
+</code><code id="L3293"><span class="ln">3293</span> fill.src<span class="s"> = </span>E;
+</code><code id="L3294"><span class="ln">3294</span> fill.type<span class="s"> = </span><i>"solid"</i>;
+</code><code id="L3295"><span class="ln">3295</span> <b>if</b> (R.getRGB(params.fill).error<span class="s"> && </span>(res.type <b>in</b> {circle: <span class="d">1</span>, ellipse: <span class="d">1</span>}<span class="s"> || </span>Str(params.fill).charAt() != <i>"r"</i>)<span class="s"> && </span>addGradientFill(res, params.fill, fill)) {
+</code><code id="L3296"><span class="ln">3296</span> a.fill<span class="s"> = </span><i>"none"</i>;
+</code><code id="L3297"><span class="ln">3297</span> a.gradient<span class="s"> = </span>params.fill;
+</code><code id="L3298"><span class="ln">3298</span> fill.rotate<span class="s"> = </span><b>false</b>;
+</code><code id="L3299"><span class="ln">3299</span> }
+</code><code id="L3300"><span class="ln">3300</span> }
+</code><code id="L3301"><span class="ln">3301</span> }
+</code><code id="L3302"><span class="ln">3302</span> node.appendChild(fill);
+</code><code id="L3303"><span class="ln">3303</span> <b>var</b> stroke<span class="s"> = </span>(node.getElementsByTagName(<i>"stroke"</i>)<span class="s"> && </span>node.getElementsByTagName(<i>"stroke"</i>)[<span class="d">0</span>]),
+</code><code id="L3304"><span class="ln">3304</span> newstroke<span class="s"> = </span><b>false</b>;
+</code><code id="L3305"><span class="ln">3305</span> !stroke<span class="s"> && </span>(newstroke<span class="s"> = </span>stroke<span class="s"> = </span>createNode(<i>"stroke"</i>));
+</code><code id="L3306"><span class="ln">3306</span> <b>if</b> ((params.stroke<span class="s"> && </span>params.stroke != <i>"none"</i>) ||
+</code><code id="L3307"><span class="ln">3307</span> params[<i>"stroke-width"</i>] ||
+</code><code id="L3308"><span class="ln">3308</span> params[<i>"stroke-opacity"</i>] != <b>null</b> ||
+</code><code id="L3309"><span class="ln">3309</span> params[<i>"stroke-dasharray"</i>] ||
+</code><code id="L3310"><span class="ln">3310</span> params[<i>"stroke-miterlimit"</i>] ||
+</code><code id="L3311"><span class="ln">3311</span> params[<i>"stroke-linejoin"</i>] ||
+</code><code id="L3312"><span class="ln">3312</span> params[<i>"stroke-linecap"</i>]) {
+</code><code id="L3313"><span class="ln">3313</span> stroke.on<span class="s"> = </span><b>true</b>;
+</code><code id="L3314"><span class="ln">3314</span> }
+</code><code id="L3315"><span class="ln">3315</span> (params.stroke<span class="s"> == </span><i>"none"</i><span class="s"> || </span>params.stroke<span class="s"> === </span><b>null</b><span class="s"> || </span>stroke.on<span class="s"> == </span><b>null</b><span class="s"> || </span>params.stroke<span class="s"> == </span><span class="d">0</span><span class="s"> || </span>params[<i>"stroke-width"</i>]<span class="s"> == </span><span class="d">0</span>)<span class="s"> && </span>(stroke.on<span class="s"> = </span><b>false</b>);
+</code><code id="L3316"><span class="ln">3316</span> <b>var</b> strokeColor<span class="s"> = </span>R.getRGB(params.stroke);
+</code><code id="L3317"><span class="ln">3317</span> stroke.on<span class="s"> && </span>params.stroke<span class="s"> && </span>(stroke.color<span class="s"> = </span>strokeColor.hex);
+</code><code id="L3318"><span class="ln">3318</span> opacity<span class="s"> = </span>((+a[<i>"stroke-opacity"</i>]<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>)<span class="s"> * </span>((+a.opacity<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>)<span class="s"> * </span>((+strokeColor.o<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>);
+</code><code id="L3319"><span class="ln">3319</span> <b>var</b> width<span class="s"> = </span>(toFloat(params[<i>"stroke-width"</i>])<span class="s"> || </span><span class="d">1</span>)<span class="s"> * </span><span class="d">.75</span>;
+</code><code id="L3320"><span class="ln">3320</span> opacity<span class="s"> = </span>mmin(mmax(opacity, <span class="d">0</span>), <span class="d">1</span>);
+</code><code id="L3321"><span class="ln">3321</span> params[<i>"stroke-width"</i>]<span class="s"> == </span><b>null</b><span class="s"> && </span>(width<span class="s"> = </span>a[<i>"stroke-width"</i>]);
+</code><code id="L3322"><span class="ln">3322</span> params[<i>"stroke-width"</i>]<span class="s"> && </span>(stroke.weight<span class="s"> = </span>width);
+</code><code id="L3323"><span class="ln">3323</span> width<span class="s"> && </span>width < <span class="d">1</span><span class="s"> && </span>(opacity *= width)<span class="s"> && </span>(stroke.weight<span class="s"> = </span><span class="d">1</span>);
+</code><code id="L3324"><span class="ln">3324</span> stroke.opacity<span class="s"> = </span>opacity;
+</code><code id="L3325"><span class="ln">3325</span>
+</code><code id="L3326"><span class="ln">3326</span> params[<i>"stroke-linejoin"</i>]<span class="s"> && </span>(stroke.joinstyle<span class="s"> = </span>params[<i>"stroke-linejoin"</i>]<span class="s"> || </span><i>"miter"</i>);
+</code><code id="L3327"><span class="ln">3327</span> stroke.miterlimit<span class="s"> = </span>params[<i>"stroke-miterlimit"</i>]<span class="s"> || </span><span class="d">8</span>;
+</code><code id="L3328"><span class="ln">3328</span> params[<i>"stroke-linecap"</i>]<span class="s"> && </span>(stroke.endcap<span class="s"> = </span>params[<i>"stroke-linecap"</i>]<span class="s"> == </span><i>"butt"</i> ? <i>"flat"</i> : params[<i>"stroke-linecap"</i>]<span class="s"> == </span><i>"square"</i> ? <i>"square"</i> : <i>"round"</i>);
+</code><code id="L3329"><span class="ln">3329</span> <b>if</b> (params[<i>"stroke-dasharray"</i>]) {
+</code><code id="L3330"><span class="ln">3330</span> <b>var</b> dasharray<span class="s"> = </span>{
+</code><code id="L3331"><span class="ln">3331</span> <i>"-"</i>: <i>"shortdash"</i>,
+</code><code id="L3332"><span class="ln">3332</span> <i>"."</i>: <i>"shortdot"</i>,
+</code><code id="L3333"><span class="ln">3333</span> <i>"-."</i>: <i>"shortdashdot"</i>,
+</code><code id="L3334"><span class="ln">3334</span> <i>"-.."</i>: <i>"shortdashdotdot"</i>,
+</code><code id="L3335"><span class="ln">3335</span> <i>". "</i>: <i>"dot"</i>,
+</code><code id="L3336"><span class="ln">3336</span> <i>"- "</i>: <i>"dash"</i>,
+</code><code id="L3337"><span class="ln">3337</span> <i>"--"</i>: <i>"longdash"</i>,
+</code><code id="L3338"><span class="ln">3338</span> <i>"- ."</i>: <i>"dashdot"</i>,
+</code><code id="L3339"><span class="ln">3339</span> <i>"--."</i>: <i>"longdashdot"</i>,
+</code><code id="L3340"><span class="ln">3340</span> <i>"--.."</i>: <i>"longdashdotdot"</i>
+</code><code id="L3341"><span class="ln">3341</span> };
+</code><code id="L3342"><span class="ln">3342</span> stroke.dashstyle<span class="s"> = </span>dasharray[has](params[<i>"stroke-dasharray"</i>]) ? dasharray[params[<i>"stroke-dasharray"</i>]] : E;
+</code><code id="L3343"><span class="ln">3343</span> }
+</code><code id="L3344"><span class="ln">3344</span> newstroke<span class="s"> && </span>node.appendChild(stroke);
+</code><code id="L3345"><span class="ln">3345</span> }
+</code><code id="L3346"><span class="ln">3346</span> <b>if</b> (res.type<span class="s"> == </span><i>"text"</i>) {
+</code><code id="L3347"><span class="ln">3347</span> res.paper.canvas.style.display<span class="s"> = </span>E;
+</code><code id="L3348"><span class="ln">3348</span> <b>var</b> span<span class="s"> = </span>res.paper.span,
+</code><code id="L3349"><span class="ln">3349</span> m<span class="s"> = </span><span class="d">100</span>,
+</code><code id="L3350"><span class="ln">3350</span> fontSize<span class="s"> = </span>a.font<span class="s"> && </span>a.font.match(/\d+(?:\.\d*)?(?=px)/);
+</code><code id="L3351"><span class="ln">3351</span> s<span class="s"> = </span>span.style;
+</code><code id="L3352"><span class="ln">3352</span> a.font<span class="s"> && </span>(s.font<span class="s"> = </span>a.font);
+</code><code id="L3353"><span class="ln">3353</span> a[<i>"font-family"</i>]<span class="s"> && </span>(s.fontFamily<span class="s"> = </span>a[<i>"font-family"</i>]);
+</code><code id="L3354"><span class="ln">3354</span> a[<i>"font-weight"</i>]<span class="s"> && </span>(s.fontWeight<span class="s"> = </span>a[<i>"font-weight"</i>]);
+</code><code id="L3355"><span class="ln">3355</span> a[<i>"font-style"</i>]<span class="s"> && </span>(s.fontStyle<span class="s"> = </span>a[<i>"font-style"</i>]);
+</code><code id="L3356"><span class="ln">3356</span> fontSize<span class="s"> = </span>toFloat(fontSize ? fontSize[<span class="d">0</span>] : a[<i>"font-size"</i>]);
+</code><code id="L3357"><span class="ln">3357</span> s.fontSize<span class="s"> = </span>fontSize<span class="s"> * </span>m<span class="s"> + </span><i>"px"</i>;
+</code><code id="L3358"><span class="ln">3358</span> res.textpath.string<span class="s"> && </span>(span.innerHTML<span class="s"> = </span>Str(res.textpath.string).replace(/</g, <i>"&#<span class="d">60</span>;"</i>).replace(/&/g, <i>"&#<span class="d">38</span>;"</i>).replace(/\n/g, <i>"<br>"</i>));
+</code><code id="L3359"><span class="ln">3359</span> <b>var</b> brect<span class="s"> = </span>span.getBoundingClientRect();
+</code><code id="L3360"><span class="ln">3360</span> res.W<span class="s"> = </span>a.w<span class="s"> = </span>(brect.right<span class="s"> - </span>brect.left)<span class="s"> / </span>m;
+</code><code id="L3361"><span class="ln">3361</span> res.H<span class="s"> = </span>a.h<span class="s"> = </span>(brect.bottom<span class="s"> - </span>brect.top)<span class="s"> / </span>m;
+</code><code id="L3362"><span class="ln">3362</span> res.paper.canvas.style.display<span class="s"> = </span><i>"none"</i>;
+</code><code id="L3363"><span class="ln">3363</span> res.X<span class="s"> = </span>a.x;
+</code><code id="L3364"><span class="ln">3364</span> res.Y<span class="s"> = </span>a.y<span class="s"> + </span>res.H<span class="s"> / </span><span class="d">2</span>;
+</code><code id="L3365"><span class="ln">3365</span>
+</code><code id="L3366"><span class="ln">3366</span> (<i>"x"</i> <b>in</b> params<span class="s"> || </span><i>"y"</i> <b>in</b> params)<span class="s"> && </span>(res.path.v<span class="s"> = </span>R.format(<i>"m{<span class="d">0</span>},{<span class="d">1</span>}l{<span class="d">2</span>},{<span class="d">1</span>}"</i>, round(a.x<span class="s"> * </span>zoom), round(a.y<span class="s"> * </span>zoom), round(a.x<span class="s"> * </span>zoom)<span class="s"> + </span><span class="d">1</span>));
+</code><code id="L3367"><span class="ln">3367</span> <b>var</b> dirtyattrs<span class="s"> = </span>[<i>"x"</i>, <i>"y"</i>, <i>"text"</i>, <i>"font"</i>, <i>"font-family"</i>, <i>"font-weight"</i>, <i>"font-style"</i>, <i>"font-size"</i>];
+</code><code id="L3368"><span class="ln">3368</span> <b>for</b> (<b>var</b> d<span class="s"> = </span><span class="d">0</span>, dd<span class="s"> = </span>dirtyattrs.length; d < dd; d++) <b>if</b> (dirtyattrs[d] <b>in</b> params) {
+</code><code id="L3369"><span class="ln">3369</span> res._.dirty<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L3370"><span class="ln">3370</span> <b>break</b>;
+</code><code id="L3371"><span class="ln">3371</span> }
+</code><code id="L3372"><span class="ln">3372</span>
+</code><code id="L3373"><span class="ln">3373</span> <span class="c">// text-anchor emulation</span>
+</code><code id="L3374"><span class="ln">3374</span> <b>switch</b> (a[<i>"text-anchor"</i>]) {
+</code><code id="L3375"><span class="ln">3375</span> <b>case</b> <i>"start"</i>:
+</code><code id="L3376"><span class="ln">3376</span> res.textpath.style[<i>"v-text-align"</i>]<span class="s"> = </span><i>"left"</i>;
+</code><code id="L3377"><span class="ln">3377</span> res.bbx<span class="s"> = </span>res.W<span class="s"> / </span><span class="d">2</span>;
+</code><code id="L3378"><span class="ln">3378</span> <b>break</b>;
+</code><code id="L3379"><span class="ln">3379</span> <b>case</b> <i>"end"</i>:
+</code><code id="L3380"><span class="ln">3380</span> res.textpath.style[<i>"v-text-align"</i>]<span class="s"> = </span><i>"right"</i>;
+</code><code id="L3381"><span class="ln">3381</span> res.bbx<span class="s"> = </span>-res.W<span class="s"> / </span><span class="d">2</span>;
+</code><code id="L3382"><span class="ln">3382</span> <b>break</b>;
+</code><code id="L3383"><span class="ln">3383</span> <b>default</b>:
+</code><code id="L3384"><span class="ln">3384</span> res.textpath.style[<i>"v-text-align"</i>]<span class="s"> = </span><i>"center"</i>;
+</code><code id="L3385"><span class="ln">3385</span> res.bbx<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L3386"><span class="ln">3386</span> <b>break</b>;
+</code><code id="L3387"><span class="ln">3387</span> }
+</code><code id="L3388"><span class="ln">3388</span> res.textpath.style[<i>"v-text-kern"</i>]<span class="s"> = </span><b>true</b>;
+</code><code id="L3389"><span class="ln">3389</span> }
+</code><code id="L3390"><span class="ln">3390</span> res.paper.canvas.style.display<span class="s"> = </span>E;
+</code><code id="L3391"><span class="ln">3391</span> };
+</code><code id="L3392"><span class="ln">3392</span> addGradientFill<span class="s"> = </span><b>function</b> (o, gradient, fill) {
+</code><code id="L3393"><span class="ln">3393</span> o.attrs<span class="s"> = </span>o.attrs<span class="s"> || </span>{};
+</code><code id="L3394"><span class="ln">3394</span> <b>var</b> attrs<span class="s"> = </span>o.attrs,
+</code><code id="L3395"><span class="ln">3395</span> type<span class="s"> = </span><i>"linear"</i>,
+</code><code id="L3396"><span class="ln">3396</span> fxfy<span class="s"> = </span><i>"<span class="d">.5</span> <span class="d">.5</span>"</i>;
+</code><code id="L3397"><span class="ln">3397</span> o.attrs.gradient<span class="s"> = </span>gradient;
+</code><code id="L3398"><span class="ln">3398</span> gradient<span class="s"> = </span>Str(gradient).replace(radial_gradient, <b>function</b> (all, fx, fy) {
+</code><code id="L3399"><span class="ln">3399</span> type<span class="s"> = </span><i>"radial"</i>;
+</code><code id="L3400"><span class="ln">3400</span> <b>if</b> (fx<span class="s"> && </span>fy) {
+</code><code id="L3401"><span class="ln">3401</span> fx<span class="s"> = </span>toFloat(fx);
+</code><code id="L3402"><span class="ln">3402</span> fy<span class="s"> = </span>toFloat(fy);
+</code><code id="L3403"><span class="ln">3403</span> pow(fx<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>)<span class="s"> + </span>pow(fy<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>) > <span class="d">.25</span><span class="s"> && </span>(fy<span class="s"> = </span>math.sqrt(<span class="d">.25</span><span class="s"> - </span>pow(fx<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>))<span class="s"> * </span>((fy > <span class="d">.5</span>)<span class="s"> * </span><span class="d">2</span><span class="s"> - </span><span class="d">1</span>)<span class="s"> + </span><span class="d">.5</span>);
+</code><code id="L3404"><span class="ln">3404</span> fxfy<span class="s"> = </span>fx<span class="s"> + </span>S<span class="s"> + </span>fy;
+</code><code id="L3405"><span class="ln">3405</span> }
+</code><code id="L3406"><span class="ln">3406</span> <b>return</b> E;
+</code><code id="L3407"><span class="ln">3407</span> });
+</code><code id="L3408"><span class="ln">3408</span> gradient<span class="s"> = </span>gradient.split(/\s*\-\s*/);
+</code><code id="L3409"><span class="ln">3409</span> <b>if</b> (type<span class="s"> == </span><i>"linear"</i>) {
+</code><code id="L3410"><span class="ln">3410</span> <b>var</b> angle<span class="s"> = </span>gradient.shift();
+</code><code id="L3411"><span class="ln">3411</span> angle<span class="s"> = </span>-toFloat(angle);
+</code><code id="L3412"><span class="ln">3412</span> <b>if</b> (isNaN(angle)) {
+</code><code id="L3413"><span class="ln">3413</span> <b>return</b> <b>null</b>;
+</code><code id="L3414"><span class="ln">3414</span> }
+</code><code id="L3415"><span class="ln">3415</span> }
+</code><code id="L3416"><span class="ln">3416</span> <b>var</b> dots<span class="s"> = </span>parseDots(gradient);
+</code><code id="L3417"><span class="ln">3417</span> <b>if</b> (!dots) {
+</code><code id="L3418"><span class="ln">3418</span> <b>return</b> <b>null</b>;
+</code><code id="L3419"><span class="ln">3419</span> }
+</code><code id="L3420"><span class="ln">3420</span> o<span class="s"> = </span>o.shape<span class="s"> || </span>o.node;
+</code><code id="L3421"><span class="ln">3421</span> <b>if</b> (dots.length) {
+</code><code id="L3422"><span class="ln">3422</span> o.removeChild(fill);
+</code><code id="L3423"><span class="ln">3423</span> fill.on<span class="s"> = </span><b>true</b>;
+</code><code id="L3424"><span class="ln">3424</span> fill.method<span class="s"> = </span><i>"none"</i>;
+</code><code id="L3425"><span class="ln">3425</span> fill.color<span class="s"> = </span>dots[<span class="d">0</span>].color;
+</code><code id="L3426"><span class="ln">3426</span> fill.color2<span class="s"> = </span>dots[dots.length<span class="s"> - </span><span class="d">1</span>].color;
+</code><code id="L3427"><span class="ln">3427</span> <b>var</b> clrs<span class="s"> = </span>[];
+</code><code id="L3428"><span class="ln">3428</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>dots.length; i < ii; i++) {
+</code><code id="L3429"><span class="ln">3429</span> dots[i].offset<span class="s"> && </span>clrs.push(dots[i].offset<span class="s"> + </span>S<span class="s"> + </span>dots[i].color);
+</code><code id="L3430"><span class="ln">3430</span> }
+</code><code id="L3431"><span class="ln">3431</span> fill.colors<span class="s"> && </span>(fill.colors.value<span class="s"> = </span>clrs.length ? clrs.join() : <i>"<span class="d">0</span>% "</i><span class="s"> + </span>fill.color);
+</code><code id="L3432"><span class="ln">3432</span> <b>if</b> (type<span class="s"> == </span><i>"radial"</i>) {
+</code><code id="L3433"><span class="ln">3433</span> fill.type<span class="s"> = </span><i>"gradientTitle"</i>;
+</code><code id="L3434"><span class="ln">3434</span> fill.focus<span class="s"> = </span><i>"<span class="d">100</span>%"</i>;
+</code><code id="L3435"><span class="ln">3435</span> fill.focussize<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span>"</i>;
+</code><code id="L3436"><span class="ln">3436</span> fill.focusposition<span class="s"> = </span>fxfy;
+</code><code id="L3437"><span class="ln">3437</span> fill.angle<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L3438"><span class="ln">3438</span> } <b>else</b> {
+</code><code id="L3439"><span class="ln">3439</span> <span class="c">// fill.rotate= <b>true</b>;</span>
+</code><code id="L3440"><span class="ln">3440</span> fill.type<span class="s"> = </span><i>"gradient"</i>;
+</code><code id="L3441"><span class="ln">3441</span> fill.angle<span class="s"> = </span>(<span class="d">270</span><span class="s"> - </span>angle)<span class="s"> % </span><span class="d">360</span>;
+</code><code id="L3442"><span class="ln">3442</span> }
+</code><code id="L3443"><span class="ln">3443</span> o.appendChild(fill);
+</code><code id="L3444"><span class="ln">3444</span> <span class="c">// alert(fill.outerHTML);</span>
+</code><code id="L3445"><span class="ln">3445</span> }
+</code><code id="L3446"><span class="ln">3446</span> <b>return</b> <span class="d">1</span>;
+</code><code id="L3447"><span class="ln">3447</span> };
+</code><code id="L3448"><span class="ln">3448</span> Element<span class="s"> = </span><b>function</b> (node, vml) {
+</code><code id="L3449"><span class="ln">3449</span> <b>this</b>[<span class="d">0</span>]<span class="s"> = </span><b>this</b>.node<span class="s"> = </span>node;
+</code><code id="L3450"><span class="ln">3450</span> node.raphael<span class="s"> = </span><b>true</b>;
+</code><code id="L3451"><span class="ln">3451</span> <b>this</b>.id<span class="s"> = </span>R._oid++;
+</code><code id="L3452"><span class="ln">3452</span> node.raphaelid<span class="s"> = </span><b>this</b>.id;
+</code><code id="L3453"><span class="ln">3453</span> <b>this</b>.X<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L3454"><span class="ln">3454</span> <b>this</b>.Y<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L3455"><span class="ln">3455</span> <b>this</b>.attrs<span class="s"> = </span>{};
+</code><code id="L3456"><span class="ln">3456</span> <b>this</b>.paper<span class="s"> = </span>vml;
+</code><code id="L3457"><span class="ln">3457</span> <b>this</b>.matrix<span class="s"> = </span><b>new</b> Matrix;
+</code><code id="L3458"><span class="ln">3458</span> <b>this</b>._<span class="s"> = </span>{
+</code><code id="L3459"><span class="ln">3459</span> transform: [],
+</code><code id="L3460"><span class="ln">3460</span> sx: <span class="d">1</span>,
+</code><code id="L3461"><span class="ln">3461</span> sy: <span class="d">1</span>,
+</code><code id="L3462"><span class="ln">3462</span> dx: <span class="d">0</span>,
+</code><code id="L3463"><span class="ln">3463</span> dy: <span class="d">0</span>,
+</code><code id="L3464"><span class="ln">3464</span> deg: <span class="d">0</span>,
+</code><code id="L3465"><span class="ln">3465</span> dirty: <span class="d">1</span>,
+</code><code id="L3466"><span class="ln">3466</span> dirtyT: <span class="d">1</span>
+</code><code id="L3467"><span class="ln">3467</span> };
+</code><code id="L3468"><span class="ln">3468</span> !vml.bottom<span class="s"> && </span>(vml.bottom<span class="s"> = </span><b>this</b>);
+</code><code id="L3469"><span class="ln">3469</span> <b>this</b>.prev<span class="s"> = </span>vml.top;
+</code><code id="L3470"><span class="ln">3470</span> vml.top<span class="s"> && </span>(vml.top.next<span class="s"> = </span><b>this</b>);
+</code><code id="L3471"><span class="ln">3471</span> vml.top<span class="s"> = </span><b>this</b>;
+</code><code id="L3472"><span class="ln">3472</span> <b>this</b>.next<span class="s"> = </span><b>null</b>;
+</code><code id="L3473"><span class="ln">3473</span> };
+</code><code id="L3474"><span class="ln">3474</span> elproto<span class="s"> = </span>Element.prototype;
+</code><code id="L3475"><span class="ln">3475</span> elproto.transform<span class="s"> = </span><b>function</b> (tstr) {
+</code><code id="L3476"><span class="ln">3476</span> <b>if</b> (tstr<span class="s"> == </span><b>null</b>) {
+</code><code id="L3477"><span class="ln">3477</span> <b>return</b> <b>this</b>._.transform;
+</code><code id="L3478"><span class="ln">3478</span> }
+</code><code id="L3479"><span class="ln">3479</span> extractTransform(<b>this</b>, tstr);
+</code><code id="L3480"><span class="ln">3480</span> <b>var</b> matrix<span class="s"> = </span><b>this</b>.matrix.clone(),
+</code><code id="L3481"><span class="ln">3481</span> skew<span class="s"> = </span><b>this</b>.skew;
+</code><code id="L3482"><span class="ln">3482</span> matrix.translate(-<span class="d">.5</span>, -<span class="d">.5</span>);
+</code><code id="L3483"><span class="ln">3483</span> <b>if</b> (<b>this</b>.type<span class="s"> == </span><i>"image"</i>) {
+</code><code id="L3484"><span class="ln">3484</span> <b>if</b> (Str(tstr).indexOf(<i>"m"</i>)<span class="s"> + </span><span class="d">1</span>) {
+</code><code id="L3485"><span class="ln">3485</span> <b>this</b>.node.style.filter<span class="s"> = </span>matrix.toFilter();
+</code><code id="L3486"><span class="ln">3486</span> <b>var</b> bb<span class="s"> = </span><b>this</b>.getBBox(),
+</code><code id="L3487"><span class="ln">3487</span> bbt<span class="s"> = </span><b>this</b>.getBBox(<span class="d">1</span>),
+</code><code id="L3488"><span class="ln">3488</span> im<span class="s"> = </span>matrix.invert(),
+</code><code id="L3489"><span class="ln">3489</span> dx<span class="s"> = </span>im.x(bb.x, bb.y)<span class="s"> - </span>im.x(bbt.x, bbt.y),
+</code><code id="L3490"><span class="ln">3490</span> dy<span class="s"> = </span>im.y(bb.x, bb.y)<span class="s"> - </span>im.y(bbt.x, bbt.y);
+</code><code id="L3491"><span class="ln">3491</span> <span class="c">// skew.offset<span class="s"> = </span>dx<span class="s"> + </span>S<span class="s"> + </span>dy;</span>
+</code><code id="L3492"><span class="ln">3492</span> <span class="c">// <b>this</b>.node.getElementsByTagName(fillString)[<span class="d">0</span>].position<span class="s"> = </span>skew.offset;</span>
+</code><code id="L3493"><span class="ln">3493</span> } <b>else</b> {
+</code><code id="L3494"><span class="ln">3494</span> <b>this</b>.node.style.filter<span class="s"> = </span>E;
+</code><code id="L3495"><span class="ln">3495</span> setCoords(<b>this</b>);
+</code><code id="L3496"><span class="ln">3496</span> }
+</code><code id="L3497"><span class="ln">3497</span> } <b>else</b> {
+</code><code id="L3498"><span class="ln">3498</span> <span class="c">// o<span class="s"> = </span><b>this</b>.node,</span>
+</code><code id="L3499"><span class="ln">3499</span> <span class="c">// _<span class="s"> = </span><b>this</b>._,</span>
+</code><code id="L3500"><span class="ln">3500</span> <span class="c">// fillpos<span class="s"> = </span>_.fillpos,</span>
+</code><code id="L3501"><span class="ln">3501</span> <span class="c">// deg,</span>
+</code><code id="L3502"><span class="ln">3502</span> <span class="c">// matrix<span class="s"> = </span><b>this</b>.matrix;</span>
+</code><code id="L3503"><span class="ln">3503</span> <span class="c">// fill<span class="s"> = </span>o.getElementsByTagName(fillString)[<span class="d">0</span>],</span>
+</code><code id="L3504"><span class="ln">3504</span> <span class="c">// angle<span class="s"> = </span>fill.angle;</span>
+</code><code id="L3505"><span class="ln">3505</span>
+</code><code id="L3506"><span class="ln">3506</span> <b>this</b>.node.style.filter<span class="s"> = </span>E;
+</code><code id="L3507"><span class="ln">3507</span> skew.matrix<span class="s"> = </span>matrix;
+</code><code id="L3508"><span class="ln">3508</span> skew.offset<span class="s"> = </span>matrix.offset();
+</code><code id="L3509"><span class="ln">3509</span>
+</code><code id="L3510"><span class="ln">3510</span> <span class="c">// <b>if</b> (<span class="d">0</span>&&angle) {</span>
+</code><code id="L3511"><span class="ln">3511</span> <span class="c">// angle<span class="s"> = </span>R.rad(<span class="d">270</span><span class="s"> - </span>angle);</span>
+</code><code id="L3512"><span class="ln">3512</span> <span class="c">// <b>var</b> dx<span class="s"> = </span><span class="d">100</span><span class="s"> * </span>math.cos(angle),</span>
+</code><code id="L3513"><span class="ln">3513</span> <span class="c">// dy<span class="s"> = </span><span class="d">100</span><span class="s"> * </span>math.sin(angle),</span>
+</code><code id="L3514"><span class="ln">3514</span> <span class="c">// zx<span class="s"> = </span>matrix.x(<span class="d">0</span>, <span class="d">0</span>),</span>
+</code><code id="L3515"><span class="ln">3515</span> <span class="c">// zy<span class="s"> = </span>matrix.y(<span class="d">0</span>, <span class="d">0</span>),</span>
+</code><code id="L3516"><span class="ln">3516</span> <span class="c">// mx<span class="s"> = </span>matrix.x(dx, dy),</span>
+</code><code id="L3517"><span class="ln">3517</span> <span class="c">// my<span class="s"> = </span>matrix.y(dx, dy);</span>
+</code><code id="L3518"><span class="ln">3518</span> <span class="c">// angle<span class="s"> = </span>R.angle(zx, zy, mx, my);</span>
+</code><code id="L3519"><span class="ln">3519</span> <span class="c">// fill.angle<span class="s"> = </span>(<span class="d">270</span><span class="s"> - </span>angle)<span class="s"> % </span><span class="d">360</span>;</span>
+</code><code id="L3520"><span class="ln">3520</span> <span class="c">// }</span>
+</code><code id="L3521"><span class="ln">3521</span> }
+</code><code id="L3522"><span class="ln">3522</span> <b>return</b> <b>this</b>;
+</code><code id="L3523"><span class="ln">3523</span> };
+</code><code id="L3524"><span class="ln">3524</span> elproto.rotate<span class="s"> = </span><b>function</b> (deg, cx, cy) {
+</code><code id="L3525"><span class="ln">3525</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3526"><span class="ln">3526</span> <b>return</b> <b>this</b>;
+</code><code id="L3527"><span class="ln">3527</span> }
+</code><code id="L3528"><span class="ln">3528</span> <b>if</b> (deg<span class="s"> == </span><b>null</b>) {
+</code><code id="L3529"><span class="ln">3529</span> <b>return</b>;
+</code><code id="L3530"><span class="ln">3530</span> }
+</code><code id="L3531"><span class="ln">3531</span> deg<span class="s"> = </span>Str(deg).split(separator);
+</code><code id="L3532"><span class="ln">3532</span> <b>if</b> (deg.length<span class="s"> - </span><span class="d">1</span>) {
+</code><code id="L3533"><span class="ln">3533</span> cx<span class="s"> = </span>toFloat(deg[<span class="d">1</span>]);
+</code><code id="L3534"><span class="ln">3534</span> cy<span class="s"> = </span>toFloat(deg[<span class="d">2</span>]);
</code><code id="L3535"><span class="ln">3535</span> }
-</code><code id="L3536"><span class="ln">3536</span> sx<span class="s"> = </span>Str(sx).split(separator);
-</code><code id="L3537"><span class="ln">3537</span> <b>if</b> (sx.length<span class="s"> - </span><span class="d">1</span>) {
-</code><code id="L3538"><span class="ln">3538</span> sy<span class="s"> = </span>toFloat(sx[<span class="d">1</span>]);
-</code><code id="L3539"><span class="ln">3539</span> cx<span class="s"> = </span>toFloat(sx[<span class="d">2</span>]);
-</code><code id="L3540"><span class="ln">3540</span> cy<span class="s"> = </span>toFloat(sx[<span class="d">3</span>]);
-</code><code id="L3541"><span class="ln">3541</span> isNaN(cx)<span class="s"> && </span>(cx<span class="s"> = </span><b>null</b>);
-</code><code id="L3542"><span class="ln">3542</span> isNaN(cy)<span class="s"> && </span>(cy<span class="s"> = </span><b>null</b>);
-</code><code id="L3543"><span class="ln">3543</span> }
-</code><code id="L3544"><span class="ln">3544</span> sx<span class="s"> = </span>toFloat(sx[<span class="d">0</span>]);
-</code><code id="L3545"><span class="ln">3545</span> (sy<span class="s"> == </span><b>null</b>)<span class="s"> && </span>(sy<span class="s"> = </span>sx);
-</code><code id="L3546"><span class="ln">3546</span> (cy<span class="s"> == </span><b>null</b>)<span class="s"> && </span>(cx<span class="s"> = </span>cy);
-</code><code id="L3547"><span class="ln">3547</span> <b>if</b> (cx<span class="s"> == </span><b>null</b><span class="s"> || </span>cy<span class="s"> == </span><b>null</b>) {
-</code><code id="L3548"><span class="ln">3548</span> <b>var</b> bbox<span class="s"> = </span><b>this</b>.getBBox(<span class="d">1</span>);
-</code><code id="L3549"><span class="ln">3549</span> }
-</code><code id="L3550"><span class="ln">3550</span> cx<span class="s"> = </span>cx<span class="s"> == </span><b>null</b> ? bbox.x<span class="s"> + </span>bbox.width<span class="s"> / </span><span class="d">2</span> : cx;
-</code><code id="L3551"><span class="ln">3551</span> cy<span class="s"> = </span>cy<span class="s"> == </span><b>null</b> ? bbox.y<span class="s"> + </span>bbox.height<span class="s"> / </span><span class="d">2</span> : cy;
-</code><code id="L3552"><span class="ln">3552</span>
-</code><code id="L3553"><span class="ln">3553</span> <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"s"</i>, sx, sy, cx, cy]]));
-</code><code id="L3554"><span class="ln">3554</span> <b>this</b>._.dirtyT<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L3555"><span class="ln">3555</span> <b>return</b> <b>this</b>;
-</code><code id="L3556"><span class="ln">3556</span> };
-</code><code id="L3557"><span class="ln">3557</span> elproto.hide<span class="s"> = </span><b>function</b> () {
-</code><code id="L3558"><span class="ln">3558</span> !<b>this</b>.removed<span class="s"> && </span>(<b>this</b>.node.style.display<span class="s"> = </span><i>"none"</i>);
-</code><code id="L3559"><span class="ln">3559</span> <b>return</b> <b>this</b>;
-</code><code id="L3560"><span class="ln">3560</span> };
-</code><code id="L3561"><span class="ln">3561</span> elproto.show<span class="s"> = </span><b>function</b> () {
-</code><code id="L3562"><span class="ln">3562</span> !<b>this</b>.removed<span class="s"> && </span>(<b>this</b>.node.style.display<span class="s"> = </span>E);
-</code><code id="L3563"><span class="ln">3563</span> <b>return</b> <b>this</b>;
-</code><code id="L3564"><span class="ln">3564</span> };
-</code><code id="L3565"><span class="ln">3565</span> elproto._getBBox<span class="s"> = </span><b>function</b> () {
-</code><code id="L3566"><span class="ln">3566</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3567"><span class="ln">3567</span> <b>return</b> {};
-</code><code id="L3568"><span class="ln">3568</span> }
-</code><code id="L3569"><span class="ln">3569</span> <b>if</b> (<b>this</b>.type<span class="s"> == </span><i>"text"</i>) {
-</code><code id="L3570"><span class="ln">3570</span> <b>return</b> {
-</code><code id="L3571"><span class="ln">3571</span> x: <b>this</b>.X<span class="s"> + </span>(<b>this</b>.bbx<span class="s"> || </span><span class="d">0</span>)<span class="s"> - </span><b>this</b>.W<span class="s"> / </span><span class="d">2</span>,
-</code><code id="L3572"><span class="ln">3572</span> y: <b>this</b>.Y<span class="s"> - </span><b>this</b>.H,
-</code><code id="L3573"><span class="ln">3573</span> width: <b>this</b>.W,
-</code><code id="L3574"><span class="ln">3574</span> height: <b>this</b>.H
-</code><code id="L3575"><span class="ln">3575</span> };
-</code><code id="L3576"><span class="ln">3576</span> } <b>else</b> {
-</code><code id="L3577"><span class="ln">3577</span> <b>return</b> pathDimensions(<b>this</b>.attrs.path);
-</code><code id="L3578"><span class="ln">3578</span> }
-</code><code id="L3579"><span class="ln">3579</span> };
-</code><code id="L3580"><span class="ln">3580</span> elproto.remove<span class="s"> = </span><b>function</b> () {
-</code><code id="L3581"><span class="ln">3581</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3582"><span class="ln">3582</span> <b>return</b>;
-</code><code id="L3583"><span class="ln">3583</span> }
-</code><code id="L3584"><span class="ln">3584</span> eve.unbind(<i>"*.*."</i><span class="s"> + </span><b>this</b>.id);
-</code><code id="L3585"><span class="ln">3585</span> tear(<b>this</b>, <b>this</b>.paper);
-</code><code id="L3586"><span class="ln">3586</span> <b>this</b>.node.parentNode.removeChild(<b>this</b>.node);
-</code><code id="L3587"><span class="ln">3587</span> <b>this</b>.shape<span class="s"> && </span><b>this</b>.shape.parentNode.removeChild(<b>this</b>.shape);
-</code><code id="L3588"><span class="ln">3588</span> <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>) {
-</code><code id="L3589"><span class="ln">3589</span> <b>delete</b> <b>this</b>[i];
-</code><code id="L3590"><span class="ln">3590</span> }
-</code><code id="L3591"><span class="ln">3591</span> <b>this</b>.removed<span class="s"> = </span><b>true</b>;
+</code><code id="L3536"><span class="ln">3536</span> deg<span class="s"> = </span>toFloat(deg[<span class="d">0</span>]);
+</code><code id="L3537"><span class="ln">3537</span> (cy<span class="s"> == </span><b>null</b>)<span class="s"> && </span>(cx<span class="s"> = </span>cy);
+</code><code id="L3538"><span class="ln">3538</span> <b>if</b> (cx<span class="s"> == </span><b>null</b><span class="s"> || </span>cy<span class="s"> == </span><b>null</b>) {
+</code><code id="L3539"><span class="ln">3539</span> <b>var</b> bbox<span class="s"> = </span><b>this</b>.getBBox(<span class="d">1</span>);
+</code><code id="L3540"><span class="ln">3540</span> cx<span class="s"> = </span>bbox.x<span class="s"> + </span>bbox.width<span class="s"> / </span><span class="d">2</span>;
+</code><code id="L3541"><span class="ln">3541</span> cy<span class="s"> = </span>bbox.y<span class="s"> + </span>bbox.height<span class="s"> / </span><span class="d">2</span>;
+</code><code id="L3542"><span class="ln">3542</span> }
+</code><code id="L3543"><span class="ln">3543</span> <b>this</b>._.dirtyT<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L3544"><span class="ln">3544</span> <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"r"</i>, deg, cx, cy]]));
+</code><code id="L3545"><span class="ln">3545</span> <b>return</b> <b>this</b>;
+</code><code id="L3546"><span class="ln">3546</span> };
+</code><code id="L3547"><span class="ln">3547</span> elproto.translate<span class="s"> = </span><b>function</b> (dx, dy) {
+</code><code id="L3548"><span class="ln">3548</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3549"><span class="ln">3549</span> <b>return</b> <b>this</b>;
+</code><code id="L3550"><span class="ln">3550</span> }
+</code><code id="L3551"><span class="ln">3551</span> dx<span class="s"> = </span>Str(dx).split(separator);
+</code><code id="L3552"><span class="ln">3552</span> <b>if</b> (dx.length<span class="s"> - </span><span class="d">1</span>) {
+</code><code id="L3553"><span class="ln">3553</span> dy<span class="s"> = </span>toFloat(dx[<span class="d">1</span>]);
+</code><code id="L3554"><span class="ln">3554</span> }
+</code><code id="L3555"><span class="ln">3555</span> dx<span class="s"> = </span>toFloat(dx[<span class="d">0</span>])<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L3556"><span class="ln">3556</span> dy<span class="s"> = </span>+dy<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L3557"><span class="ln">3557</span> <b>if</b> (<b>this</b>._.bbox) {
+</code><code id="L3558"><span class="ln">3558</span> <b>this</b>._.bbox.x += dx;
+</code><code id="L3559"><span class="ln">3559</span> <b>this</b>._.bbox.y += dy;
+</code><code id="L3560"><span class="ln">3560</span> }
+</code><code id="L3561"><span class="ln">3561</span> <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"t"</i>, dx, dy]]));
+</code><code id="L3562"><span class="ln">3562</span> <b>return</b> <b>this</b>;
+</code><code id="L3563"><span class="ln">3563</span> };
+</code><code id="L3564"><span class="ln">3564</span> elproto.scale<span class="s"> = </span><b>function</b> (sx, sy, cx, cy) {
+</code><code id="L3565"><span class="ln">3565</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3566"><span class="ln">3566</span> <b>return</b> <b>this</b>;
+</code><code id="L3567"><span class="ln">3567</span> }
+</code><code id="L3568"><span class="ln">3568</span> sx<span class="s"> = </span>Str(sx).split(separator);
+</code><code id="L3569"><span class="ln">3569</span> <b>if</b> (sx.length<span class="s"> - </span><span class="d">1</span>) {
+</code><code id="L3570"><span class="ln">3570</span> sy<span class="s"> = </span>toFloat(sx[<span class="d">1</span>]);
+</code><code id="L3571"><span class="ln">3571</span> cx<span class="s"> = </span>toFloat(sx[<span class="d">2</span>]);
+</code><code id="L3572"><span class="ln">3572</span> cy<span class="s"> = </span>toFloat(sx[<span class="d">3</span>]);
+</code><code id="L3573"><span class="ln">3573</span> isNaN(cx)<span class="s"> && </span>(cx<span class="s"> = </span><b>null</b>);
+</code><code id="L3574"><span class="ln">3574</span> isNaN(cy)<span class="s"> && </span>(cy<span class="s"> = </span><b>null</b>);
+</code><code id="L3575"><span class="ln">3575</span> }
+</code><code id="L3576"><span class="ln">3576</span> sx<span class="s"> = </span>toFloat(sx[<span class="d">0</span>]);
+</code><code id="L3577"><span class="ln">3577</span> (sy<span class="s"> == </span><b>null</b>)<span class="s"> && </span>(sy<span class="s"> = </span>sx);
+</code><code id="L3578"><span class="ln">3578</span> (cy<span class="s"> == </span><b>null</b>)<span class="s"> && </span>(cx<span class="s"> = </span>cy);
+</code><code id="L3579"><span class="ln">3579</span> <b>if</b> (cx<span class="s"> == </span><b>null</b><span class="s"> || </span>cy<span class="s"> == </span><b>null</b>) {
+</code><code id="L3580"><span class="ln">3580</span> <b>var</b> bbox<span class="s"> = </span><b>this</b>.getBBox(<span class="d">1</span>);
+</code><code id="L3581"><span class="ln">3581</span> }
+</code><code id="L3582"><span class="ln">3582</span> cx<span class="s"> = </span>cx<span class="s"> == </span><b>null</b> ? bbox.x<span class="s"> + </span>bbox.width<span class="s"> / </span><span class="d">2</span> : cx;
+</code><code id="L3583"><span class="ln">3583</span> cy<span class="s"> = </span>cy<span class="s"> == </span><b>null</b> ? bbox.y<span class="s"> + </span>bbox.height<span class="s"> / </span><span class="d">2</span> : cy;
+</code><code id="L3584"><span class="ln">3584</span>
+</code><code id="L3585"><span class="ln">3585</span> <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"s"</i>, sx, sy, cx, cy]]));
+</code><code id="L3586"><span class="ln">3586</span> <b>this</b>._.dirtyT<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L3587"><span class="ln">3587</span> <b>return</b> <b>this</b>;
+</code><code id="L3588"><span class="ln">3588</span> };
+</code><code id="L3589"><span class="ln">3589</span> elproto.hide<span class="s"> = </span><b>function</b> () {
+</code><code id="L3590"><span class="ln">3590</span> !<b>this</b>.removed<span class="s"> && </span>(<b>this</b>.node.style.display<span class="s"> = </span><i>"none"</i>);
+</code><code id="L3591"><span class="ln">3591</span> <b>return</b> <b>this</b>;
</code><code id="L3592"><span class="ln">3592</span> };
-</code><code id="L3593"><span class="ln">3593</span> elproto.attr<span class="s"> = </span><b>function</b> (name, value) {
-</code><code id="L3594"><span class="ln">3594</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3595"><span class="ln">3595</span> <b>return</b> <b>this</b>;
-</code><code id="L3596"><span class="ln">3596</span> }
-</code><code id="L3597"><span class="ln">3597</span> <b>if</b> (name<span class="s"> == </span><b>null</b>) {
-</code><code id="L3598"><span class="ln">3598</span> <b>var</b> res<span class="s"> = </span>{};
-</code><code id="L3599"><span class="ln">3599</span> <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>.attrs) <b>if</b> (<b>this</b>.attrs[has](i)) {
-</code><code id="L3600"><span class="ln">3600</span> res[i]<span class="s"> = </span><b>this</b>.attrs[i];
-</code><code id="L3601"><span class="ln">3601</span> }
-</code><code id="L3602"><span class="ln">3602</span> res.gradient<span class="s"> && </span>res.fill<span class="s"> == </span><i>"none"</i><span class="s"> && </span>(res.fill<span class="s"> = </span>res.gradient)<span class="s"> && </span><b>delete</b> res.gradient;
-</code><code id="L3603"><span class="ln">3603</span> <b>return</b> res;
-</code><code id="L3604"><span class="ln">3604</span> }
-</code><code id="L3605"><span class="ln">3605</span> <b>if</b> (value<span class="s"> == </span><b>null</b><span class="s"> && </span>R.is(name, <i>"string"</i>)) {
-</code><code id="L3606"><span class="ln">3606</span> <b>if</b> (name<span class="s"> == </span>fillString<span class="s"> && </span><b>this</b>.attrs.fill<span class="s"> == </span><i>"none"</i><span class="s"> && </span><b>this</b>.attrs.gradient) {
-</code><code id="L3607"><span class="ln">3607</span> <b>return</b> <b>this</b>.attrs.gradient;
-</code><code id="L3608"><span class="ln">3608</span> }
-</code><code id="L3609"><span class="ln">3609</span> <b>if</b> (name <b>in</b> <b>this</b>.attrs) {
-</code><code id="L3610"><span class="ln">3610</span> <b>return</b> <b>this</b>.attrs[name];
-</code><code id="L3611"><span class="ln">3611</span> } <b>else</b> <b>if</b> (R.is(<b>this</b>.paper.customAttributes[name], <i>"<b>function</b>"</i>)) {
-</code><code id="L3612"><span class="ln">3612</span> <b>return</b> <b>this</b>.paper.customAttributes[name].def;
-</code><code id="L3613"><span class="ln">3613</span> } <b>else</b> {
-</code><code id="L3614"><span class="ln">3614</span> <b>return</b> availableAttrs[name];
-</code><code id="L3615"><span class="ln">3615</span> }
-</code><code id="L3616"><span class="ln">3616</span> }
-</code><code id="L3617"><span class="ln">3617</span> <b>if</b> (<b>this</b>.attrs<span class="s"> && </span>value<span class="s"> == </span><b>null</b><span class="s"> && </span>R.is(name, array)) {
-</code><code id="L3618"><span class="ln">3618</span> <b>var</b> ii, values<span class="s"> = </span>{};
-</code><code id="L3619"><span class="ln">3619</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>name.length; i < ii; i++) {
-</code><code id="L3620"><span class="ln">3620</span> values[name[i]]<span class="s"> = </span><b>this</b>.attr(name[i]);
-</code><code id="L3621"><span class="ln">3621</span> }
-</code><code id="L3622"><span class="ln">3622</span> <b>return</b> values;
-</code><code id="L3623"><span class="ln">3623</span> }
-</code><code id="L3624"><span class="ln">3624</span> <b>var</b> params;
-</code><code id="L3625"><span class="ln">3625</span> <b>if</b> (value != <b>null</b>) {
-</code><code id="L3626"><span class="ln">3626</span> params<span class="s"> = </span>{};
-</code><code id="L3627"><span class="ln">3627</span> params[name]<span class="s"> = </span>value;
+</code><code id="L3593"><span class="ln">3593</span> elproto.show<span class="s"> = </span><b>function</b> () {
+</code><code id="L3594"><span class="ln">3594</span> !<b>this</b>.removed<span class="s"> && </span>(<b>this</b>.node.style.display<span class="s"> = </span>E);
+</code><code id="L3595"><span class="ln">3595</span> <b>return</b> <b>this</b>;
+</code><code id="L3596"><span class="ln">3596</span> };
+</code><code id="L3597"><span class="ln">3597</span> elproto._getBBox<span class="s"> = </span><b>function</b> () {
+</code><code id="L3598"><span class="ln">3598</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3599"><span class="ln">3599</span> <b>return</b> {};
+</code><code id="L3600"><span class="ln">3600</span> }
+</code><code id="L3601"><span class="ln">3601</span> <b>if</b> (<b>this</b>.type<span class="s"> == </span><i>"text"</i>) {
+</code><code id="L3602"><span class="ln">3602</span> <b>return</b> {
+</code><code id="L3603"><span class="ln">3603</span> x: <b>this</b>.X<span class="s"> + </span>(<b>this</b>.bbx<span class="s"> || </span><span class="d">0</span>)<span class="s"> - </span><b>this</b>.W<span class="s"> / </span><span class="d">2</span>,
+</code><code id="L3604"><span class="ln">3604</span> y: <b>this</b>.Y<span class="s"> - </span><b>this</b>.H,
+</code><code id="L3605"><span class="ln">3605</span> width: <b>this</b>.W,
+</code><code id="L3606"><span class="ln">3606</span> height: <b>this</b>.H
+</code><code id="L3607"><span class="ln">3607</span> };
+</code><code id="L3608"><span class="ln">3608</span> } <b>else</b> {
+</code><code id="L3609"><span class="ln">3609</span> <b>return</b> pathDimensions(<b>this</b>.attrs.path);
+</code><code id="L3610"><span class="ln">3610</span> }
+</code><code id="L3611"><span class="ln">3611</span> };
+</code><code id="L3612"><span class="ln">3612</span> elproto.remove<span class="s"> = </span><b>function</b> () {
+</code><code id="L3613"><span class="ln">3613</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3614"><span class="ln">3614</span> <b>return</b>;
+</code><code id="L3615"><span class="ln">3615</span> }
+</code><code id="L3616"><span class="ln">3616</span> eve.unbind(<i>"*.*."</i><span class="s"> + </span><b>this</b>.id);
+</code><code id="L3617"><span class="ln">3617</span> tear(<b>this</b>, <b>this</b>.paper);
+</code><code id="L3618"><span class="ln">3618</span> <b>this</b>.node.parentNode.removeChild(<b>this</b>.node);
+</code><code id="L3619"><span class="ln">3619</span> <b>this</b>.shape<span class="s"> && </span><b>this</b>.shape.parentNode.removeChild(<b>this</b>.shape);
+</code><code id="L3620"><span class="ln">3620</span> <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>) {
+</code><code id="L3621"><span class="ln">3621</span> <b>delete</b> <b>this</b>[i];
+</code><code id="L3622"><span class="ln">3622</span> }
+</code><code id="L3623"><span class="ln">3623</span> <b>this</b>.removed<span class="s"> = </span><b>true</b>;
+</code><code id="L3624"><span class="ln">3624</span> };
+</code><code id="L3625"><span class="ln">3625</span> elproto.attr<span class="s"> = </span><b>function</b> (name, value) {
+</code><code id="L3626"><span class="ln">3626</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3627"><span class="ln">3627</span> <b>return</b> <b>this</b>;
</code><code id="L3628"><span class="ln">3628</span> }
-</code><code id="L3629"><span class="ln">3629</span> value<span class="s"> == </span><b>null</b><span class="s"> && </span>R.is(name, <i>"object"</i>)<span class="s"> && </span>(params<span class="s"> = </span>name);
-</code><code id="L3630"><span class="ln">3630</span> <b>for</b> (<b>var</b> key <b>in</b> params) {
-</code><code id="L3631"><span class="ln">3631</span> eve(<i>"attr."</i><span class="s"> + </span>key<span class="s"> + </span><i>"."</i><span class="s"> + </span><b>this</b>.id, <b>this</b>, params[key]);
-</code><code id="L3632"><span class="ln">3632</span> }
-</code><code id="L3633"><span class="ln">3633</span> <b>if</b> (params) {
-</code><code id="L3634"><span class="ln">3634</span> <b>for</b> (key <b>in</b> <b>this</b>.paper.customAttributes) <b>if</b> (<b>this</b>.paper.customAttributes[has](key)<span class="s"> && </span>params[has](key)<span class="s"> && </span>R.is(<b>this</b>.paper.customAttributes[key], <i>"<b>function</b>"</i>)) {
-</code><code id="L3635"><span class="ln">3635</span> <b>var</b> par<span class="s"> = </span><b>this</b>.paper.customAttributes[key].apply(<b>this</b>, [][concat](params[key]));
-</code><code id="L3636"><span class="ln">3636</span> <b>this</b>.attrs[key]<span class="s"> = </span>params[key];
-</code><code id="L3637"><span class="ln">3637</span> <b>for</b> (<b>var</b> subkey <b>in</b> par) <b>if</b> (par[has](subkey)) {
-</code><code id="L3638"><span class="ln">3638</span> params[subkey]<span class="s"> = </span>par[subkey];
-</code><code id="L3639"><span class="ln">3639</span> }
+</code><code id="L3629"><span class="ln">3629</span> <b>if</b> (name<span class="s"> == </span><b>null</b>) {
+</code><code id="L3630"><span class="ln">3630</span> <b>var</b> res<span class="s"> = </span>{};
+</code><code id="L3631"><span class="ln">3631</span> <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>.attrs) <b>if</b> (<b>this</b>.attrs[has](i)) {
+</code><code id="L3632"><span class="ln">3632</span> res[i]<span class="s"> = </span><b>this</b>.attrs[i];
+</code><code id="L3633"><span class="ln">3633</span> }
+</code><code id="L3634"><span class="ln">3634</span> res.gradient<span class="s"> && </span>res.fill<span class="s"> == </span><i>"none"</i><span class="s"> && </span>(res.fill<span class="s"> = </span>res.gradient)<span class="s"> && </span><b>delete</b> res.gradient;
+</code><code id="L3635"><span class="ln">3635</span> <b>return</b> res;
+</code><code id="L3636"><span class="ln">3636</span> }
+</code><code id="L3637"><span class="ln">3637</span> <b>if</b> (value<span class="s"> == </span><b>null</b><span class="s"> && </span>R.is(name, <i>"string"</i>)) {
+</code><code id="L3638"><span class="ln">3638</span> <b>if</b> (name<span class="s"> == </span>fillString<span class="s"> && </span><b>this</b>.attrs.fill<span class="s"> == </span><i>"none"</i><span class="s"> && </span><b>this</b>.attrs.gradient) {
+</code><code id="L3639"><span class="ln">3639</span> <b>return</b> <b>this</b>.attrs.gradient;
</code><code id="L3640"><span class="ln">3640</span> }
-</code><code id="L3641"><span class="ln">3641</span> <span class="c">// <b>this</b>.paper.canvas.style.display<span class="s"> = </span><i>"none"</i>;</span>
-</code><code id="L3642"><span class="ln">3642</span> <b>if</b> (params.text<span class="s"> && </span><b>this</b>.type<span class="s"> == </span><i>"text"</i>) {
-</code><code id="L3643"><span class="ln">3643</span> <b>this</b>.textpath.string<span class="s"> = </span>params.text;
-</code><code id="L3644"><span class="ln">3644</span> }
-</code><code id="L3645"><span class="ln">3645</span> setFillAndStroke(<b>this</b>, params);
-</code><code id="L3646"><span class="ln">3646</span> <span class="c">// <b>this</b>.paper.canvas.style.display<span class="s"> = </span>E;</span>
-</code><code id="L3647"><span class="ln">3647</span> }
-</code><code id="L3648"><span class="ln">3648</span> <b>return</b> <b>this</b>;
-</code><code id="L3649"><span class="ln">3649</span> };
-</code><code id="L3650"><span class="ln">3650</span> elproto.toFront<span class="s"> = </span><b>function</b> () {
-</code><code id="L3651"><span class="ln">3651</span> !<b>this</b>.removed<span class="s"> && </span><b>this</b>.node.parentNode.appendChild(<b>this</b>.node);
-</code><code id="L3652"><span class="ln">3652</span> <b>this</b>.paper.top != <b>this</b><span class="s"> && </span>tofront(<b>this</b>, <b>this</b>.paper);
-</code><code id="L3653"><span class="ln">3653</span> <b>return</b> <b>this</b>;
-</code><code id="L3654"><span class="ln">3654</span> };
-</code><code id="L3655"><span class="ln">3655</span> elproto.toBack<span class="s"> = </span><b>function</b> () {
-</code><code id="L3656"><span class="ln">3656</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3657"><span class="ln">3657</span> <b>return</b> <b>this</b>;
-</code><code id="L3658"><span class="ln">3658</span> }
-</code><code id="L3659"><span class="ln">3659</span> <b>if</b> (<b>this</b>.node.parentNode.firstChild != <b>this</b>.node) {
-</code><code id="L3660"><span class="ln">3660</span> <b>this</b>.node.parentNode.insertBefore(<b>this</b>.node, <b>this</b>.node.parentNode.firstChild);
-</code><code id="L3661"><span class="ln">3661</span> toback(<b>this</b>, <b>this</b>.paper);
-</code><code id="L3662"><span class="ln">3662</span> }
-</code><code id="L3663"><span class="ln">3663</span> <b>return</b> <b>this</b>;
-</code><code id="L3664"><span class="ln">3664</span> };
-</code><code id="L3665"><span class="ln">3665</span> elproto.insertAfter<span class="s"> = </span><b>function</b> (element) {
-</code><code id="L3666"><span class="ln">3666</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3667"><span class="ln">3667</span> <b>return</b> <b>this</b>;
-</code><code id="L3668"><span class="ln">3668</span> }
-</code><code id="L3669"><span class="ln">3669</span> <b>if</b> (element.constructor<span class="s"> == </span>Set) {
-</code><code id="L3670"><span class="ln">3670</span> element<span class="s"> = </span>element[element.length<span class="s"> - </span><span class="d">1</span>];
-</code><code id="L3671"><span class="ln">3671</span> }
-</code><code id="L3672"><span class="ln">3672</span> <b>if</b> (element.node.nextSibling) {
-</code><code id="L3673"><span class="ln">3673</span> element.node.parentNode.insertBefore(<b>this</b>.node, element.node.nextSibling);
-</code><code id="L3674"><span class="ln">3674</span> } <b>else</b> {
-</code><code id="L3675"><span class="ln">3675</span> element.node.parentNode.appendChild(<b>this</b>.node);
-</code><code id="L3676"><span class="ln">3676</span> }
-</code><code id="L3677"><span class="ln">3677</span> insertafter(<b>this</b>, element, <b>this</b>.paper);
-</code><code id="L3678"><span class="ln">3678</span> <b>return</b> <b>this</b>;
-</code><code id="L3679"><span class="ln">3679</span> };
-</code><code id="L3680"><span class="ln">3680</span> elproto.insertBefore<span class="s"> = </span><b>function</b> (element) {
-</code><code id="L3681"><span class="ln">3681</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3682"><span class="ln">3682</span> <b>return</b> <b>this</b>;
-</code><code id="L3683"><span class="ln">3683</span> }
-</code><code id="L3684"><span class="ln">3684</span> <b>if</b> (element.constructor<span class="s"> == </span>Set) {
-</code><code id="L3685"><span class="ln">3685</span> element<span class="s"> = </span>element[<span class="d">0</span>];
-</code><code id="L3686"><span class="ln">3686</span> }
-</code><code id="L3687"><span class="ln">3687</span> element.node.parentNode.insertBefore(<b>this</b>.node, element.node);
-</code><code id="L3688"><span class="ln">3688</span> insertbefore(<b>this</b>, element, <b>this</b>.paper);
-</code><code id="L3689"><span class="ln">3689</span> <b>return</b> <b>this</b>;
-</code><code id="L3690"><span class="ln">3690</span> };
-</code><code id="L3691"><span class="ln">3691</span> elproto.blur<span class="s"> = </span><b>function</b> (size) {
-</code><code id="L3692"><span class="ln">3692</span> <b>var</b> s<span class="s"> = </span><b>this</b>.node.runtimeStyle,
-</code><code id="L3693"><span class="ln">3693</span> f<span class="s"> = </span>s.filter;
-</code><code id="L3694"><span class="ln">3694</span> f<span class="s"> = </span>f.replace(blurregexp, E);
-</code><code id="L3695"><span class="ln">3695</span> <b>if</b> (+size !== <span class="d">0</span>) {
-</code><code id="L3696"><span class="ln">3696</span> <b>this</b>.attrs.blur<span class="s"> = </span>size;
-</code><code id="L3697"><span class="ln">3697</span> s.filter<span class="s"> = </span>f<span class="s"> + </span>S<span class="s"> + </span>ms<span class="s"> + </span><i>".Blur(pixelradius="</i><span class="s"> + </span>(+size<span class="s"> || </span><span class="d">1.5</span>)<span class="s"> + </span><i>")"</i>;
-</code><code id="L3698"><span class="ln">3698</span> s.margin<span class="s"> = </span>R.format(<i>"-{<span class="d">0</span>}px <span class="d">0</span> <span class="d">0</span> -{<span class="d">0</span>}px"</i>, round(+size<span class="s"> || </span><span class="d">1.5</span>));
-</code><code id="L3699"><span class="ln">3699</span> } <b>else</b> {
-</code><code id="L3700"><span class="ln">3700</span> s.filter<span class="s"> = </span>f;
-</code><code id="L3701"><span class="ln">3701</span> s.margin<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L3702"><span class="ln">3702</span> <b>delete</b> <b>this</b>.attrs.blur;
+</code><code id="L3641"><span class="ln">3641</span> <b>if</b> (name <b>in</b> <b>this</b>.attrs) {
+</code><code id="L3642"><span class="ln">3642</span> <b>return</b> <b>this</b>.attrs[name];
+</code><code id="L3643"><span class="ln">3643</span> } <b>else</b> <b>if</b> (R.is(<b>this</b>.paper.customAttributes[name], <i>"<b>function</b>"</i>)) {
+</code><code id="L3644"><span class="ln">3644</span> <b>return</b> <b>this</b>.paper.customAttributes[name].def;
+</code><code id="L3645"><span class="ln">3645</span> } <b>else</b> {
+</code><code id="L3646"><span class="ln">3646</span> <b>return</b> availableAttrs[name];
+</code><code id="L3647"><span class="ln">3647</span> }
+</code><code id="L3648"><span class="ln">3648</span> }
+</code><code id="L3649"><span class="ln">3649</span> <b>if</b> (<b>this</b>.attrs<span class="s"> && </span>value<span class="s"> == </span><b>null</b><span class="s"> && </span>R.is(name, array)) {
+</code><code id="L3650"><span class="ln">3650</span> <b>var</b> ii, values<span class="s"> = </span>{};
+</code><code id="L3651"><span class="ln">3651</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>name.length; i < ii; i++) {
+</code><code id="L3652"><span class="ln">3652</span> values[name[i]]<span class="s"> = </span><b>this</b>.attr(name[i]);
+</code><code id="L3653"><span class="ln">3653</span> }
+</code><code id="L3654"><span class="ln">3654</span> <b>return</b> values;
+</code><code id="L3655"><span class="ln">3655</span> }
+</code><code id="L3656"><span class="ln">3656</span> <b>var</b> params;
+</code><code id="L3657"><span class="ln">3657</span> <b>if</b> (value != <b>null</b>) {
+</code><code id="L3658"><span class="ln">3658</span> params<span class="s"> = </span>{};
+</code><code id="L3659"><span class="ln">3659</span> params[name]<span class="s"> = </span>value;
+</code><code id="L3660"><span class="ln">3660</span> }
+</code><code id="L3661"><span class="ln">3661</span> value<span class="s"> == </span><b>null</b><span class="s"> && </span>R.is(name, <i>"object"</i>)<span class="s"> && </span>(params<span class="s"> = </span>name);
+</code><code id="L3662"><span class="ln">3662</span> <b>for</b> (<b>var</b> key <b>in</b> params) {
+</code><code id="L3663"><span class="ln">3663</span> eve(<i>"attr."</i><span class="s"> + </span>key<span class="s"> + </span><i>"."</i><span class="s"> + </span><b>this</b>.id, <b>this</b>, params[key]);
+</code><code id="L3664"><span class="ln">3664</span> }
+</code><code id="L3665"><span class="ln">3665</span> <b>if</b> (params) {
+</code><code id="L3666"><span class="ln">3666</span> <b>for</b> (key <b>in</b> <b>this</b>.paper.customAttributes) <b>if</b> (<b>this</b>.paper.customAttributes[has](key)<span class="s"> && </span>params[has](key)<span class="s"> && </span>R.is(<b>this</b>.paper.customAttributes[key], <i>"<b>function</b>"</i>)) {
+</code><code id="L3667"><span class="ln">3667</span> <b>var</b> par<span class="s"> = </span><b>this</b>.paper.customAttributes[key].apply(<b>this</b>, [][concat](params[key]));
+</code><code id="L3668"><span class="ln">3668</span> <b>this</b>.attrs[key]<span class="s"> = </span>params[key];
+</code><code id="L3669"><span class="ln">3669</span> <b>for</b> (<b>var</b> subkey <b>in</b> par) <b>if</b> (par[has](subkey)) {
+</code><code id="L3670"><span class="ln">3670</span> params[subkey]<span class="s"> = </span>par[subkey];
+</code><code id="L3671"><span class="ln">3671</span> }
+</code><code id="L3672"><span class="ln">3672</span> }
+</code><code id="L3673"><span class="ln">3673</span> <span class="c">// <b>this</b>.paper.canvas.style.display<span class="s"> = </span><i>"none"</i>;</span>
+</code><code id="L3674"><span class="ln">3674</span> <b>if</b> (params.text<span class="s"> && </span><b>this</b>.type<span class="s"> == </span><i>"text"</i>) {
+</code><code id="L3675"><span class="ln">3675</span> <b>this</b>.textpath.string<span class="s"> = </span>params.text;
+</code><code id="L3676"><span class="ln">3676</span> }
+</code><code id="L3677"><span class="ln">3677</span> setFillAndStroke(<b>this</b>, params);
+</code><code id="L3678"><span class="ln">3678</span> <span class="c">// <b>this</b>.paper.canvas.style.display<span class="s"> = </span>E;</span>
+</code><code id="L3679"><span class="ln">3679</span> }
+</code><code id="L3680"><span class="ln">3680</span> <b>return</b> <b>this</b>;
+</code><code id="L3681"><span class="ln">3681</span> };
+</code><code id="L3682"><span class="ln">3682</span> elproto.toFront<span class="s"> = </span><b>function</b> () {
+</code><code id="L3683"><span class="ln">3683</span> !<b>this</b>.removed<span class="s"> && </span><b>this</b>.node.parentNode.appendChild(<b>this</b>.node);
+</code><code id="L3684"><span class="ln">3684</span> <b>this</b>.paper.top != <b>this</b><span class="s"> && </span>tofront(<b>this</b>, <b>this</b>.paper);
+</code><code id="L3685"><span class="ln">3685</span> <b>return</b> <b>this</b>;
+</code><code id="L3686"><span class="ln">3686</span> };
+</code><code id="L3687"><span class="ln">3687</span> elproto.toBack<span class="s"> = </span><b>function</b> () {
+</code><code id="L3688"><span class="ln">3688</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3689"><span class="ln">3689</span> <b>return</b> <b>this</b>;
+</code><code id="L3690"><span class="ln">3690</span> }
+</code><code id="L3691"><span class="ln">3691</span> <b>if</b> (<b>this</b>.node.parentNode.firstChild != <b>this</b>.node) {
+</code><code id="L3692"><span class="ln">3692</span> <b>this</b>.node.parentNode.insertBefore(<b>this</b>.node, <b>this</b>.node.parentNode.firstChild);
+</code><code id="L3693"><span class="ln">3693</span> toback(<b>this</b>, <b>this</b>.paper);
+</code><code id="L3694"><span class="ln">3694</span> }
+</code><code id="L3695"><span class="ln">3695</span> <b>return</b> <b>this</b>;
+</code><code id="L3696"><span class="ln">3696</span> };
+</code><code id="L3697"><span class="ln">3697</span> elproto.insertAfter<span class="s"> = </span><b>function</b> (element) {
+</code><code id="L3698"><span class="ln">3698</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3699"><span class="ln">3699</span> <b>return</b> <b>this</b>;
+</code><code id="L3700"><span class="ln">3700</span> }
+</code><code id="L3701"><span class="ln">3701</span> <b>if</b> (element.constructor<span class="s"> == </span>Set) {
+</code><code id="L3702"><span class="ln">3702</span> element<span class="s"> = </span>element[element.length<span class="s"> - </span><span class="d">1</span>];
</code><code id="L3703"><span class="ln">3703</span> }
-</code><code id="L3704"><span class="ln">3704</span> };
-</code><code id="L3705"><span class="ln">3705</span>
-</code><code id="L3706"><span class="ln">3706</span> thePath<span class="s"> = </span><b>function</b> (pathString, vml) {
-</code><code id="L3707"><span class="ln">3707</span> <b>var</b> el<span class="s"> = </span>createNode(<i>"shape"</i>);
-</code><code id="L3708"><span class="ln">3708</span> el.style.cssText<span class="s"> = </span>cssDot;
-</code><code id="L3709"><span class="ln">3709</span> el.coordsize<span class="s"> = </span>zoom<span class="s"> + </span>S<span class="s"> + </span>zoom;
-</code><code id="L3710"><span class="ln">3710</span> el.coordorigin<span class="s"> = </span>vml.coordorigin;
-</code><code id="L3711"><span class="ln">3711</span> <b>var</b> p<span class="s"> = </span><b>new</b> Element(el, vml),
-</code><code id="L3712"><span class="ln">3712</span> attr<span class="s"> = </span>{fill: <i>"none"</i>, stroke: <i>"#<span class="d">000</span>"</i>};
-</code><code id="L3713"><span class="ln">3713</span> pathString<span class="s"> && </span>(attr.path<span class="s"> = </span>pathString);
-</code><code id="L3714"><span class="ln">3714</span> p.type<span class="s"> = </span><i>"path"</i>;
-</code><code id="L3715"><span class="ln">3715</span> p.path<span class="s"> = </span>[];
-</code><code id="L3716"><span class="ln">3716</span> p.Path<span class="s"> = </span>E;
-</code><code id="L3717"><span class="ln">3717</span> setFillAndStroke(p, attr);
-</code><code id="L3718"><span class="ln">3718</span> vml.canvas.appendChild(el);
-</code><code id="L3719"><span class="ln">3719</span> <b>var</b> skew<span class="s"> = </span>createNode(<i>"skew"</i>);
-</code><code id="L3720"><span class="ln">3720</span> skew.on<span class="s"> = </span><b>true</b>;
-</code><code id="L3721"><span class="ln">3721</span> el.appendChild(skew);
-</code><code id="L3722"><span class="ln">3722</span> p.skew<span class="s"> = </span>skew;
-</code><code id="L3723"><span class="ln">3723</span> p.transform(E);
-</code><code id="L3724"><span class="ln">3724</span> <b>return</b> p;
-</code><code id="L3725"><span class="ln">3725</span> };
-</code><code id="L3726"><span class="ln">3726</span> theRect<span class="s"> = </span><b>function</b> (vml, x, y, w, h, r) {
-</code><code id="L3727"><span class="ln">3727</span> <b>var</b> path<span class="s"> = </span>rectPath(x, y, w, h, r),
-</code><code id="L3728"><span class="ln">3728</span> res<span class="s"> = </span>vml.path(path),
-</code><code id="L3729"><span class="ln">3729</span> a<span class="s"> = </span>res.attrs;
-</code><code id="L3730"><span class="ln">3730</span> res.X<span class="s"> = </span>a.x<span class="s"> = </span>x;
-</code><code id="L3731"><span class="ln">3731</span> res.Y<span class="s"> = </span>a.y<span class="s"> = </span>y;
-</code><code id="L3732"><span class="ln">3732</span> res.W<span class="s"> = </span>a.width<span class="s"> = </span>w;
-</code><code id="L3733"><span class="ln">3733</span> res.H<span class="s"> = </span>a.height<span class="s"> = </span>h;
-</code><code id="L3734"><span class="ln">3734</span> a.r<span class="s"> = </span>r;
-</code><code id="L3735"><span class="ln">3735</span> a.path<span class="s"> = </span>path;
-</code><code id="L3736"><span class="ln">3736</span> res.type<span class="s"> = </span><i>"rect"</i>;
-</code><code id="L3737"><span class="ln">3737</span> <b>return</b> res;
-</code><code id="L3738"><span class="ln">3738</span> };
-</code><code id="L3739"><span class="ln">3739</span> theEllipse<span class="s"> = </span><b>function</b> (vml, x, y, rx, ry) {
-</code><code id="L3740"><span class="ln">3740</span> <b>var</b> res<span class="s"> = </span>vml.path(),
-</code><code id="L3741"><span class="ln">3741</span> a<span class="s"> = </span>res.attrs;
-</code><code id="L3742"><span class="ln">3742</span> res.X<span class="s"> = </span>x<span class="s"> - </span>rx;
-</code><code id="L3743"><span class="ln">3743</span> res.Y<span class="s"> = </span>y<span class="s"> - </span>ry;
-</code><code id="L3744"><span class="ln">3744</span> res.W<span class="s"> = </span>rx<span class="s"> * </span><span class="d">2</span>;
-</code><code id="L3745"><span class="ln">3745</span> res.H<span class="s"> = </span>ry<span class="s"> * </span><span class="d">2</span>;
-</code><code id="L3746"><span class="ln">3746</span> res.type<span class="s"> = </span><i>"ellipse"</i>;
-</code><code id="L3747"><span class="ln">3747</span> setFillAndStroke(res, {
-</code><code id="L3748"><span class="ln">3748</span> cx: x,
-</code><code id="L3749"><span class="ln">3749</span> cy: y,
-</code><code id="L3750"><span class="ln">3750</span> rx: rx,
-</code><code id="L3751"><span class="ln">3751</span> ry: ry
-</code><code id="L3752"><span class="ln">3752</span> });
-</code><code id="L3753"><span class="ln">3753</span> <b>return</b> res;
-</code><code id="L3754"><span class="ln">3754</span> };
-</code><code id="L3755"><span class="ln">3755</span> theCircle<span class="s"> = </span><b>function</b> (vml, x, y, r) {
-</code><code id="L3756"><span class="ln">3756</span> <b>var</b> res<span class="s"> = </span>vml.path(),
-</code><code id="L3757"><span class="ln">3757</span> a<span class="s"> = </span>res.attrs;
-</code><code id="L3758"><span class="ln">3758</span> res.X<span class="s"> = </span>x<span class="s"> - </span>r;
-</code><code id="L3759"><span class="ln">3759</span> res.Y<span class="s"> = </span>y<span class="s"> - </span>r;
-</code><code id="L3760"><span class="ln">3760</span> res.W<span class="s"> = </span>res.H<span class="s"> = </span>r<span class="s"> * </span><span class="d">2</span>;
-</code><code id="L3761"><span class="ln">3761</span> res.type<span class="s"> = </span><i>"circle"</i>;
-</code><code id="L3762"><span class="ln">3762</span> setFillAndStroke(res, {
-</code><code id="L3763"><span class="ln">3763</span> cx: x,
-</code><code id="L3764"><span class="ln">3764</span> cy: y,
-</code><code id="L3765"><span class="ln">3765</span> r: r
-</code><code id="L3766"><span class="ln">3766</span> });
-</code><code id="L3767"><span class="ln">3767</span> <b>return</b> res;
-</code><code id="L3768"><span class="ln">3768</span> };
-</code><code id="L3769"><span class="ln">3769</span> theImage<span class="s"> = </span><b>function</b> (vml, src, x, y, w, h) {
-</code><code id="L3770"><span class="ln">3770</span> <b>var</b> path<span class="s"> = </span>rectPath(x, y, w, h),
-</code><code id="L3771"><span class="ln">3771</span> res<span class="s"> = </span>vml.path(path).attr({stroke: <i>"none"</i>}),
-</code><code id="L3772"><span class="ln">3772</span> a<span class="s"> = </span>res.attrs,
-</code><code id="L3773"><span class="ln">3773</span> node<span class="s"> = </span>res.node,
-</code><code id="L3774"><span class="ln">3774</span> fill<span class="s"> = </span>node.getElementsByTagName(fillString)[<span class="d">0</span>];
-</code><code id="L3775"><span class="ln">3775</span> a.src<span class="s"> = </span>src;
-</code><code id="L3776"><span class="ln">3776</span> res.X<span class="s"> = </span>a.x<span class="s"> = </span>x;
-</code><code id="L3777"><span class="ln">3777</span> res.Y<span class="s"> = </span>a.y<span class="s"> = </span>y;
-</code><code id="L3778"><span class="ln">3778</span> res.W<span class="s"> = </span>a.width<span class="s"> = </span>w;
-</code><code id="L3779"><span class="ln">3779</span> res.H<span class="s"> = </span>a.height<span class="s"> = </span>h;
-</code><code id="L3780"><span class="ln">3780</span> a.path<span class="s"> = </span>path;
-</code><code id="L3781"><span class="ln">3781</span> res.type<span class="s"> = </span><i>"image"</i>;
-</code><code id="L3782"><span class="ln">3782</span> fill.parentNode<span class="s"> == </span>node<span class="s"> && </span>node.removeChild(fill);
-</code><code id="L3783"><span class="ln">3783</span> fill.rotate<span class="s"> = </span><b>true</b>;
-</code><code id="L3784"><span class="ln">3784</span> fill.src<span class="s"> = </span>src;
-</code><code id="L3785"><span class="ln">3785</span> fill.type<span class="s"> = </span><i>"tile"</i>;
-</code><code id="L3786"><span class="ln">3786</span> res._.fillpos<span class="s"> = </span>[x, y];
-</code><code id="L3787"><span class="ln">3787</span> res._.fillsize<span class="s"> = </span>[w, h];
-</code><code id="L3788"><span class="ln">3788</span> node.appendChild(fill);
-</code><code id="L3789"><span class="ln">3789</span> setCoords(res);
-</code><code id="L3790"><span class="ln">3790</span> <b>return</b> res;
-</code><code id="L3791"><span class="ln">3791</span> };
-</code><code id="L3792"><span class="ln">3792</span> theText<span class="s"> = </span><b>function</b> (vml, x, y, text) {
-</code><code id="L3793"><span class="ln">3793</span> <b>var</b> el<span class="s"> = </span>createNode(<i>"shape"</i>),
-</code><code id="L3794"><span class="ln">3794</span> path<span class="s"> = </span>createNode(<i>"path"</i>),
-</code><code id="L3795"><span class="ln">3795</span> o<span class="s"> = </span>createNode(<i>"textpath"</i>);
-</code><code id="L3796"><span class="ln">3796</span> x<span class="s"> = </span>x<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L3797"><span class="ln">3797</span> y<span class="s"> = </span>y<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L3798"><span class="ln">3798</span> text<span class="s"> = </span>text<span class="s"> || </span><i>""</i>;
-</code><code id="L3799"><span class="ln">3799</span> path.v<span class="s"> = </span>R.format(<i>"m{<span class="d">0</span>},{<span class="d">1</span>}l{<span class="d">2</span>},{<span class="d">1</span>}"</i>, round(x<span class="s"> * </span>zoom), round(y<span class="s"> * </span>zoom), round(x<span class="s"> * </span>zoom)<span class="s"> + </span><span class="d">1</span>);
-</code><code id="L3800"><span class="ln">3800</span> path.textpathok<span class="s"> = </span><b>true</b>;
-</code><code id="L3801"><span class="ln">3801</span> o.string<span class="s"> = </span>Str(text);
-</code><code id="L3802"><span class="ln">3802</span> o.on<span class="s"> = </span><b>true</b>;
-</code><code id="L3803"><span class="ln">3803</span> el.style.cssText<span class="s"> = </span><i>"position:absolute;left:<span class="d">0</span>;top:<span class="d">0</span>;width:<span class="d">1</span>;height:<span class="d">1</span>"</i>;
-</code><code id="L3804"><span class="ln">3804</span> el.coordsize<span class="s"> = </span>zoom<span class="s"> + </span>S<span class="s"> + </span>zoom;
-</code><code id="L3805"><span class="ln">3805</span> el.coordorigin<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span>"</i>;
-</code><code id="L3806"><span class="ln">3806</span> <b>var</b> p<span class="s"> = </span><b>new</b> Element(el, vml),
-</code><code id="L3807"><span class="ln">3807</span> attr<span class="s"> = </span>{fill: <i>"#<span class="d">000</span>"</i>, stroke: <i>"none"</i>, font: availableAttrs.font, text: text};
-</code><code id="L3808"><span class="ln">3808</span> p.shape<span class="s"> = </span>el;
-</code><code id="L3809"><span class="ln">3809</span> p.path<span class="s"> = </span>path;
-</code><code id="L3810"><span class="ln">3810</span> p.textpath<span class="s"> = </span>o;
-</code><code id="L3811"><span class="ln">3811</span> p.type<span class="s"> = </span><i>"text"</i>;
-</code><code id="L3812"><span class="ln">3812</span> p.attrs.text<span class="s"> = </span>Str(text);
-</code><code id="L3813"><span class="ln">3813</span> p.attrs.x<span class="s"> = </span>x;
-</code><code id="L3814"><span class="ln">3814</span> p.attrs.y<span class="s"> = </span>y;
-</code><code id="L3815"><span class="ln">3815</span> p.attrs.w<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L3816"><span class="ln">3816</span> p.attrs.h<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L3817"><span class="ln">3817</span> setFillAndStroke(p, attr);
-</code><code id="L3818"><span class="ln">3818</span> el.appendChild(o);
-</code><code id="L3819"><span class="ln">3819</span> el.appendChild(path);
-</code><code id="L3820"><span class="ln">3820</span> vml.canvas.appendChild(el);
-</code><code id="L3821"><span class="ln">3821</span> <b>var</b> skew<span class="s"> = </span>createNode(<i>"skew"</i>);
-</code><code id="L3822"><span class="ln">3822</span> skew.on<span class="s"> = </span><b>true</b>;
-</code><code id="L3823"><span class="ln">3823</span> el.appendChild(skew);
-</code><code id="L3824"><span class="ln">3824</span> p.skew<span class="s"> = </span>skew;
-</code><code id="L3825"><span class="ln">3825</span> p.transform(E);
-</code><code id="L3826"><span class="ln">3826</span> <b>return</b> p;
-</code><code id="L3827"><span class="ln">3827</span> };
-</code><code id="L3828"><span class="ln">3828</span> setSize<span class="s"> = </span><b>function</b> (width, height) {
-</code><code id="L3829"><span class="ln">3829</span> <b>var</b> cs<span class="s"> = </span><b>this</b>.canvas.style;
-</code><code id="L3830"><span class="ln">3830</span> <b>this</b>.width<span class="s"> = </span>width;
-</code><code id="L3831"><span class="ln">3831</span> <b>this</b>.height<span class="s"> = </span>height;
-</code><code id="L3832"><span class="ln">3832</span> width<span class="s"> == </span>+width<span class="s"> && </span>(width += <i>"px"</i>);
-</code><code id="L3833"><span class="ln">3833</span> height<span class="s"> == </span>+height<span class="s"> && </span>(height += <i>"px"</i>);
-</code><code id="L3834"><span class="ln">3834</span> cs.width<span class="s"> = </span>width;
-</code><code id="L3835"><span class="ln">3835</span> cs.height<span class="s"> = </span>height;
-</code><code id="L3836"><span class="ln">3836</span> cs.clip<span class="s"> = </span><i>"rect(<span class="d">0</span> "</i><span class="s"> + </span>width<span class="s"> + </span><i>" "</i><span class="s"> + </span>height<span class="s"> + </span><i>" <span class="d">0</span>)"</i>;
-</code><code id="L3837"><span class="ln">3837</span> <b>if</b> (<b>this</b>._viewBox) {
-</code><code id="L3838"><span class="ln">3838</span> setViewBox.apply(<b>this</b>, <b>this</b>._viewBox);
-</code><code id="L3839"><span class="ln">3839</span> }
-</code><code id="L3840"><span class="ln">3840</span> <b>return</b> <b>this</b>;
-</code><code id="L3841"><span class="ln">3841</span> };
-</code><code id="L3842"><span class="ln">3842</span> setViewBox<span class="s"> = </span><b>function</b> (x, y, w, h, fit) {
-</code><code id="L3843"><span class="ln">3843</span> eve(<i>"setViewBox"</i>, <b>this</b>, <b>this</b>._viewBox, [x, y, w, h, fit]);
-</code><code id="L3844"><span class="ln">3844</span> <b>var</b> width<span class="s"> = </span><b>this</b>.width,
-</code><code id="L3845"><span class="ln">3845</span> height<span class="s"> = </span><b>this</b>.height,
-</code><code id="L3846"><span class="ln">3846</span> size<span class="s"> = </span><span class="d">1e3</span><span class="s"> * </span>mmax(w<span class="s"> / </span>width, h<span class="s"> / </span>height),
-</code><code id="L3847"><span class="ln">3847</span> H, W;
-</code><code id="L3848"><span class="ln">3848</span> <b>if</b> (fit) {
-</code><code id="L3849"><span class="ln">3849</span> H<span class="s"> = </span>height<span class="s"> / </span>h;
-</code><code id="L3850"><span class="ln">3850</span> W<span class="s"> = </span>width<span class="s"> / </span>w;
-</code><code id="L3851"><span class="ln">3851</span> <b>if</b> (w<span class="s"> * </span>H < width) {
-</code><code id="L3852"><span class="ln">3852</span> x -= (width<span class="s"> - </span>w<span class="s"> * </span>H)<span class="s"> / </span><span class="d">2</span><span class="s"> / </span>H;
-</code><code id="L3853"><span class="ln">3853</span> }
-</code><code id="L3854"><span class="ln">3854</span> <b>if</b> (h<span class="s"> * </span>W < height) {
-</code><code id="L3855"><span class="ln">3855</span> y -= (height<span class="s"> - </span>h<span class="s"> * </span>W)<span class="s"> / </span><span class="d">2</span><span class="s"> / </span>W;
-</code><code id="L3856"><span class="ln">3856</span> }
-</code><code id="L3857"><span class="ln">3857</span> }
-</code><code id="L3858"><span class="ln">3858</span> <b>this</b>._viewBox<span class="s"> = </span>[x, y, w, h, !!fit];
-</code><code id="L3859"><span class="ln">3859</span> <b>this</b>.forEach(<b>function</b> (el) {
-</code><code id="L3860"><span class="ln">3860</span> el.transform(<i>"..."</i>);
-</code><code id="L3861"><span class="ln">3861</span> });
-</code><code id="L3862"><span class="ln">3862</span> <b>return</b> <b>this</b>;
-</code><code id="L3863"><span class="ln">3863</span> };
-</code><code id="L3864"><span class="ln">3864</span> <b>var</b> createNode,
-</code><code id="L3865"><span class="ln">3865</span> initWin<span class="s"> = </span><b>function</b> (win) {
-</code><code id="L3866"><span class="ln">3866</span> <b>var</b> doc<span class="s"> = </span>win.document;
-</code><code id="L3867"><span class="ln">3867</span> doc.createStyleSheet().addRule(<i>".rvml"</i>, <i>"behavior:url(#<b>default</b>#VML)"</i>);
-</code><code id="L3868"><span class="ln">3868</span> <b>try</b> {
-</code><code id="L3869"><span class="ln">3869</span> !doc.namespaces.rvml<span class="s"> && </span>doc.namespaces.add(<i>"rvml"</i>, <i>"urn:schemas-microsoft-com:vml"</i>);
-</code><code id="L3870"><span class="ln">3870</span> createNode<span class="s"> = </span><b>function</b> (tagName) {
-</code><code id="L3871"><span class="ln">3871</span> <b>return</b> doc.createElement(<i>'<rvml:'</i><span class="s"> + </span>tagName<span class="s"> + </span><i>' <b>class</b>="rvml">'</i>);
-</code><code id="L3872"><span class="ln">3872</span> };
-</code><code id="L3873"><span class="ln">3873</span> } <b>catch</b> (e) {
-</code><code id="L3874"><span class="ln">3874</span> createNode<span class="s"> = </span><b>function</b> (tagName) {
-</code><code id="L3875"><span class="ln">3875</span> <b>return</b> doc.createElement(<i>'<'</i><span class="s"> + </span>tagName<span class="s"> + </span><i>' xmlns="urn:schemas-microsoft.com:vml" <b>class</b>="rvml">'</i>);
-</code><code id="L3876"><span class="ln">3876</span> };
-</code><code id="L3877"><span class="ln">3877</span> }
-</code><code id="L3878"><span class="ln">3878</span> };
-</code><code id="L3879"><span class="ln">3879</span> initWin(g.win);
-</code><code id="L3880"><span class="ln">3880</span> create<span class="s"> = </span><b>function</b> () {
-</code><code id="L3881"><span class="ln">3881</span> <b>var</b> con<span class="s"> = </span>getContainer[apply](<span class="d">0</span>, arguments),
-</code><code id="L3882"><span class="ln">3882</span> container<span class="s"> = </span>con.container,
-</code><code id="L3883"><span class="ln">3883</span> height<span class="s"> = </span>con.height,
-</code><code id="L3884"><span class="ln">3884</span> s,
-</code><code id="L3885"><span class="ln">3885</span> width<span class="s"> = </span>con.width,
-</code><code id="L3886"><span class="ln">3886</span> x<span class="s"> = </span>con.x,
-</code><code id="L3887"><span class="ln">3887</span> y<span class="s"> = </span>con.y;
-</code><code id="L3888"><span class="ln">3888</span> <b>if</b> (!container) {
-</code><code id="L3889"><span class="ln">3889</span> <b>throw</b> <b>new</b> Error(<i>"VML container not found."</i>);
-</code><code id="L3890"><span class="ln">3890</span> }
-</code><code id="L3891"><span class="ln">3891</span> <b>var</b> res<span class="s"> = </span><b>new</b> Paper,
-</code><code id="L3892"><span class="ln">3892</span> c<span class="s"> = </span>res.canvas<span class="s"> = </span>g.doc.createElement(<i>"div"</i>),
-</code><code id="L3893"><span class="ln">3893</span> cs<span class="s"> = </span>c.style;
-</code><code id="L3894"><span class="ln">3894</span> x<span class="s"> = </span>x<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L3895"><span class="ln">3895</span> y<span class="s"> = </span>y<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L3896"><span class="ln">3896</span> width<span class="s"> = </span>width<span class="s"> || </span><span class="d">512</span>;
-</code><code id="L3897"><span class="ln">3897</span> height<span class="s"> = </span>height<span class="s"> || </span><span class="d">342</span>;
-</code><code id="L3898"><span class="ln">3898</span> res.width<span class="s"> = </span>width;
-</code><code id="L3899"><span class="ln">3899</span> res.height<span class="s"> = </span>height;
-</code><code id="L3900"><span class="ln">3900</span> width<span class="s"> == </span>+width<span class="s"> && </span>(width += <i>"px"</i>);
-</code><code id="L3901"><span class="ln">3901</span> height<span class="s"> == </span>+height<span class="s"> && </span>(height += <i>"px"</i>);
-</code><code id="L3902"><span class="ln">3902</span> res.coordsize<span class="s"> = </span>zoom<span class="s"> * </span><span class="d">1e3</span><span class="s"> + </span>S<span class="s"> + </span>zoom<span class="s"> * </span><span class="d">1e3</span>;
-</code><code id="L3903"><span class="ln">3903</span> res.coordorigin<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span>"</i>;
-</code><code id="L3904"><span class="ln">3904</span> res.span<span class="s"> = </span>g.doc.createElement(<i>"span"</i>);
-</code><code id="L3905"><span class="ln">3905</span> res.span.style.cssText<span class="s"> = </span><i>"position:absolute;left:-9999em;top:-9999em;padding:<span class="d">0</span>;margin:<span class="d">0</span>;line-height:<span class="d">1</span>;"</i>;
-</code><code id="L3906"><span class="ln">3906</span> c.appendChild(res.span);
-</code><code id="L3907"><span class="ln">3907</span> cs.cssText<span class="s"> = </span>R.format(<i>"top:<span class="d">0</span>;left:<span class="d">0</span>;width:{<span class="d">0</span>};height:{<span class="d">1</span>};display:inline-block;position:relative;clip:rect(<span class="d">0</span> {<span class="d">0</span>} {<span class="d">1</span>} <span class="d">0</span>);overflow:hidden"</i>, width, height);
-</code><code id="L3908"><span class="ln">3908</span> <b>if</b> (container<span class="s"> == </span><span class="d">1</span>) {
-</code><code id="L3909"><span class="ln">3909</span> g.doc.body.appendChild(c);
-</code><code id="L3910"><span class="ln">3910</span> cs.left<span class="s"> = </span>x<span class="s"> + </span><i>"px"</i>;
-</code><code id="L3911"><span class="ln">3911</span> cs.top<span class="s"> = </span>y<span class="s"> + </span><i>"px"</i>;
-</code><code id="L3912"><span class="ln">3912</span> cs.position<span class="s"> = </span><i>"absolute"</i>;
-</code><code id="L3913"><span class="ln">3913</span> } <b>else</b> {
-</code><code id="L3914"><span class="ln">3914</span> <b>if</b> (container.firstChild) {
-</code><code id="L3915"><span class="ln">3915</span> container.insertBefore(c, container.firstChild);
-</code><code id="L3916"><span class="ln">3916</span> } <b>else</b> {
-</code><code id="L3917"><span class="ln">3917</span> container.appendChild(c);
-</code><code id="L3918"><span class="ln">3918</span> }
-</code><code id="L3919"><span class="ln">3919</span> }
-</code><code id="L3920"><span class="ln">3920</span> plugins.call(res, res, R.fn);
-</code><code id="L3921"><span class="ln">3921</span> <b>return</b> res;
-</code><code id="L3922"><span class="ln">3922</span> };
-</code><code id="L3923"><span class="ln">3923</span> paperproto.clear<span class="s"> = </span><b>function</b> () {
-</code><code id="L3924"><span class="ln">3924</span> eve(<i>"clear"</i>, <b>this</b>);
-</code><code id="L3925"><span class="ln">3925</span> <b>this</b>.canvas.innerHTML<span class="s"> = </span>E;
-</code><code id="L3926"><span class="ln">3926</span> <b>this</b>.span<span class="s"> = </span>g.doc.createElement(<i>"span"</i>);
-</code><code id="L3927"><span class="ln">3927</span> <b>this</b>.span.style.cssText<span class="s"> = </span><i>"position:absolute;left:-9999em;top:-9999em;padding:<span class="d">0</span>;margin:<span class="d">0</span>;line-height:<span class="d">1</span>;display:inline;"</i>;
-</code><code id="L3928"><span class="ln">3928</span> <b>this</b>.canvas.appendChild(<b>this</b>.span);
-</code><code id="L3929"><span class="ln">3929</span> <b>this</b>.bottom<span class="s"> = </span><b>this</b>.top<span class="s"> = </span><b>null</b>;
-</code><code id="L3930"><span class="ln">3930</span> };
-</code><code id="L3931"><span class="ln">3931</span> paperproto.remove<span class="s"> = </span><b>function</b> () {
-</code><code id="L3932"><span class="ln">3932</span> eve(<i>"remove"</i>, <b>this</b>);
-</code><code id="L3933"><span class="ln">3933</span> <b>this</b>.canvas.parentNode.removeChild(<b>this</b>.canvas);
-</code><code id="L3934"><span class="ln">3934</span> <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>) {
-</code><code id="L3935"><span class="ln">3935</span> <b>this</b>[i]<span class="s"> = </span>removed(i);
-</code><code id="L3936"><span class="ln">3936</span> }
-</code><code id="L3937"><span class="ln">3937</span> <b>return</b> <b>true</b>;
-</code><code id="L3938"><span class="ln">3938</span> };
-</code><code id="L3939"><span class="ln">3939</span> }
-</code><code id="L3940"><span class="ln">3940</span>
-</code><code id="L3941"><span class="ln">3941</span> <span class="c">// WebKit rendering bug workaround method</span>
-</code><code id="L3942"><span class="ln">3942</span> <b>var</b> version<span class="s"> = </span>navigator.userAgent.match(/Version\/(.*?)\s/)<span class="s"> || </span>navigator.userAgent.match(/Chrome\/(\d+)/);
-</code><code id="L3943"><span class="ln">3943</span> <b>if</b> ((navigator.vendor<span class="s"> == </span><i>"Apple Computer, Inc."</i>)<span class="s"> && </span>(version<span class="s"> && </span>version[<span class="d">1</span>] < <span class="d">4</span><span class="s"> || </span>navigator.platform.slice(<span class="d">0</span>, <span class="d">2</span>)<span class="s"> == </span><i>"iP"</i>) ||
-</code><code id="L3944"><span class="ln">3944</span> (navigator.vendor<span class="s"> == </span><i>"Google Inc."</i><span class="s"> && </span>version<span class="s"> && </span>version[<span class="d">1</span>] < <span class="d">8</span>)) {
-</code><code id="L3945"><span class="ln">3945</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L3946"><span class="ln">3946</span><span class="c"> <span class="s"> * </span>Paper.safari
-</span></code><code id="L3947"><span class="ln">3947</span><span class="c"> [ method ]
-</span></code><code id="L3948"><span class="ln">3948</span><span class="c"> **
-</span></code><code id="L3949"><span class="ln">3949</span><span class="c"> <span class="s"> * </span>There is an inconvenient rendering bug <b>in</b> Safari (WebKit):
-</span></code><code id="L3950"><span class="ln">3950</span><span class="c"> <span class="s"> * </span>sometimes the rendering should be forced.
-</span></code><code id="L3951"><span class="ln">3951</span><span class="c"> <span class="s"> * </span>This method should help <b>with</b> dealing <b>with</b> <b>this</b> bug.
-</span></code><code id="L3952"><span class="ln">3952</span><span class="c"> \*/</span>
-</code><code id="L3953"><span class="ln">3953</span> paperproto.safari<span class="s"> = </span><b>function</b> () {
-</code><code id="L3954"><span class="ln">3954</span> <b>var</b> rect<span class="s"> = </span><b>this</b>.rect(-<span class="d">99</span>, -<span class="d">99</span>, <b>this</b>.width<span class="s"> + </span><span class="d">99</span>, <b>this</b>.height<span class="s"> + </span><span class="d">99</span>).attr({stroke: <i>"none"</i>});
-</code><code id="L3955"><span class="ln">3955</span> setTimeout(<b>function</b> () {rect.remove();});
-</code><code id="L3956"><span class="ln">3956</span> };
-</code><code id="L3957"><span class="ln">3957</span> } <b>else</b> {
-</code><code id="L3958"><span class="ln">3958</span> paperproto.safari<span class="s"> = </span>fun;
-</code><code id="L3959"><span class="ln">3959</span> }
-</code><code id="L3960"><span class="ln">3960</span>
-</code><code id="L3961"><span class="ln">3961</span> <span class="c">// Events</span>
-</code><code id="L3962"><span class="ln">3962</span> <b>var</b> preventDefault<span class="s"> = </span><b>function</b> () {
-</code><code id="L3963"><span class="ln">3963</span> <b>this</b>.returnValue<span class="s"> = </span><b>false</b>;
-</code><code id="L3964"><span class="ln">3964</span> },
-</code><code id="L3965"><span class="ln">3965</span> preventTouch<span class="s"> = </span><b>function</b> () {
-</code><code id="L3966"><span class="ln">3966</span> <b>return</b> <b>this</b>.originalEvent.preventDefault();
-</code><code id="L3967"><span class="ln">3967</span> },
-</code><code id="L3968"><span class="ln">3968</span> stopPropagation<span class="s"> = </span><b>function</b> () {
-</code><code id="L3969"><span class="ln">3969</span> <b>this</b>.cancelBubble<span class="s"> = </span><b>true</b>;
-</code><code id="L3970"><span class="ln">3970</span> },
-</code><code id="L3971"><span class="ln">3971</span> stopTouch<span class="s"> = </span><b>function</b> () {
-</code><code id="L3972"><span class="ln">3972</span> <b>return</b> <b>this</b>.originalEvent.stopPropagation();
-</code><code id="L3973"><span class="ln">3973</span> },
-</code><code id="L3974"><span class="ln">3974</span> addEvent<span class="s"> = </span>(<b>function</b> () {
-</code><code id="L3975"><span class="ln">3975</span> <b>if</b> (g.doc.addEventListener) {
-</code><code id="L3976"><span class="ln">3976</span> <b>return</b> <b>function</b> (obj, type, fn, element) {
-</code><code id="L3977"><span class="ln">3977</span> <b>var</b> realName<span class="s"> = </span>supportsTouch<span class="s"> && </span>touchMap[type] ? touchMap[type] : type;
-</code><code id="L3978"><span class="ln">3978</span> <b>var</b> f<span class="s"> = </span><b>function</b> (e) {
-</code><code id="L3979"><span class="ln">3979</span> <b>if</b> (supportsTouch<span class="s"> && </span>touchMap[has](type)) {
-</code><code id="L3980"><span class="ln">3980</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>e.targetTouches<span class="s"> && </span>e.targetTouches.length; i < ii; i++) {
-</code><code id="L3981"><span class="ln">3981</span> <b>if</b> (e.targetTouches[i].target<span class="s"> == </span>obj) {
-</code><code id="L3982"><span class="ln">3982</span> <b>var</b> olde<span class="s"> = </span>e;
-</code><code id="L3983"><span class="ln">3983</span> e<span class="s"> = </span>e.targetTouches[i];
-</code><code id="L3984"><span class="ln">3984</span> e.originalEvent<span class="s"> = </span>olde;
-</code><code id="L3985"><span class="ln">3985</span> e.preventDefault<span class="s"> = </span>preventTouch;
-</code><code id="L3986"><span class="ln">3986</span> e.stopPropagation<span class="s"> = </span>stopTouch;
-</code><code id="L3987"><span class="ln">3987</span> <b>break</b>;
-</code><code id="L3988"><span class="ln">3988</span> }
-</code><code id="L3989"><span class="ln">3989</span> }
-</code><code id="L3990"><span class="ln">3990</span> }
-</code><code id="L3991"><span class="ln">3991</span> <b>return</b> fn.call(element, e);
-</code><code id="L3992"><span class="ln">3992</span> };
-</code><code id="L3993"><span class="ln">3993</span> obj.addEventListener(realName, f, <b>false</b>);
-</code><code id="L3994"><span class="ln">3994</span> <b>return</b> <b>function</b> () {
-</code><code id="L3995"><span class="ln">3995</span> obj.removeEventListener(realName, f, <b>false</b>);
-</code><code id="L3996"><span class="ln">3996</span> <b>return</b> <b>true</b>;
-</code><code id="L3997"><span class="ln">3997</span> };
-</code><code id="L3998"><span class="ln">3998</span> };
-</code><code id="L3999"><span class="ln">3999</span> } <b>else</b> <b>if</b> (g.doc.attachEvent) {
-</code><code id="L4000"><span class="ln">4000</span> <b>return</b> <b>function</b> (obj, type, fn, element) {
-</code><code id="L4001"><span class="ln">4001</span> <b>var</b> f<span class="s"> = </span><b>function</b> (e) {
-</code><code id="L4002"><span class="ln">4002</span> e<span class="s"> = </span>e<span class="s"> || </span>g.win.event;
-</code><code id="L4003"><span class="ln">4003</span> e.preventDefault<span class="s"> = </span>e.preventDefault<span class="s"> || </span>preventDefault;
-</code><code id="L4004"><span class="ln">4004</span> e.stopPropagation<span class="s"> = </span>e.stopPropagation<span class="s"> || </span>stopPropagation;
-</code><code id="L4005"><span class="ln">4005</span> <b>return</b> fn.call(element, e);
-</code><code id="L4006"><span class="ln">4006</span> };
-</code><code id="L4007"><span class="ln">4007</span> obj.attachEvent(<i>"on"</i><span class="s"> + </span>type, f);
-</code><code id="L4008"><span class="ln">4008</span> <b>var</b> detacher<span class="s"> = </span><b>function</b> () {
-</code><code id="L4009"><span class="ln">4009</span> obj.detachEvent(<i>"on"</i><span class="s"> + </span>type, f);
-</code><code id="L4010"><span class="ln">4010</span> <b>return</b> <b>true</b>;
-</code><code id="L4011"><span class="ln">4011</span> };
-</code><code id="L4012"><span class="ln">4012</span> <b>return</b> detacher;
-</code><code id="L4013"><span class="ln">4013</span> };
-</code><code id="L4014"><span class="ln">4014</span> }
-</code><code id="L4015"><span class="ln">4015</span> })(),
-</code><code id="L4016"><span class="ln">4016</span> drag<span class="s"> = </span>[],
-</code><code id="L4017"><span class="ln">4017</span> dragMove<span class="s"> = </span><b>function</b> (e) {
-</code><code id="L4018"><span class="ln">4018</span> <b>var</b> x<span class="s"> = </span>e.clientX,
-</code><code id="L4019"><span class="ln">4019</span> y<span class="s"> = </span>e.clientY,
-</code><code id="L4020"><span class="ln">4020</span> scrollY<span class="s"> = </span>g.doc.documentElement.scrollTop<span class="s"> || </span>g.doc.body.scrollTop,
-</code><code id="L4021"><span class="ln">4021</span> scrollX<span class="s"> = </span>g.doc.documentElement.scrollLeft<span class="s"> || </span>g.doc.body.scrollLeft,
-</code><code id="L4022"><span class="ln">4022</span> dragi,
-</code><code id="L4023"><span class="ln">4023</span> j<span class="s"> = </span>drag.length;
-</code><code id="L4024"><span class="ln">4024</span> <b>while</b> (j--) {
-</code><code id="L4025"><span class="ln">4025</span> dragi<span class="s"> = </span>drag[j];
-</code><code id="L4026"><span class="ln">4026</span> <b>if</b> (supportsTouch) {
-</code><code id="L4027"><span class="ln">4027</span> <b>var</b> i<span class="s"> = </span>e.touches.length,
-</code><code id="L4028"><span class="ln">4028</span> touch;
-</code><code id="L4029"><span class="ln">4029</span> <b>while</b> (i--) {
-</code><code id="L4030"><span class="ln">4030</span> touch<span class="s"> = </span>e.touches[i];
-</code><code id="L4031"><span class="ln">4031</span> <b>if</b> (touch.identifier<span class="s"> == </span>dragi.el._drag.id) {
-</code><code id="L4032"><span class="ln">4032</span> x<span class="s"> = </span>touch.clientX;
-</code><code id="L4033"><span class="ln">4033</span> y<span class="s"> = </span>touch.clientY;
-</code><code id="L4034"><span class="ln">4034</span> (e.originalEvent ? e.originalEvent : e).preventDefault();
-</code><code id="L4035"><span class="ln">4035</span> <b>break</b>;
-</code><code id="L4036"><span class="ln">4036</span> }
-</code><code id="L4037"><span class="ln">4037</span> }
-</code><code id="L4038"><span class="ln">4038</span> } <b>else</b> {
-</code><code id="L4039"><span class="ln">4039</span> e.preventDefault();
-</code><code id="L4040"><span class="ln">4040</span> }
-</code><code id="L4041"><span class="ln">4041</span> <b>var</b> node<span class="s"> = </span>dragi.el.node,
-</code><code id="L4042"><span class="ln">4042</span> o,
-</code><code id="L4043"><span class="ln">4043</span> next<span class="s"> = </span>node.nextSibling,
-</code><code id="L4044"><span class="ln">4044</span> parent<span class="s"> = </span>node.parentNode,
-</code><code id="L4045"><span class="ln">4045</span> display<span class="s"> = </span>node.style.display;
-</code><code id="L4046"><span class="ln">4046</span> g.win.opera<span class="s"> && </span>parent.removeChild(node);
-</code><code id="L4047"><span class="ln">4047</span> node.style.display<span class="s"> = </span><i>"none"</i>;
-</code><code id="L4048"><span class="ln">4048</span> o<span class="s"> = </span>dragi.el.paper.getElementByPoint(x, y);
-</code><code id="L4049"><span class="ln">4049</span> node.style.display<span class="s"> = </span>display;
-</code><code id="L4050"><span class="ln">4050</span> g.win.opera<span class="s"> && </span>(next ? parent.insertBefore(node, next) : parent.appendChild(node));
-</code><code id="L4051"><span class="ln">4051</span> o<span class="s"> && </span>eve(<i>"drag.over."</i><span class="s"> + </span>dragi.el.id, dragi.el, o);
-</code><code id="L4052"><span class="ln">4052</span> x += scrollX;
-</code><code id="L4053"><span class="ln">4053</span> y += scrollY;
-</code><code id="L4054"><span class="ln">4054</span> eve(<i>"drag.move."</i><span class="s"> + </span>dragi.el.id, dragi.move_scope<span class="s"> || </span>dragi.el, x<span class="s"> - </span>dragi.el._drag.x, y<span class="s"> - </span>dragi.el._drag.y, x, y, e);
-</code><code id="L4055"><span class="ln">4055</span> }
-</code><code id="L4056"><span class="ln">4056</span> },
-</code><code id="L4057"><span class="ln">4057</span> dragUp<span class="s"> = </span><b>function</b> (e) {
-</code><code id="L4058"><span class="ln">4058</span> R.unmousemove(dragMove).unmouseup(dragUp);
-</code><code id="L4059"><span class="ln">4059</span> <b>var</b> i<span class="s"> = </span>drag.length,
-</code><code id="L4060"><span class="ln">4060</span> dragi;
-</code><code id="L4061"><span class="ln">4061</span> <b>while</b> (i--) {
-</code><code id="L4062"><span class="ln">4062</span> dragi<span class="s"> = </span>drag[i];
-</code><code id="L4063"><span class="ln">4063</span> dragi.el._drag<span class="s"> = </span>{};
-</code><code id="L4064"><span class="ln">4064</span> eve(<i>"drag.end."</i><span class="s"> + </span>dragi.el.id, dragi.end_scope<span class="s"> || </span>dragi.start_scope<span class="s"> || </span>dragi.move_scope<span class="s"> || </span>dragi.el, e);
-</code><code id="L4065"><span class="ln">4065</span> }
-</code><code id="L4066"><span class="ln">4066</span> drag<span class="s"> = </span>[];
-</code><code id="L4067"><span class="ln">4067</span> };
-</code><code id="L4068"><span class="ln">4068</span> <b>for</b> (<b>var</b> i<span class="s"> = </span>events.length; i--;) {
-</code><code id="L4069"><span class="ln">4069</span> (<b>function</b> (eventName) {
-</code><code id="L4070"><span class="ln">4070</span> R[eventName]<span class="s"> = </span>Element.prototype[eventName]<span class="s"> = </span><b>function</b> (fn, scope) {
-</code><code id="L4071"><span class="ln">4071</span> <b>if</b> (R.is(fn, <i>"<b>function</b>"</i>)) {
-</code><code id="L4072"><span class="ln">4072</span> <b>this</b>.events<span class="s"> = </span><b>this</b>.events<span class="s"> || </span>[];
-</code><code id="L4073"><span class="ln">4073</span> <b>this</b>.events.push({name: eventName, f: fn, unbind: addEvent(<b>this</b>.shape<span class="s"> || </span><b>this</b>.node<span class="s"> || </span>g.doc, eventName, fn, scope<span class="s"> || </span><b>this</b>)});
-</code><code id="L4074"><span class="ln">4074</span> }
-</code><code id="L4075"><span class="ln">4075</span> <b>return</b> <b>this</b>;
-</code><code id="L4076"><span class="ln">4076</span> };
-</code><code id="L4077"><span class="ln">4077</span> R[<i>"un"</i><span class="s"> + </span>eventName]<span class="s"> = </span>Element.prototype[<i>"un"</i><span class="s"> + </span>eventName]<span class="s"> = </span><b>function</b> (fn) {
-</code><code id="L4078"><span class="ln">4078</span> <b>var</b> events<span class="s"> = </span><b>this</b>.events,
-</code><code id="L4079"><span class="ln">4079</span> l<span class="s"> = </span>events.length;
-</code><code id="L4080"><span class="ln">4080</span> <b>while</b> (l--) <b>if</b> (events[l].name<span class="s"> == </span>eventName<span class="s"> && </span>events[l].f<span class="s"> == </span>fn) {
-</code><code id="L4081"><span class="ln">4081</span> events[l].unbind();
-</code><code id="L4082"><span class="ln">4082</span> events.splice(l, <span class="d">1</span>);
-</code><code id="L4083"><span class="ln">4083</span> !events.length<span class="s"> && </span><b>delete</b> <b>this</b>.events;
-</code><code id="L4084"><span class="ln">4084</span> <b>return</b> <b>this</b>;
-</code><code id="L4085"><span class="ln">4085</span> }
-</code><code id="L4086"><span class="ln">4086</span> <b>return</b> <b>this</b>;
-</code><code id="L4087"><span class="ln">4087</span> };
-</code><code id="L4088"><span class="ln">4088</span> })(events[i]);
-</code><code id="L4089"><span class="ln">4089</span> }
-</code><code id="L4090"><span class="ln">4090</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4091"><span class="ln">4091</span><span class="c"> <span class="s"> * </span>Element.hover
-</span></code><code id="L4092"><span class="ln">4092</span><span class="c"> [ method ]
-</span></code><code id="L4093"><span class="ln">4093</span><span class="c"> **
-</span></code><code id="L4094"><span class="ln">4094</span><span class="c"> <span class="s"> * </span>Adds event handlers <b>for</b> hover <b>for</b> the element.
-</span></code><code id="L4095"><span class="ln">4095</span><span class="c"> > Parameters
-</span></code><code id="L4096"><span class="ln">4096</span><span class="c"> <span class="s"> - </span>f_in (<b>function</b>) handler <b>for</b> hover <b>in</b>
-</span></code><code id="L4097"><span class="ln">4097</span><span class="c"> <span class="s"> - </span>f_out (<b>function</b>) handler <b>for</b> hover out
-</span></code><code id="L4098"><span class="ln">4098</span><span class="c"> <span class="s"> - </span>icontext (object) #optional context <b>for</b> hover <b>in</b> handler
-</span></code><code id="L4099"><span class="ln">4099</span><span class="c"> <span class="s"> - </span>ocontext (object) #optional context <b>for</b> hover out handler
-</span></code><code id="L4100"><span class="ln">4100</span><span class="c"> <span class="s"> = </span>(object) @Element
-</span></code><code id="L4101"><span class="ln">4101</span><span class="c"> \*/</span>
-</code><code id="L4102"><span class="ln">4102</span> elproto.hover<span class="s"> = </span><b>function</b> (f_in, f_out, scope_in, scope_out) {
-</code><code id="L4103"><span class="ln">4103</span> <b>return</b> <b>this</b>.mouseover(f_in, scope_in).mouseout(f_out, scope_out<span class="s"> || </span>scope_in);
-</code><code id="L4104"><span class="ln">4104</span> };
-</code><code id="L4105"><span class="ln">4105</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4106"><span class="ln">4106</span><span class="c"> <span class="s"> * </span>Element.unhover
-</span></code><code id="L4107"><span class="ln">4107</span><span class="c"> [ method ]
-</span></code><code id="L4108"><span class="ln">4108</span><span class="c"> **
-</span></code><code id="L4109"><span class="ln">4109</span><span class="c"> <span class="s"> * </span>Removes event handlers <b>for</b> hover <b>for</b> the element.
-</span></code><code id="L4110"><span class="ln">4110</span><span class="c"> > Parameters
-</span></code><code id="L4111"><span class="ln">4111</span><span class="c"> <span class="s"> - </span>f_in (<b>function</b>) handler <b>for</b> hover <b>in</b>
-</span></code><code id="L4112"><span class="ln">4112</span><span class="c"> <span class="s"> - </span>f_out (<b>function</b>) handler <b>for</b> hover out
-</span></code><code id="L4113"><span class="ln">4113</span><span class="c"> <span class="s"> = </span>(object) @Element
-</span></code><code id="L4114"><span class="ln">4114</span><span class="c"> \*/</span>
-</code><code id="L4115"><span class="ln">4115</span> elproto.unhover<span class="s"> = </span><b>function</b> (f_in, f_out) {
-</code><code id="L4116"><span class="ln">4116</span> <b>return</b> <b>this</b>.unmouseover(f_in).unmouseout(f_out);
-</code><code id="L4117"><span class="ln">4117</span> };
-</code><code id="L4118"><span class="ln">4118</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4119"><span class="ln">4119</span><span class="c"> <span class="s"> * </span>Element.drag
-</span></code><code id="L4120"><span class="ln">4120</span><span class="c"> [ method ]
-</span></code><code id="L4121"><span class="ln">4121</span><span class="c"> **
-</span></code><code id="L4122"><span class="ln">4122</span><span class="c"> <span class="s"> * </span>Adds event handlers <b>for</b> drag of the element.
-</span></code><code id="L4123"><span class="ln">4123</span><span class="c"> > Parameters
-</span></code><code id="L4124"><span class="ln">4124</span><span class="c"> <span class="s"> - </span>onmove (<b>function</b>) handler <b>for</b> moving
-</span></code><code id="L4125"><span class="ln">4125</span><span class="c"> <span class="s"> - </span>onstart (<b>function</b>) handler <b>for</b> drag start
-</span></code><code id="L4126"><span class="ln">4126</span><span class="c"> <span class="s"> - </span>onend (<b>function</b>) handler <b>for</b> drag end
-</span></code><code id="L4127"><span class="ln">4127</span><span class="c"> <span class="s"> - </span>mcontext (object) #optional context <b>for</b> moving handler
-</span></code><code id="L4128"><span class="ln">4128</span><span class="c"> <span class="s"> - </span>scontext (object) #optional context <b>for</b> drag start handler
-</span></code><code id="L4129"><span class="ln">4129</span><span class="c"> <span class="s"> - </span>econtext (object) #optional context <b>for</b> drag end handler
-</span></code><code id="L4130"><span class="ln">4130</span><span class="c"> <span class="s"> * </span>Additionaly following `drag` events will be triggered: `drag.start.<id>` on start,
-</span></code><code id="L4131"><span class="ln">4131</span><span class="c"> <span class="s"> * </span>`drag.end.<id>` on end and `drag.move.<id>` on every move. When element will be dragged over another element
-</span></code><code id="L4132"><span class="ln">4132</span><span class="c"> <span class="s"> * </span>`drag.over.<id>` will be fired as well.
-</span></code><code id="L4133"><span class="ln">4133</span><span class="c"> *
-</span></code><code id="L4134"><span class="ln">4134</span><span class="c"> <span class="s"> * </span>Start event and start handler will be called <b>in</b> specified context or <b>in</b> context of the element <b>with</b> following parameters:
-</span></code><code id="L4135"><span class="ln">4135</span><span class="c"> o x (number) x position of the mouse
-</span></code><code id="L4136"><span class="ln">4136</span><span class="c"> o y (number) y position of the mouse
-</span></code><code id="L4137"><span class="ln">4137</span><span class="c"> o event (object) DOM event object
-</span></code><code id="L4138"><span class="ln">4138</span><span class="c"> <span class="s"> * </span>Move event and move handler will be called <b>in</b> specified context or <b>in</b> context of the element <b>with</b> following parameters:
-</span></code><code id="L4139"><span class="ln">4139</span><span class="c"> o dx (number) shift by x from the start point
-</span></code><code id="L4140"><span class="ln">4140</span><span class="c"> o dy (number) shift by y from the start point
-</span></code><code id="L4141"><span class="ln">4141</span><span class="c"> o x (number) x position of the mouse
-</span></code><code id="L4142"><span class="ln">4142</span><span class="c"> o y (number) y position of the mouse
-</span></code><code id="L4143"><span class="ln">4143</span><span class="c"> o event (object) DOM event object
-</span></code><code id="L4144"><span class="ln">4144</span><span class="c"> <span class="s"> * </span>End event and end handler will be called <b>in</b> specified context or <b>in</b> context of the element <b>with</b> following parameters:
-</span></code><code id="L4145"><span class="ln">4145</span><span class="c"> o event (object) DOM event object
+</code><code id="L3704"><span class="ln">3704</span> <b>if</b> (element.node.nextSibling) {
+</code><code id="L3705"><span class="ln">3705</span> element.node.parentNode.insertBefore(<b>this</b>.node, element.node.nextSibling);
+</code><code id="L3706"><span class="ln">3706</span> } <b>else</b> {
+</code><code id="L3707"><span class="ln">3707</span> element.node.parentNode.appendChild(<b>this</b>.node);
+</code><code id="L3708"><span class="ln">3708</span> }
+</code><code id="L3709"><span class="ln">3709</span> insertafter(<b>this</b>, element, <b>this</b>.paper);
+</code><code id="L3710"><span class="ln">3710</span> <b>return</b> <b>this</b>;
+</code><code id="L3711"><span class="ln">3711</span> };
+</code><code id="L3712"><span class="ln">3712</span> elproto.insertBefore<span class="s"> = </span><b>function</b> (element) {
+</code><code id="L3713"><span class="ln">3713</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3714"><span class="ln">3714</span> <b>return</b> <b>this</b>;
+</code><code id="L3715"><span class="ln">3715</span> }
+</code><code id="L3716"><span class="ln">3716</span> <b>if</b> (element.constructor<span class="s"> == </span>Set) {
+</code><code id="L3717"><span class="ln">3717</span> element<span class="s"> = </span>element[<span class="d">0</span>];
+</code><code id="L3718"><span class="ln">3718</span> }
+</code><code id="L3719"><span class="ln">3719</span> element.node.parentNode.insertBefore(<b>this</b>.node, element.node);
+</code><code id="L3720"><span class="ln">3720</span> insertbefore(<b>this</b>, element, <b>this</b>.paper);
+</code><code id="L3721"><span class="ln">3721</span> <b>return</b> <b>this</b>;
+</code><code id="L3722"><span class="ln">3722</span> };
+</code><code id="L3723"><span class="ln">3723</span> elproto.blur<span class="s"> = </span><b>function</b> (size) {
+</code><code id="L3724"><span class="ln">3724</span> <b>var</b> s<span class="s"> = </span><b>this</b>.node.runtimeStyle,
+</code><code id="L3725"><span class="ln">3725</span> f<span class="s"> = </span>s.filter;
+</code><code id="L3726"><span class="ln">3726</span> f<span class="s"> = </span>f.replace(blurregexp, E);
+</code><code id="L3727"><span class="ln">3727</span> <b>if</b> (+size !== <span class="d">0</span>) {
+</code><code id="L3728"><span class="ln">3728</span> <b>this</b>.attrs.blur<span class="s"> = </span>size;
+</code><code id="L3729"><span class="ln">3729</span> s.filter<span class="s"> = </span>f<span class="s"> + </span>S<span class="s"> + </span>ms<span class="s"> + </span><i>".Blur(pixelradius="</i><span class="s"> + </span>(+size<span class="s"> || </span><span class="d">1.5</span>)<span class="s"> + </span><i>")"</i>;
+</code><code id="L3730"><span class="ln">3730</span> s.margin<span class="s"> = </span>R.format(<i>"-{<span class="d">0</span>}px <span class="d">0</span> <span class="d">0</span> -{<span class="d">0</span>}px"</i>, round(+size<span class="s"> || </span><span class="d">1.5</span>));
+</code><code id="L3731"><span class="ln">3731</span> } <b>else</b> {
+</code><code id="L3732"><span class="ln">3732</span> s.filter<span class="s"> = </span>f;
+</code><code id="L3733"><span class="ln">3733</span> s.margin<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L3734"><span class="ln">3734</span> <b>delete</b> <b>this</b>.attrs.blur;
+</code><code id="L3735"><span class="ln">3735</span> }
+</code><code id="L3736"><span class="ln">3736</span> };
+</code><code id="L3737"><span class="ln">3737</span>
+</code><code id="L3738"><span class="ln">3738</span> thePath<span class="s"> = </span><b>function</b> (pathString, vml) {
+</code><code id="L3739"><span class="ln">3739</span> <b>var</b> el<span class="s"> = </span>createNode(<i>"shape"</i>);
+</code><code id="L3740"><span class="ln">3740</span> el.style.cssText<span class="s"> = </span>cssDot;
+</code><code id="L3741"><span class="ln">3741</span> el.coordsize<span class="s"> = </span>zoom<span class="s"> + </span>S<span class="s"> + </span>zoom;
+</code><code id="L3742"><span class="ln">3742</span> el.coordorigin<span class="s"> = </span>vml.coordorigin;
+</code><code id="L3743"><span class="ln">3743</span> <b>var</b> p<span class="s"> = </span><b>new</b> Element(el, vml),
+</code><code id="L3744"><span class="ln">3744</span> attr<span class="s"> = </span>{fill: <i>"none"</i>, stroke: <i>"#<span class="d">000</span>"</i>};
+</code><code id="L3745"><span class="ln">3745</span> pathString<span class="s"> && </span>(attr.path<span class="s"> = </span>pathString);
+</code><code id="L3746"><span class="ln">3746</span> p.type<span class="s"> = </span><i>"path"</i>;
+</code><code id="L3747"><span class="ln">3747</span> p.path<span class="s"> = </span>[];
+</code><code id="L3748"><span class="ln">3748</span> p.Path<span class="s"> = </span>E;
+</code><code id="L3749"><span class="ln">3749</span> setFillAndStroke(p, attr);
+</code><code id="L3750"><span class="ln">3750</span> vml.canvas.appendChild(el);
+</code><code id="L3751"><span class="ln">3751</span> <b>var</b> skew<span class="s"> = </span>createNode(<i>"skew"</i>);
+</code><code id="L3752"><span class="ln">3752</span> skew.on<span class="s"> = </span><b>true</b>;
+</code><code id="L3753"><span class="ln">3753</span> el.appendChild(skew);
+</code><code id="L3754"><span class="ln">3754</span> p.skew<span class="s"> = </span>skew;
+</code><code id="L3755"><span class="ln">3755</span> p.transform(E);
+</code><code id="L3756"><span class="ln">3756</span> <b>return</b> p;
+</code><code id="L3757"><span class="ln">3757</span> };
+</code><code id="L3758"><span class="ln">3758</span> theRect<span class="s"> = </span><b>function</b> (vml, x, y, w, h, r) {
+</code><code id="L3759"><span class="ln">3759</span> <b>var</b> path<span class="s"> = </span>rectPath(x, y, w, h, r),
+</code><code id="L3760"><span class="ln">3760</span> res<span class="s"> = </span>vml.path(path),
+</code><code id="L3761"><span class="ln">3761</span> a<span class="s"> = </span>res.attrs;
+</code><code id="L3762"><span class="ln">3762</span> res.X<span class="s"> = </span>a.x<span class="s"> = </span>x;
+</code><code id="L3763"><span class="ln">3763</span> res.Y<span class="s"> = </span>a.y<span class="s"> = </span>y;
+</code><code id="L3764"><span class="ln">3764</span> res.W<span class="s"> = </span>a.width<span class="s"> = </span>w;
+</code><code id="L3765"><span class="ln">3765</span> res.H<span class="s"> = </span>a.height<span class="s"> = </span>h;
+</code><code id="L3766"><span class="ln">3766</span> a.r<span class="s"> = </span>r;
+</code><code id="L3767"><span class="ln">3767</span> a.path<span class="s"> = </span>path;
+</code><code id="L3768"><span class="ln">3768</span> res.type<span class="s"> = </span><i>"rect"</i>;
+</code><code id="L3769"><span class="ln">3769</span> <b>return</b> res;
+</code><code id="L3770"><span class="ln">3770</span> };
+</code><code id="L3771"><span class="ln">3771</span> theEllipse<span class="s"> = </span><b>function</b> (vml, x, y, rx, ry) {
+</code><code id="L3772"><span class="ln">3772</span> <b>var</b> res<span class="s"> = </span>vml.path(),
+</code><code id="L3773"><span class="ln">3773</span> a<span class="s"> = </span>res.attrs;
+</code><code id="L3774"><span class="ln">3774</span> res.X<span class="s"> = </span>x<span class="s"> - </span>rx;
+</code><code id="L3775"><span class="ln">3775</span> res.Y<span class="s"> = </span>y<span class="s"> - </span>ry;
+</code><code id="L3776"><span class="ln">3776</span> res.W<span class="s"> = </span>rx<span class="s"> * </span><span class="d">2</span>;
+</code><code id="L3777"><span class="ln">3777</span> res.H<span class="s"> = </span>ry<span class="s"> * </span><span class="d">2</span>;
+</code><code id="L3778"><span class="ln">3778</span> res.type<span class="s"> = </span><i>"ellipse"</i>;
+</code><code id="L3779"><span class="ln">3779</span> setFillAndStroke(res, {
+</code><code id="L3780"><span class="ln">3780</span> cx: x,
+</code><code id="L3781"><span class="ln">3781</span> cy: y,
+</code><code id="L3782"><span class="ln">3782</span> rx: rx,
+</code><code id="L3783"><span class="ln">3783</span> ry: ry
+</code><code id="L3784"><span class="ln">3784</span> });
+</code><code id="L3785"><span class="ln">3785</span> <b>return</b> res;
+</code><code id="L3786"><span class="ln">3786</span> };
+</code><code id="L3787"><span class="ln">3787</span> theCircle<span class="s"> = </span><b>function</b> (vml, x, y, r) {
+</code><code id="L3788"><span class="ln">3788</span> <b>var</b> res<span class="s"> = </span>vml.path(),
+</code><code id="L3789"><span class="ln">3789</span> a<span class="s"> = </span>res.attrs;
+</code><code id="L3790"><span class="ln">3790</span> res.X<span class="s"> = </span>x<span class="s"> - </span>r;
+</code><code id="L3791"><span class="ln">3791</span> res.Y<span class="s"> = </span>y<span class="s"> - </span>r;
+</code><code id="L3792"><span class="ln">3792</span> res.W<span class="s"> = </span>res.H<span class="s"> = </span>r<span class="s"> * </span><span class="d">2</span>;
+</code><code id="L3793"><span class="ln">3793</span> res.type<span class="s"> = </span><i>"circle"</i>;
+</code><code id="L3794"><span class="ln">3794</span> setFillAndStroke(res, {
+</code><code id="L3795"><span class="ln">3795</span> cx: x,
+</code><code id="L3796"><span class="ln">3796</span> cy: y,
+</code><code id="L3797"><span class="ln">3797</span> r: r
+</code><code id="L3798"><span class="ln">3798</span> });
+</code><code id="L3799"><span class="ln">3799</span> <b>return</b> res;
+</code><code id="L3800"><span class="ln">3800</span> };
+</code><code id="L3801"><span class="ln">3801</span> theImage<span class="s"> = </span><b>function</b> (vml, src, x, y, w, h) {
+</code><code id="L3802"><span class="ln">3802</span> <b>var</b> path<span class="s"> = </span>rectPath(x, y, w, h),
+</code><code id="L3803"><span class="ln">3803</span> res<span class="s"> = </span>vml.path(path).attr({stroke: <i>"none"</i>}),
+</code><code id="L3804"><span class="ln">3804</span> a<span class="s"> = </span>res.attrs,
+</code><code id="L3805"><span class="ln">3805</span> node<span class="s"> = </span>res.node,
+</code><code id="L3806"><span class="ln">3806</span> fill<span class="s"> = </span>node.getElementsByTagName(fillString)[<span class="d">0</span>];
+</code><code id="L3807"><span class="ln">3807</span> a.src<span class="s"> = </span>src;
+</code><code id="L3808"><span class="ln">3808</span> res.X<span class="s"> = </span>a.x<span class="s"> = </span>x;
+</code><code id="L3809"><span class="ln">3809</span> res.Y<span class="s"> = </span>a.y<span class="s"> = </span>y;
+</code><code id="L3810"><span class="ln">3810</span> res.W<span class="s"> = </span>a.width<span class="s"> = </span>w;
+</code><code id="L3811"><span class="ln">3811</span> res.H<span class="s"> = </span>a.height<span class="s"> = </span>h;
+</code><code id="L3812"><span class="ln">3812</span> a.path<span class="s"> = </span>path;
+</code><code id="L3813"><span class="ln">3813</span> res.type<span class="s"> = </span><i>"image"</i>;
+</code><code id="L3814"><span class="ln">3814</span> fill.parentNode<span class="s"> == </span>node<span class="s"> && </span>node.removeChild(fill);
+</code><code id="L3815"><span class="ln">3815</span> fill.rotate<span class="s"> = </span><b>true</b>;
+</code><code id="L3816"><span class="ln">3816</span> fill.src<span class="s"> = </span>src;
+</code><code id="L3817"><span class="ln">3817</span> fill.type<span class="s"> = </span><i>"tile"</i>;
+</code><code id="L3818"><span class="ln">3818</span> res._.fillpos<span class="s"> = </span>[x, y];
+</code><code id="L3819"><span class="ln">3819</span> res._.fillsize<span class="s"> = </span>[w, h];
+</code><code id="L3820"><span class="ln">3820</span> node.appendChild(fill);
+</code><code id="L3821"><span class="ln">3821</span> setCoords(res);
+</code><code id="L3822"><span class="ln">3822</span> <b>return</b> res;
+</code><code id="L3823"><span class="ln">3823</span> };
+</code><code id="L3824"><span class="ln">3824</span> theText<span class="s"> = </span><b>function</b> (vml, x, y, text) {
+</code><code id="L3825"><span class="ln">3825</span> <b>var</b> el<span class="s"> = </span>createNode(<i>"shape"</i>),
+</code><code id="L3826"><span class="ln">3826</span> path<span class="s"> = </span>createNode(<i>"path"</i>),
+</code><code id="L3827"><span class="ln">3827</span> o<span class="s"> = </span>createNode(<i>"textpath"</i>);
+</code><code id="L3828"><span class="ln">3828</span> x<span class="s"> = </span>x<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L3829"><span class="ln">3829</span> y<span class="s"> = </span>y<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L3830"><span class="ln">3830</span> text<span class="s"> = </span>text<span class="s"> || </span><i>""</i>;
+</code><code id="L3831"><span class="ln">3831</span> path.v<span class="s"> = </span>R.format(<i>"m{<span class="d">0</span>},{<span class="d">1</span>}l{<span class="d">2</span>},{<span class="d">1</span>}"</i>, round(x<span class="s"> * </span>zoom), round(y<span class="s"> * </span>zoom), round(x<span class="s"> * </span>zoom)<span class="s"> + </span><span class="d">1</span>);
+</code><code id="L3832"><span class="ln">3832</span> path.textpathok<span class="s"> = </span><b>true</b>;
+</code><code id="L3833"><span class="ln">3833</span> o.string<span class="s"> = </span>Str(text);
+</code><code id="L3834"><span class="ln">3834</span> o.on<span class="s"> = </span><b>true</b>;
+</code><code id="L3835"><span class="ln">3835</span> el.style.cssText<span class="s"> = </span><i>"position:absolute;left:<span class="d">0</span>;top:<span class="d">0</span>;width:<span class="d">1</span>;height:<span class="d">1</span>"</i>;
+</code><code id="L3836"><span class="ln">3836</span> el.coordsize<span class="s"> = </span>zoom<span class="s"> + </span>S<span class="s"> + </span>zoom;
+</code><code id="L3837"><span class="ln">3837</span> el.coordorigin<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span>"</i>;
+</code><code id="L3838"><span class="ln">3838</span> <b>var</b> p<span class="s"> = </span><b>new</b> Element(el, vml),
+</code><code id="L3839"><span class="ln">3839</span> attr<span class="s"> = </span>{fill: <i>"#<span class="d">000</span>"</i>, stroke: <i>"none"</i>, font: availableAttrs.font, text: text};
+</code><code id="L3840"><span class="ln">3840</span> p.shape<span class="s"> = </span>el;
+</code><code id="L3841"><span class="ln">3841</span> p.path<span class="s"> = </span>path;
+</code><code id="L3842"><span class="ln">3842</span> p.textpath<span class="s"> = </span>o;
+</code><code id="L3843"><span class="ln">3843</span> p.type<span class="s"> = </span><i>"text"</i>;
+</code><code id="L3844"><span class="ln">3844</span> p.attrs.text<span class="s"> = </span>Str(text);
+</code><code id="L3845"><span class="ln">3845</span> p.attrs.x<span class="s"> = </span>x;
+</code><code id="L3846"><span class="ln">3846</span> p.attrs.y<span class="s"> = </span>y;
+</code><code id="L3847"><span class="ln">3847</span> p.attrs.w<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L3848"><span class="ln">3848</span> p.attrs.h<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L3849"><span class="ln">3849</span> setFillAndStroke(p, attr);
+</code><code id="L3850"><span class="ln">3850</span> el.appendChild(o);
+</code><code id="L3851"><span class="ln">3851</span> el.appendChild(path);
+</code><code id="L3852"><span class="ln">3852</span> vml.canvas.appendChild(el);
+</code><code id="L3853"><span class="ln">3853</span> <b>var</b> skew<span class="s"> = </span>createNode(<i>"skew"</i>);
+</code><code id="L3854"><span class="ln">3854</span> skew.on<span class="s"> = </span><b>true</b>;
+</code><code id="L3855"><span class="ln">3855</span> el.appendChild(skew);
+</code><code id="L3856"><span class="ln">3856</span> p.skew<span class="s"> = </span>skew;
+</code><code id="L3857"><span class="ln">3857</span> p.transform(E);
+</code><code id="L3858"><span class="ln">3858</span> <b>return</b> p;
+</code><code id="L3859"><span class="ln">3859</span> };
+</code><code id="L3860"><span class="ln">3860</span> setSize<span class="s"> = </span><b>function</b> (width, height) {
+</code><code id="L3861"><span class="ln">3861</span> <b>var</b> cs<span class="s"> = </span><b>this</b>.canvas.style;
+</code><code id="L3862"><span class="ln">3862</span> <b>this</b>.width<span class="s"> = </span>width;
+</code><code id="L3863"><span class="ln">3863</span> <b>this</b>.height<span class="s"> = </span>height;
+</code><code id="L3864"><span class="ln">3864</span> width<span class="s"> == </span>+width<span class="s"> && </span>(width += <i>"px"</i>);
+</code><code id="L3865"><span class="ln">3865</span> height<span class="s"> == </span>+height<span class="s"> && </span>(height += <i>"px"</i>);
+</code><code id="L3866"><span class="ln">3866</span> cs.width<span class="s"> = </span>width;
+</code><code id="L3867"><span class="ln">3867</span> cs.height<span class="s"> = </span>height;
+</code><code id="L3868"><span class="ln">3868</span> cs.clip<span class="s"> = </span><i>"rect(<span class="d">0</span> "</i><span class="s"> + </span>width<span class="s"> + </span><i>" "</i><span class="s"> + </span>height<span class="s"> + </span><i>" <span class="d">0</span>)"</i>;
+</code><code id="L3869"><span class="ln">3869</span> <b>if</b> (<b>this</b>._viewBox) {
+</code><code id="L3870"><span class="ln">3870</span> setViewBox.apply(<b>this</b>, <b>this</b>._viewBox);
+</code><code id="L3871"><span class="ln">3871</span> }
+</code><code id="L3872"><span class="ln">3872</span> <b>return</b> <b>this</b>;
+</code><code id="L3873"><span class="ln">3873</span> };
+</code><code id="L3874"><span class="ln">3874</span> setViewBox<span class="s"> = </span><b>function</b> (x, y, w, h, fit) {
+</code><code id="L3875"><span class="ln">3875</span> eve(<i>"setViewBox"</i>, <b>this</b>, <b>this</b>._viewBox, [x, y, w, h, fit]);
+</code><code id="L3876"><span class="ln">3876</span> <b>var</b> width<span class="s"> = </span><b>this</b>.width,
+</code><code id="L3877"><span class="ln">3877</span> height<span class="s"> = </span><b>this</b>.height,
+</code><code id="L3878"><span class="ln">3878</span> size<span class="s"> = </span><span class="d">1e3</span><span class="s"> * </span>mmax(w<span class="s"> / </span>width, h<span class="s"> / </span>height),
+</code><code id="L3879"><span class="ln">3879</span> H, W;
+</code><code id="L3880"><span class="ln">3880</span> <b>if</b> (fit) {
+</code><code id="L3881"><span class="ln">3881</span> H<span class="s"> = </span>height<span class="s"> / </span>h;
+</code><code id="L3882"><span class="ln">3882</span> W<span class="s"> = </span>width<span class="s"> / </span>w;
+</code><code id="L3883"><span class="ln">3883</span> <b>if</b> (w<span class="s"> * </span>H < width) {
+</code><code id="L3884"><span class="ln">3884</span> x -= (width<span class="s"> - </span>w<span class="s"> * </span>H)<span class="s"> / </span><span class="d">2</span><span class="s"> / </span>H;
+</code><code id="L3885"><span class="ln">3885</span> }
+</code><code id="L3886"><span class="ln">3886</span> <b>if</b> (h<span class="s"> * </span>W < height) {
+</code><code id="L3887"><span class="ln">3887</span> y -= (height<span class="s"> - </span>h<span class="s"> * </span>W)<span class="s"> / </span><span class="d">2</span><span class="s"> / </span>W;
+</code><code id="L3888"><span class="ln">3888</span> }
+</code><code id="L3889"><span class="ln">3889</span> }
+</code><code id="L3890"><span class="ln">3890</span> <b>this</b>._viewBox<span class="s"> = </span>[x, y, w, h, !!fit];
+</code><code id="L3891"><span class="ln">3891</span> <b>this</b>.forEach(<b>function</b> (el) {
+</code><code id="L3892"><span class="ln">3892</span> el.transform(<i>"..."</i>);
+</code><code id="L3893"><span class="ln">3893</span> });
+</code><code id="L3894"><span class="ln">3894</span> <b>return</b> <b>this</b>;
+</code><code id="L3895"><span class="ln">3895</span> };
+</code><code id="L3896"><span class="ln">3896</span> <b>var</b> createNode,
+</code><code id="L3897"><span class="ln">3897</span> initWin<span class="s"> = </span><b>function</b> (win) {
+</code><code id="L3898"><span class="ln">3898</span> <b>var</b> doc<span class="s"> = </span>win.document;
+</code><code id="L3899"><span class="ln">3899</span> doc.createStyleSheet().addRule(<i>".rvml"</i>, <i>"behavior:url(#<b>default</b>#VML)"</i>);
+</code><code id="L3900"><span class="ln">3900</span> <b>try</b> {
+</code><code id="L3901"><span class="ln">3901</span> !doc.namespaces.rvml<span class="s"> && </span>doc.namespaces.add(<i>"rvml"</i>, <i>"urn:schemas-microsoft-com:vml"</i>);
+</code><code id="L3902"><span class="ln">3902</span> createNode<span class="s"> = </span><b>function</b> (tagName) {
+</code><code id="L3903"><span class="ln">3903</span> <b>return</b> doc.createElement(<i>'<rvml:'</i><span class="s"> + </span>tagName<span class="s"> + </span><i>' <b>class</b>="rvml">'</i>);
+</code><code id="L3904"><span class="ln">3904</span> };
+</code><code id="L3905"><span class="ln">3905</span> } <b>catch</b> (e) {
+</code><code id="L3906"><span class="ln">3906</span> createNode<span class="s"> = </span><b>function</b> (tagName) {
+</code><code id="L3907"><span class="ln">3907</span> <b>return</b> doc.createElement(<i>'<'</i><span class="s"> + </span>tagName<span class="s"> + </span><i>' xmlns="urn:schemas-microsoft.com:vml" <b>class</b>="rvml">'</i>);
+</code><code id="L3908"><span class="ln">3908</span> };
+</code><code id="L3909"><span class="ln">3909</span> }
+</code><code id="L3910"><span class="ln">3910</span> };
+</code><code id="L3911"><span class="ln">3911</span> initWin(g.win);
+</code><code id="L3912"><span class="ln">3912</span> create<span class="s"> = </span><b>function</b> () {
+</code><code id="L3913"><span class="ln">3913</span> <b>var</b> con<span class="s"> = </span>getContainer[apply](<span class="d">0</span>, arguments),
+</code><code id="L3914"><span class="ln">3914</span> container<span class="s"> = </span>con.container,
+</code><code id="L3915"><span class="ln">3915</span> height<span class="s"> = </span>con.height,
+</code><code id="L3916"><span class="ln">3916</span> s,
+</code><code id="L3917"><span class="ln">3917</span> width<span class="s"> = </span>con.width,
+</code><code id="L3918"><span class="ln">3918</span> x<span class="s"> = </span>con.x,
+</code><code id="L3919"><span class="ln">3919</span> y<span class="s"> = </span>con.y;
+</code><code id="L3920"><span class="ln">3920</span> <b>if</b> (!container) {
+</code><code id="L3921"><span class="ln">3921</span> <b>throw</b> <b>new</b> Error(<i>"VML container not found."</i>);
+</code><code id="L3922"><span class="ln">3922</span> }
+</code><code id="L3923"><span class="ln">3923</span> <b>var</b> res<span class="s"> = </span><b>new</b> Paper,
+</code><code id="L3924"><span class="ln">3924</span> c<span class="s"> = </span>res.canvas<span class="s"> = </span>g.doc.createElement(<i>"div"</i>),
+</code><code id="L3925"><span class="ln">3925</span> cs<span class="s"> = </span>c.style;
+</code><code id="L3926"><span class="ln">3926</span> x<span class="s"> = </span>x<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L3927"><span class="ln">3927</span> y<span class="s"> = </span>y<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L3928"><span class="ln">3928</span> width<span class="s"> = </span>width<span class="s"> || </span><span class="d">512</span>;
+</code><code id="L3929"><span class="ln">3929</span> height<span class="s"> = </span>height<span class="s"> || </span><span class="d">342</span>;
+</code><code id="L3930"><span class="ln">3930</span> res.width<span class="s"> = </span>width;
+</code><code id="L3931"><span class="ln">3931</span> res.height<span class="s"> = </span>height;
+</code><code id="L3932"><span class="ln">3932</span> width<span class="s"> == </span>+width<span class="s"> && </span>(width += <i>"px"</i>);
+</code><code id="L3933"><span class="ln">3933</span> height<span class="s"> == </span>+height<span class="s"> && </span>(height += <i>"px"</i>);
+</code><code id="L3934"><span class="ln">3934</span> res.coordsize<span class="s"> = </span>zoom<span class="s"> * </span><span class="d">1e3</span><span class="s"> + </span>S<span class="s"> + </span>zoom<span class="s"> * </span><span class="d">1e3</span>;
+</code><code id="L3935"><span class="ln">3935</span> res.coordorigin<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span>"</i>;
+</code><code id="L3936"><span class="ln">3936</span> res.span<span class="s"> = </span>g.doc.createElement(<i>"span"</i>);
+</code><code id="L3937"><span class="ln">3937</span> res.span.style.cssText<span class="s"> = </span><i>"position:absolute;left:-9999em;top:-9999em;padding:<span class="d">0</span>;margin:<span class="d">0</span>;line-height:<span class="d">1</span>;"</i>;
+</code><code id="L3938"><span class="ln">3938</span> c.appendChild(res.span);
+</code><code id="L3939"><span class="ln">3939</span> cs.cssText<span class="s"> = </span>R.format(<i>"top:<span class="d">0</span>;left:<span class="d">0</span>;width:{<span class="d">0</span>};height:{<span class="d">1</span>};display:inline-block;position:relative;clip:rect(<span class="d">0</span> {<span class="d">0</span>} {<span class="d">1</span>} <span class="d">0</span>);overflow:hidden"</i>, width, height);
+</code><code id="L3940"><span class="ln">3940</span> <b>if</b> (container<span class="s"> == </span><span class="d">1</span>) {
+</code><code id="L3941"><span class="ln">3941</span> g.doc.body.appendChild(c);
+</code><code id="L3942"><span class="ln">3942</span> cs.left<span class="s"> = </span>x<span class="s"> + </span><i>"px"</i>;
+</code><code id="L3943"><span class="ln">3943</span> cs.top<span class="s"> = </span>y<span class="s"> + </span><i>"px"</i>;
+</code><code id="L3944"><span class="ln">3944</span> cs.position<span class="s"> = </span><i>"absolute"</i>;
+</code><code id="L3945"><span class="ln">3945</span> } <b>else</b> {
+</code><code id="L3946"><span class="ln">3946</span> <b>if</b> (container.firstChild) {
+</code><code id="L3947"><span class="ln">3947</span> container.insertBefore(c, container.firstChild);
+</code><code id="L3948"><span class="ln">3948</span> } <b>else</b> {
+</code><code id="L3949"><span class="ln">3949</span> container.appendChild(c);
+</code><code id="L3950"><span class="ln">3950</span> }
+</code><code id="L3951"><span class="ln">3951</span> }
+</code><code id="L3952"><span class="ln">3952</span> plugins.call(res, res, R.fn);
+</code><code id="L3953"><span class="ln">3953</span> res.renderfix<span class="s"> = </span>fun;
+</code><code id="L3954"><span class="ln">3954</span> <b>return</b> res;
+</code><code id="L3955"><span class="ln">3955</span> };
+</code><code id="L3956"><span class="ln">3956</span> paperproto.clear<span class="s"> = </span><b>function</b> () {
+</code><code id="L3957"><span class="ln">3957</span> eve(<i>"clear"</i>, <b>this</b>);
+</code><code id="L3958"><span class="ln">3958</span> <b>this</b>.canvas.innerHTML<span class="s"> = </span>E;
+</code><code id="L3959"><span class="ln">3959</span> <b>this</b>.span<span class="s"> = </span>g.doc.createElement(<i>"span"</i>);
+</code><code id="L3960"><span class="ln">3960</span> <b>this</b>.span.style.cssText<span class="s"> = </span><i>"position:absolute;left:-9999em;top:-9999em;padding:<span class="d">0</span>;margin:<span class="d">0</span>;line-height:<span class="d">1</span>;display:inline;"</i>;
+</code><code id="L3961"><span class="ln">3961</span> <b>this</b>.canvas.appendChild(<b>this</b>.span);
+</code><code id="L3962"><span class="ln">3962</span> <b>this</b>.bottom<span class="s"> = </span><b>this</b>.top<span class="s"> = </span><b>null</b>;
+</code><code id="L3963"><span class="ln">3963</span> };
+</code><code id="L3964"><span class="ln">3964</span> paperproto.remove<span class="s"> = </span><b>function</b> () {
+</code><code id="L3965"><span class="ln">3965</span> eve(<i>"remove"</i>, <b>this</b>);
+</code><code id="L3966"><span class="ln">3966</span> <b>this</b>.canvas.parentNode.removeChild(<b>this</b>.canvas);
+</code><code id="L3967"><span class="ln">3967</span> <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>) {
+</code><code id="L3968"><span class="ln">3968</span> <b>this</b>[i]<span class="s"> = </span>removed(i);
+</code><code id="L3969"><span class="ln">3969</span> }
+</code><code id="L3970"><span class="ln">3970</span> <b>return</b> <b>true</b>;
+</code><code id="L3971"><span class="ln">3971</span> };
+</code><code id="L3972"><span class="ln">3972</span> }
+</code><code id="L3973"><span class="ln">3973</span>
+</code><code id="L3974"><span class="ln">3974</span> <span class="c">// WebKit rendering bug workaround method</span>
+</code><code id="L3975"><span class="ln">3975</span> <b>var</b> version<span class="s"> = </span>navigator.userAgent.match(/Version\/(.*?)\s/)<span class="s"> || </span>navigator.userAgent.match(/Chrome\/(\d+)/);
+</code><code id="L3976"><span class="ln">3976</span> <b>if</b> ((navigator.vendor<span class="s"> == </span><i>"Apple Computer, Inc."</i>)<span class="s"> && </span>(version<span class="s"> && </span>version[<span class="d">1</span>] < <span class="d">4</span><span class="s"> || </span>navigator.platform.slice(<span class="d">0</span>, <span class="d">2</span>)<span class="s"> == </span><i>"iP"</i>) ||
+</code><code id="L3977"><span class="ln">3977</span> (navigator.vendor<span class="s"> == </span><i>"Google Inc."</i><span class="s"> && </span>version<span class="s"> && </span>version[<span class="d">1</span>] < <span class="d">8</span>)) {
+</code><code id="L3978"><span class="ln">3978</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L3979"><span class="ln">3979</span><span class="c"> <span class="s"> * </span>Paper.safari
+</span></code><code id="L3980"><span class="ln">3980</span><span class="c"> [ method ]
+</span></code><code id="L3981"><span class="ln">3981</span><span class="c"> **
+</span></code><code id="L3982"><span class="ln">3982</span><span class="c"> <span class="s"> * </span>There is an inconvenient rendering bug <b>in</b> Safari (WebKit):
+</span></code><code id="L3983"><span class="ln">3983</span><span class="c"> <span class="s"> * </span>sometimes the rendering should be forced.
+</span></code><code id="L3984"><span class="ln">3984</span><span class="c"> <span class="s"> * </span>This method should help <b>with</b> dealing <b>with</b> <b>this</b> bug.
+</span></code><code id="L3985"><span class="ln">3985</span><span class="c"> \*/</span>
+</code><code id="L3986"><span class="ln">3986</span> paperproto.safari<span class="s"> = </span><b>function</b> () {
+</code><code id="L3987"><span class="ln">3987</span> <b>var</b> rect<span class="s"> = </span><b>this</b>.rect(-<span class="d">99</span>, -<span class="d">99</span>, <b>this</b>.width<span class="s"> + </span><span class="d">99</span>, <b>this</b>.height<span class="s"> + </span><span class="d">99</span>).attr({stroke: <i>"none"</i>});
+</code><code id="L3988"><span class="ln">3988</span> setTimeout(<b>function</b> () {rect.remove();});
+</code><code id="L3989"><span class="ln">3989</span> };
+</code><code id="L3990"><span class="ln">3990</span> } <b>else</b> {
+</code><code id="L3991"><span class="ln">3991</span> paperproto.safari<span class="s"> = </span>fun;
+</code><code id="L3992"><span class="ln">3992</span> }
+</code><code id="L3993"><span class="ln">3993</span>
+</code><code id="L3994"><span class="ln">3994</span> <span class="c">// Events</span>
+</code><code id="L3995"><span class="ln">3995</span> <b>var</b> preventDefault<span class="s"> = </span><b>function</b> () {
+</code><code id="L3996"><span class="ln">3996</span> <b>this</b>.returnValue<span class="s"> = </span><b>false</b>;
+</code><code id="L3997"><span class="ln">3997</span> },
+</code><code id="L3998"><span class="ln">3998</span> preventTouch<span class="s"> = </span><b>function</b> () {
+</code><code id="L3999"><span class="ln">3999</span> <b>return</b> <b>this</b>.originalEvent.preventDefault();
+</code><code id="L4000"><span class="ln">4000</span> },
+</code><code id="L4001"><span class="ln">4001</span> stopPropagation<span class="s"> = </span><b>function</b> () {
+</code><code id="L4002"><span class="ln">4002</span> <b>this</b>.cancelBubble<span class="s"> = </span><b>true</b>;
+</code><code id="L4003"><span class="ln">4003</span> },
+</code><code id="L4004"><span class="ln">4004</span> stopTouch<span class="s"> = </span><b>function</b> () {
+</code><code id="L4005"><span class="ln">4005</span> <b>return</b> <b>this</b>.originalEvent.stopPropagation();
+</code><code id="L4006"><span class="ln">4006</span> },
+</code><code id="L4007"><span class="ln">4007</span> addEvent<span class="s"> = </span>(<b>function</b> () {
+</code><code id="L4008"><span class="ln">4008</span> <b>if</b> (g.doc.addEventListener) {
+</code><code id="L4009"><span class="ln">4009</span> <b>return</b> <b>function</b> (obj, type, fn, element) {
+</code><code id="L4010"><span class="ln">4010</span> <b>var</b> realName<span class="s"> = </span>supportsTouch<span class="s"> && </span>touchMap[type] ? touchMap[type] : type;
+</code><code id="L4011"><span class="ln">4011</span> <b>var</b> f<span class="s"> = </span><b>function</b> (e) {
+</code><code id="L4012"><span class="ln">4012</span> <b>if</b> (supportsTouch<span class="s"> && </span>touchMap[has](type)) {
+</code><code id="L4013"><span class="ln">4013</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>e.targetTouches<span class="s"> && </span>e.targetTouches.length; i < ii; i++) {
+</code><code id="L4014"><span class="ln">4014</span> <b>if</b> (e.targetTouches[i].target<span class="s"> == </span>obj) {
+</code><code id="L4015"><span class="ln">4015</span> <b>var</b> olde<span class="s"> = </span>e;
+</code><code id="L4016"><span class="ln">4016</span> e<span class="s"> = </span>e.targetTouches[i];
+</code><code id="L4017"><span class="ln">4017</span> e.originalEvent<span class="s"> = </span>olde;
+</code><code id="L4018"><span class="ln">4018</span> e.preventDefault<span class="s"> = </span>preventTouch;
+</code><code id="L4019"><span class="ln">4019</span> e.stopPropagation<span class="s"> = </span>stopTouch;
+</code><code id="L4020"><span class="ln">4020</span> <b>break</b>;
+</code><code id="L4021"><span class="ln">4021</span> }
+</code><code id="L4022"><span class="ln">4022</span> }
+</code><code id="L4023"><span class="ln">4023</span> }
+</code><code id="L4024"><span class="ln">4024</span> <b>return</b> fn.call(element, e);
+</code><code id="L4025"><span class="ln">4025</span> };
+</code><code id="L4026"><span class="ln">4026</span> obj.addEventListener(realName, f, <b>false</b>);
+</code><code id="L4027"><span class="ln">4027</span> <b>return</b> <b>function</b> () {
+</code><code id="L4028"><span class="ln">4028</span> obj.removeEventListener(realName, f, <b>false</b>);
+</code><code id="L4029"><span class="ln">4029</span> <b>return</b> <b>true</b>;
+</code><code id="L4030"><span class="ln">4030</span> };
+</code><code id="L4031"><span class="ln">4031</span> };
+</code><code id="L4032"><span class="ln">4032</span> } <b>else</b> <b>if</b> (g.doc.attachEvent) {
+</code><code id="L4033"><span class="ln">4033</span> <b>return</b> <b>function</b> (obj, type, fn, element) {
+</code><code id="L4034"><span class="ln">4034</span> <b>var</b> f<span class="s"> = </span><b>function</b> (e) {
+</code><code id="L4035"><span class="ln">4035</span> e<span class="s"> = </span>e<span class="s"> || </span>g.win.event;
+</code><code id="L4036"><span class="ln">4036</span> e.preventDefault<span class="s"> = </span>e.preventDefault<span class="s"> || </span>preventDefault;
+</code><code id="L4037"><span class="ln">4037</span> e.stopPropagation<span class="s"> = </span>e.stopPropagation<span class="s"> || </span>stopPropagation;
+</code><code id="L4038"><span class="ln">4038</span> <b>return</b> fn.call(element, e);
+</code><code id="L4039"><span class="ln">4039</span> };
+</code><code id="L4040"><span class="ln">4040</span> obj.attachEvent(<i>"on"</i><span class="s"> + </span>type, f);
+</code><code id="L4041"><span class="ln">4041</span> <b>var</b> detacher<span class="s"> = </span><b>function</b> () {
+</code><code id="L4042"><span class="ln">4042</span> obj.detachEvent(<i>"on"</i><span class="s"> + </span>type, f);
+</code><code id="L4043"><span class="ln">4043</span> <b>return</b> <b>true</b>;
+</code><code id="L4044"><span class="ln">4044</span> };
+</code><code id="L4045"><span class="ln">4045</span> <b>return</b> detacher;
+</code><code id="L4046"><span class="ln">4046</span> };
+</code><code id="L4047"><span class="ln">4047</span> }
+</code><code id="L4048"><span class="ln">4048</span> })(),
+</code><code id="L4049"><span class="ln">4049</span> drag<span class="s"> = </span>[],
+</code><code id="L4050"><span class="ln">4050</span> dragMove<span class="s"> = </span><b>function</b> (e) {
+</code><code id="L4051"><span class="ln">4051</span> <b>var</b> x<span class="s"> = </span>e.clientX,
+</code><code id="L4052"><span class="ln">4052</span> y<span class="s"> = </span>e.clientY,
+</code><code id="L4053"><span class="ln">4053</span> scrollY<span class="s"> = </span>g.doc.documentElement.scrollTop<span class="s"> || </span>g.doc.body.scrollTop,
+</code><code id="L4054"><span class="ln">4054</span> scrollX<span class="s"> = </span>g.doc.documentElement.scrollLeft<span class="s"> || </span>g.doc.body.scrollLeft,
+</code><code id="L4055"><span class="ln">4055</span> dragi,
+</code><code id="L4056"><span class="ln">4056</span> j<span class="s"> = </span>drag.length;
+</code><code id="L4057"><span class="ln">4057</span> <b>while</b> (j--) {
+</code><code id="L4058"><span class="ln">4058</span> dragi<span class="s"> = </span>drag[j];
+</code><code id="L4059"><span class="ln">4059</span> <b>if</b> (supportsTouch) {
+</code><code id="L4060"><span class="ln">4060</span> <b>var</b> i<span class="s"> = </span>e.touches.length,
+</code><code id="L4061"><span class="ln">4061</span> touch;
+</code><code id="L4062"><span class="ln">4062</span> <b>while</b> (i--) {
+</code><code id="L4063"><span class="ln">4063</span> touch<span class="s"> = </span>e.touches[i];
+</code><code id="L4064"><span class="ln">4064</span> <b>if</b> (touch.identifier<span class="s"> == </span>dragi.el._drag.id) {
+</code><code id="L4065"><span class="ln">4065</span> x<span class="s"> = </span>touch.clientX;
+</code><code id="L4066"><span class="ln">4066</span> y<span class="s"> = </span>touch.clientY;
+</code><code id="L4067"><span class="ln">4067</span> (e.originalEvent ? e.originalEvent : e).preventDefault();
+</code><code id="L4068"><span class="ln">4068</span> <b>break</b>;
+</code><code id="L4069"><span class="ln">4069</span> }
+</code><code id="L4070"><span class="ln">4070</span> }
+</code><code id="L4071"><span class="ln">4071</span> } <b>else</b> {
+</code><code id="L4072"><span class="ln">4072</span> e.preventDefault();
+</code><code id="L4073"><span class="ln">4073</span> }
+</code><code id="L4074"><span class="ln">4074</span> <b>var</b> node<span class="s"> = </span>dragi.el.node,
+</code><code id="L4075"><span class="ln">4075</span> o,
+</code><code id="L4076"><span class="ln">4076</span> next<span class="s"> = </span>node.nextSibling,
+</code><code id="L4077"><span class="ln">4077</span> parent<span class="s"> = </span>node.parentNode,
+</code><code id="L4078"><span class="ln">4078</span> display<span class="s"> = </span>node.style.display;
+</code><code id="L4079"><span class="ln">4079</span> g.win.opera<span class="s"> && </span>parent.removeChild(node);
+</code><code id="L4080"><span class="ln">4080</span> node.style.display<span class="s"> = </span><i>"none"</i>;
+</code><code id="L4081"><span class="ln">4081</span> o<span class="s"> = </span>dragi.el.paper.getElementByPoint(x, y);
+</code><code id="L4082"><span class="ln">4082</span> node.style.display<span class="s"> = </span>display;
+</code><code id="L4083"><span class="ln">4083</span> g.win.opera<span class="s"> && </span>(next ? parent.insertBefore(node, next) : parent.appendChild(node));
+</code><code id="L4084"><span class="ln">4084</span> o<span class="s"> && </span>eve(<i>"drag.over."</i><span class="s"> + </span>dragi.el.id, dragi.el, o);
+</code><code id="L4085"><span class="ln">4085</span> x += scrollX;
+</code><code id="L4086"><span class="ln">4086</span> y += scrollY;
+</code><code id="L4087"><span class="ln">4087</span> eve(<i>"drag.move."</i><span class="s"> + </span>dragi.el.id, dragi.move_scope<span class="s"> || </span>dragi.el, x<span class="s"> - </span>dragi.el._drag.x, y<span class="s"> - </span>dragi.el._drag.y, x, y, e);
+</code><code id="L4088"><span class="ln">4088</span> }
+</code><code id="L4089"><span class="ln">4089</span> },
+</code><code id="L4090"><span class="ln">4090</span> dragUp<span class="s"> = </span><b>function</b> (e) {
+</code><code id="L4091"><span class="ln">4091</span> R.unmousemove(dragMove).unmouseup(dragUp);
+</code><code id="L4092"><span class="ln">4092</span> <b>var</b> i<span class="s"> = </span>drag.length,
+</code><code id="L4093"><span class="ln">4093</span> dragi;
+</code><code id="L4094"><span class="ln">4094</span> <b>while</b> (i--) {
+</code><code id="L4095"><span class="ln">4095</span> dragi<span class="s"> = </span>drag[i];
+</code><code id="L4096"><span class="ln">4096</span> dragi.el._drag<span class="s"> = </span>{};
+</code><code id="L4097"><span class="ln">4097</span> eve(<i>"drag.end."</i><span class="s"> + </span>dragi.el.id, dragi.end_scope<span class="s"> || </span>dragi.start_scope<span class="s"> || </span>dragi.move_scope<span class="s"> || </span>dragi.el, e);
+</code><code id="L4098"><span class="ln">4098</span> }
+</code><code id="L4099"><span class="ln">4099</span> drag<span class="s"> = </span>[];
+</code><code id="L4100"><span class="ln">4100</span> };
+</code><code id="L4101"><span class="ln">4101</span> <b>for</b> (<b>var</b> i<span class="s"> = </span>events.length; i--;) {
+</code><code id="L4102"><span class="ln">4102</span> (<b>function</b> (eventName) {
+</code><code id="L4103"><span class="ln">4103</span> R[eventName]<span class="s"> = </span>Element.prototype[eventName]<span class="s"> = </span><b>function</b> (fn, scope) {
+</code><code id="L4104"><span class="ln">4104</span> <b>if</b> (R.is(fn, <i>"<b>function</b>"</i>)) {
+</code><code id="L4105"><span class="ln">4105</span> <b>this</b>.events<span class="s"> = </span><b>this</b>.events<span class="s"> || </span>[];
+</code><code id="L4106"><span class="ln">4106</span> <b>this</b>.events.push({name: eventName, f: fn, unbind: addEvent(<b>this</b>.shape<span class="s"> || </span><b>this</b>.node<span class="s"> || </span>g.doc, eventName, fn, scope<span class="s"> || </span><b>this</b>)});
+</code><code id="L4107"><span class="ln">4107</span> }
+</code><code id="L4108"><span class="ln">4108</span> <b>return</b> <b>this</b>;
+</code><code id="L4109"><span class="ln">4109</span> };
+</code><code id="L4110"><span class="ln">4110</span> R[<i>"un"</i><span class="s"> + </span>eventName]<span class="s"> = </span>Element.prototype[<i>"un"</i><span class="s"> + </span>eventName]<span class="s"> = </span><b>function</b> (fn) {
+</code><code id="L4111"><span class="ln">4111</span> <b>var</b> events<span class="s"> = </span><b>this</b>.events,
+</code><code id="L4112"><span class="ln">4112</span> l<span class="s"> = </span>events.length;
+</code><code id="L4113"><span class="ln">4113</span> <b>while</b> (l--) <b>if</b> (events[l].name<span class="s"> == </span>eventName<span class="s"> && </span>events[l].f<span class="s"> == </span>fn) {
+</code><code id="L4114"><span class="ln">4114</span> events[l].unbind();
+</code><code id="L4115"><span class="ln">4115</span> events.splice(l, <span class="d">1</span>);
+</code><code id="L4116"><span class="ln">4116</span> !events.length<span class="s"> && </span><b>delete</b> <b>this</b>.events;
+</code><code id="L4117"><span class="ln">4117</span> <b>return</b> <b>this</b>;
+</code><code id="L4118"><span class="ln">4118</span> }
+</code><code id="L4119"><span class="ln">4119</span> <b>return</b> <b>this</b>;
+</code><code id="L4120"><span class="ln">4120</span> };
+</code><code id="L4121"><span class="ln">4121</span> })(events[i]);
+</code><code id="L4122"><span class="ln">4122</span> }
+</code><code id="L4123"><span class="ln">4123</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4124"><span class="ln">4124</span><span class="c"> <span class="s"> * </span>Element.hover
+</span></code><code id="L4125"><span class="ln">4125</span><span class="c"> [ method ]
+</span></code><code id="L4126"><span class="ln">4126</span><span class="c"> **
+</span></code><code id="L4127"><span class="ln">4127</span><span class="c"> <span class="s"> * </span>Adds event handlers <b>for</b> hover <b>for</b> the element.
+</span></code><code id="L4128"><span class="ln">4128</span><span class="c"> > Parameters
+</span></code><code id="L4129"><span class="ln">4129</span><span class="c"> <span class="s"> - </span>f_in (<b>function</b>) handler <b>for</b> hover <b>in</b>
+</span></code><code id="L4130"><span class="ln">4130</span><span class="c"> <span class="s"> - </span>f_out (<b>function</b>) handler <b>for</b> hover out
+</span></code><code id="L4131"><span class="ln">4131</span><span class="c"> <span class="s"> - </span>icontext (object) #optional context <b>for</b> hover <b>in</b> handler
+</span></code><code id="L4132"><span class="ln">4132</span><span class="c"> <span class="s"> - </span>ocontext (object) #optional context <b>for</b> hover out handler
+</span></code><code id="L4133"><span class="ln">4133</span><span class="c"> <span class="s"> = </span>(object) @Element
+</span></code><code id="L4134"><span class="ln">4134</span><span class="c"> \*/</span>
+</code><code id="L4135"><span class="ln">4135</span> elproto.hover<span class="s"> = </span><b>function</b> (f_in, f_out, scope_in, scope_out) {
+</code><code id="L4136"><span class="ln">4136</span> <b>return</b> <b>this</b>.mouseover(f_in, scope_in).mouseout(f_out, scope_out<span class="s"> || </span>scope_in);
+</code><code id="L4137"><span class="ln">4137</span> };
+</code><code id="L4138"><span class="ln">4138</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4139"><span class="ln">4139</span><span class="c"> <span class="s"> * </span>Element.unhover
+</span></code><code id="L4140"><span class="ln">4140</span><span class="c"> [ method ]
+</span></code><code id="L4141"><span class="ln">4141</span><span class="c"> **
+</span></code><code id="L4142"><span class="ln">4142</span><span class="c"> <span class="s"> * </span>Removes event handlers <b>for</b> hover <b>for</b> the element.
+</span></code><code id="L4143"><span class="ln">4143</span><span class="c"> > Parameters
+</span></code><code id="L4144"><span class="ln">4144</span><span class="c"> <span class="s"> - </span>f_in (<b>function</b>) handler <b>for</b> hover <b>in</b>
+</span></code><code id="L4145"><span class="ln">4145</span><span class="c"> <span class="s"> - </span>f_out (<b>function</b>) handler <b>for</b> hover out
</span></code><code id="L4146"><span class="ln">4146</span><span class="c"> <span class="s"> = </span>(object) @Element
</span></code><code id="L4147"><span class="ln">4147</span><span class="c"> \*/</span>
-</code><code id="L4148"><span class="ln">4148</span> elproto.drag<span class="s"> = </span><b>function</b> (onmove, onstart, onend, move_scope, start_scope, end_scope) {
-</code><code id="L4149"><span class="ln">4149</span> <b>function</b> start(e) {
-</code><code id="L4150"><span class="ln">4150</span> (e.originalEvent<span class="s"> || </span>e).preventDefault();
-</code><code id="L4151"><span class="ln">4151</span> <b>var</b> scrollY<span class="s"> = </span>g.doc.documentElement.scrollTop<span class="s"> || </span>g.doc.body.scrollTop,
-</code><code id="L4152"><span class="ln">4152</span> scrollX<span class="s"> = </span>g.doc.documentElement.scrollLeft<span class="s"> || </span>g.doc.body.scrollLeft;
-</code><code id="L4153"><span class="ln">4153</span> <b>this</b>._drag.x<span class="s"> = </span>e.clientX<span class="s"> + </span>scrollX;
-</code><code id="L4154"><span class="ln">4154</span> <b>this</b>._drag.y<span class="s"> = </span>e.clientY<span class="s"> + </span>scrollY;
-</code><code id="L4155"><span class="ln">4155</span> <b>this</b>._drag.id<span class="s"> = </span>e.identifier;
-</code><code id="L4156"><span class="ln">4156</span> !drag.length<span class="s"> && </span>R.mousemove(dragMove).mouseup(dragUp);
-</code><code id="L4157"><span class="ln">4157</span> drag.push({el: <b>this</b>, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});
-</code><code id="L4158"><span class="ln">4158</span> onstart<span class="s"> && </span>eve.on(<i>"drag.start."</i><span class="s"> + </span><b>this</b>.id, onstart);
-</code><code id="L4159"><span class="ln">4159</span> onmove<span class="s"> && </span>eve.on(<i>"drag.move."</i><span class="s"> + </span><b>this</b>.id, onmove);
-</code><code id="L4160"><span class="ln">4160</span> onend<span class="s"> && </span>eve.on(<i>"drag.end."</i><span class="s"> + </span><b>this</b>.id, onend);
-</code><code id="L4161"><span class="ln">4161</span> eve(<i>"drag.start."</i><span class="s"> + </span><b>this</b>.id, start_scope<span class="s"> || </span>move_scope<span class="s"> || </span><b>this</b>, e.clientX<span class="s"> + </span>scrollX, e.clientY<span class="s"> + </span>scrollY, e);
-</code><code id="L4162"><span class="ln">4162</span> }
-</code><code id="L4163"><span class="ln">4163</span> <b>this</b>._drag<span class="s"> = </span>{};
-</code><code id="L4164"><span class="ln">4164</span> <b>this</b>.mousedown(start);
-</code><code id="L4165"><span class="ln">4165</span> <b>return</b> <b>this</b>;
-</code><code id="L4166"><span class="ln">4166</span> };
-</code><code id="L4167"><span class="ln">4167</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4168"><span class="ln">4168</span><span class="c"> <span class="s"> * </span>Element.onDragOver
-</span></code><code id="L4169"><span class="ln">4169</span><span class="c"> [ method ]
-</span></code><code id="L4170"><span class="ln">4170</span><span class="c"> **
-</span></code><code id="L4171"><span class="ln">4171</span><span class="c"> <span class="s"> * </span>Shortcut <b>for</b> assigning event handler <b>for</b> `drag.over.<id>` event, where id is id of the element (see @Element.id).
-</span></code><code id="L4172"><span class="ln">4172</span><span class="c"> > Parameters
-</span></code><code id="L4173"><span class="ln">4173</span><span class="c"> <span class="s"> - </span>f (<b>function</b>) handler <b>for</b> event
-</span></code><code id="L4174"><span class="ln">4174</span><span class="c"> \*/</span>
-</code><code id="L4175"><span class="ln">4175</span> elproto.onDragOver<span class="s"> = </span><b>function</b> (f) {
-</code><code id="L4176"><span class="ln">4176</span> f ? eve.on(<i>"drag.over."</i><span class="s"> + </span><b>this</b>.id, f) : eve.unbind(<i>"drag.over."</i><span class="s"> + </span><b>this</b>.id);
-</code><code id="L4177"><span class="ln">4177</span> };
-</code><code id="L4178"><span class="ln">4178</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4179"><span class="ln">4179</span><span class="c"> <span class="s"> * </span>Element.undrag
-</span></code><code id="L4180"><span class="ln">4180</span><span class="c"> [ method ]
-</span></code><code id="L4181"><span class="ln">4181</span><span class="c"> **
-</span></code><code id="L4182"><span class="ln">4182</span><span class="c"> <span class="s"> * </span>Removes all drag event handlers from given element.
-</span></code><code id="L4183"><span class="ln">4183</span><span class="c"> \*/</span>
-</code><code id="L4184"><span class="ln">4184</span> elproto.undrag<span class="s"> = </span><b>function</b> () {
-</code><code id="L4185"><span class="ln">4185</span> <b>var</b> i<span class="s"> = </span>drag.length;
-</code><code id="L4186"><span class="ln">4186</span> <b>while</b> (i--) <b>if</b> (drag[i].el<span class="s"> == </span><b>this</b>) {
-</code><code id="L4187"><span class="ln">4187</span> R.unmousedown(drag[i].start);
-</code><code id="L4188"><span class="ln">4188</span> drag.splice(i++, <span class="d">1</span>);
-</code><code id="L4189"><span class="ln">4189</span> eve.unbind(<i>"drag.*."</i><span class="s"> + </span><b>this</b>.id);
-</code><code id="L4190"><span class="ln">4190</span> }
-</code><code id="L4191"><span class="ln">4191</span> !drag.length<span class="s"> && </span>R.unmousemove(dragMove).unmouseup(dragUp);
-</code><code id="L4192"><span class="ln">4192</span> };
-</code><code id="L4193"><span class="ln">4193</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4194"><span class="ln">4194</span><span class="c"> <span class="s"> * </span>Paper.circle
-</span></code><code id="L4195"><span class="ln">4195</span><span class="c"> [ method ]
-</span></code><code id="L4196"><span class="ln">4196</span><span class="c"> **
-</span></code><code id="L4197"><span class="ln">4197</span><span class="c"> <span class="s"> * </span>Draws a circle.
-</span></code><code id="L4198"><span class="ln">4198</span><span class="c"> **
-</span></code><code id="L4199"><span class="ln">4199</span><span class="c"> > Parameters
-</span></code><code id="L4200"><span class="ln">4200</span><span class="c"> **
-</span></code><code id="L4201"><span class="ln">4201</span><span class="c"> <span class="s"> - </span>x (number) x coordinate of the centre
-</span></code><code id="L4202"><span class="ln">4202</span><span class="c"> <span class="s"> - </span>y (number) y coordinate of the centre
-</span></code><code id="L4203"><span class="ln">4203</span><span class="c"> <span class="s"> - </span>r (number) radius
-</span></code><code id="L4204"><span class="ln">4204</span><span class="c"> <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “circle”
-</span></code><code id="L4205"><span class="ln">4205</span><span class="c"> **
-</span></code><code id="L4206"><span class="ln">4206</span><span class="c"> > Usage
-</span></code><code id="L4207"><span class="ln">4207</span><span class="c"> <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.circle(<span class="d">50</span>, <span class="d">50</span>, <span class="d">40</span>);
-</span></code><code id="L4208"><span class="ln">4208</span><span class="c"> \*/</span>
-</code><code id="L4209"><span class="ln">4209</span> paperproto.circle<span class="s"> = </span><b>function</b> (x, y, r) {
-</code><code id="L4210"><span class="ln">4210</span> <b>return</b> theCircle(<b>this</b>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, r<span class="s"> || </span><span class="d">0</span>);
-</code><code id="L4211"><span class="ln">4211</span> };
-</code><code id="L4212"><span class="ln">4212</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4213"><span class="ln">4213</span><span class="c"> <span class="s"> * </span>Paper.rect
-</span></code><code id="L4214"><span class="ln">4214</span><span class="c"> [ method ]
-</span></code><code id="L4215"><span class="ln">4215</span><span class="c"> *
-</span></code><code id="L4216"><span class="ln">4216</span><span class="c"> <span class="s"> * </span>Draws a rectangle.
-</span></code><code id="L4217"><span class="ln">4217</span><span class="c"> **
-</span></code><code id="L4218"><span class="ln">4218</span><span class="c"> > Parameters
-</span></code><code id="L4219"><span class="ln">4219</span><span class="c"> **
-</span></code><code id="L4220"><span class="ln">4220</span><span class="c"> <span class="s"> - </span>x (number) x coordinate of the top left corner
-</span></code><code id="L4221"><span class="ln">4221</span><span class="c"> <span class="s"> - </span>y (number) y coordinate of the top left corner
-</span></code><code id="L4222"><span class="ln">4222</span><span class="c"> <span class="s"> - </span>width (number) width
-</span></code><code id="L4223"><span class="ln">4223</span><span class="c"> <span class="s"> - </span>height (number) height
-</span></code><code id="L4224"><span class="ln">4224</span><span class="c"> <span class="s"> - </span>r (number) #optional radius <b>for</b> rounded corners, <b>default</b> is <span class="d">0</span>
-</span></code><code id="L4225"><span class="ln">4225</span><span class="c"> <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “rect”
-</span></code><code id="L4226"><span class="ln">4226</span><span class="c"> **
-</span></code><code id="L4227"><span class="ln">4227</span><span class="c"> > Usage
-</span></code><code id="L4228"><span class="ln">4228</span><span class="c"> <span class="s"> | </span><span class="c">// regular rectangle</span>
-</span></code><code id="L4229"><span class="ln">4229</span><span class="c"> <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.rect(<span class="d">10</span>, <span class="d">10</span>, <span class="d">50</span>, <span class="d">50</span>);
-</span></code><code id="L4230"><span class="ln">4230</span><span class="c"> <span class="s"> | </span><span class="c">// rectangle <b>with</b> rounded corners</span>
-</span></code><code id="L4231"><span class="ln">4231</span><span class="c"> <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.rect(<span class="d">40</span>, <span class="d">40</span>, <span class="d">50</span>, <span class="d">50</span>, <span class="d">10</span>);
-</span></code><code id="L4232"><span class="ln">4232</span><span class="c"> \*/</span>
-</code><code id="L4233"><span class="ln">4233</span> paperproto.rect<span class="s"> = </span><b>function</b> (x, y, w, h, r) {
-</code><code id="L4234"><span class="ln">4234</span> <b>return</b> theRect(<b>this</b>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, w<span class="s"> || </span><span class="d">0</span>, h<span class="s"> || </span><span class="d">0</span>, r<span class="s"> || </span><span class="d">0</span>);
-</code><code id="L4235"><span class="ln">4235</span> };
-</code><code id="L4236"><span class="ln">4236</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4237"><span class="ln">4237</span><span class="c"> <span class="s"> * </span>Paper.ellipse
-</span></code><code id="L4238"><span class="ln">4238</span><span class="c"> [ method ]
-</span></code><code id="L4239"><span class="ln">4239</span><span class="c"> **
-</span></code><code id="L4240"><span class="ln">4240</span><span class="c"> <span class="s"> * </span>Draws an ellipse.
-</span></code><code id="L4241"><span class="ln">4241</span><span class="c"> **
-</span></code><code id="L4242"><span class="ln">4242</span><span class="c"> > Parameters
-</span></code><code id="L4243"><span class="ln">4243</span><span class="c"> **
-</span></code><code id="L4244"><span class="ln">4244</span><span class="c"> <span class="s"> - </span>x (number) x coordinate of the centre
-</span></code><code id="L4245"><span class="ln">4245</span><span class="c"> <span class="s"> - </span>y (number) y coordinate of the centre
-</span></code><code id="L4246"><span class="ln">4246</span><span class="c"> <span class="s"> - </span>rx (number) horizontal radius
-</span></code><code id="L4247"><span class="ln">4247</span><span class="c"> <span class="s"> - </span>ry (number) vertical radius
-</span></code><code id="L4248"><span class="ln">4248</span><span class="c"> <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “ellipse”
-</span></code><code id="L4249"><span class="ln">4249</span><span class="c"> **
-</span></code><code id="L4250"><span class="ln">4250</span><span class="c"> > Usage
-</span></code><code id="L4251"><span class="ln">4251</span><span class="c"> <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.ellipse(<span class="d">50</span>, <span class="d">50</span>, <span class="d">40</span>, <span class="d">20</span>);
-</span></code><code id="L4252"><span class="ln">4252</span><span class="c"> \*/</span>
-</code><code id="L4253"><span class="ln">4253</span> paperproto.ellipse<span class="s"> = </span><b>function</b> (x, y, rx, ry) {
-</code><code id="L4254"><span class="ln">4254</span> <b>return</b> theEllipse(<b>this</b>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, rx<span class="s"> || </span><span class="d">0</span>, ry<span class="s"> || </span><span class="d">0</span>);
-</code><code id="L4255"><span class="ln">4255</span> };
-</code><code id="L4256"><span class="ln">4256</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4257"><span class="ln">4257</span><span class="c"> <span class="s"> * </span>Paper.path
-</span></code><code id="L4258"><span class="ln">4258</span><span class="c"> [ method ]
+</code><code id="L4148"><span class="ln">4148</span> elproto.unhover<span class="s"> = </span><b>function</b> (f_in, f_out) {
+</code><code id="L4149"><span class="ln">4149</span> <b>return</b> <b>this</b>.unmouseover(f_in).unmouseout(f_out);
+</code><code id="L4150"><span class="ln">4150</span> };
+</code><code id="L4151"><span class="ln">4151</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4152"><span class="ln">4152</span><span class="c"> <span class="s"> * </span>Element.drag
+</span></code><code id="L4153"><span class="ln">4153</span><span class="c"> [ method ]
+</span></code><code id="L4154"><span class="ln">4154</span><span class="c"> **
+</span></code><code id="L4155"><span class="ln">4155</span><span class="c"> <span class="s"> * </span>Adds event handlers <b>for</b> drag of the element.
+</span></code><code id="L4156"><span class="ln">4156</span><span class="c"> > Parameters
+</span></code><code id="L4157"><span class="ln">4157</span><span class="c"> <span class="s"> - </span>onmove (<b>function</b>) handler <b>for</b> moving
+</span></code><code id="L4158"><span class="ln">4158</span><span class="c"> <span class="s"> - </span>onstart (<b>function</b>) handler <b>for</b> drag start
+</span></code><code id="L4159"><span class="ln">4159</span><span class="c"> <span class="s"> - </span>onend (<b>function</b>) handler <b>for</b> drag end
+</span></code><code id="L4160"><span class="ln">4160</span><span class="c"> <span class="s"> - </span>mcontext (object) #optional context <b>for</b> moving handler
+</span></code><code id="L4161"><span class="ln">4161</span><span class="c"> <span class="s"> - </span>scontext (object) #optional context <b>for</b> drag start handler
+</span></code><code id="L4162"><span class="ln">4162</span><span class="c"> <span class="s"> - </span>econtext (object) #optional context <b>for</b> drag end handler
+</span></code><code id="L4163"><span class="ln">4163</span><span class="c"> <span class="s"> * </span>Additionaly following `drag` events will be triggered: `drag.start.<id>` on start,
+</span></code><code id="L4164"><span class="ln">4164</span><span class="c"> <span class="s"> * </span>`drag.end.<id>` on end and `drag.move.<id>` on every move. When element will be dragged over another element
+</span></code><code id="L4165"><span class="ln">4165</span><span class="c"> <span class="s"> * </span>`drag.over.<id>` will be fired as well.
+</span></code><code id="L4166"><span class="ln">4166</span><span class="c"> *
+</span></code><code id="L4167"><span class="ln">4167</span><span class="c"> <span class="s"> * </span>Start event and start handler will be called <b>in</b> specified context or <b>in</b> context of the element <b>with</b> following parameters:
+</span></code><code id="L4168"><span class="ln">4168</span><span class="c"> o x (number) x position of the mouse
+</span></code><code id="L4169"><span class="ln">4169</span><span class="c"> o y (number) y position of the mouse
+</span></code><code id="L4170"><span class="ln">4170</span><span class="c"> o event (object) DOM event object
+</span></code><code id="L4171"><span class="ln">4171</span><span class="c"> <span class="s"> * </span>Move event and move handler will be called <b>in</b> specified context or <b>in</b> context of the element <b>with</b> following parameters:
+</span></code><code id="L4172"><span class="ln">4172</span><span class="c"> o dx (number) shift by x from the start point
+</span></code><code id="L4173"><span class="ln">4173</span><span class="c"> o dy (number) shift by y from the start point
+</span></code><code id="L4174"><span class="ln">4174</span><span class="c"> o x (number) x position of the mouse
+</span></code><code id="L4175"><span class="ln">4175</span><span class="c"> o y (number) y position of the mouse
+</span></code><code id="L4176"><span class="ln">4176</span><span class="c"> o event (object) DOM event object
+</span></code><code id="L4177"><span class="ln">4177</span><span class="c"> <span class="s"> * </span>End event and end handler will be called <b>in</b> specified context or <b>in</b> context of the element <b>with</b> following parameters:
+</span></code><code id="L4178"><span class="ln">4178</span><span class="c"> o event (object) DOM event object
+</span></code><code id="L4179"><span class="ln">4179</span><span class="c"> <span class="s"> = </span>(object) @Element
+</span></code><code id="L4180"><span class="ln">4180</span><span class="c"> \*/</span>
+</code><code id="L4181"><span class="ln">4181</span> elproto.drag<span class="s"> = </span><b>function</b> (onmove, onstart, onend, move_scope, start_scope, end_scope) {
+</code><code id="L4182"><span class="ln">4182</span> <b>function</b> start(e) {
+</code><code id="L4183"><span class="ln">4183</span> (e.originalEvent<span class="s"> || </span>e).preventDefault();
+</code><code id="L4184"><span class="ln">4184</span> <b>var</b> scrollY<span class="s"> = </span>g.doc.documentElement.scrollTop<span class="s"> || </span>g.doc.body.scrollTop,
+</code><code id="L4185"><span class="ln">4185</span> scrollX<span class="s"> = </span>g.doc.documentElement.scrollLeft<span class="s"> || </span>g.doc.body.scrollLeft;
+</code><code id="L4186"><span class="ln">4186</span> <b>this</b>._drag.x<span class="s"> = </span>e.clientX<span class="s"> + </span>scrollX;
+</code><code id="L4187"><span class="ln">4187</span> <b>this</b>._drag.y<span class="s"> = </span>e.clientY<span class="s"> + </span>scrollY;
+</code><code id="L4188"><span class="ln">4188</span> <b>this</b>._drag.id<span class="s"> = </span>e.identifier;
+</code><code id="L4189"><span class="ln">4189</span> !drag.length<span class="s"> && </span>R.mousemove(dragMove).mouseup(dragUp);
+</code><code id="L4190"><span class="ln">4190</span> drag.push({el: <b>this</b>, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});
+</code><code id="L4191"><span class="ln">4191</span> onstart<span class="s"> && </span>eve.on(<i>"drag.start."</i><span class="s"> + </span><b>this</b>.id, onstart);
+</code><code id="L4192"><span class="ln">4192</span> onmove<span class="s"> && </span>eve.on(<i>"drag.move."</i><span class="s"> + </span><b>this</b>.id, onmove);
+</code><code id="L4193"><span class="ln">4193</span> onend<span class="s"> && </span>eve.on(<i>"drag.end."</i><span class="s"> + </span><b>this</b>.id, onend);
+</code><code id="L4194"><span class="ln">4194</span> eve(<i>"drag.start."</i><span class="s"> + </span><b>this</b>.id, start_scope<span class="s"> || </span>move_scope<span class="s"> || </span><b>this</b>, e.clientX<span class="s"> + </span>scrollX, e.clientY<span class="s"> + </span>scrollY, e);
+</code><code id="L4195"><span class="ln">4195</span> }
+</code><code id="L4196"><span class="ln">4196</span> <b>this</b>._drag<span class="s"> = </span>{};
+</code><code id="L4197"><span class="ln">4197</span> <b>this</b>.mousedown(start);
+</code><code id="L4198"><span class="ln">4198</span> <b>return</b> <b>this</b>;
+</code><code id="L4199"><span class="ln">4199</span> };
+</code><code id="L4200"><span class="ln">4200</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4201"><span class="ln">4201</span><span class="c"> <span class="s"> * </span>Element.onDragOver
+</span></code><code id="L4202"><span class="ln">4202</span><span class="c"> [ method ]
+</span></code><code id="L4203"><span class="ln">4203</span><span class="c"> **
+</span></code><code id="L4204"><span class="ln">4204</span><span class="c"> <span class="s"> * </span>Shortcut <b>for</b> assigning event handler <b>for</b> `drag.over.<id>` event, where id is id of the element (see @Element.id).
+</span></code><code id="L4205"><span class="ln">4205</span><span class="c"> > Parameters
+</span></code><code id="L4206"><span class="ln">4206</span><span class="c"> <span class="s"> - </span>f (<b>function</b>) handler <b>for</b> event
+</span></code><code id="L4207"><span class="ln">4207</span><span class="c"> \*/</span>
+</code><code id="L4208"><span class="ln">4208</span> elproto.onDragOver<span class="s"> = </span><b>function</b> (f) {
+</code><code id="L4209"><span class="ln">4209</span> f ? eve.on(<i>"drag.over."</i><span class="s"> + </span><b>this</b>.id, f) : eve.unbind(<i>"drag.over."</i><span class="s"> + </span><b>this</b>.id);
+</code><code id="L4210"><span class="ln">4210</span> };
+</code><code id="L4211"><span class="ln">4211</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4212"><span class="ln">4212</span><span class="c"> <span class="s"> * </span>Element.undrag
+</span></code><code id="L4213"><span class="ln">4213</span><span class="c"> [ method ]
+</span></code><code id="L4214"><span class="ln">4214</span><span class="c"> **
+</span></code><code id="L4215"><span class="ln">4215</span><span class="c"> <span class="s"> * </span>Removes all drag event handlers from given element.
+</span></code><code id="L4216"><span class="ln">4216</span><span class="c"> \*/</span>
+</code><code id="L4217"><span class="ln">4217</span> elproto.undrag<span class="s"> = </span><b>function</b> () {
+</code><code id="L4218"><span class="ln">4218</span> <b>var</b> i<span class="s"> = </span>drag.length;
+</code><code id="L4219"><span class="ln">4219</span> <b>while</b> (i--) <b>if</b> (drag[i].el<span class="s"> == </span><b>this</b>) {
+</code><code id="L4220"><span class="ln">4220</span> R.unmousedown(drag[i].start);
+</code><code id="L4221"><span class="ln">4221</span> drag.splice(i++, <span class="d">1</span>);
+</code><code id="L4222"><span class="ln">4222</span> eve.unbind(<i>"drag.*."</i><span class="s"> + </span><b>this</b>.id);
+</code><code id="L4223"><span class="ln">4223</span> }
+</code><code id="L4224"><span class="ln">4224</span> !drag.length<span class="s"> && </span>R.unmousemove(dragMove).unmouseup(dragUp);
+</code><code id="L4225"><span class="ln">4225</span> };
+</code><code id="L4226"><span class="ln">4226</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4227"><span class="ln">4227</span><span class="c"> <span class="s"> * </span>Paper.circle
+</span></code><code id="L4228"><span class="ln">4228</span><span class="c"> [ method ]
+</span></code><code id="L4229"><span class="ln">4229</span><span class="c"> **
+</span></code><code id="L4230"><span class="ln">4230</span><span class="c"> <span class="s"> * </span>Draws a circle.
+</span></code><code id="L4231"><span class="ln">4231</span><span class="c"> **
+</span></code><code id="L4232"><span class="ln">4232</span><span class="c"> > Parameters
+</span></code><code id="L4233"><span class="ln">4233</span><span class="c"> **
+</span></code><code id="L4234"><span class="ln">4234</span><span class="c"> <span class="s"> - </span>x (number) x coordinate of the centre
+</span></code><code id="L4235"><span class="ln">4235</span><span class="c"> <span class="s"> - </span>y (number) y coordinate of the centre
+</span></code><code id="L4236"><span class="ln">4236</span><span class="c"> <span class="s"> - </span>r (number) radius
+</span></code><code id="L4237"><span class="ln">4237</span><span class="c"> <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “circle”
+</span></code><code id="L4238"><span class="ln">4238</span><span class="c"> **
+</span></code><code id="L4239"><span class="ln">4239</span><span class="c"> > Usage
+</span></code><code id="L4240"><span class="ln">4240</span><span class="c"> <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.circle(<span class="d">50</span>, <span class="d">50</span>, <span class="d">40</span>);
+</span></code><code id="L4241"><span class="ln">4241</span><span class="c"> \*/</span>
+</code><code id="L4242"><span class="ln">4242</span> paperproto.circle<span class="s"> = </span><b>function</b> (x, y, r) {
+</code><code id="L4243"><span class="ln">4243</span> <b>return</b> theCircle(<b>this</b>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, r<span class="s"> || </span><span class="d">0</span>);
+</code><code id="L4244"><span class="ln">4244</span> };
+</code><code id="L4245"><span class="ln">4245</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4246"><span class="ln">4246</span><span class="c"> <span class="s"> * </span>Paper.rect
+</span></code><code id="L4247"><span class="ln">4247</span><span class="c"> [ method ]
+</span></code><code id="L4248"><span class="ln">4248</span><span class="c"> *
+</span></code><code id="L4249"><span class="ln">4249</span><span class="c"> <span class="s"> * </span>Draws a rectangle.
+</span></code><code id="L4250"><span class="ln">4250</span><span class="c"> **
+</span></code><code id="L4251"><span class="ln">4251</span><span class="c"> > Parameters
+</span></code><code id="L4252"><span class="ln">4252</span><span class="c"> **
+</span></code><code id="L4253"><span class="ln">4253</span><span class="c"> <span class="s"> - </span>x (number) x coordinate of the top left corner
+</span></code><code id="L4254"><span class="ln">4254</span><span class="c"> <span class="s"> - </span>y (number) y coordinate of the top left corner
+</span></code><code id="L4255"><span class="ln">4255</span><span class="c"> <span class="s"> - </span>width (number) width
+</span></code><code id="L4256"><span class="ln">4256</span><span class="c"> <span class="s"> - </span>height (number) height
+</span></code><code id="L4257"><span class="ln">4257</span><span class="c"> <span class="s"> - </span>r (number) #optional radius <b>for</b> rounded corners, <b>default</b> is <span class="d">0</span>
+</span></code><code id="L4258"><span class="ln">4258</span><span class="c"> <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “rect”
</span></code><code id="L4259"><span class="ln">4259</span><span class="c"> **
-</span></code><code id="L4260"><span class="ln">4260</span><span class="c"> <span class="s"> * </span>Creates a path element by given path data string.
-</span></code><code id="L4261"><span class="ln">4261</span><span class="c"> **
-</span></code><code id="L4262"><span class="ln">4262</span><span class="c"> > Parameters
-</span></code><code id="L4263"><span class="ln">4263</span><span class="c"> **
-</span></code><code id="L4264"><span class="ln">4264</span><span class="c"> <span class="s"> - </span>pathString (string) path data <b>in</b> SVG path string format.
-</span></code><code id="L4265"><span class="ln">4265</span><span class="c"> <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “ellipse”
-</span></code><code id="L4266"><span class="ln">4266</span><span class="c"> # Details of a path<i>'s data attribute'</i>s format are described <b>in</b> the <a href=<i>"http:<span class="c">//www.w3.org/TR/SVG/paths.html#PathData"</i>>SVG specification</a>.</span>
-</span></code><code id="L4267"><span class="ln">4267</span><span class="c"> **
-</span></code><code id="L4268"><span class="ln">4268</span><span class="c"> > Usage
-</span></code><code id="L4269"><span class="ln">4269</span><span class="c"> <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.path(<i>"M10 10L90 <span class="d">90</span>"</i>);
-</span></code><code id="L4270"><span class="ln">4270</span><span class="c"> <span class="s"> | </span><span class="c">// draw a diagonal line:</span>
-</span></code><code id="L4271"><span class="ln">4271</span><span class="c"> <span class="s"> | </span><span class="c">// move to <span class="d">10</span>,<span class="d">10</span>, line to <span class="d">90</span>,<span class="d">90</span></span>
-</span></code><code id="L4272"><span class="ln">4272</span><span class="c"> \*/</span>
-</code><code id="L4273"><span class="ln">4273</span> paperproto.path<span class="s"> = </span><b>function</b> (pathString) {
-</code><code id="L4274"><span class="ln">4274</span> pathString<span class="s"> && </span>!R.is(pathString, string)<span class="s"> && </span>!R.is(pathString[<span class="d">0</span>], array)<span class="s"> && </span>(pathString += E);
-</code><code id="L4275"><span class="ln">4275</span> <b>return</b> thePath(R.format[apply](R, arguments), <b>this</b>);
-</code><code id="L4276"><span class="ln">4276</span> };
-</code><code id="L4277"><span class="ln">4277</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4278"><span class="ln">4278</span><span class="c"> <span class="s"> * </span>Paper.image
-</span></code><code id="L4279"><span class="ln">4279</span><span class="c"> [ method ]
-</span></code><code id="L4280"><span class="ln">4280</span><span class="c"> **
-</span></code><code id="L4281"><span class="ln">4281</span><span class="c"> <span class="s"> * </span>Embeds an image into the surface.
+</span></code><code id="L4260"><span class="ln">4260</span><span class="c"> > Usage
+</span></code><code id="L4261"><span class="ln">4261</span><span class="c"> <span class="s"> | </span><span class="c">// regular rectangle</span>
+</span></code><code id="L4262"><span class="ln">4262</span><span class="c"> <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.rect(<span class="d">10</span>, <span class="d">10</span>, <span class="d">50</span>, <span class="d">50</span>);
+</span></code><code id="L4263"><span class="ln">4263</span><span class="c"> <span class="s"> | </span><span class="c">// rectangle <b>with</b> rounded corners</span>
+</span></code><code id="L4264"><span class="ln">4264</span><span class="c"> <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.rect(<span class="d">40</span>, <span class="d">40</span>, <span class="d">50</span>, <span class="d">50</span>, <span class="d">10</span>);
+</span></code><code id="L4265"><span class="ln">4265</span><span class="c"> \*/</span>
+</code><code id="L4266"><span class="ln">4266</span> paperproto.rect<span class="s"> = </span><b>function</b> (x, y, w, h, r) {
+</code><code id="L4267"><span class="ln">4267</span> <b>return</b> theRect(<b>this</b>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, w<span class="s"> || </span><span class="d">0</span>, h<span class="s"> || </span><span class="d">0</span>, r<span class="s"> || </span><span class="d">0</span>);
+</code><code id="L4268"><span class="ln">4268</span> };
+</code><code id="L4269"><span class="ln">4269</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4270"><span class="ln">4270</span><span class="c"> <span class="s"> * </span>Paper.ellipse
+</span></code><code id="L4271"><span class="ln">4271</span><span class="c"> [ method ]
+</span></code><code id="L4272"><span class="ln">4272</span><span class="c"> **
+</span></code><code id="L4273"><span class="ln">4273</span><span class="c"> <span class="s"> * </span>Draws an ellipse.
+</span></code><code id="L4274"><span class="ln">4274</span><span class="c"> **
+</span></code><code id="L4275"><span class="ln">4275</span><span class="c"> > Parameters
+</span></code><code id="L4276"><span class="ln">4276</span><span class="c"> **
+</span></code><code id="L4277"><span class="ln">4277</span><span class="c"> <span class="s"> - </span>x (number) x coordinate of the centre
+</span></code><code id="L4278"><span class="ln">4278</span><span class="c"> <span class="s"> - </span>y (number) y coordinate of the centre
+</span></code><code id="L4279"><span class="ln">4279</span><span class="c"> <span class="s"> - </span>rx (number) horizontal radius
+</span></code><code id="L4280"><span class="ln">4280</span><span class="c"> <span class="s"> - </span>ry (number) vertical radius
+</span></code><code id="L4281"><span class="ln">4281</span><span class="c"> <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “ellipse”
</span></code><code id="L4282"><span class="ln">4282</span><span class="c"> **
-</span></code><code id="L4283"><span class="ln">4283</span><span class="c"> > Parameters
-</span></code><code id="L4284"><span class="ln">4284</span><span class="c"> **
-</span></code><code id="L4285"><span class="ln">4285</span><span class="c"> <span class="s"> - </span>src (string) URI of the source image
-</span></code><code id="L4286"><span class="ln">4286</span><span class="c"> <span class="s"> - </span>x (number) x coordinate position
-</span></code><code id="L4287"><span class="ln">4287</span><span class="c"> <span class="s"> - </span>y (number) y coordinate position
-</span></code><code id="L4288"><span class="ln">4288</span><span class="c"> <span class="s"> - </span>width (number) width of the image
-</span></code><code id="L4289"><span class="ln">4289</span><span class="c"> <span class="s"> - </span>height (number) height of the image
-</span></code><code id="L4290"><span class="ln">4290</span><span class="c"> <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “image”
-</span></code><code id="L4291"><span class="ln">4291</span><span class="c"> **
-</span></code><code id="L4292"><span class="ln">4292</span><span class="c"> > Usage
-</span></code><code id="L4293"><span class="ln">4293</span><span class="c"> <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.image(<i>"apple.png"</i>, <span class="d">10</span>, <span class="d">10</span>, <span class="d">80</span>, <span class="d">80</span>);
-</span></code><code id="L4294"><span class="ln">4294</span><span class="c"> \*/</span>
-</code><code id="L4295"><span class="ln">4295</span> paperproto.image<span class="s"> = </span><b>function</b> (src, x, y, w, h) {
-</code><code id="L4296"><span class="ln">4296</span> <b>return</b> theImage(<b>this</b>, src<span class="s"> || </span><i>"about:blank"</i>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, w<span class="s"> || </span><span class="d">0</span>, h<span class="s"> || </span><span class="d">0</span>);
-</code><code id="L4297"><span class="ln">4297</span> };
-</code><code id="L4298"><span class="ln">4298</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4299"><span class="ln">4299</span><span class="c"> <span class="s"> * </span>Paper.text
-</span></code><code id="L4300"><span class="ln">4300</span><span class="c"> [ method ]
-</span></code><code id="L4301"><span class="ln">4301</span><span class="c"> **
-</span></code><code id="L4302"><span class="ln">4302</span><span class="c"> <span class="s"> * </span>Draws a text string. If you need line breaks, put “\n” <b>in</b> the string.
-</span></code><code id="L4303"><span class="ln">4303</span><span class="c"> **
-</span></code><code id="L4304"><span class="ln">4304</span><span class="c"> > Parameters
-</span></code><code id="L4305"><span class="ln">4305</span><span class="c"> **
-</span></code><code id="L4306"><span class="ln">4306</span><span class="c"> <span class="s"> - </span>x (number) x coordinate position
-</span></code><code id="L4307"><span class="ln">4307</span><span class="c"> <span class="s"> - </span>y (number) y coordinate position
-</span></code><code id="L4308"><span class="ln">4308</span><span class="c"> <span class="s"> - </span>text (string) The text string to draw
-</span></code><code id="L4309"><span class="ln">4309</span><span class="c"> <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “text”
-</span></code><code id="L4310"><span class="ln">4310</span><span class="c"> **
-</span></code><code id="L4311"><span class="ln">4311</span><span class="c"> > Usage
-</span></code><code id="L4312"><span class="ln">4312</span><span class="c"> <span class="s"> | </span><b>var</b> t<span class="s"> = </span>paper.text(<span class="d">50</span>, <span class="d">50</span>, <i>"Raphaël\nkicks\nbutt!"</i>);
-</span></code><code id="L4313"><span class="ln">4313</span><span class="c"> \*/</span>
-</code><code id="L4314"><span class="ln">4314</span> paperproto.text<span class="s"> = </span><b>function</b> (x, y, text) {
-</code><code id="L4315"><span class="ln">4315</span> <b>return</b> theText(<b>this</b>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, Str(text));
-</code><code id="L4316"><span class="ln">4316</span> };
-</code><code id="L4317"><span class="ln">4317</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4318"><span class="ln">4318</span><span class="c"> <span class="s"> * </span>Paper.set
-</span></code><code id="L4319"><span class="ln">4319</span><span class="c"> [ method ]
-</span></code><code id="L4320"><span class="ln">4320</span><span class="c"> **
-</span></code><code id="L4321"><span class="ln">4321</span><span class="c"> <span class="s"> * </span>Creates array-like object to keep and operate several elements at once.
-</span></code><code id="L4322"><span class="ln">4322</span><span class="c"> <span class="s"> * </span>Warning: it doesn’t create any elements <b>for</b> itself <b>in</b> the page, it just groups existing elements.
-</span></code><code id="L4323"><span class="ln">4323</span><span class="c"> <span class="s"> * </span>Sets act as pseudo elements — all methods available to an element can be used on a set.
-</span></code><code id="L4324"><span class="ln">4324</span><span class="c"> <span class="s"> = </span>(object) array-like object that represents set of elements
-</span></code><code id="L4325"><span class="ln">4325</span><span class="c"> **
-</span></code><code id="L4326"><span class="ln">4326</span><span class="c"> > Usage
-</span></code><code id="L4327"><span class="ln">4327</span><span class="c"> <span class="s"> | </span><b>var</b> st<span class="s"> = </span>paper.set();
-</span></code><code id="L4328"><span class="ln">4328</span><span class="c"> <span class="s"> | </span>st.push(
-</span></code><code id="L4329"><span class="ln">4329</span><span class="c"> <span class="s"> | </span> paper.circle(<span class="d">10</span>, <span class="d">10</span>, <span class="d">5</span>),
-</span></code><code id="L4330"><span class="ln">4330</span><span class="c"> <span class="s"> | </span> paper.circle(<span class="d">30</span>, <span class="d">10</span>, <span class="d">5</span>)
-</span></code><code id="L4331"><span class="ln">4331</span><span class="c"> <span class="s"> | </span>);
-</span></code><code id="L4332"><span class="ln">4332</span><span class="c"> <span class="s"> | </span>st.attr({fill: <i>"red"</i>});
-</span></code><code id="L4333"><span class="ln">4333</span><span class="c"> \*/</span>
-</code><code id="L4334"><span class="ln">4334</span> paperproto.set<span class="s"> = </span><b>function</b> (itemsArray) {
-</code><code id="L4335"><span class="ln">4335</span> arguments.length > <span class="d">1</span><span class="s"> && </span>(itemsArray<span class="s"> = </span>Array.prototype.splice.call(arguments, <span class="d">0</span>, arguments.length));
-</code><code id="L4336"><span class="ln">4336</span> <b>return</b> <b>new</b> Set(itemsArray);
-</code><code id="L4337"><span class="ln">4337</span> };
-</code><code id="L4338"><span class="ln">4338</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4339"><span class="ln">4339</span><span class="c"> <span class="s"> * </span>Paper.setSize
-</span></code><code id="L4340"><span class="ln">4340</span><span class="c"> [ method ]
-</span></code><code id="L4341"><span class="ln">4341</span><span class="c"> **
-</span></code><code id="L4342"><span class="ln">4342</span><span class="c"> <span class="s"> * </span>If you need to change dimensions of the canvas call <b>this</b> method
+</span></code><code id="L4283"><span class="ln">4283</span><span class="c"> > Usage
+</span></code><code id="L4284"><span class="ln">4284</span><span class="c"> <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.ellipse(<span class="d">50</span>, <span class="d">50</span>, <span class="d">40</span>, <span class="d">20</span>);
+</span></code><code id="L4285"><span class="ln">4285</span><span class="c"> \*/</span>
+</code><code id="L4286"><span class="ln">4286</span> paperproto.ellipse<span class="s"> = </span><b>function</b> (x, y, rx, ry) {
+</code><code id="L4287"><span class="ln">4287</span> <b>return</b> theEllipse(<b>this</b>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, rx<span class="s"> || </span><span class="d">0</span>, ry<span class="s"> || </span><span class="d">0</span>);
+</code><code id="L4288"><span class="ln">4288</span> };
+</code><code id="L4289"><span class="ln">4289</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4290"><span class="ln">4290</span><span class="c"> <span class="s"> * </span>Paper.path
+</span></code><code id="L4291"><span class="ln">4291</span><span class="c"> [ method ]
+</span></code><code id="L4292"><span class="ln">4292</span><span class="c"> **
+</span></code><code id="L4293"><span class="ln">4293</span><span class="c"> <span class="s"> * </span>Creates a path element by given path data string.
+</span></code><code id="L4294"><span class="ln">4294</span><span class="c"> **
+</span></code><code id="L4295"><span class="ln">4295</span><span class="c"> > Parameters
+</span></code><code id="L4296"><span class="ln">4296</span><span class="c"> **
+</span></code><code id="L4297"><span class="ln">4297</span><span class="c"> <span class="s"> - </span>pathString (string) path data <b>in</b> SVG path string format.
+</span></code><code id="L4298"><span class="ln">4298</span><span class="c"> <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “ellipse”
+</span></code><code id="L4299"><span class="ln">4299</span><span class="c"> # Details of a path<i>'s data attribute'</i>s format are described <b>in</b> the <a href=<i>"http:<span class="c">//www.w3.org/TR/SVG/paths.html#PathData"</i>>SVG specification</a>.</span>
+</span></code><code id="L4300"><span class="ln">4300</span><span class="c"> **
+</span></code><code id="L4301"><span class="ln">4301</span><span class="c"> > Usage
+</span></code><code id="L4302"><span class="ln">4302</span><span class="c"> <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.path(<i>"M10 10L90 <span class="d">90</span>"</i>);
+</span></code><code id="L4303"><span class="ln">4303</span><span class="c"> <span class="s"> | </span><span class="c">// draw a diagonal line:</span>
+</span></code><code id="L4304"><span class="ln">4304</span><span class="c"> <span class="s"> | </span><span class="c">// move to <span class="d">10</span>,<span class="d">10</span>, line to <span class="d">90</span>,<span class="d">90</span></span>
+</span></code><code id="L4305"><span class="ln">4305</span><span class="c"> \*/</span>
+</code><code id="L4306"><span class="ln">4306</span> paperproto.path<span class="s"> = </span><b>function</b> (pathString) {
+</code><code id="L4307"><span class="ln">4307</span> pathString<span class="s"> && </span>!R.is(pathString, string)<span class="s"> && </span>!R.is(pathString[<span class="d">0</span>], array)<span class="s"> && </span>(pathString += E);
+</code><code id="L4308"><span class="ln">4308</span> <b>return</b> thePath(R.format[apply](R, arguments), <b>this</b>);
+</code><code id="L4309"><span class="ln">4309</span> };
+</code><code id="L4310"><span class="ln">4310</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4311"><span class="ln">4311</span><span class="c"> <span class="s"> * </span>Paper.image
+</span></code><code id="L4312"><span class="ln">4312</span><span class="c"> [ method ]
+</span></code><code id="L4313"><span class="ln">4313</span><span class="c"> **
+</span></code><code id="L4314"><span class="ln">4314</span><span class="c"> <span class="s"> * </span>Embeds an image into the surface.
+</span></code><code id="L4315"><span class="ln">4315</span><span class="c"> **
+</span></code><code id="L4316"><span class="ln">4316</span><span class="c"> > Parameters
+</span></code><code id="L4317"><span class="ln">4317</span><span class="c"> **
+</span></code><code id="L4318"><span class="ln">4318</span><span class="c"> <span class="s"> - </span>src (string) URI of the source image
+</span></code><code id="L4319"><span class="ln">4319</span><span class="c"> <span class="s"> - </span>x (number) x coordinate position
+</span></code><code id="L4320"><span class="ln">4320</span><span class="c"> <span class="s"> - </span>y (number) y coordinate position
+</span></code><code id="L4321"><span class="ln">4321</span><span class="c"> <span class="s"> - </span>width (number) width of the image
+</span></code><code id="L4322"><span class="ln">4322</span><span class="c"> <span class="s"> - </span>height (number) height of the image
+</span></code><code id="L4323"><span class="ln">4323</span><span class="c"> <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “image”
+</span></code><code id="L4324"><span class="ln">4324</span><span class="c"> **
+</span></code><code id="L4325"><span class="ln">4325</span><span class="c"> > Usage
+</span></code><code id="L4326"><span class="ln">4326</span><span class="c"> <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.image(<i>"apple.png"</i>, <span class="d">10</span>, <span class="d">10</span>, <span class="d">80</span>, <span class="d">80</span>);
+</span></code><code id="L4327"><span class="ln">4327</span><span class="c"> \*/</span>
+</code><code id="L4328"><span class="ln">4328</span> paperproto.image<span class="s"> = </span><b>function</b> (src, x, y, w, h) {
+</code><code id="L4329"><span class="ln">4329</span> <b>return</b> theImage(<b>this</b>, src<span class="s"> || </span><i>"about:blank"</i>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, w<span class="s"> || </span><span class="d">0</span>, h<span class="s"> || </span><span class="d">0</span>);
+</code><code id="L4330"><span class="ln">4330</span> };
+</code><code id="L4331"><span class="ln">4331</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4332"><span class="ln">4332</span><span class="c"> <span class="s"> * </span>Paper.text
+</span></code><code id="L4333"><span class="ln">4333</span><span class="c"> [ method ]
+</span></code><code id="L4334"><span class="ln">4334</span><span class="c"> **
+</span></code><code id="L4335"><span class="ln">4335</span><span class="c"> <span class="s"> * </span>Draws a text string. If you need line breaks, put “\n” <b>in</b> the string.
+</span></code><code id="L4336"><span class="ln">4336</span><span class="c"> **
+</span></code><code id="L4337"><span class="ln">4337</span><span class="c"> > Parameters
+</span></code><code id="L4338"><span class="ln">4338</span><span class="c"> **
+</span></code><code id="L4339"><span class="ln">4339</span><span class="c"> <span class="s"> - </span>x (number) x coordinate position
+</span></code><code id="L4340"><span class="ln">4340</span><span class="c"> <span class="s"> - </span>y (number) y coordinate position
+</span></code><code id="L4341"><span class="ln">4341</span><span class="c"> <span class="s"> - </span>text (string) The text string to draw
+</span></code><code id="L4342"><span class="ln">4342</span><span class="c"> <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “text”
</span></code><code id="L4343"><span class="ln">4343</span><span class="c"> **
-</span></code><code id="L4344"><span class="ln">4344</span><span class="c"> > Parameters
-</span></code><code id="L4345"><span class="ln">4345</span><span class="c"> **
-</span></code><code id="L4346"><span class="ln">4346</span><span class="c"> <span class="s"> - </span>width (number) <b>new</b> width of the canvas
-</span></code><code id="L4347"><span class="ln">4347</span><span class="c"> <span class="s"> - </span>height (number) <b>new</b> height of the canvas
-</span></code><code id="L4348"><span class="ln">4348</span><span class="c"> > Usage
-</span></code><code id="L4349"><span class="ln">4349</span><span class="c"> <span class="s"> | </span><b>var</b> st<span class="s"> = </span>paper.set();
-</span></code><code id="L4350"><span class="ln">4350</span><span class="c"> <span class="s"> | </span>st.push(
-</span></code><code id="L4351"><span class="ln">4351</span><span class="c"> <span class="s"> | </span> paper.circle(<span class="d">10</span>, <span class="d">10</span>, <span class="d">5</span>),
-</span></code><code id="L4352"><span class="ln">4352</span><span class="c"> <span class="s"> | </span> paper.circle(<span class="d">30</span>, <span class="d">10</span>, <span class="d">5</span>)
-</span></code><code id="L4353"><span class="ln">4353</span><span class="c"> <span class="s"> | </span>);
-</span></code><code id="L4354"><span class="ln">4354</span><span class="c"> <span class="s"> | </span>st.attr({fill: <i>"red"</i>});
-</span></code><code id="L4355"><span class="ln">4355</span><span class="c"> \*/</span>
-</code><code id="L4356"><span class="ln">4356</span> paperproto.setSize<span class="s"> = </span>setSize;
-</code><code id="L4357"><span class="ln">4357</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4358"><span class="ln">4358</span><span class="c"> <span class="s"> * </span>Paper.setViewBox
-</span></code><code id="L4359"><span class="ln">4359</span><span class="c"> [ method ]
-</span></code><code id="L4360"><span class="ln">4360</span><span class="c"> **
-</span></code><code id="L4361"><span class="ln">4361</span><span class="c"> <span class="s"> * </span>Sets the view box of the paper. Practically it gives you ability to zoom and pan whole paper surface by
-</span></code><code id="L4362"><span class="ln">4362</span><span class="c"> <span class="s"> * </span>specifying <b>new</b> boundaries.
-</span></code><code id="L4363"><span class="ln">4363</span><span class="c"> **
-</span></code><code id="L4364"><span class="ln">4364</span><span class="c"> > Parameters
-</span></code><code id="L4365"><span class="ln">4365</span><span class="c"> **
-</span></code><code id="L4366"><span class="ln">4366</span><span class="c"> x, y, w, h, fit
-</span></code><code id="L4367"><span class="ln">4367</span><span class="c"> <span class="s"> - </span>x (number) <b>new</b> x position, <b>default</b> is `<span class="d">0</span>`
-</span></code><code id="L4368"><span class="ln">4368</span><span class="c"> <span class="s"> - </span>y (number) <b>new</b> y position, <b>default</b> is `<span class="d">0</span>`
-</span></code><code id="L4369"><span class="ln">4369</span><span class="c"> <span class="s"> - </span>w (number) <b>new</b> width of the canvas
-</span></code><code id="L4370"><span class="ln">4370</span><span class="c"> <span class="s"> - </span>h (number) <b>new</b> height of the canvas
-</span></code><code id="L4371"><span class="ln">4371</span><span class="c"> <span class="s"> - </span>fit (<b>boolean</b>) `<b>true</b>` <b>if</b> you want graphics to fit into <b>new</b> boundary box
-</span></code><code id="L4372"><span class="ln">4372</span><span class="c"> \*/</span>
-</code><code id="L4373"><span class="ln">4373</span> paperproto.setViewBox<span class="s"> = </span>setViewBox;
-</code><code id="L4374"><span class="ln">4374</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4375"><span class="ln">4375</span><span class="c"> <span class="s"> * </span>Paper.top
-</span></code><code id="L4376"><span class="ln">4376</span><span class="c"> [ property ]
-</span></code><code id="L4377"><span class="ln">4377</span><span class="c"> **
-</span></code><code id="L4378"><span class="ln">4378</span><span class="c"> <span class="s"> * </span>Points to the topmost element on the paper
-</span></code><code id="L4379"><span class="ln">4379</span><span class="c"> \*/</span>
-</code><code id="L4380"><span class="ln">4380</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4381"><span class="ln">4381</span><span class="c"> <span class="s"> * </span>Paper.bottom
-</span></code><code id="L4382"><span class="ln">4382</span><span class="c"> [ property ]
-</span></code><code id="L4383"><span class="ln">4383</span><span class="c"> **
-</span></code><code id="L4384"><span class="ln">4384</span><span class="c"> <span class="s"> * </span>Points to the bottom element on the paper
-</span></code><code id="L4385"><span class="ln">4385</span><span class="c"> \*/</span>
-</code><code id="L4386"><span class="ln">4386</span> paperproto.top<span class="s"> = </span>paperproto.bottom<span class="s"> = </span><b>null</b>;
-</code><code id="L4387"><span class="ln">4387</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4388"><span class="ln">4388</span><span class="c"> <span class="s"> * </span>Paper.raphael
-</span></code><code id="L4389"><span class="ln">4389</span><span class="c"> [ property ]
-</span></code><code id="L4390"><span class="ln">4390</span><span class="c"> **
-</span></code><code id="L4391"><span class="ln">4391</span><span class="c"> <span class="s"> * </span>Points to the @Raphael object/<b>function</b>
-</span></code><code id="L4392"><span class="ln">4392</span><span class="c"> \*/</span>
-</code><code id="L4393"><span class="ln">4393</span> paperproto.raphael<span class="s"> = </span>R;
-</code><code id="L4394"><span class="ln">4394</span> <b>var</b> getOffset<span class="s"> = </span><b>function</b> (elem) {
-</code><code id="L4395"><span class="ln">4395</span> <b>var</b> box<span class="s"> = </span>elem.getBoundingClientRect(),
-</code><code id="L4396"><span class="ln">4396</span> doc<span class="s"> = </span>elem.ownerDocument,
-</code><code id="L4397"><span class="ln">4397</span> body<span class="s"> = </span>doc.body,
-</code><code id="L4398"><span class="ln">4398</span> docElem<span class="s"> = </span>doc.documentElement,
-</code><code id="L4399"><span class="ln">4399</span> clientTop<span class="s"> = </span>docElem.clientTop<span class="s"> || </span>body.clientTop<span class="s"> || </span><span class="d">0</span>, clientLeft<span class="s"> = </span>docElem.clientLeft<span class="s"> || </span>body.clientLeft<span class="s"> || </span><span class="d">0</span>,
-</code><code id="L4400"><span class="ln">4400</span> top <span class="s"> = </span>box.top <span class="s"> + </span>(g.win.pageYOffset<span class="s"> || </span>docElem.scrollTop<span class="s"> || </span>body.scrollTop )<span class="s"> - </span>clientTop,
-</code><code id="L4401"><span class="ln">4401</span> left<span class="s"> = </span>box.left<span class="s"> + </span>(g.win.pageXOffset<span class="s"> || </span>docElem.scrollLeft<span class="s"> || </span>body.scrollLeft)<span class="s"> - </span>clientLeft;
-</code><code id="L4402"><span class="ln">4402</span> <b>return</b> {
-</code><code id="L4403"><span class="ln">4403</span> y: top,
-</code><code id="L4404"><span class="ln">4404</span> x: left
-</code><code id="L4405"><span class="ln">4405</span> };
-</code><code id="L4406"><span class="ln">4406</span> };
+</span></code><code id="L4344"><span class="ln">4344</span><span class="c"> > Usage
+</span></code><code id="L4345"><span class="ln">4345</span><span class="c"> <span class="s"> | </span><b>var</b> t<span class="s"> = </span>paper.text(<span class="d">50</span>, <span class="d">50</span>, <i>"Raphaël\nkicks\nbutt!"</i>);
+</span></code><code id="L4346"><span class="ln">4346</span><span class="c"> \*/</span>
+</code><code id="L4347"><span class="ln">4347</span> paperproto.text<span class="s"> = </span><b>function</b> (x, y, text) {
+</code><code id="L4348"><span class="ln">4348</span> <b>return</b> theText(<b>this</b>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, Str(text));
+</code><code id="L4349"><span class="ln">4349</span> };
+</code><code id="L4350"><span class="ln">4350</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4351"><span class="ln">4351</span><span class="c"> <span class="s"> * </span>Paper.set
+</span></code><code id="L4352"><span class="ln">4352</span><span class="c"> [ method ]
+</span></code><code id="L4353"><span class="ln">4353</span><span class="c"> **
+</span></code><code id="L4354"><span class="ln">4354</span><span class="c"> <span class="s"> * </span>Creates array-like object to keep and operate several elements at once.
+</span></code><code id="L4355"><span class="ln">4355</span><span class="c"> <span class="s"> * </span>Warning: it doesn’t create any elements <b>for</b> itself <b>in</b> the page, it just groups existing elements.
+</span></code><code id="L4356"><span class="ln">4356</span><span class="c"> <span class="s"> * </span>Sets act as pseudo elements — all methods available to an element can be used on a set.
+</span></code><code id="L4357"><span class="ln">4357</span><span class="c"> <span class="s"> = </span>(object) array-like object that represents set of elements
+</span></code><code id="L4358"><span class="ln">4358</span><span class="c"> **
+</span></code><code id="L4359"><span class="ln">4359</span><span class="c"> > Usage
+</span></code><code id="L4360"><span class="ln">4360</span><span class="c"> <span class="s"> | </span><b>var</b> st<span class="s"> = </span>paper.set();
+</span></code><code id="L4361"><span class="ln">4361</span><span class="c"> <span class="s"> | </span>st.push(
+</span></code><code id="L4362"><span class="ln">4362</span><span class="c"> <span class="s"> | </span> paper.circle(<span class="d">10</span>, <span class="d">10</span>, <span class="d">5</span>),
+</span></code><code id="L4363"><span class="ln">4363</span><span class="c"> <span class="s"> | </span> paper.circle(<span class="d">30</span>, <span class="d">10</span>, <span class="d">5</span>)
+</span></code><code id="L4364"><span class="ln">4364</span><span class="c"> <span class="s"> | </span>);
+</span></code><code id="L4365"><span class="ln">4365</span><span class="c"> <span class="s"> | </span>st.attr({fill: <i>"red"</i>});
+</span></code><code id="L4366"><span class="ln">4366</span><span class="c"> \*/</span>
+</code><code id="L4367"><span class="ln">4367</span> paperproto.set<span class="s"> = </span><b>function</b> (itemsArray) {
+</code><code id="L4368"><span class="ln">4368</span> arguments.length > <span class="d">1</span><span class="s"> && </span>(itemsArray<span class="s"> = </span>Array.prototype.splice.call(arguments, <span class="d">0</span>, arguments.length));
+</code><code id="L4369"><span class="ln">4369</span> <b>return</b> <b>new</b> Set(itemsArray);
+</code><code id="L4370"><span class="ln">4370</span> };
+</code><code id="L4371"><span class="ln">4371</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4372"><span class="ln">4372</span><span class="c"> <span class="s"> * </span>Paper.setSize
+</span></code><code id="L4373"><span class="ln">4373</span><span class="c"> [ method ]
+</span></code><code id="L4374"><span class="ln">4374</span><span class="c"> **
+</span></code><code id="L4375"><span class="ln">4375</span><span class="c"> <span class="s"> * </span>If you need to change dimensions of the canvas call <b>this</b> method
+</span></code><code id="L4376"><span class="ln">4376</span><span class="c"> **
+</span></code><code id="L4377"><span class="ln">4377</span><span class="c"> > Parameters
+</span></code><code id="L4378"><span class="ln">4378</span><span class="c"> **
+</span></code><code id="L4379"><span class="ln">4379</span><span class="c"> <span class="s"> - </span>width (number) <b>new</b> width of the canvas
+</span></code><code id="L4380"><span class="ln">4380</span><span class="c"> <span class="s"> - </span>height (number) <b>new</b> height of the canvas
+</span></code><code id="L4381"><span class="ln">4381</span><span class="c"> > Usage
+</span></code><code id="L4382"><span class="ln">4382</span><span class="c"> <span class="s"> | </span><b>var</b> st<span class="s"> = </span>paper.set();
+</span></code><code id="L4383"><span class="ln">4383</span><span class="c"> <span class="s"> | </span>st.push(
+</span></code><code id="L4384"><span class="ln">4384</span><span class="c"> <span class="s"> | </span> paper.circle(<span class="d">10</span>, <span class="d">10</span>, <span class="d">5</span>),
+</span></code><code id="L4385"><span class="ln">4385</span><span class="c"> <span class="s"> | </span> paper.circle(<span class="d">30</span>, <span class="d">10</span>, <span class="d">5</span>)
+</span></code><code id="L4386"><span class="ln">4386</span><span class="c"> <span class="s"> | </span>);
+</span></code><code id="L4387"><span class="ln">4387</span><span class="c"> <span class="s"> | </span>st.attr({fill: <i>"red"</i>});
+</span></code><code id="L4388"><span class="ln">4388</span><span class="c"> \*/</span>
+</code><code id="L4389"><span class="ln">4389</span> paperproto.setSize<span class="s"> = </span>setSize;
+</code><code id="L4390"><span class="ln">4390</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4391"><span class="ln">4391</span><span class="c"> <span class="s"> * </span>Paper.setViewBox
+</span></code><code id="L4392"><span class="ln">4392</span><span class="c"> [ method ]
+</span></code><code id="L4393"><span class="ln">4393</span><span class="c"> **
+</span></code><code id="L4394"><span class="ln">4394</span><span class="c"> <span class="s"> * </span>Sets the view box of the paper. Practically it gives you ability to zoom and pan whole paper surface by
+</span></code><code id="L4395"><span class="ln">4395</span><span class="c"> <span class="s"> * </span>specifying <b>new</b> boundaries.
+</span></code><code id="L4396"><span class="ln">4396</span><span class="c"> **
+</span></code><code id="L4397"><span class="ln">4397</span><span class="c"> > Parameters
+</span></code><code id="L4398"><span class="ln">4398</span><span class="c"> **
+</span></code><code id="L4399"><span class="ln">4399</span><span class="c"> x, y, w, h, fit
+</span></code><code id="L4400"><span class="ln">4400</span><span class="c"> <span class="s"> - </span>x (number) <b>new</b> x position, <b>default</b> is `<span class="d">0</span>`
+</span></code><code id="L4401"><span class="ln">4401</span><span class="c"> <span class="s"> - </span>y (number) <b>new</b> y position, <b>default</b> is `<span class="d">0</span>`
+</span></code><code id="L4402"><span class="ln">4402</span><span class="c"> <span class="s"> - </span>w (number) <b>new</b> width of the canvas
+</span></code><code id="L4403"><span class="ln">4403</span><span class="c"> <span class="s"> - </span>h (number) <b>new</b> height of the canvas
+</span></code><code id="L4404"><span class="ln">4404</span><span class="c"> <span class="s"> - </span>fit (<b>boolean</b>) `<b>true</b>` <b>if</b> you want graphics to fit into <b>new</b> boundary box
+</span></code><code id="L4405"><span class="ln">4405</span><span class="c"> \*/</span>
+</code><code id="L4406"><span class="ln">4406</span> paperproto.setViewBox<span class="s"> = </span>setViewBox;
</code><code id="L4407"><span class="ln">4407</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4408"><span class="ln">4408</span><span class="c"> <span class="s"> * </span>Paper.getElementByPoint
-</span></code><code id="L4409"><span class="ln">4409</span><span class="c"> [ method ]
+</span></code><code id="L4408"><span class="ln">4408</span><span class="c"> <span class="s"> * </span>Paper.top
+</span></code><code id="L4409"><span class="ln">4409</span><span class="c"> [ property ]
</span></code><code id="L4410"><span class="ln">4410</span><span class="c"> **
-</span></code><code id="L4411"><span class="ln">4411</span><span class="c"> <span class="s"> * </span>Returns you topmost element under given point.
-</span></code><code id="L4412"><span class="ln">4412</span><span class="c"> **
-</span></code><code id="L4413"><span class="ln">4413</span><span class="c"> <span class="s"> = </span>(object) Raphaël element object
-</span></code><code id="L4414"><span class="ln">4414</span><span class="c"> > Parameters
-</span></code><code id="L4415"><span class="ln">4415</span><span class="c"> **
-</span></code><code id="L4416"><span class="ln">4416</span><span class="c"> <span class="s"> - </span>x (number) x coordinate from the top left corner of the window
-</span></code><code id="L4417"><span class="ln">4417</span><span class="c"> <span class="s"> - </span>y (number) y coordinate from the top left corner of the window
-</span></code><code id="L4418"><span class="ln">4418</span><span class="c"> > Usage
-</span></code><code id="L4419"><span class="ln">4419</span><span class="c"> <span class="s"> | </span>paper.getElementByPoint(mouseX, mouseY).attr({stroke: <i>"#f00"</i>});
-</span></code><code id="L4420"><span class="ln">4420</span><span class="c"> \*/</span>
-</code><code id="L4421"><span class="ln">4421</span> paperproto.getElementByPoint<span class="s"> = </span><b>function</b> (x, y) {
-</code><code id="L4422"><span class="ln">4422</span> <b>var</b> paper<span class="s"> = </span><b>this</b>,
-</code><code id="L4423"><span class="ln">4423</span> svg<span class="s"> = </span>paper.canvas,
-</code><code id="L4424"><span class="ln">4424</span> target<span class="s"> = </span>g.doc.elementFromPoint(x, y);
-</code><code id="L4425"><span class="ln">4425</span> <b>if</b> (g.win.opera<span class="s"> && </span>target.tagName<span class="s"> == </span><i>"svg"</i>) {
-</code><code id="L4426"><span class="ln">4426</span> <b>var</b> so<span class="s"> = </span>getOffset(svg),
-</code><code id="L4427"><span class="ln">4427</span> sr<span class="s"> = </span>svg.createSVGRect();
-</code><code id="L4428"><span class="ln">4428</span> sr.x<span class="s"> = </span>x<span class="s"> - </span>so.x;
-</code><code id="L4429"><span class="ln">4429</span> sr.y<span class="s"> = </span>y<span class="s"> - </span>so.y;
-</code><code id="L4430"><span class="ln">4430</span> sr.width<span class="s"> = </span>sr.height<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L4431"><span class="ln">4431</span> <b>var</b> hits<span class="s"> = </span>svg.getIntersectionList(sr, <b>null</b>);
-</code><code id="L4432"><span class="ln">4432</span> <b>if</b> (hits.length) {
-</code><code id="L4433"><span class="ln">4433</span> target<span class="s"> = </span>hits[hits.length<span class="s"> - </span><span class="d">1</span>];
-</code><code id="L4434"><span class="ln">4434</span> }
-</code><code id="L4435"><span class="ln">4435</span> }
-</code><code id="L4436"><span class="ln">4436</span> <b>if</b> (!target) {
-</code><code id="L4437"><span class="ln">4437</span> <b>return</b> <b>null</b>;
-</code><code id="L4438"><span class="ln">4438</span> }
-</code><code id="L4439"><span class="ln">4439</span> <b>while</b> (target.parentNode<span class="s"> && </span>target != svg.parentNode<span class="s"> && </span>!target.raphael) {
-</code><code id="L4440"><span class="ln">4440</span> target<span class="s"> = </span>target.parentNode;
-</code><code id="L4441"><span class="ln">4441</span> }
-</code><code id="L4442"><span class="ln">4442</span> target<span class="s"> == </span>paper.canvas.parentNode<span class="s"> && </span>(target<span class="s"> = </span>svg);
-</code><code id="L4443"><span class="ln">4443</span> target<span class="s"> = </span>target<span class="s"> && </span>target.raphael ? paper.getById(target.raphaelid) : <b>null</b>;
-</code><code id="L4444"><span class="ln">4444</span> <b>return</b> target;
-</code><code id="L4445"><span class="ln">4445</span> };
-</code><code id="L4446"><span class="ln">4446</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4447"><span class="ln">4447</span><span class="c"> <span class="s"> * </span>Paper.getById
-</span></code><code id="L4448"><span class="ln">4448</span><span class="c"> [ method ]
-</span></code><code id="L4449"><span class="ln">4449</span><span class="c"> **
-</span></code><code id="L4450"><span class="ln">4450</span><span class="c"> <span class="s"> * </span>Returns you element by its internal ID.
-</span></code><code id="L4451"><span class="ln">4451</span><span class="c"> **
-</span></code><code id="L4452"><span class="ln">4452</span><span class="c"> > Parameters
-</span></code><code id="L4453"><span class="ln">4453</span><span class="c"> **
-</span></code><code id="L4454"><span class="ln">4454</span><span class="c"> <span class="s"> - </span>id (number) id
-</span></code><code id="L4455"><span class="ln">4455</span><span class="c"> <span class="s"> = </span>(object) Raphaël element object
-</span></code><code id="L4456"><span class="ln">4456</span><span class="c"> \*/</span>
-</code><code id="L4457"><span class="ln">4457</span> paperproto.getById<span class="s"> = </span><b>function</b> (id) {
-</code><code id="L4458"><span class="ln">4458</span> <b>var</b> bot<span class="s"> = </span><b>this</b>.bottom;
-</code><code id="L4459"><span class="ln">4459</span> <b>while</b> (bot) {
-</code><code id="L4460"><span class="ln">4460</span> <b>if</b> (bot.id<span class="s"> == </span>id) {
-</code><code id="L4461"><span class="ln">4461</span> <b>return</b> bot;
-</code><code id="L4462"><span class="ln">4462</span> }
-</code><code id="L4463"><span class="ln">4463</span> bot<span class="s"> = </span>bot.next;
-</code><code id="L4464"><span class="ln">4464</span> }
-</code><code id="L4465"><span class="ln">4465</span> <b>return</b> <b>null</b>;
-</code><code id="L4466"><span class="ln">4466</span> };
-</code><code id="L4467"><span class="ln">4467</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4468"><span class="ln">4468</span><span class="c"> <span class="s"> * </span>Paper.forEach
-</span></code><code id="L4469"><span class="ln">4469</span><span class="c"> [ method ]
-</span></code><code id="L4470"><span class="ln">4470</span><span class="c"> **
-</span></code><code id="L4471"><span class="ln">4471</span><span class="c"> <span class="s"> * </span>Executes given <b>function</b> <b>for</b> each element on the paper
-</span></code><code id="L4472"><span class="ln">4472</span><span class="c"> *
-</span></code><code id="L4473"><span class="ln">4473</span><span class="c"> <span class="s"> * </span>If callback <b>function</b> returns `<b>false</b>` it will stop loop running.
-</span></code><code id="L4474"><span class="ln">4474</span><span class="c"> **
-</span></code><code id="L4475"><span class="ln">4475</span><span class="c"> > Parameters
-</span></code><code id="L4476"><span class="ln">4476</span><span class="c"> **
-</span></code><code id="L4477"><span class="ln">4477</span><span class="c"> <span class="s"> - </span>callback (<b>function</b>) <b>function</b> to run
-</span></code><code id="L4478"><span class="ln">4478</span><span class="c"> <span class="s"> - </span>thisArg (object) context object <b>for</b> the callback
-</span></code><code id="L4479"><span class="ln">4479</span><span class="c"> <span class="s"> = </span>(object) Paper object
-</span></code><code id="L4480"><span class="ln">4480</span><span class="c"> \*/</span>
-</code><code id="L4481"><span class="ln">4481</span> paperproto.forEach<span class="s"> = </span><b>function</b> (callback, thisArg) {
-</code><code id="L4482"><span class="ln">4482</span> <b>var</b> bot<span class="s"> = </span><b>this</b>.bottom;
-</code><code id="L4483"><span class="ln">4483</span> <b>while</b> (bot) {
-</code><code id="L4484"><span class="ln">4484</span> <b>if</b> (callback.call(thisArg, bot)<span class="s"> === </span><b>false</b>) {
-</code><code id="L4485"><span class="ln">4485</span> <b>return</b> <b>this</b>;
-</code><code id="L4486"><span class="ln">4486</span> }
-</code><code id="L4487"><span class="ln">4487</span> bot<span class="s"> = </span>bot.next;
-</code><code id="L4488"><span class="ln">4488</span> }
-</code><code id="L4489"><span class="ln">4489</span> <b>return</b> <b>this</b>;
-</code><code id="L4490"><span class="ln">4490</span> };
-</code><code id="L4491"><span class="ln">4491</span> <b>function</b> x_y() {
-</code><code id="L4492"><span class="ln">4492</span> <b>return</b> <b>this</b>.x<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.y;
-</code><code id="L4493"><span class="ln">4493</span> }
-</code><code id="L4494"><span class="ln">4494</span> <b>function</b> x_y_w_h() {
-</code><code id="L4495"><span class="ln">4495</span> <b>return</b> <b>this</b>.x<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.y<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.width<span class="s"> + </span><i>"\xd7"</i><span class="s"> + </span><b>this</b>.height;
-</code><code id="L4496"><span class="ln">4496</span> }
-</code><code id="L4497"><span class="ln">4497</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4498"><span class="ln">4498</span><span class="c"> <span class="s"> * </span>Element.getBBox
-</span></code><code id="L4499"><span class="ln">4499</span><span class="c"> [ method ]
-</span></code><code id="L4500"><span class="ln">4500</span><span class="c"> **
-</span></code><code id="L4501"><span class="ln">4501</span><span class="c"> <span class="s"> * </span>Return bounding box <b>for</b> a given element
-</span></code><code id="L4502"><span class="ln">4502</span><span class="c"> **
-</span></code><code id="L4503"><span class="ln">4503</span><span class="c"> > Parameters
-</span></code><code id="L4504"><span class="ln">4504</span><span class="c"> **
-</span></code><code id="L4505"><span class="ln">4505</span><span class="c"> <span class="s"> - </span>isWithoutTransform (<b>boolean</b>) flag, `<b>true</b>` <b>if</b> you want to have bounding box before transformations. Default is `<b>false</b>`.
-</span></code><code id="L4506"><span class="ln">4506</span><span class="c"> <span class="s"> = </span>(object) Bounding box object:
-</span></code><code id="L4507"><span class="ln">4507</span><span class="c"> o {
-</span></code><code id="L4508"><span class="ln">4508</span><span class="c"> o x: (number) top left corner x
-</span></code><code id="L4509"><span class="ln">4509</span><span class="c"> o y: (number) top left corner y
-</span></code><code id="L4510"><span class="ln">4510</span><span class="c"> o width: (number) width
-</span></code><code id="L4511"><span class="ln">4511</span><span class="c"> o height: (number) height
-</span></code><code id="L4512"><span class="ln">4512</span><span class="c"> o }
+</span></code><code id="L4411"><span class="ln">4411</span><span class="c"> <span class="s"> * </span>Points to the topmost element on the paper
+</span></code><code id="L4412"><span class="ln">4412</span><span class="c"> \*/</span>
+</code><code id="L4413"><span class="ln">4413</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4414"><span class="ln">4414</span><span class="c"> <span class="s"> * </span>Paper.bottom
+</span></code><code id="L4415"><span class="ln">4415</span><span class="c"> [ property ]
+</span></code><code id="L4416"><span class="ln">4416</span><span class="c"> **
+</span></code><code id="L4417"><span class="ln">4417</span><span class="c"> <span class="s"> * </span>Points to the bottom element on the paper
+</span></code><code id="L4418"><span class="ln">4418</span><span class="c"> \*/</span>
+</code><code id="L4419"><span class="ln">4419</span> paperproto.top<span class="s"> = </span>paperproto.bottom<span class="s"> = </span><b>null</b>;
+</code><code id="L4420"><span class="ln">4420</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4421"><span class="ln">4421</span><span class="c"> <span class="s"> * </span>Paper.raphael
+</span></code><code id="L4422"><span class="ln">4422</span><span class="c"> [ property ]
+</span></code><code id="L4423"><span class="ln">4423</span><span class="c"> **
+</span></code><code id="L4424"><span class="ln">4424</span><span class="c"> <span class="s"> * </span>Points to the @Raphael object/<b>function</b>
+</span></code><code id="L4425"><span class="ln">4425</span><span class="c"> \*/</span>
+</code><code id="L4426"><span class="ln">4426</span> paperproto.raphael<span class="s"> = </span>R;
+</code><code id="L4427"><span class="ln">4427</span> <b>var</b> getOffset<span class="s"> = </span><b>function</b> (elem) {
+</code><code id="L4428"><span class="ln">4428</span> <b>var</b> box<span class="s"> = </span>elem.getBoundingClientRect(),
+</code><code id="L4429"><span class="ln">4429</span> doc<span class="s"> = </span>elem.ownerDocument,
+</code><code id="L4430"><span class="ln">4430</span> body<span class="s"> = </span>doc.body,
+</code><code id="L4431"><span class="ln">4431</span> docElem<span class="s"> = </span>doc.documentElement,
+</code><code id="L4432"><span class="ln">4432</span> clientTop<span class="s"> = </span>docElem.clientTop<span class="s"> || </span>body.clientTop<span class="s"> || </span><span class="d">0</span>, clientLeft<span class="s"> = </span>docElem.clientLeft<span class="s"> || </span>body.clientLeft<span class="s"> || </span><span class="d">0</span>,
+</code><code id="L4433"><span class="ln">4433</span> top <span class="s"> = </span>box.top <span class="s"> + </span>(g.win.pageYOffset<span class="s"> || </span>docElem.scrollTop<span class="s"> || </span>body.scrollTop )<span class="s"> - </span>clientTop,
+</code><code id="L4434"><span class="ln">4434</span> left<span class="s"> = </span>box.left<span class="s"> + </span>(g.win.pageXOffset<span class="s"> || </span>docElem.scrollLeft<span class="s"> || </span>body.scrollLeft)<span class="s"> - </span>clientLeft;
+</code><code id="L4435"><span class="ln">4435</span> <b>return</b> {
+</code><code id="L4436"><span class="ln">4436</span> y: top,
+</code><code id="L4437"><span class="ln">4437</span> x: left
+</code><code id="L4438"><span class="ln">4438</span> };
+</code><code id="L4439"><span class="ln">4439</span> };
+</code><code id="L4440"><span class="ln">4440</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4441"><span class="ln">4441</span><span class="c"> <span class="s"> * </span>Paper.getElementByPoint
+</span></code><code id="L4442"><span class="ln">4442</span><span class="c"> [ method ]
+</span></code><code id="L4443"><span class="ln">4443</span><span class="c"> **
+</span></code><code id="L4444"><span class="ln">4444</span><span class="c"> <span class="s"> * </span>Returns you topmost element under given point.
+</span></code><code id="L4445"><span class="ln">4445</span><span class="c"> **
+</span></code><code id="L4446"><span class="ln">4446</span><span class="c"> <span class="s"> = </span>(object) Raphaël element object
+</span></code><code id="L4447"><span class="ln">4447</span><span class="c"> > Parameters
+</span></code><code id="L4448"><span class="ln">4448</span><span class="c"> **
+</span></code><code id="L4449"><span class="ln">4449</span><span class="c"> <span class="s"> - </span>x (number) x coordinate from the top left corner of the window
+</span></code><code id="L4450"><span class="ln">4450</span><span class="c"> <span class="s"> - </span>y (number) y coordinate from the top left corner of the window
+</span></code><code id="L4451"><span class="ln">4451</span><span class="c"> > Usage
+</span></code><code id="L4452"><span class="ln">4452</span><span class="c"> <span class="s"> | </span>paper.getElementByPoint(mouseX, mouseY).attr({stroke: <i>"#f00"</i>});
+</span></code><code id="L4453"><span class="ln">4453</span><span class="c"> \*/</span>
+</code><code id="L4454"><span class="ln">4454</span> paperproto.getElementByPoint<span class="s"> = </span><b>function</b> (x, y) {
+</code><code id="L4455"><span class="ln">4455</span> <b>var</b> paper<span class="s"> = </span><b>this</b>,
+</code><code id="L4456"><span class="ln">4456</span> svg<span class="s"> = </span>paper.canvas,
+</code><code id="L4457"><span class="ln">4457</span> target<span class="s"> = </span>g.doc.elementFromPoint(x, y);
+</code><code id="L4458"><span class="ln">4458</span> <b>if</b> (g.win.opera<span class="s"> && </span>target.tagName<span class="s"> == </span><i>"svg"</i>) {
+</code><code id="L4459"><span class="ln">4459</span> <b>var</b> so<span class="s"> = </span>getOffset(svg),
+</code><code id="L4460"><span class="ln">4460</span> sr<span class="s"> = </span>svg.createSVGRect();
+</code><code id="L4461"><span class="ln">4461</span> sr.x<span class="s"> = </span>x<span class="s"> - </span>so.x;
+</code><code id="L4462"><span class="ln">4462</span> sr.y<span class="s"> = </span>y<span class="s"> - </span>so.y;
+</code><code id="L4463"><span class="ln">4463</span> sr.width<span class="s"> = </span>sr.height<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L4464"><span class="ln">4464</span> <b>var</b> hits<span class="s"> = </span>svg.getIntersectionList(sr, <b>null</b>);
+</code><code id="L4465"><span class="ln">4465</span> <b>if</b> (hits.length) {
+</code><code id="L4466"><span class="ln">4466</span> target<span class="s"> = </span>hits[hits.length<span class="s"> - </span><span class="d">1</span>];
+</code><code id="L4467"><span class="ln">4467</span> }
+</code><code id="L4468"><span class="ln">4468</span> }
+</code><code id="L4469"><span class="ln">4469</span> <b>if</b> (!target) {
+</code><code id="L4470"><span class="ln">4470</span> <b>return</b> <b>null</b>;
+</code><code id="L4471"><span class="ln">4471</span> }
+</code><code id="L4472"><span class="ln">4472</span> <b>while</b> (target.parentNode<span class="s"> && </span>target != svg.parentNode<span class="s"> && </span>!target.raphael) {
+</code><code id="L4473"><span class="ln">4473</span> target<span class="s"> = </span>target.parentNode;
+</code><code id="L4474"><span class="ln">4474</span> }
+</code><code id="L4475"><span class="ln">4475</span> target<span class="s"> == </span>paper.canvas.parentNode<span class="s"> && </span>(target<span class="s"> = </span>svg);
+</code><code id="L4476"><span class="ln">4476</span> target<span class="s"> = </span>target<span class="s"> && </span>target.raphael ? paper.getById(target.raphaelid) : <b>null</b>;
+</code><code id="L4477"><span class="ln">4477</span> <b>return</b> target;
+</code><code id="L4478"><span class="ln">4478</span> };
+</code><code id="L4479"><span class="ln">4479</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4480"><span class="ln">4480</span><span class="c"> <span class="s"> * </span>Paper.getById
+</span></code><code id="L4481"><span class="ln">4481</span><span class="c"> [ method ]
+</span></code><code id="L4482"><span class="ln">4482</span><span class="c"> **
+</span></code><code id="L4483"><span class="ln">4483</span><span class="c"> <span class="s"> * </span>Returns you element by its internal ID.
+</span></code><code id="L4484"><span class="ln">4484</span><span class="c"> **
+</span></code><code id="L4485"><span class="ln">4485</span><span class="c"> > Parameters
+</span></code><code id="L4486"><span class="ln">4486</span><span class="c"> **
+</span></code><code id="L4487"><span class="ln">4487</span><span class="c"> <span class="s"> - </span>id (number) id
+</span></code><code id="L4488"><span class="ln">4488</span><span class="c"> <span class="s"> = </span>(object) Raphaël element object
+</span></code><code id="L4489"><span class="ln">4489</span><span class="c"> \*/</span>
+</code><code id="L4490"><span class="ln">4490</span> paperproto.getById<span class="s"> = </span><b>function</b> (id) {
+</code><code id="L4491"><span class="ln">4491</span> <b>var</b> bot<span class="s"> = </span><b>this</b>.bottom;
+</code><code id="L4492"><span class="ln">4492</span> <b>while</b> (bot) {
+</code><code id="L4493"><span class="ln">4493</span> <b>if</b> (bot.id<span class="s"> == </span>id) {
+</code><code id="L4494"><span class="ln">4494</span> <b>return</b> bot;
+</code><code id="L4495"><span class="ln">4495</span> }
+</code><code id="L4496"><span class="ln">4496</span> bot<span class="s"> = </span>bot.next;
+</code><code id="L4497"><span class="ln">4497</span> }
+</code><code id="L4498"><span class="ln">4498</span> <b>return</b> <b>null</b>;
+</code><code id="L4499"><span class="ln">4499</span> };
+</code><code id="L4500"><span class="ln">4500</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4501"><span class="ln">4501</span><span class="c"> <span class="s"> * </span>Paper.forEach
+</span></code><code id="L4502"><span class="ln">4502</span><span class="c"> [ method ]
+</span></code><code id="L4503"><span class="ln">4503</span><span class="c"> **
+</span></code><code id="L4504"><span class="ln">4504</span><span class="c"> <span class="s"> * </span>Executes given <b>function</b> <b>for</b> each element on the paper
+</span></code><code id="L4505"><span class="ln">4505</span><span class="c"> *
+</span></code><code id="L4506"><span class="ln">4506</span><span class="c"> <span class="s"> * </span>If callback <b>function</b> returns `<b>false</b>` it will stop loop running.
+</span></code><code id="L4507"><span class="ln">4507</span><span class="c"> **
+</span></code><code id="L4508"><span class="ln">4508</span><span class="c"> > Parameters
+</span></code><code id="L4509"><span class="ln">4509</span><span class="c"> **
+</span></code><code id="L4510"><span class="ln">4510</span><span class="c"> <span class="s"> - </span>callback (<b>function</b>) <b>function</b> to run
+</span></code><code id="L4511"><span class="ln">4511</span><span class="c"> <span class="s"> - </span>thisArg (object) context object <b>for</b> the callback
+</span></code><code id="L4512"><span class="ln">4512</span><span class="c"> <span class="s"> = </span>(object) Paper object
</span></code><code id="L4513"><span class="ln">4513</span><span class="c"> \*/</span>
-</code><code id="L4514"><span class="ln">4514</span> elproto.getBBox<span class="s"> = </span><b>function</b> (isWithoutTransform) {
-</code><code id="L4515"><span class="ln">4515</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L4516"><span class="ln">4516</span> <b>return</b> {};
-</code><code id="L4517"><span class="ln">4517</span> }
-</code><code id="L4518"><span class="ln">4518</span> <b>var</b> _<span class="s"> = </span><b>this</b>._;
-</code><code id="L4519"><span class="ln">4519</span> <b>if</b> (isWithoutTransform) {
-</code><code id="L4520"><span class="ln">4520</span> <b>if</b> (_.dirty<span class="s"> || </span>!_.bboxwt) {
-</code><code id="L4521"><span class="ln">4521</span> <b>this</b>.realPath<span class="s"> = </span>getPath[<b>this</b>.type](<b>this</b>);
-</code><code id="L4522"><span class="ln">4522</span> _.bboxwt<span class="s"> = </span>pathDimensions(<b>this</b>.realPath);
-</code><code id="L4523"><span class="ln">4523</span> _.bboxwt.toString<span class="s"> = </span>x_y_w_h;
-</code><code id="L4524"><span class="ln">4524</span> _.dirty<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L4525"><span class="ln">4525</span> }
-</code><code id="L4526"><span class="ln">4526</span> <b>return</b> _.bboxwt;
-</code><code id="L4527"><span class="ln">4527</span> }
-</code><code id="L4528"><span class="ln">4528</span> <b>if</b> (_.dirty<span class="s"> || </span>_.dirtyT<span class="s"> || </span>!_.bbox) {
-</code><code id="L4529"><span class="ln">4529</span> <b>if</b> (_.dirty<span class="s"> || </span>!<b>this</b>.realPath) {
-</code><code id="L4530"><span class="ln">4530</span> _.bboxwt<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L4531"><span class="ln">4531</span> <b>this</b>.realPath<span class="s"> = </span>getPath[<b>this</b>.type](<b>this</b>);
-</code><code id="L4532"><span class="ln">4532</span> }
-</code><code id="L4533"><span class="ln">4533</span> _.bbox<span class="s"> = </span>pathDimensions(mapPath(<b>this</b>.realPath, <b>this</b>.matrix));
-</code><code id="L4534"><span class="ln">4534</span> _.bbox.toString<span class="s"> = </span>x_y_w_h;
-</code><code id="L4535"><span class="ln">4535</span> _.dirty<span class="s"> = </span>_.dirtyT<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L4536"><span class="ln">4536</span> }
-</code><code id="L4537"><span class="ln">4537</span> <b>return</b> _.bbox;
-</code><code id="L4538"><span class="ln">4538</span> };
-</code><code id="L4539"><span class="ln">4539</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4540"><span class="ln">4540</span><span class="c"> <span class="s"> * </span>Element.clone
-</span></code><code id="L4541"><span class="ln">4541</span><span class="c"> [ method ]
-</span></code><code id="L4542"><span class="ln">4542</span><span class="c"> **
-</span></code><code id="L4543"><span class="ln">4543</span><span class="c"> <span class="s"> = </span>(object) clone of a given element
-</span></code><code id="L4544"><span class="ln">4544</span><span class="c"> **
-</span></code><code id="L4545"><span class="ln">4545</span><span class="c"> \*/</span>
-</code><code id="L4546"><span class="ln">4546</span> elproto.clone<span class="s"> = </span><b>function</b> () {
-</code><code id="L4547"><span class="ln">4547</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L4548"><span class="ln">4548</span> <b>return</b> <b>null</b>;
-</code><code id="L4549"><span class="ln">4549</span> }
-</code><code id="L4550"><span class="ln">4550</span> <b>var</b> attr<span class="s"> = </span><b>this</b>.attr();
-</code><code id="L4551"><span class="ln">4551</span> <b>delete</b> attr.scale;
-</code><code id="L4552"><span class="ln">4552</span> <b>delete</b> attr.translation;
-</code><code id="L4553"><span class="ln">4553</span> <b>return</b> <b>this</b>.paper[<b>this</b>.type]().attr(attr);
-</code><code id="L4554"><span class="ln">4554</span> };
-</code><code id="L4555"><span class="ln">4555</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4556"><span class="ln">4556</span><span class="c"> <span class="s"> * </span>Element.glow
-</span></code><code id="L4557"><span class="ln">4557</span><span class="c"> [ method ]
-</span></code><code id="L4558"><span class="ln">4558</span><span class="c"> **
-</span></code><code id="L4559"><span class="ln">4559</span><span class="c"> <span class="s"> * </span>Return set of elements that create glow-like effect around given element. See @Paper.set.
-</span></code><code id="L4560"><span class="ln">4560</span><span class="c"> *
-</span></code><code id="L4561"><span class="ln">4561</span><span class="c"> <span class="s"> * </span>Note: Glow is not connected to the element. If you change element attributes it won’t adjust itself.
-</span></code><code id="L4562"><span class="ln">4562</span><span class="c"> **
-</span></code><code id="L4563"><span class="ln">4563</span><span class="c"> <span class="s"> = </span>(object) @Paper.set of elements that represents glow
-</span></code><code id="L4564"><span class="ln">4564</span><span class="c"> \*/</span>
-</code><code id="L4565"><span class="ln">4565</span> elproto.glow<span class="s"> = </span><b>function</b> (glow) {
-</code><code id="L4566"><span class="ln">4566</span> <b>if</b> (<b>this</b>.type<span class="s"> == </span><i>"text"</i>) {
-</code><code id="L4567"><span class="ln">4567</span> <b>return</b> <b>null</b>;
-</code><code id="L4568"><span class="ln">4568</span> }
-</code><code id="L4569"><span class="ln">4569</span> glow<span class="s"> = </span>glow<span class="s"> || </span>{};
-</code><code id="L4570"><span class="ln">4570</span> <b>var</b> s<span class="s"> = </span>{
-</code><code id="L4571"><span class="ln">4571</span> width: glow.width<span class="s"> || </span><span class="d">10</span>,
-</code><code id="L4572"><span class="ln">4572</span> fill: glow.fill<span class="s"> || </span><b>false</b>,
-</code><code id="L4573"><span class="ln">4573</span> opacity: glow.opacity<span class="s"> || </span><span class="d">.5</span>,
-</code><code id="L4574"><span class="ln">4574</span> offsetx: glow.offsetx<span class="s"> || </span><span class="d">0</span>,
-</code><code id="L4575"><span class="ln">4575</span> offsety: glow.offsety<span class="s"> || </span><span class="d">0</span>,
-</code><code id="L4576"><span class="ln">4576</span> color: glow.color<span class="s"> || </span><i>"#<span class="d">000</span>"</i>
-</code><code id="L4577"><span class="ln">4577</span> },
-</code><code id="L4578"><span class="ln">4578</span> c<span class="s"> = </span>s.width<span class="s"> / </span><span class="d">2</span>,
-</code><code id="L4579"><span class="ln">4579</span> r<span class="s"> = </span><b>this</b>.paper,
-</code><code id="L4580"><span class="ln">4580</span> out<span class="s"> = </span>r.set(),
-</code><code id="L4581"><span class="ln">4581</span> path<span class="s"> = </span><b>this</b>.realPath<span class="s"> || </span>getPath[<b>this</b>.type](<b>this</b>);
-</code><code id="L4582"><span class="ln">4582</span> path<span class="s"> = </span><b>this</b>.matrix ? mapPath(path, <b>this</b>.matrix) : path;
-</code><code id="L4583"><span class="ln">4583</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">1</span>; i < c<span class="s"> + </span><span class="d">1</span>; i++) {
-</code><code id="L4584"><span class="ln">4584</span> out.push(r.path(path).attr({stroke: s.color, fill: s.fill ? s.color : <i>"none"</i>, <i>"stroke-linejoin"</i>: <i>"round"</i>, <i>"stroke-linecap"</i>: <i>"round"</i>, <i>"stroke-width"</i>: +(s.width<span class="s"> / </span>c<span class="s"> * </span>i).toFixed(<span class="d">3</span>), opacity: +(s.opacity<span class="s"> / </span>c).toFixed(<span class="d">3</span>)}));
-</code><code id="L4585"><span class="ln">4585</span> }
-</code><code id="L4586"><span class="ln">4586</span> <b>return</b> out.insertBefore(<b>this</b>).translate(s.offsetx, s.offsety);
+</code><code id="L4514"><span class="ln">4514</span> paperproto.forEach<span class="s"> = </span><b>function</b> (callback, thisArg) {
+</code><code id="L4515"><span class="ln">4515</span> <b>var</b> bot<span class="s"> = </span><b>this</b>.bottom;
+</code><code id="L4516"><span class="ln">4516</span> <b>while</b> (bot) {
+</code><code id="L4517"><span class="ln">4517</span> <b>if</b> (callback.call(thisArg, bot)<span class="s"> === </span><b>false</b>) {
+</code><code id="L4518"><span class="ln">4518</span> <b>return</b> <b>this</b>;
+</code><code id="L4519"><span class="ln">4519</span> }
+</code><code id="L4520"><span class="ln">4520</span> bot<span class="s"> = </span>bot.next;
+</code><code id="L4521"><span class="ln">4521</span> }
+</code><code id="L4522"><span class="ln">4522</span> <b>return</b> <b>this</b>;
+</code><code id="L4523"><span class="ln">4523</span> };
+</code><code id="L4524"><span class="ln">4524</span> <b>function</b> x_y() {
+</code><code id="L4525"><span class="ln">4525</span> <b>return</b> <b>this</b>.x<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.y;
+</code><code id="L4526"><span class="ln">4526</span> }
+</code><code id="L4527"><span class="ln">4527</span> <b>function</b> x_y_w_h() {
+</code><code id="L4528"><span class="ln">4528</span> <b>return</b> <b>this</b>.x<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.y<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.width<span class="s"> + </span><i>"\xd7"</i><span class="s"> + </span><b>this</b>.height;
+</code><code id="L4529"><span class="ln">4529</span> }
+</code><code id="L4530"><span class="ln">4530</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4531"><span class="ln">4531</span><span class="c"> <span class="s"> * </span>Element.getBBox
+</span></code><code id="L4532"><span class="ln">4532</span><span class="c"> [ method ]
+</span></code><code id="L4533"><span class="ln">4533</span><span class="c"> **
+</span></code><code id="L4534"><span class="ln">4534</span><span class="c"> <span class="s"> * </span>Return bounding box <b>for</b> a given element
+</span></code><code id="L4535"><span class="ln">4535</span><span class="c"> **
+</span></code><code id="L4536"><span class="ln">4536</span><span class="c"> > Parameters
+</span></code><code id="L4537"><span class="ln">4537</span><span class="c"> **
+</span></code><code id="L4538"><span class="ln">4538</span><span class="c"> <span class="s"> - </span>isWithoutTransform (<b>boolean</b>) flag, `<b>true</b>` <b>if</b> you want to have bounding box before transformations. Default is `<b>false</b>`.
+</span></code><code id="L4539"><span class="ln">4539</span><span class="c"> <span class="s"> = </span>(object) Bounding box object:
+</span></code><code id="L4540"><span class="ln">4540</span><span class="c"> o {
+</span></code><code id="L4541"><span class="ln">4541</span><span class="c"> o x: (number) top left corner x
+</span></code><code id="L4542"><span class="ln">4542</span><span class="c"> o y: (number) top left corner y
+</span></code><code id="L4543"><span class="ln">4543</span><span class="c"> o width: (number) width
+</span></code><code id="L4544"><span class="ln">4544</span><span class="c"> o height: (number) height
+</span></code><code id="L4545"><span class="ln">4545</span><span class="c"> o }
+</span></code><code id="L4546"><span class="ln">4546</span><span class="c"> \*/</span>
+</code><code id="L4547"><span class="ln">4547</span> elproto.getBBox<span class="s"> = </span><b>function</b> (isWithoutTransform) {
+</code><code id="L4548"><span class="ln">4548</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L4549"><span class="ln">4549</span> <b>return</b> {};
+</code><code id="L4550"><span class="ln">4550</span> }
+</code><code id="L4551"><span class="ln">4551</span> <b>var</b> _<span class="s"> = </span><b>this</b>._;
+</code><code id="L4552"><span class="ln">4552</span> <b>if</b> (isWithoutTransform) {
+</code><code id="L4553"><span class="ln">4553</span> <b>if</b> (_.dirty<span class="s"> || </span>!_.bboxwt) {
+</code><code id="L4554"><span class="ln">4554</span> <b>this</b>.realPath<span class="s"> = </span>getPath[<b>this</b>.type](<b>this</b>);
+</code><code id="L4555"><span class="ln">4555</span> _.bboxwt<span class="s"> = </span>pathDimensions(<b>this</b>.realPath);
+</code><code id="L4556"><span class="ln">4556</span> _.bboxwt.toString<span class="s"> = </span>x_y_w_h;
+</code><code id="L4557"><span class="ln">4557</span> _.dirty<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L4558"><span class="ln">4558</span> }
+</code><code id="L4559"><span class="ln">4559</span> <b>return</b> _.bboxwt;
+</code><code id="L4560"><span class="ln">4560</span> }
+</code><code id="L4561"><span class="ln">4561</span> <b>if</b> (_.dirty<span class="s"> || </span>_.dirtyT<span class="s"> || </span>!_.bbox) {
+</code><code id="L4562"><span class="ln">4562</span> <b>if</b> (_.dirty<span class="s"> || </span>!<b>this</b>.realPath) {
+</code><code id="L4563"><span class="ln">4563</span> _.bboxwt<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L4564"><span class="ln">4564</span> <b>this</b>.realPath<span class="s"> = </span>getPath[<b>this</b>.type](<b>this</b>);
+</code><code id="L4565"><span class="ln">4565</span> }
+</code><code id="L4566"><span class="ln">4566</span> _.bbox<span class="s"> = </span>pathDimensions(mapPath(<b>this</b>.realPath, <b>this</b>.matrix));
+</code><code id="L4567"><span class="ln">4567</span> _.bbox.toString<span class="s"> = </span>x_y_w_h;
+</code><code id="L4568"><span class="ln">4568</span> _.dirty<span class="s"> = </span>_.dirtyT<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L4569"><span class="ln">4569</span> }
+</code><code id="L4570"><span class="ln">4570</span> <b>return</b> _.bbox;
+</code><code id="L4571"><span class="ln">4571</span> };
+</code><code id="L4572"><span class="ln">4572</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4573"><span class="ln">4573</span><span class="c"> <span class="s"> * </span>Element.clone
+</span></code><code id="L4574"><span class="ln">4574</span><span class="c"> [ method ]
+</span></code><code id="L4575"><span class="ln">4575</span><span class="c"> **
+</span></code><code id="L4576"><span class="ln">4576</span><span class="c"> <span class="s"> = </span>(object) clone of a given element
+</span></code><code id="L4577"><span class="ln">4577</span><span class="c"> **
+</span></code><code id="L4578"><span class="ln">4578</span><span class="c"> \*/</span>
+</code><code id="L4579"><span class="ln">4579</span> elproto.clone<span class="s"> = </span><b>function</b> () {
+</code><code id="L4580"><span class="ln">4580</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L4581"><span class="ln">4581</span> <b>return</b> <b>null</b>;
+</code><code id="L4582"><span class="ln">4582</span> }
+</code><code id="L4583"><span class="ln">4583</span> <b>var</b> attr<span class="s"> = </span><b>this</b>.attr();
+</code><code id="L4584"><span class="ln">4584</span> <b>delete</b> attr.scale;
+</code><code id="L4585"><span class="ln">4585</span> <b>delete</b> attr.translation;
+</code><code id="L4586"><span class="ln">4586</span> <b>return</b> <b>this</b>.paper[<b>this</b>.type]().attr(attr);
</code><code id="L4587"><span class="ln">4587</span> };
-</code><code id="L4588"><span class="ln">4588</span> <b>var</b> curveslengths<span class="s"> = </span>{},
-</code><code id="L4589"><span class="ln">4589</span> getPointAtSegmentLength<span class="s"> = </span><b>function</b> (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {
-</code><code id="L4590"><span class="ln">4590</span> <b>var</b> len<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L4591"><span class="ln">4591</span> precision<span class="s"> = </span><span class="d">100</span>,
-</code><code id="L4592"><span class="ln">4592</span> name<span class="s"> = </span>[p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y].join(),
-</code><code id="L4593"><span class="ln">4593</span> cache<span class="s"> = </span>curveslengths[name],
-</code><code id="L4594"><span class="ln">4594</span> old, dot;
-</code><code id="L4595"><span class="ln">4595</span> !cache<span class="s"> && </span>(curveslengths[name]<span class="s"> = </span>cache<span class="s"> = </span>{data: []});
-</code><code id="L4596"><span class="ln">4596</span> cache.timer<span class="s"> && </span>clearTimeout(cache.timer);
-</code><code id="L4597"><span class="ln">4597</span> cache.timer<span class="s"> = </span>setTimeout(<b>function</b> () {<b>delete</b> curveslengths[name];}, <span class="d">2e3</span>);
-</code><code id="L4598"><span class="ln">4598</span> <b>if</b> (length != <b>null</b><span class="s"> && </span>!cache.precision) {
-</code><code id="L4599"><span class="ln">4599</span> <b>var</b> total<span class="s"> = </span>getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);
-</code><code id="L4600"><span class="ln">4600</span> cache.precision<span class="s"> = </span>~~total<span class="s"> * </span><span class="d">10</span>;
-</code><code id="L4601"><span class="ln">4601</span> cache.data<span class="s"> = </span>[];
-</code><code id="L4602"><span class="ln">4602</span> }
-</code><code id="L4603"><span class="ln">4603</span> precision<span class="s"> = </span>cache.precision<span class="s"> || </span>precision;
-</code><code id="L4604"><span class="ln">4604</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>; i < precision<span class="s"> + </span><span class="d">1</span>; i++) {
-</code><code id="L4605"><span class="ln">4605</span> <b>if</b> (cache.data[i<span class="s"> * </span>precision]) {
-</code><code id="L4606"><span class="ln">4606</span> dot<span class="s"> = </span>cache.data[i<span class="s"> * </span>precision];
-</code><code id="L4607"><span class="ln">4607</span> } <b>else</b> {
-</code><code id="L4608"><span class="ln">4608</span> dot<span class="s"> = </span>R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, i<span class="s"> / </span>precision);
-</code><code id="L4609"><span class="ln">4609</span> cache.data[i<span class="s"> * </span>precision]<span class="s"> = </span>dot;
-</code><code id="L4610"><span class="ln">4610</span> }
-</code><code id="L4611"><span class="ln">4611</span> i<span class="s"> && </span>(len += pow(pow(old.x<span class="s"> - </span>dot.x, <span class="d">2</span>)<span class="s"> + </span>pow(old.y<span class="s"> - </span>dot.y, <span class="d">2</span>), <span class="d">.5</span>));
-</code><code id="L4612"><span class="ln">4612</span> <b>if</b> (length != <b>null</b><span class="s"> && </span>len >= length) {
-</code><code id="L4613"><span class="ln">4613</span> <b>return</b> dot;
-</code><code id="L4614"><span class="ln">4614</span> }
-</code><code id="L4615"><span class="ln">4615</span> old<span class="s"> = </span>dot;
-</code><code id="L4616"><span class="ln">4616</span> }
-</code><code id="L4617"><span class="ln">4617</span> <b>if</b> (length<span class="s"> == </span><b>null</b>) {
-</code><code id="L4618"><span class="ln">4618</span> <b>return</b> len;
-</code><code id="L4619"><span class="ln">4619</span> }
-</code><code id="L4620"><span class="ln">4620</span> },
-</code><code id="L4621"><span class="ln">4621</span> getLengthFactory<span class="s"> = </span><b>function</b> (istotal, subpath) {
-</code><code id="L4622"><span class="ln">4622</span> <b>return</b> <b>function</b> (path, length, onlystart) {
-</code><code id="L4623"><span class="ln">4623</span> path<span class="s"> = </span>path2curve(path);
-</code><code id="L4624"><span class="ln">4624</span> <b>var</b> x, y, p, l, sp<span class="s"> = </span><i>""</i>, subpaths<span class="s"> = </span>{}, point,
-</code><code id="L4625"><span class="ln">4625</span> len<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L4626"><span class="ln">4626</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>path.length; i < ii; i++) {
-</code><code id="L4627"><span class="ln">4627</span> p<span class="s"> = </span>path[i];
-</code><code id="L4628"><span class="ln">4628</span> <b>if</b> (p[<span class="d">0</span>]<span class="s"> == </span><i>"M"</i>) {
-</code><code id="L4629"><span class="ln">4629</span> x<span class="s"> = </span>+p[<span class="d">1</span>];
-</code><code id="L4630"><span class="ln">4630</span> y<span class="s"> = </span>+p[<span class="d">2</span>];
-</code><code id="L4631"><span class="ln">4631</span> } <b>else</b> {
-</code><code id="L4632"><span class="ln">4632</span> l<span class="s"> = </span>getPointAtSegmentLength(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>]);
-</code><code id="L4633"><span class="ln">4633</span> <b>if</b> (len<span class="s"> + </span>l > length) {
-</code><code id="L4634"><span class="ln">4634</span> <b>if</b> (subpath<span class="s"> && </span>!subpaths.start) {
-</code><code id="L4635"><span class="ln">4635</span> point<span class="s"> = </span>getPointAtSegmentLength(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>], length<span class="s"> - </span>len);
-</code><code id="L4636"><span class="ln">4636</span> sp += [<i>"C"</i><span class="s"> + </span>point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y];
-</code><code id="L4637"><span class="ln">4637</span> <b>if</b> (onlystart) {<b>return</b> sp;}
-</code><code id="L4638"><span class="ln">4638</span> subpaths.start<span class="s"> = </span>sp;
-</code><code id="L4639"><span class="ln">4639</span> sp<span class="s"> = </span>[<i>"M"</i><span class="s"> + </span>point.x, point.y<span class="s"> + </span><i>"C"</i><span class="s"> + </span>point.n.x, point.n.y, point.end.x, point.end.y, p[<span class="d">5</span>], p[<span class="d">6</span>]].join();
-</code><code id="L4640"><span class="ln">4640</span> len += l;
-</code><code id="L4641"><span class="ln">4641</span> x<span class="s"> = </span>+p[<span class="d">5</span>];
-</code><code id="L4642"><span class="ln">4642</span> y<span class="s"> = </span>+p[<span class="d">6</span>];
-</code><code id="L4643"><span class="ln">4643</span> <b>continue</b>;
-</code><code id="L4644"><span class="ln">4644</span> }
-</code><code id="L4645"><span class="ln">4645</span> <b>if</b> (!istotal<span class="s"> && </span>!subpath) {
-</code><code id="L4646"><span class="ln">4646</span> point<span class="s"> = </span>getPointAtSegmentLength(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>], length<span class="s"> - </span>len);
-</code><code id="L4647"><span class="ln">4647</span> <b>return</b> {x: point.x, y: point.y, alpha: point.alpha};
-</code><code id="L4648"><span class="ln">4648</span> }
-</code><code id="L4649"><span class="ln">4649</span> }
-</code><code id="L4650"><span class="ln">4650</span> len += l;
-</code><code id="L4651"><span class="ln">4651</span> x<span class="s"> = </span>+p[<span class="d">5</span>];
-</code><code id="L4652"><span class="ln">4652</span> y<span class="s"> = </span>+p[<span class="d">6</span>];
-</code><code id="L4653"><span class="ln">4653</span> }
-</code><code id="L4654"><span class="ln">4654</span> sp += p.shift()<span class="s"> + </span>p;
-</code><code id="L4655"><span class="ln">4655</span> }
-</code><code id="L4656"><span class="ln">4656</span> subpaths.end<span class="s"> = </span>sp;
-</code><code id="L4657"><span class="ln">4657</span> point<span class="s"> = </span>istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>], <span class="d">1</span>);
-</code><code id="L4658"><span class="ln">4658</span> point.alpha<span class="s"> && </span>(point<span class="s"> = </span>{x: point.x, y: point.y, alpha: point.alpha});
-</code><code id="L4659"><span class="ln">4659</span> <b>return</b> point;
-</code><code id="L4660"><span class="ln">4660</span> };
-</code><code id="L4661"><span class="ln">4661</span> };
-</code><code id="L4662"><span class="ln">4662</span> <b>var</b> getTotalLength<span class="s"> = </span>getLengthFactory(<span class="d">1</span>),
-</code><code id="L4663"><span class="ln">4663</span> getPointAtLength<span class="s"> = </span>getLengthFactory(),
-</code><code id="L4664"><span class="ln">4664</span> getSubpathsAtLength<span class="s"> = </span>getLengthFactory(<span class="d">0</span>, <span class="d">1</span>);
-</code><code id="L4665"><span class="ln">4665</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4666"><span class="ln">4666</span><span class="c"> <span class="s"> * </span>Raphael.getTotalLength
-</span></code><code id="L4667"><span class="ln">4667</span><span class="c"> [ method ]
-</span></code><code id="L4668"><span class="ln">4668</span><span class="c"> **
-</span></code><code id="L4669"><span class="ln">4669</span><span class="c"> <span class="s"> * </span>Returns length of the given path <b>in</b> pixels.
-</span></code><code id="L4670"><span class="ln">4670</span><span class="c"> **
-</span></code><code id="L4671"><span class="ln">4671</span><span class="c"> > Parameters
-</span></code><code id="L4672"><span class="ln">4672</span><span class="c"> **
-</span></code><code id="L4673"><span class="ln">4673</span><span class="c"> <span class="s"> - </span>path (string) SVG path string.
-</span></code><code id="L4674"><span class="ln">4674</span><span class="c"> **
-</span></code><code id="L4675"><span class="ln">4675</span><span class="c"> <span class="s"> = </span>(number) length.
-</span></code><code id="L4676"><span class="ln">4676</span><span class="c"> \*/</span>
-</code><code id="L4677"><span class="ln">4677</span> R.getTotalLength<span class="s"> = </span>getTotalLength;
-</code><code id="L4678"><span class="ln">4678</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4679"><span class="ln">4679</span><span class="c"> <span class="s"> * </span>Raphael.getPointAtLength
-</span></code><code id="L4680"><span class="ln">4680</span><span class="c"> [ method ]
-</span></code><code id="L4681"><span class="ln">4681</span><span class="c"> **
-</span></code><code id="L4682"><span class="ln">4682</span><span class="c"> <span class="s"> * </span>Return coordinates of the point located at the given length on the given path.
-</span></code><code id="L4683"><span class="ln">4683</span><span class="c"> **
-</span></code><code id="L4684"><span class="ln">4684</span><span class="c"> > Parameters
-</span></code><code id="L4685"><span class="ln">4685</span><span class="c"> **
-</span></code><code id="L4686"><span class="ln">4686</span><span class="c"> <span class="s"> - </span>path (string) SVG path string
-</span></code><code id="L4687"><span class="ln">4687</span><span class="c"> <span class="s"> - </span>length (number)
-</span></code><code id="L4688"><span class="ln">4688</span><span class="c"> **
-</span></code><code id="L4689"><span class="ln">4689</span><span class="c"> <span class="s"> = </span>(object) representation of the point:
-</span></code><code id="L4690"><span class="ln">4690</span><span class="c"> o {
-</span></code><code id="L4691"><span class="ln">4691</span><span class="c"> o x: (number) x coordinate
-</span></code><code id="L4692"><span class="ln">4692</span><span class="c"> o y: (number) y coordinate
-</span></code><code id="L4693"><span class="ln">4693</span><span class="c"> o alpha: (number) angle of derivative
-</span></code><code id="L4694"><span class="ln">4694</span><span class="c"> o }
-</span></code><code id="L4695"><span class="ln">4695</span><span class="c"> \*/</span>
-</code><code id="L4696"><span class="ln">4696</span> R.getPointAtLength<span class="s"> = </span>getPointAtLength;
-</code><code id="L4697"><span class="ln">4697</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4698"><span class="ln">4698</span><span class="c"> <span class="s"> * </span>Raphael.getSubpath
-</span></code><code id="L4699"><span class="ln">4699</span><span class="c"> [ method ]
-</span></code><code id="L4700"><span class="ln">4700</span><span class="c"> **
-</span></code><code id="L4701"><span class="ln">4701</span><span class="c"> <span class="s"> * </span>Return subpath of a given path from given length to given length.
-</span></code><code id="L4702"><span class="ln">4702</span><span class="c"> **
-</span></code><code id="L4703"><span class="ln">4703</span><span class="c"> > Parameters
-</span></code><code id="L4704"><span class="ln">4704</span><span class="c"> **
-</span></code><code id="L4705"><span class="ln">4705</span><span class="c"> <span class="s"> - </span>path (string) SVG path string
-</span></code><code id="L4706"><span class="ln">4706</span><span class="c"> <span class="s"> - </span>from (number) position of the start of the segment
-</span></code><code id="L4707"><span class="ln">4707</span><span class="c"> <span class="s"> - </span>to (number) position of the end of the segment
-</span></code><code id="L4708"><span class="ln">4708</span><span class="c"> **
-</span></code><code id="L4709"><span class="ln">4709</span><span class="c"> <span class="s"> = </span>(string) pathstring <b>for</b> the segment
-</span></code><code id="L4710"><span class="ln">4710</span><span class="c"> \*/</span>
-</code><code id="L4711"><span class="ln">4711</span> R.getSubpath<span class="s"> = </span><b>function</b> (path, from, to) {
-</code><code id="L4712"><span class="ln">4712</span> <b>if</b> (abs(<b>this</b>.getTotalLength(path)<span class="s"> - </span>to) < <span class="d">1e-6</span>) {
-</code><code id="L4713"><span class="ln">4713</span> <b>return</b> getSubpathsAtLength(path, from).end;
-</code><code id="L4714"><span class="ln">4714</span> }
-</code><code id="L4715"><span class="ln">4715</span> <b>var</b> a<span class="s"> = </span>getSubpathsAtLength(path, to, <span class="d">1</span>);
-</code><code id="L4716"><span class="ln">4716</span> <b>return</b> from ? getSubpathsAtLength(a, from).end : a;
-</code><code id="L4717"><span class="ln">4717</span> };
-</code><code id="L4718"><span class="ln">4718</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4719"><span class="ln">4719</span><span class="c"> <span class="s"> * </span>Element.getTotalLength
-</span></code><code id="L4720"><span class="ln">4720</span><span class="c"> [ method ]
+</code><code id="L4588"><span class="ln">4588</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4589"><span class="ln">4589</span><span class="c"> <span class="s"> * </span>Element.glow
+</span></code><code id="L4590"><span class="ln">4590</span><span class="c"> [ method ]
+</span></code><code id="L4591"><span class="ln">4591</span><span class="c"> **
+</span></code><code id="L4592"><span class="ln">4592</span><span class="c"> <span class="s"> * </span>Return set of elements that create glow-like effect around given element. See @Paper.set.
+</span></code><code id="L4593"><span class="ln">4593</span><span class="c"> *
+</span></code><code id="L4594"><span class="ln">4594</span><span class="c"> <span class="s"> * </span>Note: Glow is not connected to the element. If you change element attributes it won’t adjust itself.
+</span></code><code id="L4595"><span class="ln">4595</span><span class="c"> **
+</span></code><code id="L4596"><span class="ln">4596</span><span class="c"> > Parameters
+</span></code><code id="L4597"><span class="ln">4597</span><span class="c"> **
+</span></code><code id="L4598"><span class="ln">4598</span><span class="c"> <span class="s"> - </span>glow (object) #optional parameters object <b>with</b> all properties optional:
+</span></code><code id="L4599"><span class="ln">4599</span><span class="c"> o {
+</span></code><code id="L4600"><span class="ln">4600</span><span class="c"> o width (number) size of the glow, <b>default</b> is `<span class="d">10</span>`
+</span></code><code id="L4601"><span class="ln">4601</span><span class="c"> o fill (<b>boolean</b>) will it be filled, <b>default</b> is `<b>false</b>`
+</span></code><code id="L4602"><span class="ln">4602</span><span class="c"> o opacity: opacity, <b>default</b> is `<span class="d">0.5</span>`
+</span></code><code id="L4603"><span class="ln">4603</span><span class="c"> o offsetx: horizontal offset, <b>default</b> is `<span class="d">0</span>`
+</span></code><code id="L4604"><span class="ln">4604</span><span class="c"> o offsety: vertical offset, <b>default</b> is `<span class="d">0</span>`
+</span></code><code id="L4605"><span class="ln">4605</span><span class="c"> o color: glow colour, <b>default</b> is `black`
+</span></code><code id="L4606"><span class="ln">4606</span><span class="c"> o }
+</span></code><code id="L4607"><span class="ln">4607</span><span class="c"> <span class="s"> = </span>(object) @Paper.set of elements that represents glow
+</span></code><code id="L4608"><span class="ln">4608</span><span class="c"> \*/</span>
+</code><code id="L4609"><span class="ln">4609</span> elproto.glow<span class="s"> = </span><b>function</b> (glow) {
+</code><code id="L4610"><span class="ln">4610</span> <b>if</b> (<b>this</b>.type<span class="s"> == </span><i>"text"</i>) {
+</code><code id="L4611"><span class="ln">4611</span> <b>return</b> <b>null</b>;
+</code><code id="L4612"><span class="ln">4612</span> }
+</code><code id="L4613"><span class="ln">4613</span> glow<span class="s"> = </span>glow<span class="s"> || </span>{};
+</code><code id="L4614"><span class="ln">4614</span> <b>var</b> s<span class="s"> = </span>{
+</code><code id="L4615"><span class="ln">4615</span> width: (glow.width<span class="s"> || </span><span class="d">10</span>)<span class="s"> + </span>(+<b>this</b>.attr(<i>"stroke-width"</i>)<span class="s"> || </span><span class="d">1</span>),
+</code><code id="L4616"><span class="ln">4616</span> fill: glow.fill<span class="s"> || </span><b>false</b>,
+</code><code id="L4617"><span class="ln">4617</span> opacity: glow.opacity<span class="s"> || </span><span class="d">.5</span>,
+</code><code id="L4618"><span class="ln">4618</span> offsetx: glow.offsetx<span class="s"> || </span><span class="d">0</span>,
+</code><code id="L4619"><span class="ln">4619</span> offsety: glow.offsety<span class="s"> || </span><span class="d">0</span>,
+</code><code id="L4620"><span class="ln">4620</span> color: glow.color<span class="s"> || </span><i>"#<span class="d">000</span>"</i>
+</code><code id="L4621"><span class="ln">4621</span> },
+</code><code id="L4622"><span class="ln">4622</span> c<span class="s"> = </span>s.width<span class="s"> / </span><span class="d">2</span>,
+</code><code id="L4623"><span class="ln">4623</span> r<span class="s"> = </span><b>this</b>.paper,
+</code><code id="L4624"><span class="ln">4624</span> out<span class="s"> = </span>r.set(),
+</code><code id="L4625"><span class="ln">4625</span> path<span class="s"> = </span><b>this</b>.realPath<span class="s"> || </span>getPath[<b>this</b>.type](<b>this</b>);
+</code><code id="L4626"><span class="ln">4626</span> path<span class="s"> = </span><b>this</b>.matrix ? mapPath(path, <b>this</b>.matrix) : path;
+</code><code id="L4627"><span class="ln">4627</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">1</span>; i < c<span class="s"> + </span><span class="d">1</span>; i++) {
+</code><code id="L4628"><span class="ln">4628</span> out.push(r.path(path).attr({
+</code><code id="L4629"><span class="ln">4629</span> stroke: s.color,
+</code><code id="L4630"><span class="ln">4630</span> fill: s.fill ? s.color : <i>"none"</i>,
+</code><code id="L4631"><span class="ln">4631</span> <i>"stroke-linejoin"</i>: <i>"round"</i>,
+</code><code id="L4632"><span class="ln">4632</span> <i>"stroke-linecap"</i>: <i>"round"</i>,
+</code><code id="L4633"><span class="ln">4633</span> <i>"stroke-width"</i>: +(s.width<span class="s"> / </span>c<span class="s"> * </span>i).toFixed(<span class="d">3</span>),
+</code><code id="L4634"><span class="ln">4634</span> opacity: +(s.opacity<span class="s"> / </span>c).toFixed(<span class="d">3</span>)
+</code><code id="L4635"><span class="ln">4635</span> }));
+</code><code id="L4636"><span class="ln">4636</span> }
+</code><code id="L4637"><span class="ln">4637</span> <b>return</b> out.insertBefore(<b>this</b>).translate(s.offsetx, s.offsety);
+</code><code id="L4638"><span class="ln">4638</span> };
+</code><code id="L4639"><span class="ln">4639</span> <b>var</b> curveslengths<span class="s"> = </span>{},
+</code><code id="L4640"><span class="ln">4640</span> getPointAtSegmentLength<span class="s"> = </span><b>function</b> (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {
+</code><code id="L4641"><span class="ln">4641</span> <b>var</b> len<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L4642"><span class="ln">4642</span> precision<span class="s"> = </span><span class="d">100</span>,
+</code><code id="L4643"><span class="ln">4643</span> name<span class="s"> = </span>[p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y].join(),
+</code><code id="L4644"><span class="ln">4644</span> cache<span class="s"> = </span>curveslengths[name],
+</code><code id="L4645"><span class="ln">4645</span> old, dot;
+</code><code id="L4646"><span class="ln">4646</span> !cache<span class="s"> && </span>(curveslengths[name]<span class="s"> = </span>cache<span class="s"> = </span>{data: []});
+</code><code id="L4647"><span class="ln">4647</span> cache.timer<span class="s"> && </span>clearTimeout(cache.timer);
+</code><code id="L4648"><span class="ln">4648</span> cache.timer<span class="s"> = </span>setTimeout(<b>function</b> () {<b>delete</b> curveslengths[name];}, <span class="d">2e3</span>);
+</code><code id="L4649"><span class="ln">4649</span> <b>if</b> (length != <b>null</b><span class="s"> && </span>!cache.precision) {
+</code><code id="L4650"><span class="ln">4650</span> <b>var</b> total<span class="s"> = </span>getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);
+</code><code id="L4651"><span class="ln">4651</span> cache.precision<span class="s"> = </span>~~total<span class="s"> * </span><span class="d">10</span>;
+</code><code id="L4652"><span class="ln">4652</span> cache.data<span class="s"> = </span>[];
+</code><code id="L4653"><span class="ln">4653</span> }
+</code><code id="L4654"><span class="ln">4654</span> precision<span class="s"> = </span>cache.precision<span class="s"> || </span>precision;
+</code><code id="L4655"><span class="ln">4655</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>; i < precision<span class="s"> + </span><span class="d">1</span>; i++) {
+</code><code id="L4656"><span class="ln">4656</span> <b>if</b> (cache.data[i<span class="s"> * </span>precision]) {
+</code><code id="L4657"><span class="ln">4657</span> dot<span class="s"> = </span>cache.data[i<span class="s"> * </span>precision];
+</code><code id="L4658"><span class="ln">4658</span> } <b>else</b> {
+</code><code id="L4659"><span class="ln">4659</span> dot<span class="s"> = </span>R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, i<span class="s"> / </span>precision);
+</code><code id="L4660"><span class="ln">4660</span> cache.data[i<span class="s"> * </span>precision]<span class="s"> = </span>dot;
+</code><code id="L4661"><span class="ln">4661</span> }
+</code><code id="L4662"><span class="ln">4662</span> i<span class="s"> && </span>(len += pow(pow(old.x<span class="s"> - </span>dot.x, <span class="d">2</span>)<span class="s"> + </span>pow(old.y<span class="s"> - </span>dot.y, <span class="d">2</span>), <span class="d">.5</span>));
+</code><code id="L4663"><span class="ln">4663</span> <b>if</b> (length != <b>null</b><span class="s"> && </span>len >= length) {
+</code><code id="L4664"><span class="ln">4664</span> <b>return</b> dot;
+</code><code id="L4665"><span class="ln">4665</span> }
+</code><code id="L4666"><span class="ln">4666</span> old<span class="s"> = </span>dot;
+</code><code id="L4667"><span class="ln">4667</span> }
+</code><code id="L4668"><span class="ln">4668</span> <b>if</b> (length<span class="s"> == </span><b>null</b>) {
+</code><code id="L4669"><span class="ln">4669</span> <b>return</b> len;
+</code><code id="L4670"><span class="ln">4670</span> }
+</code><code id="L4671"><span class="ln">4671</span> },
+</code><code id="L4672"><span class="ln">4672</span> getLengthFactory<span class="s"> = </span><b>function</b> (istotal, subpath) {
+</code><code id="L4673"><span class="ln">4673</span> <b>return</b> <b>function</b> (path, length, onlystart) {
+</code><code id="L4674"><span class="ln">4674</span> path<span class="s"> = </span>path2curve(path);
+</code><code id="L4675"><span class="ln">4675</span> <b>var</b> x, y, p, l, sp<span class="s"> = </span><i>""</i>, subpaths<span class="s"> = </span>{}, point,
+</code><code id="L4676"><span class="ln">4676</span> len<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L4677"><span class="ln">4677</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>path.length; i < ii; i++) {
+</code><code id="L4678"><span class="ln">4678</span> p<span class="s"> = </span>path[i];
+</code><code id="L4679"><span class="ln">4679</span> <b>if</b> (p[<span class="d">0</span>]<span class="s"> == </span><i>"M"</i>) {
+</code><code id="L4680"><span class="ln">4680</span> x<span class="s"> = </span>+p[<span class="d">1</span>];
+</code><code id="L4681"><span class="ln">4681</span> y<span class="s"> = </span>+p[<span class="d">2</span>];
+</code><code id="L4682"><span class="ln">4682</span> } <b>else</b> {
+</code><code id="L4683"><span class="ln">4683</span> l<span class="s"> = </span>getPointAtSegmentLength(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>]);
+</code><code id="L4684"><span class="ln">4684</span> <b>if</b> (len<span class="s"> + </span>l > length) {
+</code><code id="L4685"><span class="ln">4685</span> <b>if</b> (subpath<span class="s"> && </span>!subpaths.start) {
+</code><code id="L4686"><span class="ln">4686</span> point<span class="s"> = </span>getPointAtSegmentLength(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>], length<span class="s"> - </span>len);
+</code><code id="L4687"><span class="ln">4687</span> sp += [<i>"C"</i><span class="s"> + </span>point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y];
+</code><code id="L4688"><span class="ln">4688</span> <b>if</b> (onlystart) {<b>return</b> sp;}
+</code><code id="L4689"><span class="ln">4689</span> subpaths.start<span class="s"> = </span>sp;
+</code><code id="L4690"><span class="ln">4690</span> sp<span class="s"> = </span>[<i>"M"</i><span class="s"> + </span>point.x, point.y<span class="s"> + </span><i>"C"</i><span class="s"> + </span>point.n.x, point.n.y, point.end.x, point.end.y, p[<span class="d">5</span>], p[<span class="d">6</span>]].join();
+</code><code id="L4691"><span class="ln">4691</span> len += l;
+</code><code id="L4692"><span class="ln">4692</span> x<span class="s"> = </span>+p[<span class="d">5</span>];
+</code><code id="L4693"><span class="ln">4693</span> y<span class="s"> = </span>+p[<span class="d">6</span>];
+</code><code id="L4694"><span class="ln">4694</span> <b>continue</b>;
+</code><code id="L4695"><span class="ln">4695</span> }
+</code><code id="L4696"><span class="ln">4696</span> <b>if</b> (!istotal<span class="s"> && </span>!subpath) {
+</code><code id="L4697"><span class="ln">4697</span> point<span class="s"> = </span>getPointAtSegmentLength(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>], length<span class="s"> - </span>len);
+</code><code id="L4698"><span class="ln">4698</span> <b>return</b> {x: point.x, y: point.y, alpha: point.alpha};
+</code><code id="L4699"><span class="ln">4699</span> }
+</code><code id="L4700"><span class="ln">4700</span> }
+</code><code id="L4701"><span class="ln">4701</span> len += l;
+</code><code id="L4702"><span class="ln">4702</span> x<span class="s"> = </span>+p[<span class="d">5</span>];
+</code><code id="L4703"><span class="ln">4703</span> y<span class="s"> = </span>+p[<span class="d">6</span>];
+</code><code id="L4704"><span class="ln">4704</span> }
+</code><code id="L4705"><span class="ln">4705</span> sp += p.shift()<span class="s"> + </span>p;
+</code><code id="L4706"><span class="ln">4706</span> }
+</code><code id="L4707"><span class="ln">4707</span> subpaths.end<span class="s"> = </span>sp;
+</code><code id="L4708"><span class="ln">4708</span> point<span class="s"> = </span>istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>], <span class="d">1</span>);
+</code><code id="L4709"><span class="ln">4709</span> point.alpha<span class="s"> && </span>(point<span class="s"> = </span>{x: point.x, y: point.y, alpha: point.alpha});
+</code><code id="L4710"><span class="ln">4710</span> <b>return</b> point;
+</code><code id="L4711"><span class="ln">4711</span> };
+</code><code id="L4712"><span class="ln">4712</span> };
+</code><code id="L4713"><span class="ln">4713</span> <b>var</b> getTotalLength<span class="s"> = </span>getLengthFactory(<span class="d">1</span>),
+</code><code id="L4714"><span class="ln">4714</span> getPointAtLength<span class="s"> = </span>getLengthFactory(),
+</code><code id="L4715"><span class="ln">4715</span> getSubpathsAtLength<span class="s"> = </span>getLengthFactory(<span class="d">0</span>, <span class="d">1</span>);
+</code><code id="L4716"><span class="ln">4716</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4717"><span class="ln">4717</span><span class="c"> <span class="s"> * </span>Raphael.getTotalLength
+</span></code><code id="L4718"><span class="ln">4718</span><span class="c"> [ method ]
+</span></code><code id="L4719"><span class="ln">4719</span><span class="c"> **
+</span></code><code id="L4720"><span class="ln">4720</span><span class="c"> <span class="s"> * </span>Returns length of the given path <b>in</b> pixels.
</span></code><code id="L4721"><span class="ln">4721</span><span class="c"> **
-</span></code><code id="L4722"><span class="ln">4722</span><span class="c"> <span class="s"> * </span>Returns length of the path <b>in</b> pixels. Only works <b>for</b> element of “path” type.
-</span></code><code id="L4723"><span class="ln">4723</span><span class="c"> <span class="s"> = </span>(number) length.
-</span></code><code id="L4724"><span class="ln">4724</span><span class="c"> \*/</span>
-</code><code id="L4725"><span class="ln">4725</span> elproto.getTotalLength<span class="s"> = </span><b>function</b> () {
-</code><code id="L4726"><span class="ln">4726</span> <b>if</b> (<b>this</b>.type != <i>"path"</i>) {<b>return</b>;}
-</code><code id="L4727"><span class="ln">4727</span> <b>if</b> (<b>this</b>.node.getTotalLength) {
-</code><code id="L4728"><span class="ln">4728</span> <b>return</b> <b>this</b>.node.getTotalLength();
-</code><code id="L4729"><span class="ln">4729</span> }
-</code><code id="L4730"><span class="ln">4730</span> <b>return</b> getTotalLength(<b>this</b>.attrs.path);
-</code><code id="L4731"><span class="ln">4731</span> };
-</code><code id="L4732"><span class="ln">4732</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4733"><span class="ln">4733</span><span class="c"> <span class="s"> * </span>Element.getPointAtLength
-</span></code><code id="L4734"><span class="ln">4734</span><span class="c"> [ method ]
-</span></code><code id="L4735"><span class="ln">4735</span><span class="c"> **
-</span></code><code id="L4736"><span class="ln">4736</span><span class="c"> <span class="s"> * </span>Return coordinates of the point located at the given length on the given path. Only works <b>for</b> element of “path” type.
-</span></code><code id="L4737"><span class="ln">4737</span><span class="c"> **
-</span></code><code id="L4738"><span class="ln">4738</span><span class="c"> > Parameters
+</span></code><code id="L4722"><span class="ln">4722</span><span class="c"> > Parameters
+</span></code><code id="L4723"><span class="ln">4723</span><span class="c"> **
+</span></code><code id="L4724"><span class="ln">4724</span><span class="c"> <span class="s"> - </span>path (string) SVG path string.
+</span></code><code id="L4725"><span class="ln">4725</span><span class="c"> **
+</span></code><code id="L4726"><span class="ln">4726</span><span class="c"> <span class="s"> = </span>(number) length.
+</span></code><code id="L4727"><span class="ln">4727</span><span class="c"> \*/</span>
+</code><code id="L4728"><span class="ln">4728</span> R.getTotalLength<span class="s"> = </span>getTotalLength;
+</code><code id="L4729"><span class="ln">4729</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4730"><span class="ln">4730</span><span class="c"> <span class="s"> * </span>Raphael.getPointAtLength
+</span></code><code id="L4731"><span class="ln">4731</span><span class="c"> [ method ]
+</span></code><code id="L4732"><span class="ln">4732</span><span class="c"> **
+</span></code><code id="L4733"><span class="ln">4733</span><span class="c"> <span class="s"> * </span>Return coordinates of the point located at the given length on the given path.
+</span></code><code id="L4734"><span class="ln">4734</span><span class="c"> **
+</span></code><code id="L4735"><span class="ln">4735</span><span class="c"> > Parameters
+</span></code><code id="L4736"><span class="ln">4736</span><span class="c"> **
+</span></code><code id="L4737"><span class="ln">4737</span><span class="c"> <span class="s"> - </span>path (string) SVG path string
+</span></code><code id="L4738"><span class="ln">4738</span><span class="c"> <span class="s"> - </span>length (number)
</span></code><code id="L4739"><span class="ln">4739</span><span class="c"> **
-</span></code><code id="L4740"><span class="ln">4740</span><span class="c"> <span class="s"> - </span>length (number)
-</span></code><code id="L4741"><span class="ln">4741</span><span class="c"> **
-</span></code><code id="L4742"><span class="ln">4742</span><span class="c"> <span class="s"> = </span>(object) representation of the point:
-</span></code><code id="L4743"><span class="ln">4743</span><span class="c"> o {
-</span></code><code id="L4744"><span class="ln">4744</span><span class="c"> o x: (number) x coordinate
-</span></code><code id="L4745"><span class="ln">4745</span><span class="c"> o y: (number) y coordinate
-</span></code><code id="L4746"><span class="ln">4746</span><span class="c"> o alpha: (number) angle of derivative
-</span></code><code id="L4747"><span class="ln">4747</span><span class="c"> o }
-</span></code><code id="L4748"><span class="ln">4748</span><span class="c"> \*/</span>
-</code><code id="L4749"><span class="ln">4749</span> elproto.getPointAtLength<span class="s"> = </span><b>function</b> (length) {
-</code><code id="L4750"><span class="ln">4750</span> <b>if</b> (<b>this</b>.type != <i>"path"</i>) {<b>return</b>;}
-</code><code id="L4751"><span class="ln">4751</span> <b>return</b> getPointAtLength(<b>this</b>.attrs.path, length);
-</code><code id="L4752"><span class="ln">4752</span> };
-</code><code id="L4753"><span class="ln">4753</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4754"><span class="ln">4754</span><span class="c"> <span class="s"> * </span>Element.getSubpath
-</span></code><code id="L4755"><span class="ln">4755</span><span class="c"> [ method ]
-</span></code><code id="L4756"><span class="ln">4756</span><span class="c"> **
-</span></code><code id="L4757"><span class="ln">4757</span><span class="c"> <span class="s"> * </span>Return subpath of a given element from given length to given length. Only works <b>for</b> element of “path” type.
-</span></code><code id="L4758"><span class="ln">4758</span><span class="c"> **
-</span></code><code id="L4759"><span class="ln">4759</span><span class="c"> > Parameters
-</span></code><code id="L4760"><span class="ln">4760</span><span class="c"> **
-</span></code><code id="L4761"><span class="ln">4761</span><span class="c"> <span class="s"> - </span>from (number) position of the start of the segment
-</span></code><code id="L4762"><span class="ln">4762</span><span class="c"> <span class="s"> - </span>to (number) position of the end of the segment
-</span></code><code id="L4763"><span class="ln">4763</span><span class="c"> **
-</span></code><code id="L4764"><span class="ln">4764</span><span class="c"> <span class="s"> = </span>(string) pathstring <b>for</b> the segment
-</span></code><code id="L4765"><span class="ln">4765</span><span class="c"> \*/</span>
-</code><code id="L4766"><span class="ln">4766</span> elproto.getSubpath<span class="s"> = </span><b>function</b> (from, to) {
-</code><code id="L4767"><span class="ln">4767</span> <b>if</b> (<b>this</b>.type != <i>"path"</i>) {<b>return</b>;}
-</code><code id="L4768"><span class="ln">4768</span> <b>return</b> R.getSubpath(<b>this</b>.attrs.path, from, to);
-</code><code id="L4769"><span class="ln">4769</span> };
-</code><code id="L4770"><span class="ln">4770</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4771"><span class="ln">4771</span><span class="c"> <span class="s"> * </span>Raphael.easing_formulas
-</span></code><code id="L4772"><span class="ln">4772</span><span class="c"> [ property ]
-</span></code><code id="L4773"><span class="ln">4773</span><span class="c"> **
-</span></code><code id="L4774"><span class="ln">4774</span><span class="c"> <span class="s"> * </span>Object that contains easing formulas <b>for</b> animation. You could extend it <b>with</b> your own. By <b>default</b> it has following list of easing:
-</span></code><code id="L4775"><span class="ln">4775</span><span class="c"> # <ul>
-</span></code><code id="L4776"><span class="ln">4776</span><span class="c"> # <li>“linear”</li>
-</span></code><code id="L4777"><span class="ln">4777</span><span class="c"> # <li>“<” or “easeIn” or “ease-<b>in</b>”</li>
-</span></code><code id="L4778"><span class="ln">4778</span><span class="c"> # <li>“>” or “easeOut” or “ease-out”</li>
-</span></code><code id="L4779"><span class="ln">4779</span><span class="c"> # <li>“<>” or “easeInOut” or “ease-<b>in</b>-out”</li>
-</span></code><code id="L4780"><span class="ln">4780</span><span class="c"> # <li>“backIn” or “back-<b>in</b>”</li>
-</span></code><code id="L4781"><span class="ln">4781</span><span class="c"> # <li>“backOut” or “back-out”</li>
-</span></code><code id="L4782"><span class="ln">4782</span><span class="c"> # <li>“elastic”</li>
-</span></code><code id="L4783"><span class="ln">4783</span><span class="c"> # <li>“bounce”</li>
-</span></code><code id="L4784"><span class="ln">4784</span><span class="c"> # </ul>
-</span></code><code id="L4785"><span class="ln">4785</span><span class="c"> # <p>See also <a href=<i>"http:<span class="c">//raphaeljs.com/easing.html"</i>>Easing demo</a>.</p></span>
-</span></code><code id="L4786"><span class="ln">4786</span><span class="c"> \*/</span>
-</code><code id="L4787"><span class="ln">4787</span> <b>var</b> ef<span class="s"> = </span>R.easing_formulas<span class="s"> = </span>{
-</code><code id="L4788"><span class="ln">4788</span> linear: <b>function</b> (n) {
-</code><code id="L4789"><span class="ln">4789</span> <b>return</b> n;
-</code><code id="L4790"><span class="ln">4790</span> },
-</code><code id="L4791"><span class="ln">4791</span> <i>"<"</i>: <b>function</b> (n) {
-</code><code id="L4792"><span class="ln">4792</span> <b>return</b> pow(n, <span class="d">1.7</span>);
-</code><code id="L4793"><span class="ln">4793</span> },
-</code><code id="L4794"><span class="ln">4794</span> <i>">"</i>: <b>function</b> (n) {
-</code><code id="L4795"><span class="ln">4795</span> <b>return</b> pow(n, <span class="d">.48</span>);
-</code><code id="L4796"><span class="ln">4796</span> },
-</code><code id="L4797"><span class="ln">4797</span> <i>"<>"</i>: <b>function</b> (n) {
-</code><code id="L4798"><span class="ln">4798</span> <b>var</b> q<span class="s"> = </span><span class="d">.48</span><span class="s"> - </span>n<span class="s"> / </span><span class="d">1.04</span>,
-</code><code id="L4799"><span class="ln">4799</span> Q<span class="s"> = </span>math.sqrt(<span class="d">.1734</span><span class="s"> + </span>q<span class="s"> * </span>q),
-</code><code id="L4800"><span class="ln">4800</span> x<span class="s"> = </span>Q<span class="s"> - </span>q,
-</code><code id="L4801"><span class="ln">4801</span> X<span class="s"> = </span>pow(abs(x), <span class="d">1</span><span class="s"> / </span><span class="d">3</span>)<span class="s"> * </span>(x < <span class="d">0</span> ? -<span class="d">1</span> : <span class="d">1</span>),
-</code><code id="L4802"><span class="ln">4802</span> y<span class="s"> = </span>-Q<span class="s"> - </span>q,
-</code><code id="L4803"><span class="ln">4803</span> Y<span class="s"> = </span>pow(abs(y), <span class="d">1</span><span class="s"> / </span><span class="d">3</span>)<span class="s"> * </span>(y < <span class="d">0</span> ? -<span class="d">1</span> : <span class="d">1</span>),
-</code><code id="L4804"><span class="ln">4804</span> t<span class="s"> = </span>X<span class="s"> + </span>Y<span class="s"> + </span><span class="d">.5</span>;
-</code><code id="L4805"><span class="ln">4805</span> <b>return</b> (<span class="d">1</span><span class="s"> - </span>t)<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>t<span class="s"> + </span>t<span class="s"> * </span>t<span class="s"> * </span>t;
-</code><code id="L4806"><span class="ln">4806</span> },
-</code><code id="L4807"><span class="ln">4807</span> backIn: <b>function</b> (n) {
-</code><code id="L4808"><span class="ln">4808</span> <b>var</b> s<span class="s"> = </span><span class="d">1.70158</span>;
-</code><code id="L4809"><span class="ln">4809</span> <b>return</b> n<span class="s"> * </span>n<span class="s"> * </span>((s<span class="s"> + </span><span class="d">1</span>)<span class="s"> * </span>n<span class="s"> - </span>s);
-</code><code id="L4810"><span class="ln">4810</span> },
-</code><code id="L4811"><span class="ln">4811</span> backOut: <b>function</b> (n) {
-</code><code id="L4812"><span class="ln">4812</span> n<span class="s"> = </span>n<span class="s"> - </span><span class="d">1</span>;
-</code><code id="L4813"><span class="ln">4813</span> <b>var</b> s<span class="s"> = </span><span class="d">1.70158</span>;
-</code><code id="L4814"><span class="ln">4814</span> <b>return</b> n<span class="s"> * </span>n<span class="s"> * </span>((s<span class="s"> + </span><span class="d">1</span>)<span class="s"> * </span>n<span class="s"> + </span>s)<span class="s"> + </span><span class="d">1</span>;
-</code><code id="L4815"><span class="ln">4815</span> },
-</code><code id="L4816"><span class="ln">4816</span> elastic: <b>function</b> (n) {
-</code><code id="L4817"><span class="ln">4817</span> <b>if</b> (n<span class="s"> == </span>!!n) {
-</code><code id="L4818"><span class="ln">4818</span> <b>return</b> n;
-</code><code id="L4819"><span class="ln">4819</span> }
-</code><code id="L4820"><span class="ln">4820</span> <b>return</b> pow(<span class="d">2</span>, -<span class="d">10</span><span class="s"> * </span>n)<span class="s"> * </span>math.sin((n<span class="s"> - </span><span class="d">.075</span>)<span class="s"> * </span>(<span class="d">2</span><span class="s"> * </span>PI)<span class="s"> / </span><span class="d">.3</span>)<span class="s"> + </span><span class="d">1</span>;
-</code><code id="L4821"><span class="ln">4821</span> },
-</code><code id="L4822"><span class="ln">4822</span> bounce: <b>function</b> (n) {
-</code><code id="L4823"><span class="ln">4823</span> <b>var</b> s<span class="s"> = </span><span class="d">7.5625</span>,
-</code><code id="L4824"><span class="ln">4824</span> p<span class="s"> = </span><span class="d">2.75</span>,
-</code><code id="L4825"><span class="ln">4825</span> l;
-</code><code id="L4826"><span class="ln">4826</span> <b>if</b> (n < (<span class="d">1</span><span class="s"> / </span>p)) {
-</code><code id="L4827"><span class="ln">4827</span> l<span class="s"> = </span>s<span class="s"> * </span>n<span class="s"> * </span>n;
-</code><code id="L4828"><span class="ln">4828</span> } <b>else</b> {
-</code><code id="L4829"><span class="ln">4829</span> <b>if</b> (n < (<span class="d">2</span><span class="s"> / </span>p)) {
-</code><code id="L4830"><span class="ln">4830</span> n -= (<span class="d">1.5</span><span class="s"> / </span>p);
-</code><code id="L4831"><span class="ln">4831</span> l<span class="s"> = </span>s<span class="s"> * </span>n<span class="s"> * </span>n<span class="s"> + </span><span class="d">.75</span>;
-</code><code id="L4832"><span class="ln">4832</span> } <b>else</b> {
-</code><code id="L4833"><span class="ln">4833</span> <b>if</b> (n < (<span class="d">2.5</span><span class="s"> / </span>p)) {
-</code><code id="L4834"><span class="ln">4834</span> n -= (<span class="d">2.25</span><span class="s"> / </span>p);
-</code><code id="L4835"><span class="ln">4835</span> l<span class="s"> = </span>s<span class="s"> * </span>n<span class="s"> * </span>n<span class="s"> + </span><span class="d">.9375</span>;
-</code><code id="L4836"><span class="ln">4836</span> } <b>else</b> {
-</code><code id="L4837"><span class="ln">4837</span> n -= (<span class="d">2.625</span><span class="s"> / </span>p);
-</code><code id="L4838"><span class="ln">4838</span> l<span class="s"> = </span>s<span class="s"> * </span>n<span class="s"> * </span>n<span class="s"> + </span><span class="d">.984375</span>;
-</code><code id="L4839"><span class="ln">4839</span> }
-</code><code id="L4840"><span class="ln">4840</span> }
-</code><code id="L4841"><span class="ln">4841</span> }
-</code><code id="L4842"><span class="ln">4842</span> <b>return</b> l;
-</code><code id="L4843"><span class="ln">4843</span> }
-</code><code id="L4844"><span class="ln">4844</span> };
-</code><code id="L4845"><span class="ln">4845</span> ef.easeIn<span class="s"> = </span>ef[<i>"ease-<b>in</b>"</i>]<span class="s"> = </span>ef[<i>"<"</i>];
-</code><code id="L4846"><span class="ln">4846</span> ef.easeOut<span class="s"> = </span>ef[<i>"ease-out"</i>]<span class="s"> = </span>ef[<i>">"</i>];
-</code><code id="L4847"><span class="ln">4847</span> ef.easeInOut<span class="s"> = </span>ef[<i>"ease-<b>in</b>-out"</i>]<span class="s"> = </span>ef[<i>"<>"</i>];
-</code><code id="L4848"><span class="ln">4848</span> ef[<i>"back-<b>in</b>"</i>]<span class="s"> = </span>ef.backIn;
-</code><code id="L4849"><span class="ln">4849</span> ef[<i>"back-out"</i>]<span class="s"> = </span>ef.backOut;
-</code><code id="L4850"><span class="ln">4850</span>
-</code><code id="L4851"><span class="ln">4851</span> <b>var</b> animationElements<span class="s"> = </span>[],
-</code><code id="L4852"><span class="ln">4852</span> requestAnimFrame<span class="s"> = </span>window.requestAnimationFrame ||
-</code><code id="L4853"><span class="ln">4853</span> window.webkitRequestAnimationFrame ||
-</code><code id="L4854"><span class="ln">4854</span> window.mozRequestAnimationFrame ||
-</code><code id="L4855"><span class="ln">4855</span> window.oRequestAnimationFrame ||
-</code><code id="L4856"><span class="ln">4856</span> window.msRequestAnimationFrame ||
-</code><code id="L4857"><span class="ln">4857</span> <b>function</b> (callback) {
-</code><code id="L4858"><span class="ln">4858</span> setTimeout(callback, <span class="d">16</span>);
-</code><code id="L4859"><span class="ln">4859</span> },
-</code><code id="L4860"><span class="ln">4860</span> animation<span class="s"> = </span><b>function</b> () {
-</code><code id="L4861"><span class="ln">4861</span> <b>var</b> Now<span class="s"> = </span>+<b>new</b> Date,
-</code><code id="L4862"><span class="ln">4862</span> l<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L4863"><span class="ln">4863</span> <b>for</b> (; l < animationElements.length; l++) {
-</code><code id="L4864"><span class="ln">4864</span> <b>var</b> e<span class="s"> = </span>animationElements[l];
-</code><code id="L4865"><span class="ln">4865</span> <b>if</b> (e.el.removed<span class="s"> || </span>e.paused) {
-</code><code id="L4866"><span class="ln">4866</span> <b>continue</b>;
-</code><code id="L4867"><span class="ln">4867</span> }
-</code><code id="L4868"><span class="ln">4868</span> <b>var</b> time<span class="s"> = </span>Now<span class="s"> - </span>e.start,
-</code><code id="L4869"><span class="ln">4869</span> ms<span class="s"> = </span>e.ms,
-</code><code id="L4870"><span class="ln">4870</span> easing<span class="s"> = </span>e.easing,
-</code><code id="L4871"><span class="ln">4871</span> from<span class="s"> = </span>e.from,
-</code><code id="L4872"><span class="ln">4872</span> diff<span class="s"> = </span>e.diff,
-</code><code id="L4873"><span class="ln">4873</span> to<span class="s"> = </span>e.to,
-</code><code id="L4874"><span class="ln">4874</span> t<span class="s"> = </span>e.t,
-</code><code id="L4875"><span class="ln">4875</span> that<span class="s"> = </span>e.el,
-</code><code id="L4876"><span class="ln">4876</span> set<span class="s"> = </span>{},
-</code><code id="L4877"><span class="ln">4877</span> now;
-</code><code id="L4878"><span class="ln">4878</span> <b>if</b> (e.initstatus) {
-</code><code id="L4879"><span class="ln">4879</span> time<span class="s"> = </span>(e.initstatus<span class="s"> * </span>e.anim.top<span class="s"> - </span>e.prev)<span class="s"> / </span>(e.percent<span class="s"> - </span>e.prev)<span class="s"> * </span>ms;
-</code><code id="L4880"><span class="ln">4880</span> e.status<span class="s"> = </span>e.initstatus;
-</code><code id="L4881"><span class="ln">4881</span> <b>delete</b> e.initstatus;
-</code><code id="L4882"><span class="ln">4882</span> e.stop<span class="s"> && </span>animationElements.splice(l--, <span class="d">1</span>);
+</span></code><code id="L4740"><span class="ln">4740</span><span class="c"> <span class="s"> = </span>(object) representation of the point:
+</span></code><code id="L4741"><span class="ln">4741</span><span class="c"> o {
+</span></code><code id="L4742"><span class="ln">4742</span><span class="c"> o x: (number) x coordinate
+</span></code><code id="L4743"><span class="ln">4743</span><span class="c"> o y: (number) y coordinate
+</span></code><code id="L4744"><span class="ln">4744</span><span class="c"> o alpha: (number) angle of derivative
+</span></code><code id="L4745"><span class="ln">4745</span><span class="c"> o }
+</span></code><code id="L4746"><span class="ln">4746</span><span class="c"> \*/</span>
+</code><code id="L4747"><span class="ln">4747</span> R.getPointAtLength<span class="s"> = </span>getPointAtLength;
+</code><code id="L4748"><span class="ln">4748</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4749"><span class="ln">4749</span><span class="c"> <span class="s"> * </span>Raphael.getSubpath
+</span></code><code id="L4750"><span class="ln">4750</span><span class="c"> [ method ]
+</span></code><code id="L4751"><span class="ln">4751</span><span class="c"> **
+</span></code><code id="L4752"><span class="ln">4752</span><span class="c"> <span class="s"> * </span>Return subpath of a given path from given length to given length.
+</span></code><code id="L4753"><span class="ln">4753</span><span class="c"> **
+</span></code><code id="L4754"><span class="ln">4754</span><span class="c"> > Parameters
+</span></code><code id="L4755"><span class="ln">4755</span><span class="c"> **
+</span></code><code id="L4756"><span class="ln">4756</span><span class="c"> <span class="s"> - </span>path (string) SVG path string
+</span></code><code id="L4757"><span class="ln">4757</span><span class="c"> <span class="s"> - </span>from (number) position of the start of the segment
+</span></code><code id="L4758"><span class="ln">4758</span><span class="c"> <span class="s"> - </span>to (number) position of the end of the segment
+</span></code><code id="L4759"><span class="ln">4759</span><span class="c"> **
+</span></code><code id="L4760"><span class="ln">4760</span><span class="c"> <span class="s"> = </span>(string) pathstring <b>for</b> the segment
+</span></code><code id="L4761"><span class="ln">4761</span><span class="c"> \*/</span>
+</code><code id="L4762"><span class="ln">4762</span> R.getSubpath<span class="s"> = </span><b>function</b> (path, from, to) {
+</code><code id="L4763"><span class="ln">4763</span> <b>if</b> (abs(<b>this</b>.getTotalLength(path)<span class="s"> - </span>to) < <span class="d">1e-6</span>) {
+</code><code id="L4764"><span class="ln">4764</span> <b>return</b> getSubpathsAtLength(path, from).end;
+</code><code id="L4765"><span class="ln">4765</span> }
+</code><code id="L4766"><span class="ln">4766</span> <b>var</b> a<span class="s"> = </span>getSubpathsAtLength(path, to, <span class="d">1</span>);
+</code><code id="L4767"><span class="ln">4767</span> <b>return</b> from ? getSubpathsAtLength(a, from).end : a;
+</code><code id="L4768"><span class="ln">4768</span> };
+</code><code id="L4769"><span class="ln">4769</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4770"><span class="ln">4770</span><span class="c"> <span class="s"> * </span>Element.getTotalLength
+</span></code><code id="L4771"><span class="ln">4771</span><span class="c"> [ method ]
+</span></code><code id="L4772"><span class="ln">4772</span><span class="c"> **
+</span></code><code id="L4773"><span class="ln">4773</span><span class="c"> <span class="s"> * </span>Returns length of the path <b>in</b> pixels. Only works <b>for</b> element of “path” type.
+</span></code><code id="L4774"><span class="ln">4774</span><span class="c"> <span class="s"> = </span>(number) length.
+</span></code><code id="L4775"><span class="ln">4775</span><span class="c"> \*/</span>
+</code><code id="L4776"><span class="ln">4776</span> elproto.getTotalLength<span class="s"> = </span><b>function</b> () {
+</code><code id="L4777"><span class="ln">4777</span> <b>if</b> (<b>this</b>.type != <i>"path"</i>) {<b>return</b>;}
+</code><code id="L4778"><span class="ln">4778</span> <b>if</b> (<b>this</b>.node.getTotalLength) {
+</code><code id="L4779"><span class="ln">4779</span> <b>return</b> <b>this</b>.node.getTotalLength();
+</code><code id="L4780"><span class="ln">4780</span> }
+</code><code id="L4781"><span class="ln">4781</span> <b>return</b> getTotalLength(<b>this</b>.attrs.path);
+</code><code id="L4782"><span class="ln">4782</span> };
+</code><code id="L4783"><span class="ln">4783</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4784"><span class="ln">4784</span><span class="c"> <span class="s"> * </span>Element.getPointAtLength
+</span></code><code id="L4785"><span class="ln">4785</span><span class="c"> [ method ]
+</span></code><code id="L4786"><span class="ln">4786</span><span class="c"> **
+</span></code><code id="L4787"><span class="ln">4787</span><span class="c"> <span class="s"> * </span>Return coordinates of the point located at the given length on the given path. Only works <b>for</b> element of “path” type.
+</span></code><code id="L4788"><span class="ln">4788</span><span class="c"> **
+</span></code><code id="L4789"><span class="ln">4789</span><span class="c"> > Parameters
+</span></code><code id="L4790"><span class="ln">4790</span><span class="c"> **
+</span></code><code id="L4791"><span class="ln">4791</span><span class="c"> <span class="s"> - </span>length (number)
+</span></code><code id="L4792"><span class="ln">4792</span><span class="c"> **
+</span></code><code id="L4793"><span class="ln">4793</span><span class="c"> <span class="s"> = </span>(object) representation of the point:
+</span></code><code id="L4794"><span class="ln">4794</span><span class="c"> o {
+</span></code><code id="L4795"><span class="ln">4795</span><span class="c"> o x: (number) x coordinate
+</span></code><code id="L4796"><span class="ln">4796</span><span class="c"> o y: (number) y coordinate
+</span></code><code id="L4797"><span class="ln">4797</span><span class="c"> o alpha: (number) angle of derivative
+</span></code><code id="L4798"><span class="ln">4798</span><span class="c"> o }
+</span></code><code id="L4799"><span class="ln">4799</span><span class="c"> \*/</span>
+</code><code id="L4800"><span class="ln">4800</span> elproto.getPointAtLength<span class="s"> = </span><b>function</b> (length) {
+</code><code id="L4801"><span class="ln">4801</span> <b>if</b> (<b>this</b>.type != <i>"path"</i>) {<b>return</b>;}
+</code><code id="L4802"><span class="ln">4802</span> <b>return</b> getPointAtLength(<b>this</b>.attrs.path, length);
+</code><code id="L4803"><span class="ln">4803</span> };
+</code><code id="L4804"><span class="ln">4804</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4805"><span class="ln">4805</span><span class="c"> <span class="s"> * </span>Element.getSubpath
+</span></code><code id="L4806"><span class="ln">4806</span><span class="c"> [ method ]
+</span></code><code id="L4807"><span class="ln">4807</span><span class="c"> **
+</span></code><code id="L4808"><span class="ln">4808</span><span class="c"> <span class="s"> * </span>Return subpath of a given element from given length to given length. Only works <b>for</b> element of “path” type.
+</span></code><code id="L4809"><span class="ln">4809</span><span class="c"> **
+</span></code><code id="L4810"><span class="ln">4810</span><span class="c"> > Parameters
+</span></code><code id="L4811"><span class="ln">4811</span><span class="c"> **
+</span></code><code id="L4812"><span class="ln">4812</span><span class="c"> <span class="s"> - </span>from (number) position of the start of the segment
+</span></code><code id="L4813"><span class="ln">4813</span><span class="c"> <span class="s"> - </span>to (number) position of the end of the segment
+</span></code><code id="L4814"><span class="ln">4814</span><span class="c"> **
+</span></code><code id="L4815"><span class="ln">4815</span><span class="c"> <span class="s"> = </span>(string) pathstring <b>for</b> the segment
+</span></code><code id="L4816"><span class="ln">4816</span><span class="c"> \*/</span>
+</code><code id="L4817"><span class="ln">4817</span> elproto.getSubpath<span class="s"> = </span><b>function</b> (from, to) {
+</code><code id="L4818"><span class="ln">4818</span> <b>if</b> (<b>this</b>.type != <i>"path"</i>) {<b>return</b>;}
+</code><code id="L4819"><span class="ln">4819</span> <b>return</b> R.getSubpath(<b>this</b>.attrs.path, from, to);
+</code><code id="L4820"><span class="ln">4820</span> };
+</code><code id="L4821"><span class="ln">4821</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L4822"><span class="ln">4822</span><span class="c"> <span class="s"> * </span>Raphael.easing_formulas
+</span></code><code id="L4823"><span class="ln">4823</span><span class="c"> [ property ]
+</span></code><code id="L4824"><span class="ln">4824</span><span class="c"> **
+</span></code><code id="L4825"><span class="ln">4825</span><span class="c"> <span class="s"> * </span>Object that contains easing formulas <b>for</b> animation. You could extend it <b>with</b> your own. By <b>default</b> it has following list of easing:
+</span></code><code id="L4826"><span class="ln">4826</span><span class="c"> # <ul>
+</span></code><code id="L4827"><span class="ln">4827</span><span class="c"> # <li>“linear”</li>
+</span></code><code id="L4828"><span class="ln">4828</span><span class="c"> # <li>“<” or “easeIn” or “ease-<b>in</b>”</li>
+</span></code><code id="L4829"><span class="ln">4829</span><span class="c"> # <li>“>” or “easeOut” or “ease-out”</li>
+</span></code><code id="L4830"><span class="ln">4830</span><span class="c"> # <li>“<>” or “easeInOut” or “ease-<b>in</b>-out”</li>
+</span></code><code id="L4831"><span class="ln">4831</span><span class="c"> # <li>“backIn” or “back-<b>in</b>”</li>
+</span></code><code id="L4832"><span class="ln">4832</span><span class="c"> # <li>“backOut” or “back-out”</li>
+</span></code><code id="L4833"><span class="ln">4833</span><span class="c"> # <li>“elastic”</li>
+</span></code><code id="L4834"><span class="ln">4834</span><span class="c"> # <li>“bounce”</li>
+</span></code><code id="L4835"><span class="ln">4835</span><span class="c"> # </ul>
+</span></code><code id="L4836"><span class="ln">4836</span><span class="c"> # <p>See also <a href=<i>"http:<span class="c">//raphaeljs.com/easing.html"</i>>Easing demo</a>.</p></span>
+</span></code><code id="L4837"><span class="ln">4837</span><span class="c"> \*/</span>
+</code><code id="L4838"><span class="ln">4838</span> <b>var</b> ef<span class="s"> = </span>R.easing_formulas<span class="s"> = </span>{
+</code><code id="L4839"><span class="ln">4839</span> linear: <b>function</b> (n) {
+</code><code id="L4840"><span class="ln">4840</span> <b>return</b> n;
+</code><code id="L4841"><span class="ln">4841</span> },
+</code><code id="L4842"><span class="ln">4842</span> <i>"<"</i>: <b>function</b> (n) {
+</code><code id="L4843"><span class="ln">4843</span> <b>return</b> pow(n, <span class="d">1.7</span>);
+</code><code id="L4844"><span class="ln">4844</span> },
+</code><code id="L4845"><span class="ln">4845</span> <i>">"</i>: <b>function</b> (n) {
+</code><code id="L4846"><span class="ln">4846</span> <b>return</b> pow(n, <span class="d">.48</span>);
+</code><code id="L4847"><span class="ln">4847</span> },
+</code><code id="L4848"><span class="ln">4848</span> <i>"<>"</i>: <b>function</b> (n) {
+</code><code id="L4849"><span class="ln">4849</span> <b>var</b> q<span class="s"> = </span><span class="d">.48</span><span class="s"> - </span>n<span class="s"> / </span><span class="d">1.04</span>,
+</code><code id="L4850"><span class="ln">4850</span> Q<span class="s"> = </span>math.sqrt(<span class="d">.1734</span><span class="s"> + </span>q<span class="s"> * </span>q),
+</code><code id="L4851"><span class="ln">4851</span> x<span class="s"> = </span>Q<span class="s"> - </span>q,
+</code><code id="L4852"><span class="ln">4852</span> X<span class="s"> = </span>pow(abs(x), <span class="d">1</span><span class="s"> / </span><span class="d">3</span>)<span class="s"> * </span>(x < <span class="d">0</span> ? -<span class="d">1</span> : <span class="d">1</span>),
+</code><code id="L4853"><span class="ln">4853</span> y<span class="s"> = </span>-Q<span class="s"> - </span>q,
+</code><code id="L4854"><span class="ln">4854</span> Y<span class="s"> = </span>pow(abs(y), <span class="d">1</span><span class="s"> / </span><span class="d">3</span>)<span class="s"> * </span>(y < <span class="d">0</span> ? -<span class="d">1</span> : <span class="d">1</span>),
+</code><code id="L4855"><span class="ln">4855</span> t<span class="s"> = </span>X<span class="s"> + </span>Y<span class="s"> + </span><span class="d">.5</span>;
+</code><code id="L4856"><span class="ln">4856</span> <b>return</b> (<span class="d">1</span><span class="s"> - </span>t)<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>t<span class="s"> + </span>t<span class="s"> * </span>t<span class="s"> * </span>t;
+</code><code id="L4857"><span class="ln">4857</span> },
+</code><code id="L4858"><span class="ln">4858</span> backIn: <b>function</b> (n) {
+</code><code id="L4859"><span class="ln">4859</span> <b>var</b> s<span class="s"> = </span><span class="d">1.70158</span>;
+</code><code id="L4860"><span class="ln">4860</span> <b>return</b> n<span class="s"> * </span>n<span class="s"> * </span>((s<span class="s"> + </span><span class="d">1</span>)<span class="s"> * </span>n<span class="s"> - </span>s);
+</code><code id="L4861"><span class="ln">4861</span> },
+</code><code id="L4862"><span class="ln">4862</span> backOut: <b>function</b> (n) {
+</code><code id="L4863"><span class="ln">4863</span> n<span class="s"> = </span>n<span class="s"> - </span><span class="d">1</span>;
+</code><code id="L4864"><span class="ln">4864</span> <b>var</b> s<span class="s"> = </span><span class="d">1.70158</span>;
+</code><code id="L4865"><span class="ln">4865</span> <b>return</b> n<span class="s"> * </span>n<span class="s"> * </span>((s<span class="s"> + </span><span class="d">1</span>)<span class="s"> * </span>n<span class="s"> + </span>s)<span class="s"> + </span><span class="d">1</span>;
+</code><code id="L4866"><span class="ln">4866</span> },
+</code><code id="L4867"><span class="ln">4867</span> elastic: <b>function</b> (n) {
+</code><code id="L4868"><span class="ln">4868</span> <b>if</b> (n<span class="s"> == </span>!!n) {
+</code><code id="L4869"><span class="ln">4869</span> <b>return</b> n;
+</code><code id="L4870"><span class="ln">4870</span> }
+</code><code id="L4871"><span class="ln">4871</span> <b>return</b> pow(<span class="d">2</span>, -<span class="d">10</span><span class="s"> * </span>n)<span class="s"> * </span>math.sin((n<span class="s"> - </span><span class="d">.075</span>)<span class="s"> * </span>(<span class="d">2</span><span class="s"> * </span>PI)<span class="s"> / </span><span class="d">.3</span>)<span class="s"> + </span><span class="d">1</span>;
+</code><code id="L4872"><span class="ln">4872</span> },
+</code><code id="L4873"><span class="ln">4873</span> bounce: <b>function</b> (n) {
+</code><code id="L4874"><span class="ln">4874</span> <b>var</b> s<span class="s"> = </span><span class="d">7.5625</span>,
+</code><code id="L4875"><span class="ln">4875</span> p<span class="s"> = </span><span class="d">2.75</span>,
+</code><code id="L4876"><span class="ln">4876</span> l;
+</code><code id="L4877"><span class="ln">4877</span> <b>if</b> (n < (<span class="d">1</span><span class="s"> / </span>p)) {
+</code><code id="L4878"><span class="ln">4878</span> l<span class="s"> = </span>s<span class="s"> * </span>n<span class="s"> * </span>n;
+</code><code id="L4879"><span class="ln">4879</span> } <b>else</b> {
+</code><code id="L4880"><span class="ln">4880</span> <b>if</b> (n < (<span class="d">2</span><span class="s"> / </span>p)) {
+</code><code id="L4881"><span class="ln">4881</span> n -= (<span class="d">1.5</span><span class="s"> / </span>p);
+</code><code id="L4882"><span class="ln">4882</span> l<span class="s"> = </span>s<span class="s"> * </span>n<span class="s"> * </span>n<span class="s"> + </span><span class="d">.75</span>;
</code><code id="L4883"><span class="ln">4883</span> } <b>else</b> {
-</code><code id="L4884"><span class="ln">4884</span> e.status<span class="s"> = </span>(e.prev<span class="s"> + </span>(e.percent<span class="s"> - </span>e.prev)<span class="s"> * </span>(time<span class="s"> / </span>ms))<span class="s"> / </span>e.anim.top;
-</code><code id="L4885"><span class="ln">4885</span> }
-</code><code id="L4886"><span class="ln">4886</span> <b>if</b> (time < <span class="d">0</span>) {
-</code><code id="L4887"><span class="ln">4887</span> <b>continue</b>;
-</code><code id="L4888"><span class="ln">4888</span> }
-</code><code id="L4889"><span class="ln">4889</span> <b>if</b> (time < ms) {
-</code><code id="L4890"><span class="ln">4890</span> <b>var</b> pos<span class="s"> = </span>easing(time<span class="s"> / </span>ms);
-</code><code id="L4891"><span class="ln">4891</span> <b>for</b> (<b>var</b> attr <b>in</b> from) <b>if</b> (from[has](attr)) {
-</code><code id="L4892"><span class="ln">4892</span> <b>switch</b> (availableAnimAttrs[attr]) {
-</code><code id="L4893"><span class="ln">4893</span> <b>case</b> nu:
-</code><code id="L4894"><span class="ln">4894</span> now<span class="s"> = </span>+from[attr]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr];
-</code><code id="L4895"><span class="ln">4895</span> <b>break</b>;
-</code><code id="L4896"><span class="ln">4896</span> <b>case</b> <i>"colour"</i>:
-</code><code id="L4897"><span class="ln">4897</span> now<span class="s"> = </span><i>"rgb("</i><span class="s"> + </span>[
-</code><code id="L4898"><span class="ln">4898</span> upto255(round(from[attr].r<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr].r)),
-</code><code id="L4899"><span class="ln">4899</span> upto255(round(from[attr].g<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr].g)),
-</code><code id="L4900"><span class="ln">4900</span> upto255(round(from[attr].b<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr].b))
-</code><code id="L4901"><span class="ln">4901</span> ].join(<i>","</i>)<span class="s"> + </span><i>")"</i>;
-</code><code id="L4902"><span class="ln">4902</span> <b>break</b>;
-</code><code id="L4903"><span class="ln">4903</span> <b>case</b> <i>"path"</i>:
-</code><code id="L4904"><span class="ln">4904</span> now<span class="s"> = </span>[];
-</code><code id="L4905"><span class="ln">4905</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>from[attr].length; i < ii; i++) {
-</code><code id="L4906"><span class="ln">4906</span> now[i]<span class="s"> = </span>[from[attr][i][<span class="d">0</span>]];
-</code><code id="L4907"><span class="ln">4907</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>from[attr][i].length; j < jj; j++) {
-</code><code id="L4908"><span class="ln">4908</span> now[i][j]<span class="s"> = </span>+from[attr][i][j]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i][j];
-</code><code id="L4909"><span class="ln">4909</span> }
-</code><code id="L4910"><span class="ln">4910</span> now[i]<span class="s"> = </span>now[i].join(S);
-</code><code id="L4911"><span class="ln">4911</span> }
-</code><code id="L4912"><span class="ln">4912</span> now<span class="s"> = </span>now.join(S);
-</code><code id="L4913"><span class="ln">4913</span> <b>break</b>;
-</code><code id="L4914"><span class="ln">4914</span> <b>case</b> <i>"transform"</i>:
-</code><code id="L4915"><span class="ln">4915</span> <b>if</b> (diff[attr].real) {
-</code><code id="L4916"><span class="ln">4916</span> now<span class="s"> = </span>[];
-</code><code id="L4917"><span class="ln">4917</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>from[attr].length; i < ii; i++) {
-</code><code id="L4918"><span class="ln">4918</span> now[i]<span class="s"> = </span>[from[attr][i][<span class="d">0</span>]];
-</code><code id="L4919"><span class="ln">4919</span> <b>for</b> (j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>from[attr][i].length; j < jj; j++) {
-</code><code id="L4920"><span class="ln">4920</span> now[i][j]<span class="s"> = </span>from[attr][i][j]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i][j];
-</code><code id="L4921"><span class="ln">4921</span> }
-</code><code id="L4922"><span class="ln">4922</span> }
-</code><code id="L4923"><span class="ln">4923</span> } <b>else</b> {
-</code><code id="L4924"><span class="ln">4924</span> <b>var</b> get<span class="s"> = </span><b>function</b> (i) {
-</code><code id="L4925"><span class="ln">4925</span> <b>return</b> +from[attr][i]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i];
-</code><code id="L4926"><span class="ln">4926</span> };
-</code><code id="L4927"><span class="ln">4927</span> <span class="c">// now<span class="s"> = </span>[[<i>"r"</i>, get(<span class="d">2</span>), <span class="d">0</span>, <span class="d">0</span>], [<i>"t"</i>, get(<span class="d">3</span>), get(<span class="d">4</span>)], [<i>"s"</i>, get(<span class="d">0</span>), get(<span class="d">1</span>), <span class="d">0</span>, <span class="d">0</span>]];</span>
-</code><code id="L4928"><span class="ln">4928</span> now<span class="s"> = </span>[[<i>"m"</i>, get(<span class="d">0</span>), get(<span class="d">1</span>), get(<span class="d">2</span>), get(<span class="d">3</span>), get(<span class="d">4</span>), get(<span class="d">5</span>)]];
-</code><code id="L4929"><span class="ln">4929</span> }
-</code><code id="L4930"><span class="ln">4930</span> <b>break</b>;
-</code><code id="L4931"><span class="ln">4931</span> <b>case</b> <i>"csv"</i>:
-</code><code id="L4932"><span class="ln">4932</span> <b>if</b> (attr<span class="s"> == </span><i>"clip-rect"</i>) {
-</code><code id="L4933"><span class="ln">4933</span> now<span class="s"> = </span>[];
-</code><code id="L4934"><span class="ln">4934</span> i<span class="s"> = </span><span class="d">4</span>;
-</code><code id="L4935"><span class="ln">4935</span> <b>while</b> (i--) {
-</code><code id="L4936"><span class="ln">4936</span> now[i]<span class="s"> = </span>+from[attr][i]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i];
-</code><code id="L4937"><span class="ln">4937</span> }
-</code><code id="L4938"><span class="ln">4938</span> }
-</code><code id="L4939"><span class="ln">4939</span> <b>break</b>;
-</code><code id="L4940"><span class="ln">4940</span> <b>default</b>:
-</code><code id="L4941"><span class="ln">4941</span> <b>var</b> from2<span class="s"> = </span>[].concat(from[attr]);
-</code><code id="L4942"><span class="ln">4942</span> now<span class="s"> = </span>[];
-</code><code id="L4943"><span class="ln">4943</span> i<span class="s"> = </span>that.paper.customAttributes[attr].length;
-</code><code id="L4944"><span class="ln">4944</span> <b>while</b> (i--) {
-</code><code id="L4945"><span class="ln">4945</span> now[i]<span class="s"> = </span>+from2[i]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i];
-</code><code id="L4946"><span class="ln">4946</span> }
-</code><code id="L4947"><span class="ln">4947</span> <b>break</b>;
-</code><code id="L4948"><span class="ln">4948</span> }
-</code><code id="L4949"><span class="ln">4949</span> set[attr]<span class="s"> = </span>now;
-</code><code id="L4950"><span class="ln">4950</span> }
-</code><code id="L4951"><span class="ln">4951</span> that.attr(set);
-</code><code id="L4952"><span class="ln">4952</span> (<b>function</b> (id, that, anim) {
-</code><code id="L4953"><span class="ln">4953</span> setTimeout(<b>function</b> () {
-</code><code id="L4954"><span class="ln">4954</span> eve(<i>"anim.frame."</i><span class="s"> + </span>id, that, anim);
-</code><code id="L4955"><span class="ln">4955</span> });
-</code><code id="L4956"><span class="ln">4956</span> })(that.id, that, e.anim);
-</code><code id="L4957"><span class="ln">4957</span> } <b>else</b> {
-</code><code id="L4958"><span class="ln">4958</span> (<b>function</b>(f, el, a) {
-</code><code id="L4959"><span class="ln">4959</span> setTimeout(<b>function</b>() {
-</code><code id="L4960"><span class="ln">4960</span> eve(<i>"anim.finish."</i><span class="s"> + </span>el.id, el, a);
-</code><code id="L4961"><span class="ln">4961</span> R.is(f, <i>"<b>function</b>"</i>)<span class="s"> && </span>f.call(el);
-</code><code id="L4962"><span class="ln">4962</span> });
-</code><code id="L4963"><span class="ln">4963</span> })(e.callback, that, e.anim);
-</code><code id="L4964"><span class="ln">4964</span> <b>if</b> (--e.repeat) {
-</code><code id="L4965"><span class="ln">4965</span> that.attr(e.origin);
-</code><code id="L4966"><span class="ln">4966</span> e.start<span class="s"> = </span>Now;
-</code><code id="L4967"><span class="ln">4967</span> } <b>else</b> {
-</code><code id="L4968"><span class="ln">4968</span> that.attr(to);
-</code><code id="L4969"><span class="ln">4969</span> animationElements.splice(l--, <span class="d">1</span>);
-</code><code id="L4970"><span class="ln">4970</span> }
-</code><code id="L4971"><span class="ln">4971</span> <b>if</b> (e.next<span class="s"> && </span>!e.stop) {
-</code><code id="L4972"><span class="ln">4972</span> runAnimation(e.anim, e.el, e.next, <b>null</b>, e.totalOrigin);
-</code><code id="L4973"><span class="ln">4973</span> }
-</code><code id="L4974"><span class="ln">4974</span> }
-</code><code id="L4975"><span class="ln">4975</span> }
-</code><code id="L4976"><span class="ln">4976</span> R.svg<span class="s"> && </span>that<span class="s"> && </span>that.paper<span class="s"> && </span>that.paper.safari();
-</code><code id="L4977"><span class="ln">4977</span> animationElements.length<span class="s"> && </span>requestAnimFrame(animation);
-</code><code id="L4978"><span class="ln">4978</span> },
-</code><code id="L4979"><span class="ln">4979</span> upto255<span class="s"> = </span><b>function</b> (color) {
-</code><code id="L4980"><span class="ln">4980</span> <b>return</b> mmax(mmin(color, <span class="d">255</span>), <span class="d">0</span>);
-</code><code id="L4981"><span class="ln">4981</span> };
-</code><code id="L4982"><span class="ln">4982</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L4983"><span class="ln">4983</span><span class="c"> <span class="s"> * </span>Element.animateWith
-</span></code><code id="L4984"><span class="ln">4984</span><span class="c"> [ method ]
-</span></code><code id="L4985"><span class="ln">4985</span><span class="c"> **
-</span></code><code id="L4986"><span class="ln">4986</span><span class="c"> <span class="s"> * </span>Acts similar to @Element.animate, but ensure that given animation runs <b>in</b> sync <b>with</b> another given element.
-</span></code><code id="L4987"><span class="ln">4987</span><span class="c"> **
-</span></code><code id="L4988"><span class="ln">4988</span><span class="c"> > Parameters
-</span></code><code id="L4989"><span class="ln">4989</span><span class="c"> **
-</span></code><code id="L4990"><span class="ln">4990</span><span class="c"> <span class="s"> - </span>params (object) <b>final</b> attributes <b>for</b> the element, see also @Element.attr
-</span></code><code id="L4991"><span class="ln">4991</span><span class="c"> <span class="s"> - </span>ms (number) number of milliseconds <b>for</b> animation to run
-</span></code><code id="L4992"><span class="ln">4992</span><span class="c"> <span class="s"> - </span>easing (string) #optional easing type. Accept on of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX)`
-</span></code><code id="L4993"><span class="ln">4993</span><span class="c"> <span class="s"> - </span>callback (<b>function</b>) #optional callback <b>function</b>. Will be called at the end of animation.
-</span></code><code id="L4994"><span class="ln">4994</span><span class="c"> <span class="s"> * </span>or
-</span></code><code id="L4995"><span class="ln">4995</span><span class="c"> <span class="s"> - </span>animation (object) animation object, see @Raphael.animation
-</span></code><code id="L4996"><span class="ln">4996</span><span class="c"> **
-</span></code><code id="L4997"><span class="ln">4997</span><span class="c"> <span class="s"> = </span>(object) original element
-</span></code><code id="L4998"><span class="ln">4998</span><span class="c"> \*/</span>
-</code><code id="L4999"><span class="ln">4999</span> elproto.animateWith<span class="s"> = </span><b>function</b> (element, params, ms, easing, callback) {
-</code><code id="L5000"><span class="ln">5000</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>animationElements.length; i < ii; i++) {
-</code><code id="L5001"><span class="ln">5001</span> <b>if</b> (animationElements[i].el.id<span class="s"> == </span>element.id) {
-</code><code id="L5002"><span class="ln">5002</span> params.start<span class="s"> = </span>animationElements[i].timestamp;
-</code><code id="L5003"><span class="ln">5003</span> <b>break</b>;
-</code><code id="L5004"><span class="ln">5004</span> }
-</code><code id="L5005"><span class="ln">5005</span> }
-</code><code id="L5006"><span class="ln">5006</span> <b>return</b> <b>this</b>.animate(params, ms, easing, callback);
-</code><code id="L5007"><span class="ln">5007</span> };
-</code><code id="L5008"><span class="ln">5008</span> <b>function</b> CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) {
-</code><code id="L5009"><span class="ln">5009</span> <b>var</b> cx<span class="s"> = </span><span class="d">3</span><span class="s"> * </span>p1x,
-</code><code id="L5010"><span class="ln">5010</span> bx<span class="s"> = </span><span class="d">3</span><span class="s"> * </span>(p2x<span class="s"> - </span>p1x)<span class="s"> - </span>cx,
-</code><code id="L5011"><span class="ln">5011</span> ax<span class="s"> = </span><span class="d">1</span><span class="s"> - </span>cx<span class="s"> - </span>bx,
-</code><code id="L5012"><span class="ln">5012</span> cy<span class="s"> = </span><span class="d">3</span><span class="s"> * </span>p1y,
-</code><code id="L5013"><span class="ln">5013</span> by<span class="s"> = </span><span class="d">3</span><span class="s"> * </span>(p2y<span class="s"> - </span>p1y)<span class="s"> - </span>cy,
-</code><code id="L5014"><span class="ln">5014</span> ay<span class="s"> = </span><span class="d">1</span><span class="s"> - </span>cy<span class="s"> - </span>by;
-</code><code id="L5015"><span class="ln">5015</span> <b>function</b> sampleCurveX(t) {
-</code><code id="L5016"><span class="ln">5016</span> <b>return</b> ((ax<span class="s"> * </span>t<span class="s"> + </span>bx)<span class="s"> * </span>t<span class="s"> + </span>cx)<span class="s"> * </span>t;
-</code><code id="L5017"><span class="ln">5017</span> }
-</code><code id="L5018"><span class="ln">5018</span> <b>function</b> solve(x, epsilon) {
-</code><code id="L5019"><span class="ln">5019</span> <b>var</b> t<span class="s"> = </span>solveCurveX(x, epsilon);
-</code><code id="L5020"><span class="ln">5020</span> <b>return</b> ((ay<span class="s"> * </span>t<span class="s"> + </span>by)<span class="s"> * </span>t<span class="s"> + </span>cy)<span class="s"> * </span>t;
-</code><code id="L5021"><span class="ln">5021</span> }
-</code><code id="L5022"><span class="ln">5022</span> <b>function</b> solveCurveX(x, epsilon) {
-</code><code id="L5023"><span class="ln">5023</span> <b>var</b> t0, t1, t2, x2, d2, i;
-</code><code id="L5024"><span class="ln">5024</span> <b>for</b>(t2<span class="s"> = </span>x, i<span class="s"> = </span><span class="d">0</span>; i < <span class="d">8</span>; i++) {
-</code><code id="L5025"><span class="ln">5025</span> x2<span class="s"> = </span>sampleCurveX(t2)<span class="s"> - </span>x;
-</code><code id="L5026"><span class="ln">5026</span> <b>if</b> (abs(x2) < epsilon) {
-</code><code id="L5027"><span class="ln">5027</span> <b>return</b> t2;
-</code><code id="L5028"><span class="ln">5028</span> }
-</code><code id="L5029"><span class="ln">5029</span> d2<span class="s"> = </span>(<span class="d">3</span><span class="s"> * </span>ax<span class="s"> * </span>t2<span class="s"> + </span><span class="d">2</span><span class="s"> * </span>bx)<span class="s"> * </span>t2<span class="s"> + </span>cx;
-</code><code id="L5030"><span class="ln">5030</span> <b>if</b> (abs(d2) < <span class="d">1e-6</span>) {
-</code><code id="L5031"><span class="ln">5031</span> <b>break</b>;
-</code><code id="L5032"><span class="ln">5032</span> }
-</code><code id="L5033"><span class="ln">5033</span> t2<span class="s"> = </span>t2<span class="s"> - </span>x2<span class="s"> / </span>d2;
-</code><code id="L5034"><span class="ln">5034</span> }
-</code><code id="L5035"><span class="ln">5035</span> t0<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L5036"><span class="ln">5036</span> t1<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L5037"><span class="ln">5037</span> t2<span class="s"> = </span>x;
-</code><code id="L5038"><span class="ln">5038</span> <b>if</b> (t2 < t0) {
-</code><code id="L5039"><span class="ln">5039</span> <b>return</b> t0;
-</code><code id="L5040"><span class="ln">5040</span> }
-</code><code id="L5041"><span class="ln">5041</span> <b>if</b> (t2 > t1) {
-</code><code id="L5042"><span class="ln">5042</span> <b>return</b> t1;
-</code><code id="L5043"><span class="ln">5043</span> }
-</code><code id="L5044"><span class="ln">5044</span> <b>while</b> (t0 < t1) {
-</code><code id="L5045"><span class="ln">5045</span> x2<span class="s"> = </span>sampleCurveX(t2);
-</code><code id="L5046"><span class="ln">5046</span> <b>if</b> (abs(x2<span class="s"> - </span>x) < epsilon) {
-</code><code id="L5047"><span class="ln">5047</span> <b>return</b> t2;
-</code><code id="L5048"><span class="ln">5048</span> }
-</code><code id="L5049"><span class="ln">5049</span> <b>if</b> (x > x2) {
-</code><code id="L5050"><span class="ln">5050</span> t0<span class="s"> = </span>t2;
-</code><code id="L5051"><span class="ln">5051</span> } <b>else</b> {
-</code><code id="L5052"><span class="ln">5052</span> t1<span class="s"> = </span>t2;
-</code><code id="L5053"><span class="ln">5053</span> }
-</code><code id="L5054"><span class="ln">5054</span> t2<span class="s"> = </span>(t1<span class="s"> - </span>t0)<span class="s"> / </span><span class="d">2</span><span class="s"> + </span>t0;
-</code><code id="L5055"><span class="ln">5055</span> }
-</code><code id="L5056"><span class="ln">5056</span> <b>return</b> t2;
-</code><code id="L5057"><span class="ln">5057</span> }
-</code><code id="L5058"><span class="ln">5058</span> <b>return</b> solve(t, <span class="d">1</span><span class="s"> / </span>(<span class="d">200</span><span class="s"> * </span>duration));
-</code><code id="L5059"><span class="ln">5059</span> }
-</code><code id="L5060"><span class="ln">5060</span> elproto.onAnimation<span class="s"> = </span><b>function</b> (f) {
-</code><code id="L5061"><span class="ln">5061</span> f ? eve.on(<i>"anim.frame."</i><span class="s"> + </span><b>this</b>.id, f) : eve.unbind(<i>"anim.frame."</i><span class="s"> + </span><b>this</b>.id);
-</code><code id="L5062"><span class="ln">5062</span> <b>return</b> <b>this</b>;
+</code><code id="L4884"><span class="ln">4884</span> <b>if</b> (n < (<span class="d">2.5</span><span class="s"> / </span>p)) {
+</code><code id="L4885"><span class="ln">4885</span> n -= (<span class="d">2.25</span><span class="s"> / </span>p);
+</code><code id="L4886"><span class="ln">4886</span> l<span class="s"> = </span>s<span class="s"> * </span>n<span class="s"> * </span>n<span class="s"> + </span><span class="d">.9375</span>;
+</code><code id="L4887"><span class="ln">4887</span> } <b>else</b> {
+</code><code id="L4888"><span class="ln">4888</span> n -= (<span class="d">2.625</span><span class="s"> / </span>p);
+</code><code id="L4889"><span class="ln">4889</span> l<span class="s"> = </span>s<span class="s"> * </span>n<span class="s"> * </span>n<span class="s"> + </span><span class="d">.984375</span>;
+</code><code id="L4890"><span class="ln">4890</span> }
+</code><code id="L4891"><span class="ln">4891</span> }
+</code><code id="L4892"><span class="ln">4892</span> }
+</code><code id="L4893"><span class="ln">4893</span> <b>return</b> l;
+</code><code id="L4894"><span class="ln">4894</span> }
+</code><code id="L4895"><span class="ln">4895</span> };
+</code><code id="L4896"><span class="ln">4896</span> ef.easeIn<span class="s"> = </span>ef[<i>"ease-<b>in</b>"</i>]<span class="s"> = </span>ef[<i>"<"</i>];
+</code><code id="L4897"><span class="ln">4897</span> ef.easeOut<span class="s"> = </span>ef[<i>"ease-out"</i>]<span class="s"> = </span>ef[<i>">"</i>];
+</code><code id="L4898"><span class="ln">4898</span> ef.easeInOut<span class="s"> = </span>ef[<i>"ease-<b>in</b>-out"</i>]<span class="s"> = </span>ef[<i>"<>"</i>];
+</code><code id="L4899"><span class="ln">4899</span> ef[<i>"back-<b>in</b>"</i>]<span class="s"> = </span>ef.backIn;
+</code><code id="L4900"><span class="ln">4900</span> ef[<i>"back-out"</i>]<span class="s"> = </span>ef.backOut;
+</code><code id="L4901"><span class="ln">4901</span>
+</code><code id="L4902"><span class="ln">4902</span> <b>var</b> animationElements<span class="s"> = </span>[],
+</code><code id="L4903"><span class="ln">4903</span> requestAnimFrame<span class="s"> = </span>window.requestAnimationFrame ||
+</code><code id="L4904"><span class="ln">4904</span> window.webkitRequestAnimationFrame ||
+</code><code id="L4905"><span class="ln">4905</span> window.mozRequestAnimationFrame ||
+</code><code id="L4906"><span class="ln">4906</span> window.oRequestAnimationFrame ||
+</code><code id="L4907"><span class="ln">4907</span> window.msRequestAnimationFrame ||
+</code><code id="L4908"><span class="ln">4908</span> <b>function</b> (callback) {
+</code><code id="L4909"><span class="ln">4909</span> setTimeout(callback, <span class="d">16</span>);
+</code><code id="L4910"><span class="ln">4910</span> },
+</code><code id="L4911"><span class="ln">4911</span> animation<span class="s"> = </span><b>function</b> () {
+</code><code id="L4912"><span class="ln">4912</span> <b>var</b> Now<span class="s"> = </span>+<b>new</b> Date,
+</code><code id="L4913"><span class="ln">4913</span> l<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L4914"><span class="ln">4914</span> <b>for</b> (; l < animationElements.length; l++) {
+</code><code id="L4915"><span class="ln">4915</span> <b>var</b> e<span class="s"> = </span>animationElements[l];
+</code><code id="L4916"><span class="ln">4916</span> <b>if</b> (e.el.removed<span class="s"> || </span>e.paused) {
+</code><code id="L4917"><span class="ln">4917</span> <b>continue</b>;
+</code><code id="L4918"><span class="ln">4918</span> }
+</code><code id="L4919"><span class="ln">4919</span> <b>var</b> time<span class="s"> = </span>Now<span class="s"> - </span>e.start,
+</code><code id="L4920"><span class="ln">4920</span> ms<span class="s"> = </span>e.ms,
+</code><code id="L4921"><span class="ln">4921</span> easing<span class="s"> = </span>e.easing,
+</code><code id="L4922"><span class="ln">4922</span> from<span class="s"> = </span>e.from,
+</code><code id="L4923"><span class="ln">4923</span> diff<span class="s"> = </span>e.diff,
+</code><code id="L4924"><span class="ln">4924</span> to<span class="s"> = </span>e.to,
+</code><code id="L4925"><span class="ln">4925</span> t<span class="s"> = </span>e.t,
+</code><code id="L4926"><span class="ln">4926</span> that<span class="s"> = </span>e.el,
+</code><code id="L4927"><span class="ln">4927</span> set<span class="s"> = </span>{},
+</code><code id="L4928"><span class="ln">4928</span> now;
+</code><code id="L4929"><span class="ln">4929</span> <b>if</b> (e.initstatus) {
+</code><code id="L4930"><span class="ln">4930</span> time<span class="s"> = </span>(e.initstatus<span class="s"> * </span>e.anim.top<span class="s"> - </span>e.prev)<span class="s"> / </span>(e.percent<span class="s"> - </span>e.prev)<span class="s"> * </span>ms;
+</code><code id="L4931"><span class="ln">4931</span> e.status<span class="s"> = </span>e.initstatus;
+</code><code id="L4932"><span class="ln">4932</span> <b>delete</b> e.initstatus;
+</code><code id="L4933"><span class="ln">4933</span> e.stop<span class="s"> && </span>animationElements.splice(l--, <span class="d">1</span>);
+</code><code id="L4934"><span class="ln">4934</span> } <b>else</b> {
+</code><code id="L4935"><span class="ln">4935</span> e.status<span class="s"> = </span>(e.prev<span class="s"> + </span>(e.percent<span class="s"> - </span>e.prev)<span class="s"> * </span>(time<span class="s"> / </span>ms))<span class="s"> / </span>e.anim.top;
+</code><code id="L4936"><span class="ln">4936</span> }
+</code><code id="L4937"><span class="ln">4937</span> <b>if</b> (time < <span class="d">0</span>) {
+</code><code id="L4938"><span class="ln">4938</span> <b>continue</b>;
+</code><code id="L4939"><span class="ln">4939</span> }
+</code><code id="L4940"><span class="ln">4940</span> <b>if</b> (time < ms) {
+</code><code id="L4941"><span class="ln">4941</span> <b>var</b> pos<span class="s"> = </span>easing(time<span class="s"> / </span>ms);
+</code><code id="L4942"><span class="ln">4942</span> <b>for</b> (<b>var</b> attr <b>in</b> from) <b>if</b> (from[has](attr)) {
+</code><code id="L4943"><span class="ln">4943</span> <b>switch</b> (availableAnimAttrs[attr]) {
+</code><code id="L4944"><span class="ln">4944</span> <b>case</b> nu:
+</code><code id="L4945"><span class="ln">4945</span> now<span class="s"> = </span>+from[attr]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr];
+</code><code id="L4946"><span class="ln">4946</span> <b>break</b>;
+</code><code id="L4947"><span class="ln">4947</span> <b>case</b> <i>"colour"</i>:
+</code><code id="L4948"><span class="ln">4948</span> now<span class="s"> = </span><i>"rgb("</i><span class="s"> + </span>[
+</code><code id="L4949"><span class="ln">4949</span> upto255(round(from[attr].r<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr].r)),
+</code><code id="L4950"><span class="ln">4950</span> upto255(round(from[attr].g<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr].g)),
+</code><code id="L4951"><span class="ln">4951</span> upto255(round(from[attr].b<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr].b))
+</code><code id="L4952"><span class="ln">4952</span> ].join(<i>","</i>)<span class="s"> + </span><i>")"</i>;
+</code><code id="L4953"><span class="ln">4953</span> <b>break</b>;
+</code><code id="L4954"><span class="ln">4954</span> <b>case</b> <i>"path"</i>:
+</code><code id="L4955"><span class="ln">4955</span> now<span class="s"> = </span>[];
+</code><code id="L4956"><span class="ln">4956</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>from[attr].length; i < ii; i++) {
+</code><code id="L4957"><span class="ln">4957</span> now[i]<span class="s"> = </span>[from[attr][i][<span class="d">0</span>]];
+</code><code id="L4958"><span class="ln">4958</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>from[attr][i].length; j < jj; j++) {
+</code><code id="L4959"><span class="ln">4959</span> now[i][j]<span class="s"> = </span>+from[attr][i][j]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i][j];
+</code><code id="L4960"><span class="ln">4960</span> }
+</code><code id="L4961"><span class="ln">4961</span> now[i]<span class="s"> = </span>now[i].join(S);
+</code><code id="L4962"><span class="ln">4962</span> }
+</code><code id="L4963"><span class="ln">4963</span> now<span class="s"> = </span>now.join(S);
+</code><code id="L4964"><span class="ln">4964</span> <b>break</b>;
+</code><code id="L4965"><span class="ln">4965</span> <b>case</b> <i>"transform"</i>:
+</code><code id="L4966"><span class="ln">4966</span> <b>if</b> (diff[attr].real) {
+</code><code id="L4967"><span class="ln">4967</span> now<span class="s"> = </span>[];
+</code><code id="L4968"><span class="ln">4968</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>from[attr].length; i < ii; i++) {
+</code><code id="L4969"><span class="ln">4969</span> now[i]<span class="s"> = </span>[from[attr][i][<span class="d">0</span>]];
+</code><code id="L4970"><span class="ln">4970</span> <b>for</b> (j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>from[attr][i].length; j < jj; j++) {
+</code><code id="L4971"><span class="ln">4971</span> now[i][j]<span class="s"> = </span>from[attr][i][j]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i][j];
+</code><code id="L4972"><span class="ln">4972</span> }
+</code><code id="L4973"><span class="ln">4973</span> }
+</code><code id="L4974"><span class="ln">4974</span> } <b>else</b> {
+</code><code id="L4975"><span class="ln">4975</span> <b>var</b> get<span class="s"> = </span><b>function</b> (i) {
+</code><code id="L4976"><span class="ln">4976</span> <b>return</b> +from[attr][i]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i];
+</code><code id="L4977"><span class="ln">4977</span> };
+</code><code id="L4978"><span class="ln">4978</span> <span class="c">// now<span class="s"> = </span>[[<i>"r"</i>, get(<span class="d">2</span>), <span class="d">0</span>, <span class="d">0</span>], [<i>"t"</i>, get(<span class="d">3</span>), get(<span class="d">4</span>)], [<i>"s"</i>, get(<span class="d">0</span>), get(<span class="d">1</span>), <span class="d">0</span>, <span class="d">0</span>]];</span>
+</code><code id="L4979"><span class="ln">4979</span> now<span class="s"> = </span>[[<i>"m"</i>, get(<span class="d">0</span>), get(<span class="d">1</span>), get(<span class="d">2</span>), get(<span class="d">3</span>), get(<span class="d">4</span>), get(<span class="d">5</span>)]];
+</code><code id="L4980"><span class="ln">4980</span> }
+</code><code id="L4981"><span class="ln">4981</span> <b>break</b>;
+</code><code id="L4982"><span class="ln">4982</span> <b>case</b> <i>"csv"</i>:
+</code><code id="L4983"><span class="ln">4983</span> <b>if</b> (attr<span class="s"> == </span><i>"clip-rect"</i>) {
+</code><code id="L4984"><span class="ln">4984</span> now<span class="s"> = </span>[];
+</code><code id="L4985"><span class="ln">4985</span> i<span class="s"> = </span><span class="d">4</span>;
+</code><code id="L4986"><span class="ln">4986</span> <b>while</b> (i--) {
+</code><code id="L4987"><span class="ln">4987</span> now[i]<span class="s"> = </span>+from[attr][i]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i];
+</code><code id="L4988"><span class="ln">4988</span> }
+</code><code id="L4989"><span class="ln">4989</span> }
+</code><code id="L4990"><span class="ln">4990</span> <b>break</b>;
+</code><code id="L4991"><span class="ln">4991</span> <b>default</b>:
+</code><code id="L4992"><span class="ln">4992</span> <b>var</b> from2<span class="s"> = </span>[].concat(from[attr]);
+</code><code id="L4993"><span class="ln">4993</span> now<span class="s"> = </span>[];
+</code><code id="L4994"><span class="ln">4994</span> i<span class="s"> = </span>that.paper.customAttributes[attr].length;
+</code><code id="L4995"><span class="ln">4995</span> <b>while</b> (i--) {
+</code><code id="L4996"><span class="ln">4996</span> now[i]<span class="s"> = </span>+from2[i]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i];
+</code><code id="L4997"><span class="ln">4997</span> }
+</code><code id="L4998"><span class="ln">4998</span> <b>break</b>;
+</code><code id="L4999"><span class="ln">4999</span> }
+</code><code id="L5000"><span class="ln">5000</span> set[attr]<span class="s"> = </span>now;
+</code><code id="L5001"><span class="ln">5001</span> }
+</code><code id="L5002"><span class="ln">5002</span> that.attr(set);
+</code><code id="L5003"><span class="ln">5003</span> (<b>function</b> (id, that, anim) {
+</code><code id="L5004"><span class="ln">5004</span> setTimeout(<b>function</b> () {
+</code><code id="L5005"><span class="ln">5005</span> eve(<i>"anim.frame."</i><span class="s"> + </span>id, that, anim);
+</code><code id="L5006"><span class="ln">5006</span> });
+</code><code id="L5007"><span class="ln">5007</span> })(that.id, that, e.anim);
+</code><code id="L5008"><span class="ln">5008</span> } <b>else</b> {
+</code><code id="L5009"><span class="ln">5009</span> (<b>function</b>(f, el, a) {
+</code><code id="L5010"><span class="ln">5010</span> setTimeout(<b>function</b>() {
+</code><code id="L5011"><span class="ln">5011</span> eve(<i>"anim.finish."</i><span class="s"> + </span>el.id, el, a);
+</code><code id="L5012"><span class="ln">5012</span> R.is(f, <i>"<b>function</b>"</i>)<span class="s"> && </span>f.call(el);
+</code><code id="L5013"><span class="ln">5013</span> });
+</code><code id="L5014"><span class="ln">5014</span> })(e.callback, that, e.anim);
+</code><code id="L5015"><span class="ln">5015</span> console.log(e.repeat);
+</code><code id="L5016"><span class="ln">5016</span> <b>if</b> (--e.repeat) {
+</code><code id="L5017"><span class="ln">5017</span> that.attr(e.origin);
+</code><code id="L5018"><span class="ln">5018</span> e.start<span class="s"> = </span>Now;
+</code><code id="L5019"><span class="ln">5019</span> } <b>else</b> {
+</code><code id="L5020"><span class="ln">5020</span> that.attr(to);
+</code><code id="L5021"><span class="ln">5021</span> animationElements.splice(l--, <span class="d">1</span>);
+</code><code id="L5022"><span class="ln">5022</span> }
+</code><code id="L5023"><span class="ln">5023</span> <b>if</b> (e.next<span class="s"> && </span>!e.stop) {
+</code><code id="L5024"><span class="ln">5024</span> runAnimation(e.anim, e.el, e.next, <b>null</b>, e.totalOrigin);
+</code><code id="L5025"><span class="ln">5025</span> }
+</code><code id="L5026"><span class="ln">5026</span> }
+</code><code id="L5027"><span class="ln">5027</span> }
+</code><code id="L5028"><span class="ln">5028</span> R.svg<span class="s"> && </span>that<span class="s"> && </span>that.paper<span class="s"> && </span>that.paper.safari();
+</code><code id="L5029"><span class="ln">5029</span> animationElements.length<span class="s"> && </span>requestAnimFrame(animation);
+</code><code id="L5030"><span class="ln">5030</span> },
+</code><code id="L5031"><span class="ln">5031</span> upto255<span class="s"> = </span><b>function</b> (color) {
+</code><code id="L5032"><span class="ln">5032</span> <b>return</b> mmax(mmin(color, <span class="d">255</span>), <span class="d">0</span>);
+</code><code id="L5033"><span class="ln">5033</span> };
+</code><code id="L5034"><span class="ln">5034</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L5035"><span class="ln">5035</span><span class="c"> <span class="s"> * </span>Element.animateWith
+</span></code><code id="L5036"><span class="ln">5036</span><span class="c"> [ method ]
+</span></code><code id="L5037"><span class="ln">5037</span><span class="c"> **
+</span></code><code id="L5038"><span class="ln">5038</span><span class="c"> <span class="s"> * </span>Acts similar to @Element.animate, but ensure that given animation runs <b>in</b> sync <b>with</b> another given element.
+</span></code><code id="L5039"><span class="ln">5039</span><span class="c"> **
+</span></code><code id="L5040"><span class="ln">5040</span><span class="c"> > Parameters
+</span></code><code id="L5041"><span class="ln">5041</span><span class="c"> **
+</span></code><code id="L5042"><span class="ln">5042</span><span class="c"> <span class="s"> - </span>params (object) <b>final</b> attributes <b>for</b> the element, see also @Element.attr
+</span></code><code id="L5043"><span class="ln">5043</span><span class="c"> <span class="s"> - </span>ms (number) number of milliseconds <b>for</b> animation to run
+</span></code><code id="L5044"><span class="ln">5044</span><span class="c"> <span class="s"> - </span>easing (string) #optional easing type. Accept on of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX)`
+</span></code><code id="L5045"><span class="ln">5045</span><span class="c"> <span class="s"> - </span>callback (<b>function</b>) #optional callback <b>function</b>. Will be called at the end of animation.
+</span></code><code id="L5046"><span class="ln">5046</span><span class="c"> <span class="s"> * </span>or
+</span></code><code id="L5047"><span class="ln">5047</span><span class="c"> <span class="s"> - </span>animation (object) animation object, see @Raphael.animation
+</span></code><code id="L5048"><span class="ln">5048</span><span class="c"> **
+</span></code><code id="L5049"><span class="ln">5049</span><span class="c"> <span class="s"> = </span>(object) original element
+</span></code><code id="L5050"><span class="ln">5050</span><span class="c"> \*/</span>
+</code><code id="L5051"><span class="ln">5051</span> elproto.animateWith<span class="s"> = </span><b>function</b> (element, params, ms, easing, callback) {
+</code><code id="L5052"><span class="ln">5052</span> <b>this</b>.animate(params, ms, easing, callback);
+</code><code id="L5053"><span class="ln">5053</span> <b>var</b> start, el;
+</code><code id="L5054"><span class="ln">5054</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>animationElements.length; i < ii; i++) {
+</code><code id="L5055"><span class="ln">5055</span> el<span class="s"> = </span>animationElements[i];
+</code><code id="L5056"><span class="ln">5056</span> <b>if</b> (el.el.id<span class="s"> == </span>element.id) {
+</code><code id="L5057"><span class="ln">5057</span> start<span class="s"> = </span>el.timestamp;
+</code><code id="L5058"><span class="ln">5058</span> } <b>else</b> <b>if</b> (el.el.id<span class="s"> == </span><b>this</b>.id) {
+</code><code id="L5059"><span class="ln">5059</span> el.start<span class="s"> = </span>start;
+</code><code id="L5060"><span class="ln">5060</span> }
+</code><code id="L5061"><span class="ln">5061</span> }
+</code><code id="L5062"><span class="ln">5062</span> <b>return</b> <b>this</b>.animate(params, ms, easing, callback);
</code><code id="L5063"><span class="ln">5063</span> };
-</code><code id="L5064"><span class="ln">5064</span> <b>function</b> Animation(anim, ms) {
-</code><code id="L5065"><span class="ln">5065</span> <b>var</b> percents<span class="s"> = </span>[];
-</code><code id="L5066"><span class="ln">5066</span> <b>this</b>.anim<span class="s"> = </span>anim;
-</code><code id="L5067"><span class="ln">5067</span> <b>this</b>.ms<span class="s"> = </span>ms;
-</code><code id="L5068"><span class="ln">5068</span> <b>this</b>.times<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L5069"><span class="ln">5069</span> <b>if</b> (<b>this</b>.anim) {
-</code><code id="L5070"><span class="ln">5070</span> <b>for</b> (<b>var</b> attr <b>in</b> <b>this</b>.anim) <b>if</b> (<b>this</b>.anim[has](attr)) {
-</code><code id="L5071"><span class="ln">5071</span> percents.push(+attr);
-</code><code id="L5072"><span class="ln">5072</span> }
-</code><code id="L5073"><span class="ln">5073</span> percents.sort(sortByNumber);
-</code><code id="L5074"><span class="ln">5074</span> }
-</code><code id="L5075"><span class="ln">5075</span> <b>this</b>.top<span class="s"> = </span>percents[percents.length<span class="s"> - </span><span class="d">1</span>];
-</code><code id="L5076"><span class="ln">5076</span> <b>this</b>.percents<span class="s"> = </span>percents;
-</code><code id="L5077"><span class="ln">5077</span> }
-</code><code id="L5078"><span class="ln">5078</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L5079"><span class="ln">5079</span><span class="c"> <span class="s"> * </span>Animation.delay
-</span></code><code id="L5080"><span class="ln">5080</span><span class="c"> [ method ]
-</span></code><code id="L5081"><span class="ln">5081</span><span class="c"> **
-</span></code><code id="L5082"><span class="ln">5082</span><span class="c"> <span class="s"> * </span>Creates a copy of existing animation object <b>with</b> given delay.
-</span></code><code id="L5083"><span class="ln">5083</span><span class="c"> **
-</span></code><code id="L5084"><span class="ln">5084</span><span class="c"> > Parameters
-</span></code><code id="L5085"><span class="ln">5085</span><span class="c"> **
-</span></code><code id="L5086"><span class="ln">5086</span><span class="c"> <span class="s"> - </span>delay (number) number of ms to pass between animation start and actual animation
-</span></code><code id="L5087"><span class="ln">5087</span><span class="c"> **
-</span></code><code id="L5088"><span class="ln">5088</span><span class="c"> <span class="s"> = </span>(object) <b>new</b> altered Animation object
-</span></code><code id="L5089"><span class="ln">5089</span><span class="c"> \*/</span>
-</code><code id="L5090"><span class="ln">5090</span> Animation.prototype.delay<span class="s"> = </span><b>function</b> (delay) {
-</code><code id="L5091"><span class="ln">5091</span> <b>var</b> a<span class="s"> = </span><b>new</b> Animation(<b>this</b>.anim, <b>this</b>.ms);
-</code><code id="L5092"><span class="ln">5092</span> a.times<span class="s"> = </span><b>this</b>.times;
-</code><code id="L5093"><span class="ln">5093</span> a.del<span class="s"> = </span>+delay<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L5094"><span class="ln">5094</span> <b>return</b> a;
-</code><code id="L5095"><span class="ln">5095</span> };
-</code><code id="L5096"><span class="ln">5096</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L5097"><span class="ln">5097</span><span class="c"> <span class="s"> * </span>Animation.repeat
-</span></code><code id="L5098"><span class="ln">5098</span><span class="c"> [ method ]
-</span></code><code id="L5099"><span class="ln">5099</span><span class="c"> **
-</span></code><code id="L5100"><span class="ln">5100</span><span class="c"> <span class="s"> * </span>Creates a copy of existing animation object <b>with</b> given repetition.
-</span></code><code id="L5101"><span class="ln">5101</span><span class="c"> **
-</span></code><code id="L5102"><span class="ln">5102</span><span class="c"> > Parameters
-</span></code><code id="L5103"><span class="ln">5103</span><span class="c"> **
-</span></code><code id="L5104"><span class="ln">5104</span><span class="c"> <span class="s"> - </span>repeat (number) number iterations of animation. For infinite animation pass `Infinity`
-</span></code><code id="L5105"><span class="ln">5105</span><span class="c"> **
-</span></code><code id="L5106"><span class="ln">5106</span><span class="c"> <span class="s"> = </span>(object) <b>new</b> altered Animation object
-</span></code><code id="L5107"><span class="ln">5107</span><span class="c"> \*/</span>
-</code><code id="L5108"><span class="ln">5108</span> Animation.prototype.repeat<span class="s"> = </span><b>function</b> (times) {
-</code><code id="L5109"><span class="ln">5109</span> <b>var</b> a<span class="s"> = </span><b>new</b> Animation(<b>this</b>.anim, <b>this</b>.ms);
-</code><code id="L5110"><span class="ln">5110</span> a.del<span class="s"> = </span><b>this</b>.del;
-</code><code id="L5111"><span class="ln">5111</span> a.times<span class="s"> = </span>math.floor(mmax(times, <span class="d">0</span>))<span class="s"> || </span><span class="d">1</span>;
-</code><code id="L5112"><span class="ln">5112</span> <b>return</b> a;
-</code><code id="L5113"><span class="ln">5113</span> };
-</code><code id="L5114"><span class="ln">5114</span> <b>function</b> runAnimation(anim, element, percent, status, totalOrigin) {
-</code><code id="L5115"><span class="ln">5115</span> percent<span class="s"> = </span>toFloat(percent);
-</code><code id="L5116"><span class="ln">5116</span> <b>var</b> params,
-</code><code id="L5117"><span class="ln">5117</span> isInAnim,
-</code><code id="L5118"><span class="ln">5118</span> isInAnimSet,
-</code><code id="L5119"><span class="ln">5119</span> percents<span class="s"> = </span>[],
-</code><code id="L5120"><span class="ln">5120</span> next,
-</code><code id="L5121"><span class="ln">5121</span> prev,
-</code><code id="L5122"><span class="ln">5122</span> timestamp,
-</code><code id="L5123"><span class="ln">5123</span> ms<span class="s"> = </span>anim.ms,
-</code><code id="L5124"><span class="ln">5124</span> from<span class="s"> = </span>{},
-</code><code id="L5125"><span class="ln">5125</span> to<span class="s"> = </span>{},
-</code><code id="L5126"><span class="ln">5126</span> diff<span class="s"> = </span>{};
-</code><code id="L5127"><span class="ln">5127</span> <b>if</b> (status) {
-</code><code id="L5128"><span class="ln">5128</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>animationElements.length; i < ii; i++) {
-</code><code id="L5129"><span class="ln">5129</span> <b>var</b> e<span class="s"> = </span>animationElements[i];
-</code><code id="L5130"><span class="ln">5130</span> <b>if</b> (e.el.id<span class="s"> == </span>element.id<span class="s"> && </span>e.anim<span class="s"> == </span>anim) {
-</code><code id="L5131"><span class="ln">5131</span> <b>if</b> (e.percent != percent) {
-</code><code id="L5132"><span class="ln">5132</span> animationElements.splice(i, <span class="d">1</span>);
-</code><code id="L5133"><span class="ln">5133</span> isInAnimSet<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L5134"><span class="ln">5134</span> } <b>else</b> {
-</code><code id="L5135"><span class="ln">5135</span> isInAnim<span class="s"> = </span>e;
-</code><code id="L5136"><span class="ln">5136</span> }
-</code><code id="L5137"><span class="ln">5137</span> element.attr(e.totalOrigin);
-</code><code id="L5138"><span class="ln">5138</span> <b>break</b>;
-</code><code id="L5139"><span class="ln">5139</span> }
-</code><code id="L5140"><span class="ln">5140</span> }
-</code><code id="L5141"><span class="ln">5141</span> } <b>else</b> {
-</code><code id="L5142"><span class="ln">5142</span> status<span class="s"> = </span><span class="d">0</span><span class="s"> / </span><span class="d">0</span>;
-</code><code id="L5143"><span class="ln">5143</span> }
-</code><code id="L5144"><span class="ln">5144</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>anim.percents.length; i < ii; i++) {
-</code><code id="L5145"><span class="ln">5145</span> <b>if</b> (anim.percents[i]<span class="s"> == </span>percent<span class="s"> || </span>anim.percents[i] > status<span class="s"> * </span>anim.top) {
-</code><code id="L5146"><span class="ln">5146</span> percent<span class="s"> = </span>anim.percents[i];
-</code><code id="L5147"><span class="ln">5147</span> prev<span class="s"> = </span>anim.percents[i<span class="s"> - </span><span class="d">1</span>]<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L5148"><span class="ln">5148</span> ms<span class="s"> = </span>ms<span class="s"> / </span>anim.top<span class="s"> * </span>(percent<span class="s"> - </span>prev);
-</code><code id="L5149"><span class="ln">5149</span> next<span class="s"> = </span>anim.percents[i<span class="s"> + </span><span class="d">1</span>];
-</code><code id="L5150"><span class="ln">5150</span> params<span class="s"> = </span>anim.anim[percent];
-</code><code id="L5151"><span class="ln">5151</span> <b>break</b>;
-</code><code id="L5152"><span class="ln">5152</span> } <b>else</b> <b>if</b> (status) {
-</code><code id="L5153"><span class="ln">5153</span> element.attr(anim.anim[anim.percents[i]]);
-</code><code id="L5154"><span class="ln">5154</span> }
-</code><code id="L5155"><span class="ln">5155</span> }
-</code><code id="L5156"><span class="ln">5156</span> <b>if</b> (!params) {
-</code><code id="L5157"><span class="ln">5157</span> <b>return</b>;
-</code><code id="L5158"><span class="ln">5158</span> }
-</code><code id="L5159"><span class="ln">5159</span> <b>if</b> (!isInAnim) {
-</code><code id="L5160"><span class="ln">5160</span> <b>for</b> (attr <b>in</b> params) <b>if</b> (params[has](attr)) {
-</code><code id="L5161"><span class="ln">5161</span> <b>if</b> (availableAnimAttrs[has](attr)<span class="s"> || </span>element.paper.customAttributes[has](attr)) {
-</code><code id="L5162"><span class="ln">5162</span> from[attr]<span class="s"> = </span>element.attr(attr);
-</code><code id="L5163"><span class="ln">5163</span> (from[attr]<span class="s"> == </span><b>null</b>)<span class="s"> && </span>(from[attr]<span class="s"> = </span>availableAttrs[attr]);
-</code><code id="L5164"><span class="ln">5164</span> to[attr]<span class="s"> = </span>params[attr];
-</code><code id="L5165"><span class="ln">5165</span> <b>switch</b> (availableAnimAttrs[attr]) {
-</code><code id="L5166"><span class="ln">5166</span> <b>case</b> nu:
-</code><code id="L5167"><span class="ln">5167</span> diff[attr]<span class="s"> = </span>(to[attr]<span class="s"> - </span>from[attr])<span class="s"> / </span>ms;
-</code><code id="L5168"><span class="ln">5168</span> <b>break</b>;
-</code><code id="L5169"><span class="ln">5169</span> <b>case</b> <i>"colour"</i>:
-</code><code id="L5170"><span class="ln">5170</span> from[attr]<span class="s"> = </span>R.getRGB(from[attr]);
-</code><code id="L5171"><span class="ln">5171</span> <b>var</b> toColour<span class="s"> = </span>R.getRGB(to[attr]);
-</code><code id="L5172"><span class="ln">5172</span> diff[attr]<span class="s"> = </span>{
-</code><code id="L5173"><span class="ln">5173</span> r: (toColour.r<span class="s"> - </span>from[attr].r)<span class="s"> / </span>ms,
-</code><code id="L5174"><span class="ln">5174</span> g: (toColour.g<span class="s"> - </span>from[attr].g)<span class="s"> / </span>ms,
-</code><code id="L5175"><span class="ln">5175</span> b: (toColour.b<span class="s"> - </span>from[attr].b)<span class="s"> / </span>ms
-</code><code id="L5176"><span class="ln">5176</span> };
-</code><code id="L5177"><span class="ln">5177</span> <b>break</b>;
-</code><code id="L5178"><span class="ln">5178</span> <b>case</b> <i>"path"</i>:
-</code><code id="L5179"><span class="ln">5179</span> <b>var</b> pathes<span class="s"> = </span>path2curve(from[attr], to[attr]),
-</code><code id="L5180"><span class="ln">5180</span> toPath<span class="s"> = </span>pathes[<span class="d">1</span>];
-</code><code id="L5181"><span class="ln">5181</span> from[attr]<span class="s"> = </span>pathes[<span class="d">0</span>];
-</code><code id="L5182"><span class="ln">5182</span> diff[attr]<span class="s"> = </span>[];
-</code><code id="L5183"><span class="ln">5183</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>from[attr].length; i < ii; i++) {
-</code><code id="L5184"><span class="ln">5184</span> diff[attr][i]<span class="s"> = </span>[<span class="d">0</span>];
-</code><code id="L5185"><span class="ln">5185</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>from[attr][i].length; j < jj; j++) {
-</code><code id="L5186"><span class="ln">5186</span> diff[attr][i][j]<span class="s"> = </span>(toPath[i][j]<span class="s"> - </span>from[attr][i][j])<span class="s"> / </span>ms;
-</code><code id="L5187"><span class="ln">5187</span> }
-</code><code id="L5188"><span class="ln">5188</span> }
-</code><code id="L5189"><span class="ln">5189</span> <b>break</b>;
-</code><code id="L5190"><span class="ln">5190</span> <b>case</b> <i>"transform"</i>:
-</code><code id="L5191"><span class="ln">5191</span> <b>var</b> _<span class="s"> = </span>element._,
-</code><code id="L5192"><span class="ln">5192</span> eq<span class="s"> = </span>equaliseTransform(_[attr], to[attr]);
-</code><code id="L5193"><span class="ln">5193</span> <b>if</b> (eq) {
-</code><code id="L5194"><span class="ln">5194</span> from[attr]<span class="s"> = </span>eq.from;
-</code><code id="L5195"><span class="ln">5195</span> to[attr]<span class="s"> = </span>eq.to;
-</code><code id="L5196"><span class="ln">5196</span> diff[attr]<span class="s"> = </span>[];
-</code><code id="L5197"><span class="ln">5197</span> diff[attr].real<span class="s"> = </span><b>true</b>;
-</code><code id="L5198"><span class="ln">5198</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>from[attr].length; i < ii; i++) {
-</code><code id="L5199"><span class="ln">5199</span> diff[attr][i]<span class="s"> = </span>[from[attr][i][<span class="d">0</span>]];
-</code><code id="L5200"><span class="ln">5200</span> <b>for</b> (j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>from[attr][i].length; j < jj; j++) {
-</code><code id="L5201"><span class="ln">5201</span> diff[attr][i][j]<span class="s"> = </span>(to[attr][i][j]<span class="s"> - </span>from[attr][i][j])<span class="s"> / </span>ms;
-</code><code id="L5202"><span class="ln">5202</span> }
-</code><code id="L5203"><span class="ln">5203</span> }
-</code><code id="L5204"><span class="ln">5204</span> } <b>else</b> {
-</code><code id="L5205"><span class="ln">5205</span> <b>var</b> m<span class="s"> = </span>(element.matrix<span class="s"> || </span><b>new</b> Matrix).m,
-</code><code id="L5206"><span class="ln">5206</span> to2<span class="s"> = </span>{_:{transform: _.transform}, getBBox: <b>function</b> () { <b>return</b> element.getBBox(); }};
-</code><code id="L5207"><span class="ln">5207</span> from[attr]<span class="s"> = </span>[
-</code><code id="L5208"><span class="ln">5208</span> m[<span class="d">0</span>][<span class="d">0</span>],
-</code><code id="L5209"><span class="ln">5209</span> m[<span class="d">1</span>][<span class="d">0</span>],
-</code><code id="L5210"><span class="ln">5210</span> m[<span class="d">0</span>][<span class="d">1</span>],
-</code><code id="L5211"><span class="ln">5211</span> m[<span class="d">1</span>][<span class="d">1</span>],
-</code><code id="L5212"><span class="ln">5212</span> m[<span class="d">0</span>][<span class="d">2</span>],
-</code><code id="L5213"><span class="ln">5213</span> m[<span class="d">1</span>][<span class="d">2</span>]
-</code><code id="L5214"><span class="ln">5214</span> ];
-</code><code id="L5215"><span class="ln">5215</span> extractTransform(to2, to[attr]);
-</code><code id="L5216"><span class="ln">5216</span> to[attr]<span class="s"> = </span>to2._.transform;
-</code><code id="L5217"><span class="ln">5217</span> diff[attr]<span class="s"> = </span>[
-</code><code id="L5218"><span class="ln">5218</span> (to2.matrix.m[<span class="d">0</span>][<span class="d">0</span>]<span class="s"> - </span>m[<span class="d">0</span>][<span class="d">0</span>])<span class="s"> / </span>ms,
-</code><code id="L5219"><span class="ln">5219</span> (to2.matrix.m[<span class="d">1</span>][<span class="d">0</span>]<span class="s"> - </span>m[<span class="d">1</span>][<span class="d">0</span>])<span class="s"> / </span>ms,
-</code><code id="L5220"><span class="ln">5220</span> (to2.matrix.m[<span class="d">0</span>][<span class="d">1</span>]<span class="s"> - </span>m[<span class="d">0</span>][<span class="d">1</span>])<span class="s"> / </span>ms,
-</code><code id="L5221"><span class="ln">5221</span> (to2.matrix.m[<span class="d">1</span>][<span class="d">1</span>]<span class="s"> - </span>m[<span class="d">1</span>][<span class="d">1</span>])<span class="s"> / </span>ms,
-</code><code id="L5222"><span class="ln">5222</span> (to2.matrix.m[<span class="d">0</span>][<span class="d">2</span>]<span class="s"> - </span>m[<span class="d">0</span>][<span class="d">2</span>])<span class="s"> / </span>ms,
-</code><code id="L5223"><span class="ln">5223</span> (to2.matrix.m[<span class="d">1</span>][<span class="d">2</span>]<span class="s"> - </span>m[<span class="d">1</span>][<span class="d">2</span>])<span class="s"> / </span>ms
-</code><code id="L5224"><span class="ln">5224</span> ];
-</code><code id="L5225"><span class="ln">5225</span> <span class="c">// from[attr]<span class="s"> = </span>[_.sx, _.sy, _.deg, _.dx, _.dy];</span>
-</code><code id="L5226"><span class="ln">5226</span> <span class="c">// <b>var</b> to2<span class="s"> = </span>{_:{}, getBBox: <b>function</b> () { <b>return</b> element.getBBox(); }};</span>
-</code><code id="L5227"><span class="ln">5227</span> <span class="c">// extractTransform(to2, to[attr]);</span>
-</code><code id="L5228"><span class="ln">5228</span> <span class="c">// diff[attr]<span class="s"> = </span>[</span>
-</code><code id="L5229"><span class="ln">5229</span> <span class="c">// (to2._.sx<span class="s"> - </span>_.sx)<span class="s"> / </span>ms,</span>
-</code><code id="L5230"><span class="ln">5230</span> <span class="c">// (to2._.sy<span class="s"> - </span>_.sy)<span class="s"> / </span>ms,</span>
-</code><code id="L5231"><span class="ln">5231</span> <span class="c">// (to2._.deg<span class="s"> - </span>_.deg)<span class="s"> / </span>ms,</span>
-</code><code id="L5232"><span class="ln">5232</span> <span class="c">// (to2._.dx<span class="s"> - </span>_.dx)<span class="s"> / </span>ms,</span>
-</code><code id="L5233"><span class="ln">5233</span> <span class="c">// (to2._.dy<span class="s"> - </span>_.dy)<span class="s"> / </span>ms</span>
-</code><code id="L5234"><span class="ln">5234</span> <span class="c">// ];</span>
-</code><code id="L5235"><span class="ln">5235</span> }
-</code><code id="L5236"><span class="ln">5236</span> <b>break</b>;
-</code><code id="L5237"><span class="ln">5237</span> <b>case</b> <i>"csv"</i>:
-</code><code id="L5238"><span class="ln">5238</span> <b>var</b> values<span class="s"> = </span>Str(params[attr]).split(separator),
-</code><code id="L5239"><span class="ln">5239</span> from2<span class="s"> = </span>Str(from[attr]).split(separator);
-</code><code id="L5240"><span class="ln">5240</span> <b>if</b> (attr<span class="s"> == </span><i>"clip-rect"</i>) {
-</code><code id="L5241"><span class="ln">5241</span> from[attr]<span class="s"> = </span>from2;
-</code><code id="L5242"><span class="ln">5242</span> diff[attr]<span class="s"> = </span>[];
-</code><code id="L5243"><span class="ln">5243</span> i<span class="s"> = </span>from2.length;
-</code><code id="L5244"><span class="ln">5244</span> <b>while</b> (i--) {
-</code><code id="L5245"><span class="ln">5245</span> diff[attr][i]<span class="s"> = </span>(values[i]<span class="s"> - </span>from[attr][i])<span class="s"> / </span>ms;
-</code><code id="L5246"><span class="ln">5246</span> }
-</code><code id="L5247"><span class="ln">5247</span> }
-</code><code id="L5248"><span class="ln">5248</span> to[attr]<span class="s"> = </span>values;
-</code><code id="L5249"><span class="ln">5249</span> <b>break</b>;
-</code><code id="L5250"><span class="ln">5250</span> <b>default</b>:
-</code><code id="L5251"><span class="ln">5251</span> values<span class="s"> = </span>[].concat(params[attr]);
-</code><code id="L5252"><span class="ln">5252</span> from2<span class="s"> = </span>[].concat(from[attr]);
-</code><code id="L5253"><span class="ln">5253</span> diff[attr]<span class="s"> = </span>[];
-</code><code id="L5254"><span class="ln">5254</span> i<span class="s"> = </span>element.paper.customAttributes[attr].length;
-</code><code id="L5255"><span class="ln">5255</span> <b>while</b> (i--) {
-</code><code id="L5256"><span class="ln">5256</span> diff[attr][i]<span class="s"> = </span>((values[i]<span class="s"> || </span><span class="d">0</span>)<span class="s"> - </span>(from2[i]<span class="s"> || </span><span class="d">0</span>))<span class="s"> / </span>ms;
-</code><code id="L5257"><span class="ln">5257</span> }
-</code><code id="L5258"><span class="ln">5258</span> <b>break</b>;
-</code><code id="L5259"><span class="ln">5259</span> }
-</code><code id="L5260"><span class="ln">5260</span> }
-</code><code id="L5261"><span class="ln">5261</span> }
-</code><code id="L5262"><span class="ln">5262</span> <b>var</b> easing<span class="s"> = </span>params.easing,
-</code><code id="L5263"><span class="ln">5263</span> easyeasy<span class="s"> = </span>R.easing_formulas[easing];
-</code><code id="L5264"><span class="ln">5264</span> <b>if</b> (!easyeasy) {
-</code><code id="L5265"><span class="ln">5265</span> easyeasy<span class="s"> = </span>Str(easing).match(bezierrg);
-</code><code id="L5266"><span class="ln">5266</span> <b>if</b> (easyeasy<span class="s"> && </span>easyeasy.length<span class="s"> == </span><span class="d">5</span>) {
-</code><code id="L5267"><span class="ln">5267</span> <b>var</b> curve<span class="s"> = </span>easyeasy;
-</code><code id="L5268"><span class="ln">5268</span> easyeasy<span class="s"> = </span><b>function</b> (t) {
-</code><code id="L5269"><span class="ln">5269</span> <b>return</b> CubicBezierAtTime(t, +curve[<span class="d">1</span>], +curve[<span class="d">2</span>], +curve[<span class="d">3</span>], +curve[<span class="d">4</span>], ms);
-</code><code id="L5270"><span class="ln">5270</span> };
-</code><code id="L5271"><span class="ln">5271</span> } <b>else</b> {
-</code><code id="L5272"><span class="ln">5272</span> easyeasy<span class="s"> = </span>pipe;
-</code><code id="L5273"><span class="ln">5273</span> }
-</code><code id="L5274"><span class="ln">5274</span> }
-</code><code id="L5275"><span class="ln">5275</span> timestamp<span class="s"> = </span>params.start<span class="s"> || </span>anim.start<span class="s"> || </span>+<b>new</b> Date;
-</code><code id="L5276"><span class="ln">5276</span> e<span class="s"> = </span>{
-</code><code id="L5277"><span class="ln">5277</span> anim: anim,
-</code><code id="L5278"><span class="ln">5278</span> percent: percent,
-</code><code id="L5279"><span class="ln">5279</span> timestamp: timestamp,
-</code><code id="L5280"><span class="ln">5280</span> start: timestamp<span class="s"> + </span>(anim.del<span class="s"> || </span><span class="d">0</span>),
-</code><code id="L5281"><span class="ln">5281</span> status: <span class="d">0</span>,
-</code><code id="L5282"><span class="ln">5282</span> initstatus: status<span class="s"> || </span><span class="d">0</span>,
-</code><code id="L5283"><span class="ln">5283</span> stop: <b>false</b>,
-</code><code id="L5284"><span class="ln">5284</span> ms: ms,
-</code><code id="L5285"><span class="ln">5285</span> easing: easyeasy,
-</code><code id="L5286"><span class="ln">5286</span> from: from,
-</code><code id="L5287"><span class="ln">5287</span> diff: diff,
-</code><code id="L5288"><span class="ln">5288</span> to: to,
-</code><code id="L5289"><span class="ln">5289</span> el: element,
-</code><code id="L5290"><span class="ln">5290</span> callback: params.callback,
-</code><code id="L5291"><span class="ln">5291</span> prev: prev,
-</code><code id="L5292"><span class="ln">5292</span> next: next,
-</code><code id="L5293"><span class="ln">5293</span> repeat: anim.times,
-</code><code id="L5294"><span class="ln">5294</span> origin: element.attr(),
-</code><code id="L5295"><span class="ln">5295</span> totalOrigin: totalOrigin
-</code><code id="L5296"><span class="ln">5296</span> };
-</code><code id="L5297"><span class="ln">5297</span> animationElements.push(e);
-</code><code id="L5298"><span class="ln">5298</span> <b>if</b> (status<span class="s"> && </span>!isInAnim) {
-</code><code id="L5299"><span class="ln">5299</span> e.stop<span class="s"> = </span><b>true</b>;
-</code><code id="L5300"><span class="ln">5300</span> e.start<span class="s"> = </span><b>new</b> Date<span class="s"> - </span>ms<span class="s"> * </span>status;
-</code><code id="L5301"><span class="ln">5301</span> <b>if</b> (animationElements.length<span class="s"> == </span><span class="d">1</span>) {
-</code><code id="L5302"><span class="ln">5302</span> <b>return</b> animation();
-</code><code id="L5303"><span class="ln">5303</span> }
-</code><code id="L5304"><span class="ln">5304</span> }
-</code><code id="L5305"><span class="ln">5305</span> animationElements.length<span class="s"> == </span><span class="d">1</span><span class="s"> && </span>requestAnimFrame(animation);
-</code><code id="L5306"><span class="ln">5306</span> } <b>else</b> {
-</code><code id="L5307"><span class="ln">5307</span> isInAnim.initstatus<span class="s"> = </span>status;
-</code><code id="L5308"><span class="ln">5308</span> isInAnim.start<span class="s"> = </span><b>new</b> Date<span class="s"> - </span>isInAnim.ms<span class="s"> * </span>status;
-</code><code id="L5309"><span class="ln">5309</span> }
-</code><code id="L5310"><span class="ln">5310</span> eve(<i>"anim.start."</i><span class="s"> + </span>element.id, element, anim);
-</code><code id="L5311"><span class="ln">5311</span> }
-</code><code id="L5312"><span class="ln">5312</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L5313"><span class="ln">5313</span><span class="c"> <span class="s"> * </span>Raphael.animation
-</span></code><code id="L5314"><span class="ln">5314</span><span class="c"> [ method ]
-</span></code><code id="L5315"><span class="ln">5315</span><span class="c"> **
-</span></code><code id="L5316"><span class="ln">5316</span><span class="c"> <span class="s"> * </span>Creates an animation object that can be passed to the @Element.animate or @Element.animateWith methods.
-</span></code><code id="L5317"><span class="ln">5317</span><span class="c"> <span class="s"> * </span>See also @Animation.delay and @Animation.repeat methods.
-</span></code><code id="L5318"><span class="ln">5318</span><span class="c"> **
-</span></code><code id="L5319"><span class="ln">5319</span><span class="c"> > Parameters
-</span></code><code id="L5320"><span class="ln">5320</span><span class="c"> **
-</span></code><code id="L5321"><span class="ln">5321</span><span class="c"> <span class="s"> - </span>params (object) <b>final</b> attributes <b>for</b> the element, see also @Element.attr
-</span></code><code id="L5322"><span class="ln">5322</span><span class="c"> <span class="s"> - </span>ms (number) number of milliseconds <b>for</b> animation to run
-</span></code><code id="L5323"><span class="ln">5323</span><span class="c"> <span class="s"> - </span>easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX)`
-</span></code><code id="L5324"><span class="ln">5324</span><span class="c"> <span class="s"> - </span>callback (<b>function</b>) #optional callback <b>function</b>. Will be called at the end of animation.
-</span></code><code id="L5325"><span class="ln">5325</span><span class="c"> **
-</span></code><code id="L5326"><span class="ln">5326</span><span class="c"> <span class="s"> = </span>(object) @Animation
-</span></code><code id="L5327"><span class="ln">5327</span><span class="c"> \*/</span>
-</code><code id="L5328"><span class="ln">5328</span> R.animation<span class="s"> = </span><b>function</b> (params, ms, easing, callback) {
-</code><code id="L5329"><span class="ln">5329</span> <b>if</b> (R.is(easing, <i>"<b>function</b>"</i>)<span class="s"> || </span>!easing) {
-</code><code id="L5330"><span class="ln">5330</span> callback<span class="s"> = </span>callback<span class="s"> || </span>easing<span class="s"> || </span><b>null</b>;
-</code><code id="L5331"><span class="ln">5331</span> easing<span class="s"> = </span><b>null</b>;
-</code><code id="L5332"><span class="ln">5332</span> }
-</code><code id="L5333"><span class="ln">5333</span> params<span class="s"> = </span>Object(params);
-</code><code id="L5334"><span class="ln">5334</span> ms<span class="s"> = </span>+ms<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L5335"><span class="ln">5335</span> <b>var</b> p<span class="s"> = </span>{},
-</code><code id="L5336"><span class="ln">5336</span> json,
-</code><code id="L5337"><span class="ln">5337</span> attr;
-</code><code id="L5338"><span class="ln">5338</span> <b>for</b> (attr <b>in</b> params) <b>if</b> (params[has](attr)<span class="s"> && </span>toFloat(attr) != attr) {
-</code><code id="L5339"><span class="ln">5339</span> json<span class="s"> = </span><b>true</b>;
-</code><code id="L5340"><span class="ln">5340</span> p[attr]<span class="s"> = </span>params[attr];
-</code><code id="L5341"><span class="ln">5341</span> }
-</code><code id="L5342"><span class="ln">5342</span> <b>if</b> (!json) {
-</code><code id="L5343"><span class="ln">5343</span> <b>return</b> <b>new</b> Animation(params, ms);
-</code><code id="L5344"><span class="ln">5344</span> } <b>else</b> {
-</code><code id="L5345"><span class="ln">5345</span> easing<span class="s"> && </span>(p.easing<span class="s"> = </span>easing);
-</code><code id="L5346"><span class="ln">5346</span> callback<span class="s"> && </span>(p.callback<span class="s"> = </span>callback);
-</code><code id="L5347"><span class="ln">5347</span> <b>return</b> <b>new</b> Animation({<span class="d">100</span>: p}, ms);
-</code><code id="L5348"><span class="ln">5348</span> }
-</code><code id="L5349"><span class="ln">5349</span> };
-</code><code id="L5350"><span class="ln">5350</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L5351"><span class="ln">5351</span><span class="c"> <span class="s"> * </span>Element.animate
-</span></code><code id="L5352"><span class="ln">5352</span><span class="c"> [ method ]
-</span></code><code id="L5353"><span class="ln">5353</span><span class="c"> **
-</span></code><code id="L5354"><span class="ln">5354</span><span class="c"> <span class="s"> * </span>Creates and starts animation <b>for</b> given element.
-</span></code><code id="L5355"><span class="ln">5355</span><span class="c"> **
-</span></code><code id="L5356"><span class="ln">5356</span><span class="c"> > Parameters
-</span></code><code id="L5357"><span class="ln">5357</span><span class="c"> **
-</span></code><code id="L5358"><span class="ln">5358</span><span class="c"> <span class="s"> - </span>params (object) <b>final</b> attributes <b>for</b> the element, see also @Element.attr
-</span></code><code id="L5359"><span class="ln">5359</span><span class="c"> <span class="s"> - </span>ms (number) number of milliseconds <b>for</b> animation to run
-</span></code><code id="L5360"><span class="ln">5360</span><span class="c"> <span class="s"> - </span>easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX)`
-</span></code><code id="L5361"><span class="ln">5361</span><span class="c"> <span class="s"> - </span>callback (<b>function</b>) #optional callback <b>function</b>. Will be called at the end of animation.
-</span></code><code id="L5362"><span class="ln">5362</span><span class="c"> <span class="s"> * </span>or
-</span></code><code id="L5363"><span class="ln">5363</span><span class="c"> <span class="s"> - </span>animation (object) animation object, see @Raphael.animation
-</span></code><code id="L5364"><span class="ln">5364</span><span class="c"> **
-</span></code><code id="L5365"><span class="ln">5365</span><span class="c"> <span class="s"> = </span>(object) original element
-</span></code><code id="L5366"><span class="ln">5366</span><span class="c"> \*/</span>
-</code><code id="L5367"><span class="ln">5367</span> elproto.animate<span class="s"> = </span><b>function</b> (params, ms, easing, callback) {
-</code><code id="L5368"><span class="ln">5368</span> <b>var</b> element<span class="s"> = </span><b>this</b>;
-</code><code id="L5369"><span class="ln">5369</span> <b>if</b> (element.removed) {
-</code><code id="L5370"><span class="ln">5370</span> callback<span class="s"> && </span>callback.call(element);
-</code><code id="L5371"><span class="ln">5371</span> <b>return</b> element;
-</code><code id="L5372"><span class="ln">5372</span> }
-</code><code id="L5373"><span class="ln">5373</span> <b>var</b> anim<span class="s"> = </span>params <b>instanceof</b> Animation ? params : R.animation(params, ms, easing, callback);
-</code><code id="L5374"><span class="ln">5374</span> runAnimation(anim, element, anim.percents[<span class="d">0</span>], <b>null</b>, element.attr());
-</code><code id="L5375"><span class="ln">5375</span> <b>return</b> element;
-</code><code id="L5376"><span class="ln">5376</span> };
-</code><code id="L5377"><span class="ln">5377</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L5378"><span class="ln">5378</span><span class="c"> <span class="s"> * </span>Element.setTime
-</span></code><code id="L5379"><span class="ln">5379</span><span class="c"> [ method ]
-</span></code><code id="L5380"><span class="ln">5380</span><span class="c"> **
-</span></code><code id="L5381"><span class="ln">5381</span><span class="c"> <span class="s"> * </span>Sets the status of animation of the element <b>in</b> milliseconds. Similar to @Element.status method.
-</span></code><code id="L5382"><span class="ln">5382</span><span class="c"> **
-</span></code><code id="L5383"><span class="ln">5383</span><span class="c"> > Parameters
-</span></code><code id="L5384"><span class="ln">5384</span><span class="c"> **
-</span></code><code id="L5385"><span class="ln">5385</span><span class="c"> <span class="s"> - </span>anim (object) animation object
-</span></code><code id="L5386"><span class="ln">5386</span><span class="c"> <span class="s"> - </span>value (number) number of milliseconds from the beginning of the animation
-</span></code><code id="L5387"><span class="ln">5387</span><span class="c"> **
-</span></code><code id="L5388"><span class="ln">5388</span><span class="c"> <span class="s"> = </span>(object) original element <b>if</b> `value` is specified
-</span></code><code id="L5389"><span class="ln">5389</span><span class="c"> <span class="s"> * </span>Note, that during animation following events are triggered:
-</span></code><code id="L5390"><span class="ln">5390</span><span class="c"> *
-</span></code><code id="L5391"><span class="ln">5391</span><span class="c"> <span class="s"> * </span>On each animation frame event `anim.frame.<id>`, on start `anim.start.<id>` and on end `anim.finish.<id>`.
-</span></code><code id="L5392"><span class="ln">5392</span><span class="c"> \*/</span>
-</code><code id="L5393"><span class="ln">5393</span> elproto.setTime<span class="s"> = </span><b>function</b> (anim, value) {
-</code><code id="L5394"><span class="ln">5394</span> <b>if</b> (anim<span class="s"> && </span>value != <b>null</b>) {
-</code><code id="L5395"><span class="ln">5395</span> <b>this</b>.status(anim, mmin(value, anim.ms)<span class="s"> / </span>anim.ms);
-</code><code id="L5396"><span class="ln">5396</span> }
-</code><code id="L5397"><span class="ln">5397</span> <b>return</b> <b>this</b>;
-</code><code id="L5398"><span class="ln">5398</span> };
-</code><code id="L5399"><span class="ln">5399</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L5400"><span class="ln">5400</span><span class="c"> <span class="s"> * </span>Element.status
-</span></code><code id="L5401"><span class="ln">5401</span><span class="c"> [ method ]
-</span></code><code id="L5402"><span class="ln">5402</span><span class="c"> **
-</span></code><code id="L5403"><span class="ln">5403</span><span class="c"> <span class="s"> * </span>Gets or sets the status of animation of the element.
-</span></code><code id="L5404"><span class="ln">5404</span><span class="c"> **
-</span></code><code id="L5405"><span class="ln">5405</span><span class="c"> > Parameters
-</span></code><code id="L5406"><span class="ln">5406</span><span class="c"> **
-</span></code><code id="L5407"><span class="ln">5407</span><span class="c"> <span class="s"> - </span>anim (object) #optional animation object
-</span></code><code id="L5408"><span class="ln">5408</span><span class="c"> <span class="s"> - </span>value (number) #optional <span class="d">0</span> – <span class="d">1</span>. If specified, method works like a setter and sets the status of a given animation to the value. This will cause animation to jump to the given position.
+</code><code id="L5064"><span class="ln">5064</span> <b>function</b> CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) {
+</code><code id="L5065"><span class="ln">5065</span> <b>var</b> cx<span class="s"> = </span><span class="d">3</span><span class="s"> * </span>p1x,
+</code><code id="L5066"><span class="ln">5066</span> bx<span class="s"> = </span><span class="d">3</span><span class="s"> * </span>(p2x<span class="s"> - </span>p1x)<span class="s"> - </span>cx,
+</code><code id="L5067"><span class="ln">5067</span> ax<span class="s"> = </span><span class="d">1</span><span class="s"> - </span>cx<span class="s"> - </span>bx,
+</code><code id="L5068"><span class="ln">5068</span> cy<span class="s"> = </span><span class="d">3</span><span class="s"> * </span>p1y,
+</code><code id="L5069"><span class="ln">5069</span> by<span class="s"> = </span><span class="d">3</span><span class="s"> * </span>(p2y<span class="s"> - </span>p1y)<span class="s"> - </span>cy,
+</code><code id="L5070"><span class="ln">5070</span> ay<span class="s"> = </span><span class="d">1</span><span class="s"> - </span>cy<span class="s"> - </span>by;
+</code><code id="L5071"><span class="ln">5071</span> <b>function</b> sampleCurveX(t) {
+</code><code id="L5072"><span class="ln">5072</span> <b>return</b> ((ax<span class="s"> * </span>t<span class="s"> + </span>bx)<span class="s"> * </span>t<span class="s"> + </span>cx)<span class="s"> * </span>t;
+</code><code id="L5073"><span class="ln">5073</span> }
+</code><code id="L5074"><span class="ln">5074</span> <b>function</b> solve(x, epsilon) {
+</code><code id="L5075"><span class="ln">5075</span> <b>var</b> t<span class="s"> = </span>solveCurveX(x, epsilon);
+</code><code id="L5076"><span class="ln">5076</span> <b>return</b> ((ay<span class="s"> * </span>t<span class="s"> + </span>by)<span class="s"> * </span>t<span class="s"> + </span>cy)<span class="s"> * </span>t;
+</code><code id="L5077"><span class="ln">5077</span> }
+</code><code id="L5078"><span class="ln">5078</span> <b>function</b> solveCurveX(x, epsilon) {
+</code><code id="L5079"><span class="ln">5079</span> <b>var</b> t0, t1, t2, x2, d2, i;
+</code><code id="L5080"><span class="ln">5080</span> <b>for</b>(t2<span class="s"> = </span>x, i<span class="s"> = </span><span class="d">0</span>; i < <span class="d">8</span>; i++) {
+</code><code id="L5081"><span class="ln">5081</span> x2<span class="s"> = </span>sampleCurveX(t2)<span class="s"> - </span>x;
+</code><code id="L5082"><span class="ln">5082</span> <b>if</b> (abs(x2) < epsilon) {
+</code><code id="L5083"><span class="ln">5083</span> <b>return</b> t2;
+</code><code id="L5084"><span class="ln">5084</span> }
+</code><code id="L5085"><span class="ln">5085</span> d2<span class="s"> = </span>(<span class="d">3</span><span class="s"> * </span>ax<span class="s"> * </span>t2<span class="s"> + </span><span class="d">2</span><span class="s"> * </span>bx)<span class="s"> * </span>t2<span class="s"> + </span>cx;
+</code><code id="L5086"><span class="ln">5086</span> <b>if</b> (abs(d2) < <span class="d">1e-6</span>) {
+</code><code id="L5087"><span class="ln">5087</span> <b>break</b>;
+</code><code id="L5088"><span class="ln">5088</span> }
+</code><code id="L5089"><span class="ln">5089</span> t2<span class="s"> = </span>t2<span class="s"> - </span>x2<span class="s"> / </span>d2;
+</code><code id="L5090"><span class="ln">5090</span> }
+</code><code id="L5091"><span class="ln">5091</span> t0<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L5092"><span class="ln">5092</span> t1<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L5093"><span class="ln">5093</span> t2<span class="s"> = </span>x;
+</code><code id="L5094"><span class="ln">5094</span> <b>if</b> (t2 < t0) {
+</code><code id="L5095"><span class="ln">5095</span> <b>return</b> t0;
+</code><code id="L5096"><span class="ln">5096</span> }
+</code><code id="L5097"><span class="ln">5097</span> <b>if</b> (t2 > t1) {
+</code><code id="L5098"><span class="ln">5098</span> <b>return</b> t1;
+</code><code id="L5099"><span class="ln">5099</span> }
+</code><code id="L5100"><span class="ln">5100</span> <b>while</b> (t0 < t1) {
+</code><code id="L5101"><span class="ln">5101</span> x2<span class="s"> = </span>sampleCurveX(t2);
+</code><code id="L5102"><span class="ln">5102</span> <b>if</b> (abs(x2<span class="s"> - </span>x) < epsilon) {
+</code><code id="L5103"><span class="ln">5103</span> <b>return</b> t2;
+</code><code id="L5104"><span class="ln">5104</span> }
+</code><code id="L5105"><span class="ln">5105</span> <b>if</b> (x > x2) {
+</code><code id="L5106"><span class="ln">5106</span> t0<span class="s"> = </span>t2;
+</code><code id="L5107"><span class="ln">5107</span> } <b>else</b> {
+</code><code id="L5108"><span class="ln">5108</span> t1<span class="s"> = </span>t2;
+</code><code id="L5109"><span class="ln">5109</span> }
+</code><code id="L5110"><span class="ln">5110</span> t2<span class="s"> = </span>(t1<span class="s"> - </span>t0)<span class="s"> / </span><span class="d">2</span><span class="s"> + </span>t0;
+</code><code id="L5111"><span class="ln">5111</span> }
+</code><code id="L5112"><span class="ln">5112</span> <b>return</b> t2;
+</code><code id="L5113"><span class="ln">5113</span> }
+</code><code id="L5114"><span class="ln">5114</span> <b>return</b> solve(t, <span class="d">1</span><span class="s"> / </span>(<span class="d">200</span><span class="s"> * </span>duration));
+</code><code id="L5115"><span class="ln">5115</span> }
+</code><code id="L5116"><span class="ln">5116</span> elproto.onAnimation<span class="s"> = </span><b>function</b> (f) {
+</code><code id="L5117"><span class="ln">5117</span> f ? eve.on(<i>"anim.frame."</i><span class="s"> + </span><b>this</b>.id, f) : eve.unbind(<i>"anim.frame."</i><span class="s"> + </span><b>this</b>.id);
+</code><code id="L5118"><span class="ln">5118</span> <b>return</b> <b>this</b>;
+</code><code id="L5119"><span class="ln">5119</span> };
+</code><code id="L5120"><span class="ln">5120</span> <b>function</b> Animation(anim, ms) {
+</code><code id="L5121"><span class="ln">5121</span> <b>var</b> percents<span class="s"> = </span>[];
+</code><code id="L5122"><span class="ln">5122</span> <b>this</b>.anim<span class="s"> = </span>anim;
+</code><code id="L5123"><span class="ln">5123</span> <b>this</b>.ms<span class="s"> = </span>ms;
+</code><code id="L5124"><span class="ln">5124</span> <b>this</b>.times<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L5125"><span class="ln">5125</span> <b>if</b> (<b>this</b>.anim) {
+</code><code id="L5126"><span class="ln">5126</span> <b>for</b> (<b>var</b> attr <b>in</b> <b>this</b>.anim) <b>if</b> (<b>this</b>.anim[has](attr)) {
+</code><code id="L5127"><span class="ln">5127</span> percents.push(+attr);
+</code><code id="L5128"><span class="ln">5128</span> }
+</code><code id="L5129"><span class="ln">5129</span> percents.sort(sortByNumber);
+</code><code id="L5130"><span class="ln">5130</span> }
+</code><code id="L5131"><span class="ln">5131</span> <b>this</b>.top<span class="s"> = </span>percents[percents.length<span class="s"> - </span><span class="d">1</span>];
+</code><code id="L5132"><span class="ln">5132</span> <b>this</b>.percents<span class="s"> = </span>percents;
+</code><code id="L5133"><span class="ln">5133</span> }
+</code><code id="L5134"><span class="ln">5134</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L5135"><span class="ln">5135</span><span class="c"> <span class="s"> * </span>Animation.delay
+</span></code><code id="L5136"><span class="ln">5136</span><span class="c"> [ method ]
+</span></code><code id="L5137"><span class="ln">5137</span><span class="c"> **
+</span></code><code id="L5138"><span class="ln">5138</span><span class="c"> <span class="s"> * </span>Creates a copy of existing animation object <b>with</b> given delay.
+</span></code><code id="L5139"><span class="ln">5139</span><span class="c"> **
+</span></code><code id="L5140"><span class="ln">5140</span><span class="c"> > Parameters
+</span></code><code id="L5141"><span class="ln">5141</span><span class="c"> **
+</span></code><code id="L5142"><span class="ln">5142</span><span class="c"> <span class="s"> - </span>delay (number) number of ms to pass between animation start and actual animation
+</span></code><code id="L5143"><span class="ln">5143</span><span class="c"> **
+</span></code><code id="L5144"><span class="ln">5144</span><span class="c"> <span class="s"> = </span>(object) <b>new</b> altered Animation object
+</span></code><code id="L5145"><span class="ln">5145</span><span class="c"> \*/</span>
+</code><code id="L5146"><span class="ln">5146</span> Animation.prototype.delay<span class="s"> = </span><b>function</b> (delay) {
+</code><code id="L5147"><span class="ln">5147</span> <b>var</b> a<span class="s"> = </span><b>new</b> Animation(<b>this</b>.anim, <b>this</b>.ms);
+</code><code id="L5148"><span class="ln">5148</span> a.times<span class="s"> = </span><b>this</b>.times;
+</code><code id="L5149"><span class="ln">5149</span> a.del<span class="s"> = </span>+delay<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L5150"><span class="ln">5150</span> <b>return</b> a;
+</code><code id="L5151"><span class="ln">5151</span> };
+</code><code id="L5152"><span class="ln">5152</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L5153"><span class="ln">5153</span><span class="c"> <span class="s"> * </span>Animation.repeat
+</span></code><code id="L5154"><span class="ln">5154</span><span class="c"> [ method ]
+</span></code><code id="L5155"><span class="ln">5155</span><span class="c"> **
+</span></code><code id="L5156"><span class="ln">5156</span><span class="c"> <span class="s"> * </span>Creates a copy of existing animation object <b>with</b> given repetition.
+</span></code><code id="L5157"><span class="ln">5157</span><span class="c"> **
+</span></code><code id="L5158"><span class="ln">5158</span><span class="c"> > Parameters
+</span></code><code id="L5159"><span class="ln">5159</span><span class="c"> **
+</span></code><code id="L5160"><span class="ln">5160</span><span class="c"> <span class="s"> - </span>repeat (number) number iterations of animation. For infinite animation pass `Infinity`
+</span></code><code id="L5161"><span class="ln">5161</span><span class="c"> **
+</span></code><code id="L5162"><span class="ln">5162</span><span class="c"> <span class="s"> = </span>(object) <b>new</b> altered Animation object
+</span></code><code id="L5163"><span class="ln">5163</span><span class="c"> \*/</span>
+</code><code id="L5164"><span class="ln">5164</span> Animation.prototype.repeat<span class="s"> = </span><b>function</b> (times) {
+</code><code id="L5165"><span class="ln">5165</span> <b>var</b> a<span class="s"> = </span><b>new</b> Animation(<b>this</b>.anim, <b>this</b>.ms);
+</code><code id="L5166"><span class="ln">5166</span> a.del<span class="s"> = </span><b>this</b>.del;
+</code><code id="L5167"><span class="ln">5167</span> a.times<span class="s"> = </span>math.floor(mmax(times, <span class="d">0</span>))<span class="s"> || </span><span class="d">1</span>;
+</code><code id="L5168"><span class="ln">5168</span> <b>return</b> a;
+</code><code id="L5169"><span class="ln">5169</span> };
+</code><code id="L5170"><span class="ln">5170</span> <b>function</b> runAnimation(anim, element, percent, status, totalOrigin) {
+</code><code id="L5171"><span class="ln">5171</span> percent<span class="s"> = </span>toFloat(percent);
+</code><code id="L5172"><span class="ln">5172</span> <b>var</b> params,
+</code><code id="L5173"><span class="ln">5173</span> isInAnim,
+</code><code id="L5174"><span class="ln">5174</span> isInAnimSet,
+</code><code id="L5175"><span class="ln">5175</span> percents<span class="s"> = </span>[],
+</code><code id="L5176"><span class="ln">5176</span> next,
+</code><code id="L5177"><span class="ln">5177</span> prev,
+</code><code id="L5178"><span class="ln">5178</span> timestamp,
+</code><code id="L5179"><span class="ln">5179</span> ms<span class="s"> = </span>anim.ms,
+</code><code id="L5180"><span class="ln">5180</span> from<span class="s"> = </span>{},
+</code><code id="L5181"><span class="ln">5181</span> to<span class="s"> = </span>{},
+</code><code id="L5182"><span class="ln">5182</span> diff<span class="s"> = </span>{};
+</code><code id="L5183"><span class="ln">5183</span> <b>if</b> (status) {
+</code><code id="L5184"><span class="ln">5184</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>animationElements.length; i < ii; i++) {
+</code><code id="L5185"><span class="ln">5185</span> <b>var</b> e<span class="s"> = </span>animationElements[i];
+</code><code id="L5186"><span class="ln">5186</span> <b>if</b> (e.el.id<span class="s"> == </span>element.id<span class="s"> && </span>e.anim<span class="s"> == </span>anim) {
+</code><code id="L5187"><span class="ln">5187</span> <b>if</b> (e.percent != percent) {
+</code><code id="L5188"><span class="ln">5188</span> animationElements.splice(i, <span class="d">1</span>);
+</code><code id="L5189"><span class="ln">5189</span> isInAnimSet<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L5190"><span class="ln">5190</span> } <b>else</b> {
+</code><code id="L5191"><span class="ln">5191</span> isInAnim<span class="s"> = </span>e;
+</code><code id="L5192"><span class="ln">5192</span> }
+</code><code id="L5193"><span class="ln">5193</span> element.attr(e.totalOrigin);
+</code><code id="L5194"><span class="ln">5194</span> <b>break</b>;
+</code><code id="L5195"><span class="ln">5195</span> }
+</code><code id="L5196"><span class="ln">5196</span> }
+</code><code id="L5197"><span class="ln">5197</span> } <b>else</b> {
+</code><code id="L5198"><span class="ln">5198</span> status<span class="s"> = </span>+to; <span class="c">// NaN</span>
+</code><code id="L5199"><span class="ln">5199</span> }
+</code><code id="L5200"><span class="ln">5200</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>anim.percents.length; i < ii; i++) {
+</code><code id="L5201"><span class="ln">5201</span> <b>if</b> (anim.percents[i]<span class="s"> == </span>percent<span class="s"> || </span>anim.percents[i] > status<span class="s"> * </span>anim.top) {
+</code><code id="L5202"><span class="ln">5202</span> percent<span class="s"> = </span>anim.percents[i];
+</code><code id="L5203"><span class="ln">5203</span> prev<span class="s"> = </span>anim.percents[i<span class="s"> - </span><span class="d">1</span>]<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L5204"><span class="ln">5204</span> ms<span class="s"> = </span>ms<span class="s"> / </span>anim.top<span class="s"> * </span>(percent<span class="s"> - </span>prev);
+</code><code id="L5205"><span class="ln">5205</span> next<span class="s"> = </span>anim.percents[i<span class="s"> + </span><span class="d">1</span>];
+</code><code id="L5206"><span class="ln">5206</span> params<span class="s"> = </span>anim.anim[percent];
+</code><code id="L5207"><span class="ln">5207</span> <b>break</b>;
+</code><code id="L5208"><span class="ln">5208</span> } <b>else</b> <b>if</b> (status) {
+</code><code id="L5209"><span class="ln">5209</span> element.attr(anim.anim[anim.percents[i]]);
+</code><code id="L5210"><span class="ln">5210</span> }
+</code><code id="L5211"><span class="ln">5211</span> }
+</code><code id="L5212"><span class="ln">5212</span> <b>if</b> (!params) {
+</code><code id="L5213"><span class="ln">5213</span> <b>return</b>;
+</code><code id="L5214"><span class="ln">5214</span> }
+</code><code id="L5215"><span class="ln">5215</span> <b>if</b> (!isInAnim) {
+</code><code id="L5216"><span class="ln">5216</span> <b>for</b> (attr <b>in</b> params) <b>if</b> (params[has](attr)) {
+</code><code id="L5217"><span class="ln">5217</span> <b>if</b> (availableAnimAttrs[has](attr)<span class="s"> || </span>element.paper.customAttributes[has](attr)) {
+</code><code id="L5218"><span class="ln">5218</span> from[attr]<span class="s"> = </span>element.attr(attr);
+</code><code id="L5219"><span class="ln">5219</span> (from[attr]<span class="s"> == </span><b>null</b>)<span class="s"> && </span>(from[attr]<span class="s"> = </span>availableAttrs[attr]);
+</code><code id="L5220"><span class="ln">5220</span> to[attr]<span class="s"> = </span>params[attr];
+</code><code id="L5221"><span class="ln">5221</span> <b>switch</b> (availableAnimAttrs[attr]) {
+</code><code id="L5222"><span class="ln">5222</span> <b>case</b> nu:
+</code><code id="L5223"><span class="ln">5223</span> diff[attr]<span class="s"> = </span>(to[attr]<span class="s"> - </span>from[attr])<span class="s"> / </span>ms;
+</code><code id="L5224"><span class="ln">5224</span> <b>break</b>;
+</code><code id="L5225"><span class="ln">5225</span> <b>case</b> <i>"colour"</i>:
+</code><code id="L5226"><span class="ln">5226</span> from[attr]<span class="s"> = </span>R.getRGB(from[attr]);
+</code><code id="L5227"><span class="ln">5227</span> <b>var</b> toColour<span class="s"> = </span>R.getRGB(to[attr]);
+</code><code id="L5228"><span class="ln">5228</span> diff[attr]<span class="s"> = </span>{
+</code><code id="L5229"><span class="ln">5229</span> r: (toColour.r<span class="s"> - </span>from[attr].r)<span class="s"> / </span>ms,
+</code><code id="L5230"><span class="ln">5230</span> g: (toColour.g<span class="s"> - </span>from[attr].g)<span class="s"> / </span>ms,
+</code><code id="L5231"><span class="ln">5231</span> b: (toColour.b<span class="s"> - </span>from[attr].b)<span class="s"> / </span>ms
+</code><code id="L5232"><span class="ln">5232</span> };
+</code><code id="L5233"><span class="ln">5233</span> <b>break</b>;
+</code><code id="L5234"><span class="ln">5234</span> <b>case</b> <i>"path"</i>:
+</code><code id="L5235"><span class="ln">5235</span> <b>var</b> pathes<span class="s"> = </span>path2curve(from[attr], to[attr]),
+</code><code id="L5236"><span class="ln">5236</span> toPath<span class="s"> = </span>pathes[<span class="d">1</span>];
+</code><code id="L5237"><span class="ln">5237</span> from[attr]<span class="s"> = </span>pathes[<span class="d">0</span>];
+</code><code id="L5238"><span class="ln">5238</span> diff[attr]<span class="s"> = </span>[];
+</code><code id="L5239"><span class="ln">5239</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>from[attr].length; i < ii; i++) {
+</code><code id="L5240"><span class="ln">5240</span> diff[attr][i]<span class="s"> = </span>[<span class="d">0</span>];
+</code><code id="L5241"><span class="ln">5241</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>from[attr][i].length; j < jj; j++) {
+</code><code id="L5242"><span class="ln">5242</span> diff[attr][i][j]<span class="s"> = </span>(toPath[i][j]<span class="s"> - </span>from[attr][i][j])<span class="s"> / </span>ms;
+</code><code id="L5243"><span class="ln">5243</span> }
+</code><code id="L5244"><span class="ln">5244</span> }
+</code><code id="L5245"><span class="ln">5245</span> <b>break</b>;
+</code><code id="L5246"><span class="ln">5246</span> <b>case</b> <i>"transform"</i>:
+</code><code id="L5247"><span class="ln">5247</span> <b>var</b> _<span class="s"> = </span>element._,
+</code><code id="L5248"><span class="ln">5248</span> eq<span class="s"> = </span>equaliseTransform(_[attr], to[attr]);
+</code><code id="L5249"><span class="ln">5249</span> <b>if</b> (eq) {
+</code><code id="L5250"><span class="ln">5250</span> from[attr]<span class="s"> = </span>eq.from;
+</code><code id="L5251"><span class="ln">5251</span> to[attr]<span class="s"> = </span>eq.to;
+</code><code id="L5252"><span class="ln">5252</span> diff[attr]<span class="s"> = </span>[];
+</code><code id="L5253"><span class="ln">5253</span> diff[attr].real<span class="s"> = </span><b>true</b>;
+</code><code id="L5254"><span class="ln">5254</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>from[attr].length; i < ii; i++) {
+</code><code id="L5255"><span class="ln">5255</span> diff[attr][i]<span class="s"> = </span>[from[attr][i][<span class="d">0</span>]];
+</code><code id="L5256"><span class="ln">5256</span> <b>for</b> (j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>from[attr][i].length; j < jj; j++) {
+</code><code id="L5257"><span class="ln">5257</span> diff[attr][i][j]<span class="s"> = </span>(to[attr][i][j]<span class="s"> - </span>from[attr][i][j])<span class="s"> / </span>ms;
+</code><code id="L5258"><span class="ln">5258</span> }
+</code><code id="L5259"><span class="ln">5259</span> }
+</code><code id="L5260"><span class="ln">5260</span> } <b>else</b> {
+</code><code id="L5261"><span class="ln">5261</span> <b>var</b> m<span class="s"> = </span>(element.matrix<span class="s"> || </span><b>new</b> Matrix).m,
+</code><code id="L5262"><span class="ln">5262</span> to2<span class="s"> = </span>{_:{transform: _.transform}, getBBox: <b>function</b> () { <b>return</b> element.getBBox(); }};
+</code><code id="L5263"><span class="ln">5263</span> from[attr]<span class="s"> = </span>[
+</code><code id="L5264"><span class="ln">5264</span> m[<span class="d">0</span>][<span class="d">0</span>],
+</code><code id="L5265"><span class="ln">5265</span> m[<span class="d">1</span>][<span class="d">0</span>],
+</code><code id="L5266"><span class="ln">5266</span> m[<span class="d">0</span>][<span class="d">1</span>],
+</code><code id="L5267"><span class="ln">5267</span> m[<span class="d">1</span>][<span class="d">1</span>],
+</code><code id="L5268"><span class="ln">5268</span> m[<span class="d">0</span>][<span class="d">2</span>],
+</code><code id="L5269"><span class="ln">5269</span> m[<span class="d">1</span>][<span class="d">2</span>]
+</code><code id="L5270"><span class="ln">5270</span> ];
+</code><code id="L5271"><span class="ln">5271</span> extractTransform(to2, to[attr]);
+</code><code id="L5272"><span class="ln">5272</span> to[attr]<span class="s"> = </span>to2._.transform;
+</code><code id="L5273"><span class="ln">5273</span> diff[attr]<span class="s"> = </span>[
+</code><code id="L5274"><span class="ln">5274</span> (to2.matrix.m[<span class="d">0</span>][<span class="d">0</span>]<span class="s"> - </span>m[<span class="d">0</span>][<span class="d">0</span>])<span class="s"> / </span>ms,
+</code><code id="L5275"><span class="ln">5275</span> (to2.matrix.m[<span class="d">1</span>][<span class="d">0</span>]<span class="s"> - </span>m[<span class="d">1</span>][<span class="d">0</span>])<span class="s"> / </span>ms,
+</code><code id="L5276"><span class="ln">5276</span> (to2.matrix.m[<span class="d">0</span>][<span class="d">1</span>]<span class="s"> - </span>m[<span class="d">0</span>][<span class="d">1</span>])<span class="s"> / </span>ms,
+</code><code id="L5277"><span class="ln">5277</span> (to2.matrix.m[<span class="d">1</span>][<span class="d">1</span>]<span class="s"> - </span>m[<span class="d">1</span>][<span class="d">1</span>])<span class="s"> / </span>ms,
+</code><code id="L5278"><span class="ln">5278</span> (to2.matrix.m[<span class="d">0</span>][<span class="d">2</span>]<span class="s"> - </span>m[<span class="d">0</span>][<span class="d">2</span>])<span class="s"> / </span>ms,
+</code><code id="L5279"><span class="ln">5279</span> (to2.matrix.m[<span class="d">1</span>][<span class="d">2</span>]<span class="s"> - </span>m[<span class="d">1</span>][<span class="d">2</span>])<span class="s"> / </span>ms
+</code><code id="L5280"><span class="ln">5280</span> ];
+</code><code id="L5281"><span class="ln">5281</span> <span class="c">// from[attr]<span class="s"> = </span>[_.sx, _.sy, _.deg, _.dx, _.dy];</span>
+</code><code id="L5282"><span class="ln">5282</span> <span class="c">// <b>var</b> to2<span class="s"> = </span>{_:{}, getBBox: <b>function</b> () { <b>return</b> element.getBBox(); }};</span>
+</code><code id="L5283"><span class="ln">5283</span> <span class="c">// extractTransform(to2, to[attr]);</span>
+</code><code id="L5284"><span class="ln">5284</span> <span class="c">// diff[attr]<span class="s"> = </span>[</span>
+</code><code id="L5285"><span class="ln">5285</span> <span class="c">// (to2._.sx<span class="s"> - </span>_.sx)<span class="s"> / </span>ms,</span>
+</code><code id="L5286"><span class="ln">5286</span> <span class="c">// (to2._.sy<span class="s"> - </span>_.sy)<span class="s"> / </span>ms,</span>
+</code><code id="L5287"><span class="ln">5287</span> <span class="c">// (to2._.deg<span class="s"> - </span>_.deg)<span class="s"> / </span>ms,</span>
+</code><code id="L5288"><span class="ln">5288</span> <span class="c">// (to2._.dx<span class="s"> - </span>_.dx)<span class="s"> / </span>ms,</span>
+</code><code id="L5289"><span class="ln">5289</span> <span class="c">// (to2._.dy<span class="s"> - </span>_.dy)<span class="s"> / </span>ms</span>
+</code><code id="L5290"><span class="ln">5290</span> <span class="c">// ];</span>
+</code><code id="L5291"><span class="ln">5291</span> }
+</code><code id="L5292"><span class="ln">5292</span> <b>break</b>;
+</code><code id="L5293"><span class="ln">5293</span> <b>case</b> <i>"csv"</i>:
+</code><code id="L5294"><span class="ln">5294</span> <b>var</b> values<span class="s"> = </span>Str(params[attr]).split(separator),
+</code><code id="L5295"><span class="ln">5295</span> from2<span class="s"> = </span>Str(from[attr]).split(separator);
+</code><code id="L5296"><span class="ln">5296</span> <b>if</b> (attr<span class="s"> == </span><i>"clip-rect"</i>) {
+</code><code id="L5297"><span class="ln">5297</span> from[attr]<span class="s"> = </span>from2;
+</code><code id="L5298"><span class="ln">5298</span> diff[attr]<span class="s"> = </span>[];
+</code><code id="L5299"><span class="ln">5299</span> i<span class="s"> = </span>from2.length;
+</code><code id="L5300"><span class="ln">5300</span> <b>while</b> (i--) {
+</code><code id="L5301"><span class="ln">5301</span> diff[attr][i]<span class="s"> = </span>(values[i]<span class="s"> - </span>from[attr][i])<span class="s"> / </span>ms;
+</code><code id="L5302"><span class="ln">5302</span> }
+</code><code id="L5303"><span class="ln">5303</span> }
+</code><code id="L5304"><span class="ln">5304</span> to[attr]<span class="s"> = </span>values;
+</code><code id="L5305"><span class="ln">5305</span> <b>break</b>;
+</code><code id="L5306"><span class="ln">5306</span> <b>default</b>:
+</code><code id="L5307"><span class="ln">5307</span> values<span class="s"> = </span>[].concat(params[attr]);
+</code><code id="L5308"><span class="ln">5308</span> from2<span class="s"> = </span>[].concat(from[attr]);
+</code><code id="L5309"><span class="ln">5309</span> diff[attr]<span class="s"> = </span>[];
+</code><code id="L5310"><span class="ln">5310</span> i<span class="s"> = </span>element.paper.customAttributes[attr].length;
+</code><code id="L5311"><span class="ln">5311</span> <b>while</b> (i--) {
+</code><code id="L5312"><span class="ln">5312</span> diff[attr][i]<span class="s"> = </span>((values[i]<span class="s"> || </span><span class="d">0</span>)<span class="s"> - </span>(from2[i]<span class="s"> || </span><span class="d">0</span>))<span class="s"> / </span>ms;
+</code><code id="L5313"><span class="ln">5313</span> }
+</code><code id="L5314"><span class="ln">5314</span> <b>break</b>;
+</code><code id="L5315"><span class="ln">5315</span> }
+</code><code id="L5316"><span class="ln">5316</span> }
+</code><code id="L5317"><span class="ln">5317</span> }
+</code><code id="L5318"><span class="ln">5318</span> <b>var</b> easing<span class="s"> = </span>params.easing,
+</code><code id="L5319"><span class="ln">5319</span> easyeasy<span class="s"> = </span>R.easing_formulas[easing];
+</code><code id="L5320"><span class="ln">5320</span> <b>if</b> (!easyeasy) {
+</code><code id="L5321"><span class="ln">5321</span> easyeasy<span class="s"> = </span>Str(easing).match(bezierrg);
+</code><code id="L5322"><span class="ln">5322</span> <b>if</b> (easyeasy<span class="s"> && </span>easyeasy.length<span class="s"> == </span><span class="d">5</span>) {
+</code><code id="L5323"><span class="ln">5323</span> <b>var</b> curve<span class="s"> = </span>easyeasy;
+</code><code id="L5324"><span class="ln">5324</span> easyeasy<span class="s"> = </span><b>function</b> (t) {
+</code><code id="L5325"><span class="ln">5325</span> <b>return</b> CubicBezierAtTime(t, +curve[<span class="d">1</span>], +curve[<span class="d">2</span>], +curve[<span class="d">3</span>], +curve[<span class="d">4</span>], ms);
+</code><code id="L5326"><span class="ln">5326</span> };
+</code><code id="L5327"><span class="ln">5327</span> } <b>else</b> {
+</code><code id="L5328"><span class="ln">5328</span> easyeasy<span class="s"> = </span>pipe;
+</code><code id="L5329"><span class="ln">5329</span> }
+</code><code id="L5330"><span class="ln">5330</span> }
+</code><code id="L5331"><span class="ln">5331</span> timestamp<span class="s"> = </span>params.start<span class="s"> || </span>anim.start<span class="s"> || </span>+<b>new</b> Date;
+</code><code id="L5332"><span class="ln">5332</span> e<span class="s"> = </span>{
+</code><code id="L5333"><span class="ln">5333</span> anim: anim,
+</code><code id="L5334"><span class="ln">5334</span> percent: percent,
+</code><code id="L5335"><span class="ln">5335</span> timestamp: timestamp,
+</code><code id="L5336"><span class="ln">5336</span> start: timestamp<span class="s"> + </span>(anim.del<span class="s"> || </span><span class="d">0</span>),
+</code><code id="L5337"><span class="ln">5337</span> status: <span class="d">0</span>,
+</code><code id="L5338"><span class="ln">5338</span> initstatus: status<span class="s"> || </span><span class="d">0</span>,
+</code><code id="L5339"><span class="ln">5339</span> stop: <b>false</b>,
+</code><code id="L5340"><span class="ln">5340</span> ms: ms,
+</code><code id="L5341"><span class="ln">5341</span> easing: easyeasy,
+</code><code id="L5342"><span class="ln">5342</span> from: from,
+</code><code id="L5343"><span class="ln">5343</span> diff: diff,
+</code><code id="L5344"><span class="ln">5344</span> to: to,
+</code><code id="L5345"><span class="ln">5345</span> el: element,
+</code><code id="L5346"><span class="ln">5346</span> callback: params.callback,
+</code><code id="L5347"><span class="ln">5347</span> prev: prev,
+</code><code id="L5348"><span class="ln">5348</span> next: next,
+</code><code id="L5349"><span class="ln">5349</span> repeat: anim.times,
+</code><code id="L5350"><span class="ln">5350</span> origin: element.attr(),
+</code><code id="L5351"><span class="ln">5351</span> totalOrigin: totalOrigin
+</code><code id="L5352"><span class="ln">5352</span> };
+</code><code id="L5353"><span class="ln">5353</span> animationElements.push(e);
+</code><code id="L5354"><span class="ln">5354</span> <b>if</b> (status<span class="s"> && </span>!isInAnim) {
+</code><code id="L5355"><span class="ln">5355</span> e.stop<span class="s"> = </span><b>true</b>;
+</code><code id="L5356"><span class="ln">5356</span> e.start<span class="s"> = </span><b>new</b> Date<span class="s"> - </span>ms<span class="s"> * </span>status;
+</code><code id="L5357"><span class="ln">5357</span> <b>if</b> (animationElements.length<span class="s"> == </span><span class="d">1</span>) {
+</code><code id="L5358"><span class="ln">5358</span> <b>return</b> animation();
+</code><code id="L5359"><span class="ln">5359</span> }
+</code><code id="L5360"><span class="ln">5360</span> }
+</code><code id="L5361"><span class="ln">5361</span> animationElements.length<span class="s"> == </span><span class="d">1</span><span class="s"> && </span>requestAnimFrame(animation);
+</code><code id="L5362"><span class="ln">5362</span> } <b>else</b> {
+</code><code id="L5363"><span class="ln">5363</span> isInAnim.initstatus<span class="s"> = </span>status;
+</code><code id="L5364"><span class="ln">5364</span> isInAnim.start<span class="s"> = </span><b>new</b> Date<span class="s"> - </span>isInAnim.ms<span class="s"> * </span>status;
+</code><code id="L5365"><span class="ln">5365</span> }
+</code><code id="L5366"><span class="ln">5366</span> eve(<i>"anim.start."</i><span class="s"> + </span>element.id, element, anim);
+</code><code id="L5367"><span class="ln">5367</span> }
+</code><code id="L5368"><span class="ln">5368</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L5369"><span class="ln">5369</span><span class="c"> <span class="s"> * </span>Raphael.animation
+</span></code><code id="L5370"><span class="ln">5370</span><span class="c"> [ method ]
+</span></code><code id="L5371"><span class="ln">5371</span><span class="c"> **
+</span></code><code id="L5372"><span class="ln">5372</span><span class="c"> <span class="s"> * </span>Creates an animation object that can be passed to the @Element.animate or @Element.animateWith methods.
+</span></code><code id="L5373"><span class="ln">5373</span><span class="c"> <span class="s"> * </span>See also @Animation.delay and @Animation.repeat methods.
+</span></code><code id="L5374"><span class="ln">5374</span><span class="c"> **
+</span></code><code id="L5375"><span class="ln">5375</span><span class="c"> > Parameters
+</span></code><code id="L5376"><span class="ln">5376</span><span class="c"> **
+</span></code><code id="L5377"><span class="ln">5377</span><span class="c"> <span class="s"> - </span>params (object) <b>final</b> attributes <b>for</b> the element, see also @Element.attr
+</span></code><code id="L5378"><span class="ln">5378</span><span class="c"> <span class="s"> - </span>ms (number) number of milliseconds <b>for</b> animation to run
+</span></code><code id="L5379"><span class="ln">5379</span><span class="c"> <span class="s"> - </span>easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX)`
+</span></code><code id="L5380"><span class="ln">5380</span><span class="c"> <span class="s"> - </span>callback (<b>function</b>) #optional callback <b>function</b>. Will be called at the end of animation.
+</span></code><code id="L5381"><span class="ln">5381</span><span class="c"> **
+</span></code><code id="L5382"><span class="ln">5382</span><span class="c"> <span class="s"> = </span>(object) @Animation
+</span></code><code id="L5383"><span class="ln">5383</span><span class="c"> \*/</span>
+</code><code id="L5384"><span class="ln">5384</span> R.animation<span class="s"> = </span><b>function</b> (params, ms, easing, callback) {
+</code><code id="L5385"><span class="ln">5385</span> <b>if</b> (R.is(easing, <i>"<b>function</b>"</i>)<span class="s"> || </span>!easing) {
+</code><code id="L5386"><span class="ln">5386</span> callback<span class="s"> = </span>callback<span class="s"> || </span>easing<span class="s"> || </span><b>null</b>;
+</code><code id="L5387"><span class="ln">5387</span> easing<span class="s"> = </span><b>null</b>;
+</code><code id="L5388"><span class="ln">5388</span> }
+</code><code id="L5389"><span class="ln">5389</span> params<span class="s"> = </span>Object(params);
+</code><code id="L5390"><span class="ln">5390</span> ms<span class="s"> = </span>+ms<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L5391"><span class="ln">5391</span> <b>var</b> p<span class="s"> = </span>{},
+</code><code id="L5392"><span class="ln">5392</span> json,
+</code><code id="L5393"><span class="ln">5393</span> attr;
+</code><code id="L5394"><span class="ln">5394</span> <b>for</b> (attr <b>in</b> params) <b>if</b> (params[has](attr)<span class="s"> && </span>toFloat(attr) != attr) {
+</code><code id="L5395"><span class="ln">5395</span> json<span class="s"> = </span><b>true</b>;
+</code><code id="L5396"><span class="ln">5396</span> p[attr]<span class="s"> = </span>params[attr];
+</code><code id="L5397"><span class="ln">5397</span> }
+</code><code id="L5398"><span class="ln">5398</span> <b>if</b> (!json) {
+</code><code id="L5399"><span class="ln">5399</span> <b>return</b> <b>new</b> Animation(params, ms);
+</code><code id="L5400"><span class="ln">5400</span> } <b>else</b> {
+</code><code id="L5401"><span class="ln">5401</span> easing<span class="s"> && </span>(p.easing<span class="s"> = </span>easing);
+</code><code id="L5402"><span class="ln">5402</span> callback<span class="s"> && </span>(p.callback<span class="s"> = </span>callback);
+</code><code id="L5403"><span class="ln">5403</span> <b>return</b> <b>new</b> Animation({<span class="d">100</span>: p}, ms);
+</code><code id="L5404"><span class="ln">5404</span> }
+</code><code id="L5405"><span class="ln">5405</span> };
+</code><code id="L5406"><span class="ln">5406</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L5407"><span class="ln">5407</span><span class="c"> <span class="s"> * </span>Element.animate
+</span></code><code id="L5408"><span class="ln">5408</span><span class="c"> [ method ]
</span></code><code id="L5409"><span class="ln">5409</span><span class="c"> **
-</span></code><code id="L5410"><span class="ln">5410</span><span class="c"> <span class="s"> = </span>(number) status
-</span></code><code id="L5411"><span class="ln">5411</span><span class="c"> <span class="s"> * </span>or
-</span></code><code id="L5412"><span class="ln">5412</span><span class="c"> <span class="s"> = </span>(array) status <b>if</b> `anim` is not specified. Array of objects <b>in</b> format:
-</span></code><code id="L5413"><span class="ln">5413</span><span class="c"> o {
-</span></code><code id="L5414"><span class="ln">5414</span><span class="c"> o anim: (object) animation object
-</span></code><code id="L5415"><span class="ln">5415</span><span class="c"> o status: (number) status
-</span></code><code id="L5416"><span class="ln">5416</span><span class="c"> o }
-</span></code><code id="L5417"><span class="ln">5417</span><span class="c"> <span class="s"> * </span>or
-</span></code><code id="L5418"><span class="ln">5418</span><span class="c"> <span class="s"> = </span>(object) original element <b>if</b> `value` is specified
-</span></code><code id="L5419"><span class="ln">5419</span><span class="c"> \*/</span>
-</code><code id="L5420"><span class="ln">5420</span> elproto.status<span class="s"> = </span><b>function</b> (anim, value) {
-</code><code id="L5421"><span class="ln">5421</span> <b>var</b> out<span class="s"> = </span>[],
-</code><code id="L5422"><span class="ln">5422</span> i<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L5423"><span class="ln">5423</span> len,
-</code><code id="L5424"><span class="ln">5424</span> e;
-</code><code id="L5425"><span class="ln">5425</span> <b>if</b> (value != <b>null</b>) {
-</code><code id="L5426"><span class="ln">5426</span> runAnimation(anim, <b>this</b>, -<span class="d">1</span>, mmin(value, <span class="d">1</span>));
-</code><code id="L5427"><span class="ln">5427</span> <b>return</b> <b>this</b>;
-</code><code id="L5428"><span class="ln">5428</span> } <b>else</b> {
-</code><code id="L5429"><span class="ln">5429</span> len<span class="s"> = </span>animationElements.length;
-</code><code id="L5430"><span class="ln">5430</span> <b>for</b> (; i < len; i++) {
-</code><code id="L5431"><span class="ln">5431</span> e<span class="s"> = </span>animationElements[i];
-</code><code id="L5432"><span class="ln">5432</span> <b>if</b> (e.el.id<span class="s"> == </span><b>this</b>.id<span class="s"> && </span>(!anim<span class="s"> || </span>e.anim<span class="s"> == </span>anim)) {
-</code><code id="L5433"><span class="ln">5433</span> <b>if</b> (anim) {
-</code><code id="L5434"><span class="ln">5434</span> <b>return</b> e.status;
-</code><code id="L5435"><span class="ln">5435</span> }
-</code><code id="L5436"><span class="ln">5436</span> out.push({anim: e.anim, status: e.status});
-</code><code id="L5437"><span class="ln">5437</span> }
-</code><code id="L5438"><span class="ln">5438</span> }
-</code><code id="L5439"><span class="ln">5439</span> <b>if</b> (anim) {
-</code><code id="L5440"><span class="ln">5440</span> <b>return</b> <span class="d">0</span>;
-</code><code id="L5441"><span class="ln">5441</span> }
-</code><code id="L5442"><span class="ln">5442</span> <b>return</b> out;
-</code><code id="L5443"><span class="ln">5443</span> }
-</code><code id="L5444"><span class="ln">5444</span> };
-</code><code id="L5445"><span class="ln">5445</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L5446"><span class="ln">5446</span><span class="c"> <span class="s"> * </span>Element.pause
-</span></code><code id="L5447"><span class="ln">5447</span><span class="c"> [ method ]
-</span></code><code id="L5448"><span class="ln">5448</span><span class="c"> **
-</span></code><code id="L5449"><span class="ln">5449</span><span class="c"> <span class="s"> * </span>Stops animation of the element <b>with</b> ability to resume it later on.
-</span></code><code id="L5450"><span class="ln">5450</span><span class="c"> **
-</span></code><code id="L5451"><span class="ln">5451</span><span class="c"> > Parameters
-</span></code><code id="L5452"><span class="ln">5452</span><span class="c"> **
-</span></code><code id="L5453"><span class="ln">5453</span><span class="c"> <span class="s"> - </span>anim (object) #optional animation object
-</span></code><code id="L5454"><span class="ln">5454</span><span class="c"> **
-</span></code><code id="L5455"><span class="ln">5455</span><span class="c"> <span class="s"> = </span>(object) original element
-</span></code><code id="L5456"><span class="ln">5456</span><span class="c"> \*/</span>
-</code><code id="L5457"><span class="ln">5457</span> elproto.pause<span class="s"> = </span><b>function</b> (anim) {
-</code><code id="L5458"><span class="ln">5458</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>; i < animationElements.length; i++) <b>if</b> (animationElements[i].el.id<span class="s"> == </span><b>this</b>.id<span class="s"> && </span>(!anim<span class="s"> || </span>animationElements[i].anim<span class="s"> == </span>anim)) {
-</code><code id="L5459"><span class="ln">5459</span> <b>if</b> (eve(<i>"anim.pause."</i><span class="s"> + </span><b>this</b>.id, <b>this</b>, animationElements[i].anim) !== <b>false</b>) {
-</code><code id="L5460"><span class="ln">5460</span> animationElements[i].paused<span class="s"> = </span><b>true</b>;
-</code><code id="L5461"><span class="ln">5461</span> }
-</code><code id="L5462"><span class="ln">5462</span> }
-</code><code id="L5463"><span class="ln">5463</span> <b>return</b> <b>this</b>;
-</code><code id="L5464"><span class="ln">5464</span> };
-</code><code id="L5465"><span class="ln">5465</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L5466"><span class="ln">5466</span><span class="c"> <span class="s"> * </span>Element.resume
-</span></code><code id="L5467"><span class="ln">5467</span><span class="c"> [ method ]
-</span></code><code id="L5468"><span class="ln">5468</span><span class="c"> **
-</span></code><code id="L5469"><span class="ln">5469</span><span class="c"> <span class="s"> * </span>Resumes animation <b>if</b> it was paused <b>with</b> @Element.pause method.
-</span></code><code id="L5470"><span class="ln">5470</span><span class="c"> **
-</span></code><code id="L5471"><span class="ln">5471</span><span class="c"> > Parameters
-</span></code><code id="L5472"><span class="ln">5472</span><span class="c"> **
-</span></code><code id="L5473"><span class="ln">5473</span><span class="c"> <span class="s"> - </span>anim (object) #optional animation object
-</span></code><code id="L5474"><span class="ln">5474</span><span class="c"> **
-</span></code><code id="L5475"><span class="ln">5475</span><span class="c"> <span class="s"> = </span>(object) original element
-</span></code><code id="L5476"><span class="ln">5476</span><span class="c"> \*/</span>
-</code><code id="L5477"><span class="ln">5477</span> elproto.resume<span class="s"> = </span><b>function</b> (anim) {
-</code><code id="L5478"><span class="ln">5478</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>; i < animationElements.length; i++) <b>if</b> (animationElements[i].el.id<span class="s"> == </span><b>this</b>.id<span class="s"> && </span>(!anim<span class="s"> || </span>animationElements[i].anim<span class="s"> == </span>anim)) {
-</code><code id="L5479"><span class="ln">5479</span> <b>var</b> e<span class="s"> = </span>animationElements[i];
-</code><code id="L5480"><span class="ln">5480</span> <b>if</b> (eve(<i>"anim.resume."</i><span class="s"> + </span><b>this</b>.id, <b>this</b>, e.anim) !== <b>false</b>) {
-</code><code id="L5481"><span class="ln">5481</span> <b>delete</b> e.paused;
-</code><code id="L5482"><span class="ln">5482</span> <b>this</b>.status(e.anim, e.status);
-</code><code id="L5483"><span class="ln">5483</span> }
-</code><code id="L5484"><span class="ln">5484</span> }
-</code><code id="L5485"><span class="ln">5485</span> <b>return</b> <b>this</b>;
-</code><code id="L5486"><span class="ln">5486</span> };
-</code><code id="L5487"><span class="ln">5487</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L5488"><span class="ln">5488</span><span class="c"> <span class="s"> * </span>Element.stop
-</span></code><code id="L5489"><span class="ln">5489</span><span class="c"> [ method ]
-</span></code><code id="L5490"><span class="ln">5490</span><span class="c"> **
-</span></code><code id="L5491"><span class="ln">5491</span><span class="c"> <span class="s"> * </span>Stops animation of the element.
-</span></code><code id="L5492"><span class="ln">5492</span><span class="c"> **
-</span></code><code id="L5493"><span class="ln">5493</span><span class="c"> > Parameters
-</span></code><code id="L5494"><span class="ln">5494</span><span class="c"> **
-</span></code><code id="L5495"><span class="ln">5495</span><span class="c"> <span class="s"> - </span>anim (object) #optional animation object
-</span></code><code id="L5496"><span class="ln">5496</span><span class="c"> **
-</span></code><code id="L5497"><span class="ln">5497</span><span class="c"> <span class="s"> = </span>(object) original element
-</span></code><code id="L5498"><span class="ln">5498</span><span class="c"> \*/</span>
-</code><code id="L5499"><span class="ln">5499</span> elproto.stop<span class="s"> = </span><b>function</b> (anim) {
-</code><code id="L5500"><span class="ln">5500</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>; i < animationElements.length; i++) <b>if</b> (animationElements[i].el.id<span class="s"> == </span><b>this</b>.id<span class="s"> && </span>(!anim<span class="s"> || </span>animationElements[i].anim<span class="s"> == </span>anim)) {
-</code><code id="L5501"><span class="ln">5501</span> <b>if</b> (eve(<i>"anim.stop."</i><span class="s"> + </span><b>this</b>.id, <b>this</b>, animationElements[i].anim) !== <b>false</b>) {
-</code><code id="L5502"><span class="ln">5502</span> animationElements.splice(i--, <span class="d">1</span>);
-</code><code id="L5503"><span class="ln">5503</span> }
-</code><code id="L5504"><span class="ln">5504</span> }
-</code><code id="L5505"><span class="ln">5505</span> <b>return</b> <b>this</b>;
-</code><code id="L5506"><span class="ln">5506</span> };
-</code><code id="L5507"><span class="ln">5507</span> elproto.toString<span class="s"> = </span><b>function</b> () {
-</code><code id="L5508"><span class="ln">5508</span> <b>return</b> <i>"Rapha\xebl\u2019s object"</i>;
-</code><code id="L5509"><span class="ln">5509</span> };
-</code><code id="L5510"><span class="ln">5510</span>
-</code><code id="L5511"><span class="ln">5511</span> <span class="c">// Set</span>
-</code><code id="L5512"><span class="ln">5512</span> <b>var</b> Set<span class="s"> = </span><b>function</b> (items) {
-</code><code id="L5513"><span class="ln">5513</span> <b>this</b>.items<span class="s"> = </span>[];
-</code><code id="L5514"><span class="ln">5514</span> <b>this</b>.length<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L5515"><span class="ln">5515</span> <b>this</b>.type<span class="s"> = </span><i>"set"</i>;
-</code><code id="L5516"><span class="ln">5516</span> <b>if</b> (items) {
-</code><code id="L5517"><span class="ln">5517</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>items.length; i < ii; i++) {
-</code><code id="L5518"><span class="ln">5518</span> <b>if</b> (items[i]<span class="s"> && </span>(items[i].constructor<span class="s"> == </span>Element<span class="s"> || </span>items[i].constructor<span class="s"> == </span>Set)) {
-</code><code id="L5519"><span class="ln">5519</span> <b>this</b>[<b>this</b>.items.length]<span class="s"> = </span><b>this</b>.items[<b>this</b>.items.length]<span class="s"> = </span>items[i];
-</code><code id="L5520"><span class="ln">5520</span> <b>this</b>.length++;
-</code><code id="L5521"><span class="ln">5521</span> }
-</code><code id="L5522"><span class="ln">5522</span> }
-</code><code id="L5523"><span class="ln">5523</span> }
-</code><code id="L5524"><span class="ln">5524</span> },
-</code><code id="L5525"><span class="ln">5525</span> setproto<span class="s"> = </span>Set.prototype;
-</code><code id="L5526"><span class="ln">5526</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L5527"><span class="ln">5527</span><span class="c"> <span class="s"> * </span>Set.push
-</span></code><code id="L5528"><span class="ln">5528</span><span class="c"> [ method ]
-</span></code><code id="L5529"><span class="ln">5529</span><span class="c"> **
-</span></code><code id="L5530"><span class="ln">5530</span><span class="c"> <span class="s"> * </span>Adds each argument to the current set.
+</span></code><code id="L5410"><span class="ln">5410</span><span class="c"> <span class="s"> * </span>Creates and starts animation <b>for</b> given element.
+</span></code><code id="L5411"><span class="ln">5411</span><span class="c"> **
+</span></code><code id="L5412"><span class="ln">5412</span><span class="c"> > Parameters
+</span></code><code id="L5413"><span class="ln">5413</span><span class="c"> **
+</span></code><code id="L5414"><span class="ln">5414</span><span class="c"> <span class="s"> - </span>params (object) <b>final</b> attributes <b>for</b> the element, see also @Element.attr
+</span></code><code id="L5415"><span class="ln">5415</span><span class="c"> <span class="s"> - </span>ms (number) number of milliseconds <b>for</b> animation to run
+</span></code><code id="L5416"><span class="ln">5416</span><span class="c"> <span class="s"> - </span>easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX)`
+</span></code><code id="L5417"><span class="ln">5417</span><span class="c"> <span class="s"> - </span>callback (<b>function</b>) #optional callback <b>function</b>. Will be called at the end of animation.
+</span></code><code id="L5418"><span class="ln">5418</span><span class="c"> <span class="s"> * </span>or
+</span></code><code id="L5419"><span class="ln">5419</span><span class="c"> <span class="s"> - </span>animation (object) animation object, see @Raphael.animation
+</span></code><code id="L5420"><span class="ln">5420</span><span class="c"> **
+</span></code><code id="L5421"><span class="ln">5421</span><span class="c"> <span class="s"> = </span>(object) original element
+</span></code><code id="L5422"><span class="ln">5422</span><span class="c"> \*/</span>
+</code><code id="L5423"><span class="ln">5423</span> elproto.animate<span class="s"> = </span><b>function</b> (params, ms, easing, callback) {
+</code><code id="L5424"><span class="ln">5424</span> <b>var</b> element<span class="s"> = </span><b>this</b>;
+</code><code id="L5425"><span class="ln">5425</span> <b>if</b> (element.removed) {
+</code><code id="L5426"><span class="ln">5426</span> callback<span class="s"> && </span>callback.call(element);
+</code><code id="L5427"><span class="ln">5427</span> <b>return</b> element;
+</code><code id="L5428"><span class="ln">5428</span> }
+</code><code id="L5429"><span class="ln">5429</span> <b>var</b> anim<span class="s"> = </span>params <b>instanceof</b> Animation ? params : R.animation(params, ms, easing, callback);
+</code><code id="L5430"><span class="ln">5430</span> runAnimation(anim, element, anim.percents[<span class="d">0</span>], <b>null</b>, element.attr());
+</code><code id="L5431"><span class="ln">5431</span> <b>return</b> element;
+</code><code id="L5432"><span class="ln">5432</span> };
+</code><code id="L5433"><span class="ln">5433</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L5434"><span class="ln">5434</span><span class="c"> <span class="s"> * </span>Element.setTime
+</span></code><code id="L5435"><span class="ln">5435</span><span class="c"> [ method ]
+</span></code><code id="L5436"><span class="ln">5436</span><span class="c"> **
+</span></code><code id="L5437"><span class="ln">5437</span><span class="c"> <span class="s"> * </span>Sets the status of animation of the element <b>in</b> milliseconds. Similar to @Element.status method.
+</span></code><code id="L5438"><span class="ln">5438</span><span class="c"> **
+</span></code><code id="L5439"><span class="ln">5439</span><span class="c"> > Parameters
+</span></code><code id="L5440"><span class="ln">5440</span><span class="c"> **
+</span></code><code id="L5441"><span class="ln">5441</span><span class="c"> <span class="s"> - </span>anim (object) animation object
+</span></code><code id="L5442"><span class="ln">5442</span><span class="c"> <span class="s"> - </span>value (number) number of milliseconds from the beginning of the animation
+</span></code><code id="L5443"><span class="ln">5443</span><span class="c"> **
+</span></code><code id="L5444"><span class="ln">5444</span><span class="c"> <span class="s"> = </span>(object) original element <b>if</b> `value` is specified
+</span></code><code id="L5445"><span class="ln">5445</span><span class="c"> <span class="s"> * </span>Note, that during animation following events are triggered:
+</span></code><code id="L5446"><span class="ln">5446</span><span class="c"> *
+</span></code><code id="L5447"><span class="ln">5447</span><span class="c"> <span class="s"> * </span>On each animation frame event `anim.frame.<id>`, on start `anim.start.<id>` and on end `anim.finish.<id>`.
+</span></code><code id="L5448"><span class="ln">5448</span><span class="c"> \*/</span>
+</code><code id="L5449"><span class="ln">5449</span> elproto.setTime<span class="s"> = </span><b>function</b> (anim, value) {
+</code><code id="L5450"><span class="ln">5450</span> <b>if</b> (anim<span class="s"> && </span>value != <b>null</b>) {
+</code><code id="L5451"><span class="ln">5451</span> <b>this</b>.status(anim, mmin(value, anim.ms)<span class="s"> / </span>anim.ms);
+</code><code id="L5452"><span class="ln">5452</span> }
+</code><code id="L5453"><span class="ln">5453</span> <b>return</b> <b>this</b>;
+</code><code id="L5454"><span class="ln">5454</span> };
+</code><code id="L5455"><span class="ln">5455</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L5456"><span class="ln">5456</span><span class="c"> <span class="s"> * </span>Element.status
+</span></code><code id="L5457"><span class="ln">5457</span><span class="c"> [ method ]
+</span></code><code id="L5458"><span class="ln">5458</span><span class="c"> **
+</span></code><code id="L5459"><span class="ln">5459</span><span class="c"> <span class="s"> * </span>Gets or sets the status of animation of the element.
+</span></code><code id="L5460"><span class="ln">5460</span><span class="c"> **
+</span></code><code id="L5461"><span class="ln">5461</span><span class="c"> > Parameters
+</span></code><code id="L5462"><span class="ln">5462</span><span class="c"> **
+</span></code><code id="L5463"><span class="ln">5463</span><span class="c"> <span class="s"> - </span>anim (object) #optional animation object
+</span></code><code id="L5464"><span class="ln">5464</span><span class="c"> <span class="s"> - </span>value (number) #optional <span class="d">0</span> – <span class="d">1</span>. If specified, method works like a setter and sets the status of a given animation to the value. This will cause animation to jump to the given position.
+</span></code><code id="L5465"><span class="ln">5465</span><span class="c"> **
+</span></code><code id="L5466"><span class="ln">5466</span><span class="c"> <span class="s"> = </span>(number) status
+</span></code><code id="L5467"><span class="ln">5467</span><span class="c"> <span class="s"> * </span>or
+</span></code><code id="L5468"><span class="ln">5468</span><span class="c"> <span class="s"> = </span>(array) status <b>if</b> `anim` is not specified. Array of objects <b>in</b> format:
+</span></code><code id="L5469"><span class="ln">5469</span><span class="c"> o {
+</span></code><code id="L5470"><span class="ln">5470</span><span class="c"> o anim: (object) animation object
+</span></code><code id="L5471"><span class="ln">5471</span><span class="c"> o status: (number) status
+</span></code><code id="L5472"><span class="ln">5472</span><span class="c"> o }
+</span></code><code id="L5473"><span class="ln">5473</span><span class="c"> <span class="s"> * </span>or
+</span></code><code id="L5474"><span class="ln">5474</span><span class="c"> <span class="s"> = </span>(object) original element <b>if</b> `value` is specified
+</span></code><code id="L5475"><span class="ln">5475</span><span class="c"> \*/</span>
+</code><code id="L5476"><span class="ln">5476</span> elproto.status<span class="s"> = </span><b>function</b> (anim, value) {
+</code><code id="L5477"><span class="ln">5477</span> <b>var</b> out<span class="s"> = </span>[],
+</code><code id="L5478"><span class="ln">5478</span> i<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L5479"><span class="ln">5479</span> len,
+</code><code id="L5480"><span class="ln">5480</span> e;
+</code><code id="L5481"><span class="ln">5481</span> <b>if</b> (value != <b>null</b>) {
+</code><code id="L5482"><span class="ln">5482</span> runAnimation(anim, <b>this</b>, -<span class="d">1</span>, mmin(value, <span class="d">1</span>));
+</code><code id="L5483"><span class="ln">5483</span> <b>return</b> <b>this</b>;
+</code><code id="L5484"><span class="ln">5484</span> } <b>else</b> {
+</code><code id="L5485"><span class="ln">5485</span> len<span class="s"> = </span>animationElements.length;
+</code><code id="L5486"><span class="ln">5486</span> <b>for</b> (; i < len; i++) {
+</code><code id="L5487"><span class="ln">5487</span> e<span class="s"> = </span>animationElements[i];
+</code><code id="L5488"><span class="ln">5488</span> <b>if</b> (e.el.id<span class="s"> == </span><b>this</b>.id<span class="s"> && </span>(!anim<span class="s"> || </span>e.anim<span class="s"> == </span>anim)) {
+</code><code id="L5489"><span class="ln">5489</span> <b>if</b> (anim) {
+</code><code id="L5490"><span class="ln">5490</span> <b>return</b> e.status;
+</code><code id="L5491"><span class="ln">5491</span> }
+</code><code id="L5492"><span class="ln">5492</span> out.push({anim: e.anim, status: e.status});
+</code><code id="L5493"><span class="ln">5493</span> }
+</code><code id="L5494"><span class="ln">5494</span> }
+</code><code id="L5495"><span class="ln">5495</span> <b>if</b> (anim) {
+</code><code id="L5496"><span class="ln">5496</span> <b>return</b> <span class="d">0</span>;
+</code><code id="L5497"><span class="ln">5497</span> }
+</code><code id="L5498"><span class="ln">5498</span> <b>return</b> out;
+</code><code id="L5499"><span class="ln">5499</span> }
+</code><code id="L5500"><span class="ln">5500</span> };
+</code><code id="L5501"><span class="ln">5501</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L5502"><span class="ln">5502</span><span class="c"> <span class="s"> * </span>Element.pause
+</span></code><code id="L5503"><span class="ln">5503</span><span class="c"> [ method ]
+</span></code><code id="L5504"><span class="ln">5504</span><span class="c"> **
+</span></code><code id="L5505"><span class="ln">5505</span><span class="c"> <span class="s"> * </span>Stops animation of the element <b>with</b> ability to resume it later on.
+</span></code><code id="L5506"><span class="ln">5506</span><span class="c"> **
+</span></code><code id="L5507"><span class="ln">5507</span><span class="c"> > Parameters
+</span></code><code id="L5508"><span class="ln">5508</span><span class="c"> **
+</span></code><code id="L5509"><span class="ln">5509</span><span class="c"> <span class="s"> - </span>anim (object) #optional animation object
+</span></code><code id="L5510"><span class="ln">5510</span><span class="c"> **
+</span></code><code id="L5511"><span class="ln">5511</span><span class="c"> <span class="s"> = </span>(object) original element
+</span></code><code id="L5512"><span class="ln">5512</span><span class="c"> \*/</span>
+</code><code id="L5513"><span class="ln">5513</span> elproto.pause<span class="s"> = </span><b>function</b> (anim) {
+</code><code id="L5514"><span class="ln">5514</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>; i < animationElements.length; i++) <b>if</b> (animationElements[i].el.id<span class="s"> == </span><b>this</b>.id<span class="s"> && </span>(!anim<span class="s"> || </span>animationElements[i].anim<span class="s"> == </span>anim)) {
+</code><code id="L5515"><span class="ln">5515</span> <b>if</b> (eve(<i>"anim.pause."</i><span class="s"> + </span><b>this</b>.id, <b>this</b>, animationElements[i].anim) !== <b>false</b>) {
+</code><code id="L5516"><span class="ln">5516</span> animationElements[i].paused<span class="s"> = </span><b>true</b>;
+</code><code id="L5517"><span class="ln">5517</span> }
+</code><code id="L5518"><span class="ln">5518</span> }
+</code><code id="L5519"><span class="ln">5519</span> <b>return</b> <b>this</b>;
+</code><code id="L5520"><span class="ln">5520</span> };
+</code><code id="L5521"><span class="ln">5521</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L5522"><span class="ln">5522</span><span class="c"> <span class="s"> * </span>Element.resume
+</span></code><code id="L5523"><span class="ln">5523</span><span class="c"> [ method ]
+</span></code><code id="L5524"><span class="ln">5524</span><span class="c"> **
+</span></code><code id="L5525"><span class="ln">5525</span><span class="c"> <span class="s"> * </span>Resumes animation <b>if</b> it was paused <b>with</b> @Element.pause method.
+</span></code><code id="L5526"><span class="ln">5526</span><span class="c"> **
+</span></code><code id="L5527"><span class="ln">5527</span><span class="c"> > Parameters
+</span></code><code id="L5528"><span class="ln">5528</span><span class="c"> **
+</span></code><code id="L5529"><span class="ln">5529</span><span class="c"> <span class="s"> - </span>anim (object) #optional animation object
+</span></code><code id="L5530"><span class="ln">5530</span><span class="c"> **
</span></code><code id="L5531"><span class="ln">5531</span><span class="c"> <span class="s"> = </span>(object) original element
</span></code><code id="L5532"><span class="ln">5532</span><span class="c"> \*/</span>
-</code><code id="L5533"><span class="ln">5533</span> setproto.push<span class="s"> = </span><b>function</b> () {
-</code><code id="L5534"><span class="ln">5534</span> <b>var</b> item,
-</code><code id="L5535"><span class="ln">5535</span> len;
-</code><code id="L5536"><span class="ln">5536</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>arguments.length; i < ii; i++) {
-</code><code id="L5537"><span class="ln">5537</span> item<span class="s"> = </span>arguments[i];
-</code><code id="L5538"><span class="ln">5538</span> <b>if</b> (item<span class="s"> && </span>(item.constructor<span class="s"> == </span>Element<span class="s"> || </span>item.constructor<span class="s"> == </span>Set)) {
-</code><code id="L5539"><span class="ln">5539</span> len<span class="s"> = </span><b>this</b>.items.length;
-</code><code id="L5540"><span class="ln">5540</span> <b>this</b>[len]<span class="s"> = </span><b>this</b>.items[len]<span class="s"> = </span>item;
-</code><code id="L5541"><span class="ln">5541</span> <b>this</b>.length++;
-</code><code id="L5542"><span class="ln">5542</span> }
-</code><code id="L5543"><span class="ln">5543</span> }
-</code><code id="L5544"><span class="ln">5544</span> <b>return</b> <b>this</b>;
-</code><code id="L5545"><span class="ln">5545</span> };
-</code><code id="L5546"><span class="ln">5546</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L5547"><span class="ln">5547</span><span class="c"> <span class="s"> * </span>Set.pop
-</span></code><code id="L5548"><span class="ln">5548</span><span class="c"> [ method ]
-</span></code><code id="L5549"><span class="ln">5549</span><span class="c"> **
-</span></code><code id="L5550"><span class="ln">5550</span><span class="c"> <span class="s"> * </span>Removes last element and returns it.
-</span></code><code id="L5551"><span class="ln">5551</span><span class="c"> <span class="s"> = </span>(object) element
-</span></code><code id="L5552"><span class="ln">5552</span><span class="c"> \*/</span>
-</code><code id="L5553"><span class="ln">5553</span> setproto.pop<span class="s"> = </span><b>function</b> () {
-</code><code id="L5554"><span class="ln">5554</span> <b>this</b>.length<span class="s"> && </span><b>delete</b> <b>this</b>[<b>this</b>.length--];
-</code><code id="L5555"><span class="ln">5555</span> <b>return</b> <b>this</b>.items.pop();
-</code><code id="L5556"><span class="ln">5556</span> };
-</code><code id="L5557"><span class="ln">5557</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L5558"><span class="ln">5558</span><span class="c"> <span class="s"> * </span>Set.forEach
-</span></code><code id="L5559"><span class="ln">5559</span><span class="c"> [ method ]
-</span></code><code id="L5560"><span class="ln">5560</span><span class="c"> **
-</span></code><code id="L5561"><span class="ln">5561</span><span class="c"> <span class="s"> * </span>Executes given <b>function</b> <b>for</b> each element <b>in</b> the set.
-</span></code><code id="L5562"><span class="ln">5562</span><span class="c"> *
-</span></code><code id="L5563"><span class="ln">5563</span><span class="c"> <span class="s"> * </span>If <b>function</b> returns `<b>false</b>` it will stop loop running.
-</span></code><code id="L5564"><span class="ln">5564</span><span class="c"> **
-</span></code><code id="L5565"><span class="ln">5565</span><span class="c"> > Parameters
-</span></code><code id="L5566"><span class="ln">5566</span><span class="c"> **
-</span></code><code id="L5567"><span class="ln">5567</span><span class="c"> <span class="s"> - </span>callback (<b>function</b>) <b>function</b> to run
-</span></code><code id="L5568"><span class="ln">5568</span><span class="c"> <span class="s"> - </span>thisArg (object) context object <b>for</b> the callback
-</span></code><code id="L5569"><span class="ln">5569</span><span class="c"> <span class="s"> = </span>(object) Set object
-</span></code><code id="L5570"><span class="ln">5570</span><span class="c"> \*/</span>
-</code><code id="L5571"><span class="ln">5571</span> setproto.forEach<span class="s"> = </span><b>function</b> (callback, thisArg) {
-</code><code id="L5572"><span class="ln">5572</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span><b>this</b>.items.length; i < ii; i++) {
-</code><code id="L5573"><span class="ln">5573</span> <b>if</b> (callback.call(thisArg, <b>this</b>.items[i])<span class="s"> === </span><b>false</b>) {
-</code><code id="L5574"><span class="ln">5574</span> <b>return</b> <b>this</b>;
-</code><code id="L5575"><span class="ln">5575</span> }
-</code><code id="L5576"><span class="ln">5576</span> }
-</code><code id="L5577"><span class="ln">5577</span> <b>return</b> <b>this</b>;
-</code><code id="L5578"><span class="ln">5578</span> };
-</code><code id="L5579"><span class="ln">5579</span> <b>for</b> (<b>var</b> method <b>in</b> elproto) <b>if</b> (elproto[has](method)) {
-</code><code id="L5580"><span class="ln">5580</span> setproto[method]<span class="s"> = </span>(<b>function</b> (methodname) {
-</code><code id="L5581"><span class="ln">5581</span> <b>return</b> <b>function</b> () {
-</code><code id="L5582"><span class="ln">5582</span> <b>var</b> arg<span class="s"> = </span>arguments;
-</code><code id="L5583"><span class="ln">5583</span> <b>return</b> <b>this</b>.forEach(<b>function</b> (el) {
-</code><code id="L5584"><span class="ln">5584</span> el[methodname][apply](el, arg);
-</code><code id="L5585"><span class="ln">5585</span> });
-</code><code id="L5586"><span class="ln">5586</span> };
-</code><code id="L5587"><span class="ln">5587</span> })(method);
-</code><code id="L5588"><span class="ln">5588</span> }
-</code><code id="L5589"><span class="ln">5589</span> setproto.attr<span class="s"> = </span><b>function</b> (name, value) {
-</code><code id="L5590"><span class="ln">5590</span> <b>if</b> (name<span class="s"> && </span>R.is(name, array)<span class="s"> && </span>R.is(name[<span class="d">0</span>], <i>"object"</i>)) {
-</code><code id="L5591"><span class="ln">5591</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">0</span>, jj<span class="s"> = </span>name.length; j < jj; j++) {
-</code><code id="L5592"><span class="ln">5592</span> <b>this</b>.items[j].attr(name[j]);
-</code><code id="L5593"><span class="ln">5593</span> }
-</code><code id="L5594"><span class="ln">5594</span> } <b>else</b> {
-</code><code id="L5595"><span class="ln">5595</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span><b>this</b>.items.length; i < ii; i++) {
-</code><code id="L5596"><span class="ln">5596</span> <b>this</b>.items[i].attr(name, value);
-</code><code id="L5597"><span class="ln">5597</span> }
-</code><code id="L5598"><span class="ln">5598</span> }
-</code><code id="L5599"><span class="ln">5599</span> <b>return</b> <b>this</b>;
-</code><code id="L5600"><span class="ln">5600</span> };
-</code><code id="L5601"><span class="ln">5601</span> setproto.animate<span class="s"> = </span><b>function</b> (params, ms, easing, callback) {
-</code><code id="L5602"><span class="ln">5602</span> (R.is(easing, <i>"<b>function</b>"</i>)<span class="s"> || </span>!easing)<span class="s"> && </span>(callback<span class="s"> = </span>easing<span class="s"> || </span><b>null</b>);
-</code><code id="L5603"><span class="ln">5603</span> <b>var</b> len<span class="s"> = </span><b>this</b>.items.length,
-</code><code id="L5604"><span class="ln">5604</span> i<span class="s"> = </span>len,
-</code><code id="L5605"><span class="ln">5605</span> item,
-</code><code id="L5606"><span class="ln">5606</span> set<span class="s"> = </span><b>this</b>,
-</code><code id="L5607"><span class="ln">5607</span> collector;
-</code><code id="L5608"><span class="ln">5608</span> callback<span class="s"> && </span>(collector<span class="s"> = </span><b>function</b> () {
-</code><code id="L5609"><span class="ln">5609</span> !--len<span class="s"> && </span>callback.call(set);
-</code><code id="L5610"><span class="ln">5610</span> });
-</code><code id="L5611"><span class="ln">5611</span> easing<span class="s"> = </span>R.is(easing, string) ? easing : collector;
-</code><code id="L5612"><span class="ln">5612</span> <b>var</b> anim<span class="s"> = </span>params <b>instanceof</b> Animation ? params : R.animation(params, ms, easing, collector);
-</code><code id="L5613"><span class="ln">5613</span> item<span class="s"> = </span><b>this</b>.items[--i].animate(anim);
-</code><code id="L5614"><span class="ln">5614</span> <b>while</b> (i--) {
-</code><code id="L5615"><span class="ln">5615</span> <b>this</b>.items[i]<span class="s"> && </span>!<b>this</b>.items[i].removed<span class="s"> && </span><b>this</b>.items[i].animateWith(item, anim);
-</code><code id="L5616"><span class="ln">5616</span> }
-</code><code id="L5617"><span class="ln">5617</span> <b>return</b> <b>this</b>;
-</code><code id="L5618"><span class="ln">5618</span> };
-</code><code id="L5619"><span class="ln">5619</span> setproto.insertAfter<span class="s"> = </span><b>function</b> (el) {
-</code><code id="L5620"><span class="ln">5620</span> <b>var</b> i<span class="s"> = </span><b>this</b>.items.length;
-</code><code id="L5621"><span class="ln">5621</span> <b>while</b> (i--) {
-</code><code id="L5622"><span class="ln">5622</span> <b>this</b>.items[i].insertAfter(el);
-</code><code id="L5623"><span class="ln">5623</span> }
-</code><code id="L5624"><span class="ln">5624</span> <b>return</b> <b>this</b>;
-</code><code id="L5625"><span class="ln">5625</span> };
-</code><code id="L5626"><span class="ln">5626</span> setproto.getBBox<span class="s"> = </span><b>function</b> () {
-</code><code id="L5627"><span class="ln">5627</span> <b>var</b> x<span class="s"> = </span>[],
-</code><code id="L5628"><span class="ln">5628</span> y<span class="s"> = </span>[],
-</code><code id="L5629"><span class="ln">5629</span> w<span class="s"> = </span>[],
-</code><code id="L5630"><span class="ln">5630</span> h<span class="s"> = </span>[];
-</code><code id="L5631"><span class="ln">5631</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><b>this</b>.items.length; i--;) <b>if</b> (!<b>this</b>.items[i].removed) {
-</code><code id="L5632"><span class="ln">5632</span> <b>var</b> box<span class="s"> = </span><b>this</b>.items[i].getBBox();
-</code><code id="L5633"><span class="ln">5633</span> x.push(box.x);
-</code><code id="L5634"><span class="ln">5634</span> y.push(box.y);
-</code><code id="L5635"><span class="ln">5635</span> w.push(box.x<span class="s"> + </span>box.width);
-</code><code id="L5636"><span class="ln">5636</span> h.push(box.y<span class="s"> + </span>box.height);
-</code><code id="L5637"><span class="ln">5637</span> }
-</code><code id="L5638"><span class="ln">5638</span> x<span class="s"> = </span>mmin[apply](<span class="d">0</span>, x);
-</code><code id="L5639"><span class="ln">5639</span> y<span class="s"> = </span>mmin[apply](<span class="d">0</span>, y);
-</code><code id="L5640"><span class="ln">5640</span> <b>return</b> {
-</code><code id="L5641"><span class="ln">5641</span> x: x,
-</code><code id="L5642"><span class="ln">5642</span> y: y,
-</code><code id="L5643"><span class="ln">5643</span> width: mmax[apply](<span class="d">0</span>, w)<span class="s"> - </span>x,
-</code><code id="L5644"><span class="ln">5644</span> height: mmax[apply](<span class="d">0</span>, h)<span class="s"> - </span>y
-</code><code id="L5645"><span class="ln">5645</span> };
-</code><code id="L5646"><span class="ln">5646</span> };
-</code><code id="L5647"><span class="ln">5647</span> setproto.clone<span class="s"> = </span><b>function</b> (s) {
-</code><code id="L5648"><span class="ln">5648</span> s<span class="s"> = </span><b>new</b> Set;
-</code><code id="L5649"><span class="ln">5649</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span><b>this</b>.items.length; i < ii; i++) {
-</code><code id="L5650"><span class="ln">5650</span> s.push(<b>this</b>.items[i].clone());
-</code><code id="L5651"><span class="ln">5651</span> }
-</code><code id="L5652"><span class="ln">5652</span> <b>return</b> s;
-</code><code id="L5653"><span class="ln">5653</span> };
-</code><code id="L5654"><span class="ln">5654</span> setproto.toString<span class="s"> = </span><b>function</b> () {
-</code><code id="L5655"><span class="ln">5655</span> <b>return</b> <i>"Rapha\xebl\u2018s set"</i>;
+</code><code id="L5533"><span class="ln">5533</span> elproto.resume<span class="s"> = </span><b>function</b> (anim) {
+</code><code id="L5534"><span class="ln">5534</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>; i < animationElements.length; i++) <b>if</b> (animationElements[i].el.id<span class="s"> == </span><b>this</b>.id<span class="s"> && </span>(!anim<span class="s"> || </span>animationElements[i].anim<span class="s"> == </span>anim)) {
+</code><code id="L5535"><span class="ln">5535</span> <b>var</b> e<span class="s"> = </span>animationElements[i];
+</code><code id="L5536"><span class="ln">5536</span> <b>if</b> (eve(<i>"anim.resume."</i><span class="s"> + </span><b>this</b>.id, <b>this</b>, e.anim) !== <b>false</b>) {
+</code><code id="L5537"><span class="ln">5537</span> <b>delete</b> e.paused;
+</code><code id="L5538"><span class="ln">5538</span> <b>this</b>.status(e.anim, e.status);
+</code><code id="L5539"><span class="ln">5539</span> }
+</code><code id="L5540"><span class="ln">5540</span> }
+</code><code id="L5541"><span class="ln">5541</span> <b>return</b> <b>this</b>;
+</code><code id="L5542"><span class="ln">5542</span> };
+</code><code id="L5543"><span class="ln">5543</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L5544"><span class="ln">5544</span><span class="c"> <span class="s"> * </span>Element.stop
+</span></code><code id="L5545"><span class="ln">5545</span><span class="c"> [ method ]
+</span></code><code id="L5546"><span class="ln">5546</span><span class="c"> **
+</span></code><code id="L5547"><span class="ln">5547</span><span class="c"> <span class="s"> * </span>Stops animation of the element.
+</span></code><code id="L5548"><span class="ln">5548</span><span class="c"> **
+</span></code><code id="L5549"><span class="ln">5549</span><span class="c"> > Parameters
+</span></code><code id="L5550"><span class="ln">5550</span><span class="c"> **
+</span></code><code id="L5551"><span class="ln">5551</span><span class="c"> <span class="s"> - </span>anim (object) #optional animation object
+</span></code><code id="L5552"><span class="ln">5552</span><span class="c"> **
+</span></code><code id="L5553"><span class="ln">5553</span><span class="c"> <span class="s"> = </span>(object) original element
+</span></code><code id="L5554"><span class="ln">5554</span><span class="c"> \*/</span>
+</code><code id="L5555"><span class="ln">5555</span> elproto.stop<span class="s"> = </span><b>function</b> (anim) {
+</code><code id="L5556"><span class="ln">5556</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>; i < animationElements.length; i++) <b>if</b> (animationElements[i].el.id<span class="s"> == </span><b>this</b>.id<span class="s"> && </span>(!anim<span class="s"> || </span>animationElements[i].anim<span class="s"> == </span>anim)) {
+</code><code id="L5557"><span class="ln">5557</span> <b>if</b> (eve(<i>"anim.stop."</i><span class="s"> + </span><b>this</b>.id, <b>this</b>, animationElements[i].anim) !== <b>false</b>) {
+</code><code id="L5558"><span class="ln">5558</span> animationElements.splice(i--, <span class="d">1</span>);
+</code><code id="L5559"><span class="ln">5559</span> }
+</code><code id="L5560"><span class="ln">5560</span> }
+</code><code id="L5561"><span class="ln">5561</span> <b>return</b> <b>this</b>;
+</code><code id="L5562"><span class="ln">5562</span> };
+</code><code id="L5563"><span class="ln">5563</span> elproto.toString<span class="s"> = </span><b>function</b> () {
+</code><code id="L5564"><span class="ln">5564</span> <b>return</b> <i>"Rapha\xebl\u2019s object"</i>;
+</code><code id="L5565"><span class="ln">5565</span> };
+</code><code id="L5566"><span class="ln">5566</span>
+</code><code id="L5567"><span class="ln">5567</span> <span class="c">// Set</span>
+</code><code id="L5568"><span class="ln">5568</span> <b>var</b> Set<span class="s"> = </span><b>function</b> (items) {
+</code><code id="L5569"><span class="ln">5569</span> <b>this</b>.items<span class="s"> = </span>[];
+</code><code id="L5570"><span class="ln">5570</span> <b>this</b>.length<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L5571"><span class="ln">5571</span> <b>this</b>.type<span class="s"> = </span><i>"set"</i>;
+</code><code id="L5572"><span class="ln">5572</span> <b>if</b> (items) {
+</code><code id="L5573"><span class="ln">5573</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>items.length; i < ii; i++) {
+</code><code id="L5574"><span class="ln">5574</span> <b>if</b> (items[i]<span class="s"> && </span>(items[i].constructor<span class="s"> == </span>Element<span class="s"> || </span>items[i].constructor<span class="s"> == </span>Set)) {
+</code><code id="L5575"><span class="ln">5575</span> <b>this</b>[<b>this</b>.items.length]<span class="s"> = </span><b>this</b>.items[<b>this</b>.items.length]<span class="s"> = </span>items[i];
+</code><code id="L5576"><span class="ln">5576</span> <b>this</b>.length++;
+</code><code id="L5577"><span class="ln">5577</span> }
+</code><code id="L5578"><span class="ln">5578</span> }
+</code><code id="L5579"><span class="ln">5579</span> }
+</code><code id="L5580"><span class="ln">5580</span> },
+</code><code id="L5581"><span class="ln">5581</span> setproto<span class="s"> = </span>Set.prototype;
+</code><code id="L5582"><span class="ln">5582</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L5583"><span class="ln">5583</span><span class="c"> <span class="s"> * </span>Set.push
+</span></code><code id="L5584"><span class="ln">5584</span><span class="c"> [ method ]
+</span></code><code id="L5585"><span class="ln">5585</span><span class="c"> **
+</span></code><code id="L5586"><span class="ln">5586</span><span class="c"> <span class="s"> * </span>Adds each argument to the current set.
+</span></code><code id="L5587"><span class="ln">5587</span><span class="c"> <span class="s"> = </span>(object) original element
+</span></code><code id="L5588"><span class="ln">5588</span><span class="c"> \*/</span>
+</code><code id="L5589"><span class="ln">5589</span> setproto.push<span class="s"> = </span><b>function</b> () {
+</code><code id="L5590"><span class="ln">5590</span> <b>var</b> item,
+</code><code id="L5591"><span class="ln">5591</span> len;
+</code><code id="L5592"><span class="ln">5592</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>arguments.length; i < ii; i++) {
+</code><code id="L5593"><span class="ln">5593</span> item<span class="s"> = </span>arguments[i];
+</code><code id="L5594"><span class="ln">5594</span> <b>if</b> (item<span class="s"> && </span>(item.constructor<span class="s"> == </span>Element<span class="s"> || </span>item.constructor<span class="s"> == </span>Set)) {
+</code><code id="L5595"><span class="ln">5595</span> len<span class="s"> = </span><b>this</b>.items.length;
+</code><code id="L5596"><span class="ln">5596</span> <b>this</b>[len]<span class="s"> = </span><b>this</b>.items[len]<span class="s"> = </span>item;
+</code><code id="L5597"><span class="ln">5597</span> <b>this</b>.length++;
+</code><code id="L5598"><span class="ln">5598</span> }
+</code><code id="L5599"><span class="ln">5599</span> }
+</code><code id="L5600"><span class="ln">5600</span> <b>return</b> <b>this</b>;
+</code><code id="L5601"><span class="ln">5601</span> };
+</code><code id="L5602"><span class="ln">5602</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L5603"><span class="ln">5603</span><span class="c"> <span class="s"> * </span>Set.pop
+</span></code><code id="L5604"><span class="ln">5604</span><span class="c"> [ method ]
+</span></code><code id="L5605"><span class="ln">5605</span><span class="c"> **
+</span></code><code id="L5606"><span class="ln">5606</span><span class="c"> <span class="s"> * </span>Removes last element and returns it.
+</span></code><code id="L5607"><span class="ln">5607</span><span class="c"> <span class="s"> = </span>(object) element
+</span></code><code id="L5608"><span class="ln">5608</span><span class="c"> \*/</span>
+</code><code id="L5609"><span class="ln">5609</span> setproto.pop<span class="s"> = </span><b>function</b> () {
+</code><code id="L5610"><span class="ln">5610</span> <b>this</b>.length<span class="s"> && </span><b>delete</b> <b>this</b>[<b>this</b>.length--];
+</code><code id="L5611"><span class="ln">5611</span> <b>return</b> <b>this</b>.items.pop();
+</code><code id="L5612"><span class="ln">5612</span> };
+</code><code id="L5613"><span class="ln">5613</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L5614"><span class="ln">5614</span><span class="c"> <span class="s"> * </span>Set.forEach
+</span></code><code id="L5615"><span class="ln">5615</span><span class="c"> [ method ]
+</span></code><code id="L5616"><span class="ln">5616</span><span class="c"> **
+</span></code><code id="L5617"><span class="ln">5617</span><span class="c"> <span class="s"> * </span>Executes given <b>function</b> <b>for</b> each element <b>in</b> the set.
+</span></code><code id="L5618"><span class="ln">5618</span><span class="c"> *
+</span></code><code id="L5619"><span class="ln">5619</span><span class="c"> <span class="s"> * </span>If <b>function</b> returns `<b>false</b>` it will stop loop running.
+</span></code><code id="L5620"><span class="ln">5620</span><span class="c"> **
+</span></code><code id="L5621"><span class="ln">5621</span><span class="c"> > Parameters
+</span></code><code id="L5622"><span class="ln">5622</span><span class="c"> **
+</span></code><code id="L5623"><span class="ln">5623</span><span class="c"> <span class="s"> - </span>callback (<b>function</b>) <b>function</b> to run
+</span></code><code id="L5624"><span class="ln">5624</span><span class="c"> <span class="s"> - </span>thisArg (object) context object <b>for</b> the callback
+</span></code><code id="L5625"><span class="ln">5625</span><span class="c"> <span class="s"> = </span>(object) Set object
+</span></code><code id="L5626"><span class="ln">5626</span><span class="c"> \*/</span>
+</code><code id="L5627"><span class="ln">5627</span> setproto.forEach<span class="s"> = </span><b>function</b> (callback, thisArg) {
+</code><code id="L5628"><span class="ln">5628</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span><b>this</b>.items.length; i < ii; i++) {
+</code><code id="L5629"><span class="ln">5629</span> <b>if</b> (callback.call(thisArg, <b>this</b>.items[i])<span class="s"> === </span><b>false</b>) {
+</code><code id="L5630"><span class="ln">5630</span> <b>return</b> <b>this</b>;
+</code><code id="L5631"><span class="ln">5631</span> }
+</code><code id="L5632"><span class="ln">5632</span> }
+</code><code id="L5633"><span class="ln">5633</span> <b>return</b> <b>this</b>;
+</code><code id="L5634"><span class="ln">5634</span> };
+</code><code id="L5635"><span class="ln">5635</span> <b>for</b> (<b>var</b> method <b>in</b> elproto) <b>if</b> (elproto[has](method)) {
+</code><code id="L5636"><span class="ln">5636</span> setproto[method]<span class="s"> = </span>(<b>function</b> (methodname) {
+</code><code id="L5637"><span class="ln">5637</span> <b>return</b> <b>function</b> () {
+</code><code id="L5638"><span class="ln">5638</span> <b>var</b> arg<span class="s"> = </span>arguments;
+</code><code id="L5639"><span class="ln">5639</span> <b>return</b> <b>this</b>.forEach(<b>function</b> (el) {
+</code><code id="L5640"><span class="ln">5640</span> el[methodname][apply](el, arg);
+</code><code id="L5641"><span class="ln">5641</span> });
+</code><code id="L5642"><span class="ln">5642</span> };
+</code><code id="L5643"><span class="ln">5643</span> })(method);
+</code><code id="L5644"><span class="ln">5644</span> }
+</code><code id="L5645"><span class="ln">5645</span> setproto.attr<span class="s"> = </span><b>function</b> (name, value) {
+</code><code id="L5646"><span class="ln">5646</span> <b>if</b> (name<span class="s"> && </span>R.is(name, array)<span class="s"> && </span>R.is(name[<span class="d">0</span>], <i>"object"</i>)) {
+</code><code id="L5647"><span class="ln">5647</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">0</span>, jj<span class="s"> = </span>name.length; j < jj; j++) {
+</code><code id="L5648"><span class="ln">5648</span> <b>this</b>.items[j].attr(name[j]);
+</code><code id="L5649"><span class="ln">5649</span> }
+</code><code id="L5650"><span class="ln">5650</span> } <b>else</b> {
+</code><code id="L5651"><span class="ln">5651</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span><b>this</b>.items.length; i < ii; i++) {
+</code><code id="L5652"><span class="ln">5652</span> <b>this</b>.items[i].attr(name, value);
+</code><code id="L5653"><span class="ln">5653</span> }
+</code><code id="L5654"><span class="ln">5654</span> }
+</code><code id="L5655"><span class="ln">5655</span> <b>return</b> <b>this</b>;
</code><code id="L5656"><span class="ln">5656</span> };
-</code><code id="L5657"><span class="ln">5657</span>
-</code><code id="L5658"><span class="ln">5658</span> R.registerFont<span class="s"> = </span><b>function</b> (font) {
-</code><code id="L5659"><span class="ln">5659</span> <b>if</b> (!font.face) {
-</code><code id="L5660"><span class="ln">5660</span> <b>return</b> font;
-</code><code id="L5661"><span class="ln">5661</span> }
-</code><code id="L5662"><span class="ln">5662</span> <b>this</b>.fonts<span class="s"> = </span><b>this</b>.fonts<span class="s"> || </span>{};
-</code><code id="L5663"><span class="ln">5663</span> <b>var</b> fontcopy<span class="s"> = </span>{
-</code><code id="L5664"><span class="ln">5664</span> w: font.w,
-</code><code id="L5665"><span class="ln">5665</span> face: {},
-</code><code id="L5666"><span class="ln">5666</span> glyphs: {}
-</code><code id="L5667"><span class="ln">5667</span> },
-</code><code id="L5668"><span class="ln">5668</span> family<span class="s"> = </span>font.face[<i>"font-family"</i>];
-</code><code id="L5669"><span class="ln">5669</span> <b>for</b> (<b>var</b> prop <b>in</b> font.face) <b>if</b> (font.face[has](prop)) {
-</code><code id="L5670"><span class="ln">5670</span> fontcopy.face[prop]<span class="s"> = </span>font.face[prop];
-</code><code id="L5671"><span class="ln">5671</span> }
-</code><code id="L5672"><span class="ln">5672</span> <b>if</b> (<b>this</b>.fonts[family]) {
-</code><code id="L5673"><span class="ln">5673</span> <b>this</b>.fonts[family].push(fontcopy);
-</code><code id="L5674"><span class="ln">5674</span> } <b>else</b> {
-</code><code id="L5675"><span class="ln">5675</span> <b>this</b>.fonts[family]<span class="s"> = </span>[fontcopy];
-</code><code id="L5676"><span class="ln">5676</span> }
-</code><code id="L5677"><span class="ln">5677</span> <b>if</b> (!font.svg) {
-</code><code id="L5678"><span class="ln">5678</span> fontcopy.face[<i>"units-per-em"</i>]<span class="s"> = </span>toInt(font.face[<i>"units-per-em"</i>], <span class="d">10</span>);
-</code><code id="L5679"><span class="ln">5679</span> <b>for</b> (<b>var</b> glyph <b>in</b> font.glyphs) <b>if</b> (font.glyphs[has](glyph)) {
-</code><code id="L5680"><span class="ln">5680</span> <b>var</b> path<span class="s"> = </span>font.glyphs[glyph];
-</code><code id="L5681"><span class="ln">5681</span> fontcopy.glyphs[glyph]<span class="s"> = </span>{
-</code><code id="L5682"><span class="ln">5682</span> w: path.w,
-</code><code id="L5683"><span class="ln">5683</span> k: {},
-</code><code id="L5684"><span class="ln">5684</span> d: path.d<span class="s"> && </span><i>"M"</i><span class="s"> + </span>path.d.replace(/[mlcxtrv]/g, <b>function</b> (command) {
-</code><code id="L5685"><span class="ln">5685</span> <b>return</b> {l: <i>"L"</i>, c: <i>"C"</i>, x: <i>"z"</i>, t: <i>"m"</i>, r: <i>"l"</i>, v: <i>"c"</i>}[command]<span class="s"> || </span><i>"M"</i>;
-</code><code id="L5686"><span class="ln">5686</span> })<span class="s"> + </span><i>"z"</i>
-</code><code id="L5687"><span class="ln">5687</span> };
-</code><code id="L5688"><span class="ln">5688</span> <b>if</b> (path.k) {
-</code><code id="L5689"><span class="ln">5689</span> <b>for</b> (<b>var</b> k <b>in</b> path.k) <b>if</b> (path[has](k)) {
-</code><code id="L5690"><span class="ln">5690</span> fontcopy.glyphs[glyph].k[k]<span class="s"> = </span>path.k[k];
-</code><code id="L5691"><span class="ln">5691</span> }
-</code><code id="L5692"><span class="ln">5692</span> }
-</code><code id="L5693"><span class="ln">5693</span> }
-</code><code id="L5694"><span class="ln">5694</span> }
-</code><code id="L5695"><span class="ln">5695</span> <b>return</b> font;
-</code><code id="L5696"><span class="ln">5696</span> };
-</code><code id="L5697"><span class="ln">5697</span> paperproto.getFont<span class="s"> = </span><b>function</b> (family, weight, style, stretch) {
-</code><code id="L5698"><span class="ln">5698</span> stretch<span class="s"> = </span>stretch<span class="s"> || </span><i>"normal"</i>;
-</code><code id="L5699"><span class="ln">5699</span> style<span class="s"> = </span>style<span class="s"> || </span><i>"normal"</i>;
-</code><code id="L5700"><span class="ln">5700</span> weight<span class="s"> = </span>+weight<span class="s"> || </span>{normal: <span class="d">400</span>, bold: <span class="d">700</span>, lighter: <span class="d">300</span>, bolder: <span class="d">800</span>}[weight]<span class="s"> || </span><span class="d">400</span>;
-</code><code id="L5701"><span class="ln">5701</span> <b>if</b> (!R.fonts) {
-</code><code id="L5702"><span class="ln">5702</span> <b>return</b>;
-</code><code id="L5703"><span class="ln">5703</span> }
-</code><code id="L5704"><span class="ln">5704</span> <b>var</b> font<span class="s"> = </span>R.fonts[family];
-</code><code id="L5705"><span class="ln">5705</span> <b>if</b> (!font) {
-</code><code id="L5706"><span class="ln">5706</span> <b>var</b> name<span class="s"> = </span><b>new</b> RegExp(<i>"(^|\\s)"</i><span class="s"> + </span>family.replace(/[^\w\d\s+!~.:_-]/g, E)<span class="s"> + </span><i>"(\\s|$)"</i>, <i>"i"</i>);
-</code><code id="L5707"><span class="ln">5707</span> <b>for</b> (<b>var</b> fontName <b>in</b> R.fonts) <b>if</b> (R.fonts[has](fontName)) {
-</code><code id="L5708"><span class="ln">5708</span> <b>if</b> (name.test(fontName)) {
-</code><code id="L5709"><span class="ln">5709</span> font<span class="s"> = </span>R.fonts[fontName];
-</code><code id="L5710"><span class="ln">5710</span> <b>break</b>;
-</code><code id="L5711"><span class="ln">5711</span> }
-</code><code id="L5712"><span class="ln">5712</span> }
-</code><code id="L5713"><span class="ln">5713</span> }
-</code><code id="L5714"><span class="ln">5714</span> <b>var</b> thefont;
-</code><code id="L5715"><span class="ln">5715</span> <b>if</b> (font) {
-</code><code id="L5716"><span class="ln">5716</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>font.length; i < ii; i++) {
-</code><code id="L5717"><span class="ln">5717</span> thefont<span class="s"> = </span>font[i];
-</code><code id="L5718"><span class="ln">5718</span> <b>if</b> (thefont.face[<i>"font-weight"</i>]<span class="s"> == </span>weight<span class="s"> && </span>(thefont.face[<i>"font-style"</i>]<span class="s"> == </span>style<span class="s"> || </span>!thefont.face[<i>"font-style"</i>])<span class="s"> && </span>thefont.face[<i>"font-stretch"</i>]<span class="s"> == </span>stretch) {
-</code><code id="L5719"><span class="ln">5719</span> <b>break</b>;
-</code><code id="L5720"><span class="ln">5720</span> }
-</code><code id="L5721"><span class="ln">5721</span> }
-</code><code id="L5722"><span class="ln">5722</span> }
-</code><code id="L5723"><span class="ln">5723</span> <b>return</b> thefont;
-</code><code id="L5724"><span class="ln">5724</span> };
-</code><code id="L5725"><span class="ln">5725</span> paperproto.print<span class="s"> = </span><b>function</b> (x, y, string, font, size, origin, letter_spacing) {
-</code><code id="L5726"><span class="ln">5726</span> origin<span class="s"> = </span>origin<span class="s"> || </span><i>"middle"</i>; <span class="c">// baseline|middle</span>
-</code><code id="L5727"><span class="ln">5727</span> letter_spacing<span class="s"> = </span>mmax(mmin(letter_spacing<span class="s"> || </span><span class="d">0</span>, <span class="d">1</span>), -<span class="d">1</span>);
-</code><code id="L5728"><span class="ln">5728</span> <b>var</b> out<span class="s"> = </span><b>this</b>.set(),
-</code><code id="L5729"><span class="ln">5729</span> letters<span class="s"> = </span>Str(string).split(E),
-</code><code id="L5730"><span class="ln">5730</span> shift<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L5731"><span class="ln">5731</span> path<span class="s"> = </span>E,
-</code><code id="L5732"><span class="ln">5732</span> scale;
-</code><code id="L5733"><span class="ln">5733</span> R.is(font, string)<span class="s"> && </span>(font<span class="s"> = </span><b>this</b>.getFont(font));
-</code><code id="L5734"><span class="ln">5734</span> <b>if</b> (font) {
-</code><code id="L5735"><span class="ln">5735</span> scale<span class="s"> = </span>(size<span class="s"> || </span><span class="d">16</span>)<span class="s"> / </span>font.face[<i>"units-per-em"</i>];
-</code><code id="L5736"><span class="ln">5736</span> <b>var</b> bb<span class="s"> = </span>font.face.bbox.split(separator),
-</code><code id="L5737"><span class="ln">5737</span> top<span class="s"> = </span>+bb[<span class="d">0</span>],
-</code><code id="L5738"><span class="ln">5738</span> height<span class="s"> = </span>+bb[<span class="d">1</span>]<span class="s"> + </span>(origin<span class="s"> == </span><i>"baseline"</i> ? bb[<span class="d">3</span>]<span class="s"> - </span>bb[<span class="d">1</span>]<span class="s"> + </span>(+font.face.descent) : (bb[<span class="d">3</span>]<span class="s"> - </span>bb[<span class="d">1</span>])<span class="s"> / </span><span class="d">2</span>);
-</code><code id="L5739"><span class="ln">5739</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>letters.length; i < ii; i++) {
-</code><code id="L5740"><span class="ln">5740</span> <b>var</b> prev<span class="s"> = </span>i<span class="s"> && </span>font.glyphs[letters[i<span class="s"> - </span><span class="d">1</span>]]<span class="s"> || </span>{},
-</code><code id="L5741"><span class="ln">5741</span> curr<span class="s"> = </span>font.glyphs[letters[i]];
-</code><code id="L5742"><span class="ln">5742</span> shift += i ? (prev.w<span class="s"> || </span>font.w)<span class="s"> + </span>(prev.k<span class="s"> && </span>prev.k[letters[i]]<span class="s"> || </span><span class="d">0</span>)<span class="s"> + </span>(font.w<span class="s"> * </span>letter_spacing) : <span class="d">0</span>;
-</code><code id="L5743"><span class="ln">5743</span> curr<span class="s"> && </span>curr.d<span class="s"> && </span>out.push(<b>this</b>.path(curr.d).attr({fill: <i>"#<span class="d">000</span>"</i>, stroke: <i>"none"</i>, transform: [[<i>"t"</i>, shift, <span class="d">0</span>]]}));
-</code><code id="L5744"><span class="ln">5744</span> }
-</code><code id="L5745"><span class="ln">5745</span> out.scale(scale, scale, top, height).translate(x<span class="s"> - </span>top, y<span class="s"> - </span>height);
-</code><code id="L5746"><span class="ln">5746</span> }
-</code><code id="L5747"><span class="ln">5747</span> <b>return</b> out;
-</code><code id="L5748"><span class="ln">5748</span> };
-</code><code id="L5749"><span class="ln">5749</span>
-</code><code id="L5750"><span class="ln">5750</span> R.format<span class="s"> = </span><b>function</b> (token, params) {
-</code><code id="L5751"><span class="ln">5751</span> <b>var</b> args<span class="s"> = </span>R.is(params, array) ? [<span class="d">0</span>][concat](params) : arguments;
-</code><code id="L5752"><span class="ln">5752</span> token<span class="s"> && </span>R.is(token, string)<span class="s"> && </span>args.length<span class="s"> - </span><span class="d">1</span><span class="s"> && </span>(token<span class="s"> = </span>token.replace(formatrg, <b>function</b> (str, i) {
-</code><code id="L5753"><span class="ln">5753</span> <b>return</b> args[++i]<span class="s"> == </span><b>null</b> ? E : args[i];
-</code><code id="L5754"><span class="ln">5754</span> }));
-</code><code id="L5755"><span class="ln">5755</span> <b>return</b> token<span class="s"> || </span>E;
-</code><code id="L5756"><span class="ln">5756</span> };
-</code><code id="L5757"><span class="ln">5757</span> R.ninja<span class="s"> = </span><b>function</b> () {
-</code><code id="L5758"><span class="ln">5758</span> oldRaphael.was ? (g.win.Raphael<span class="s"> = </span>oldRaphael.is) : <b>delete</b> Raphael;
-</code><code id="L5759"><span class="ln">5759</span> <b>return</b> R;
-</code><code id="L5760"><span class="ln">5760</span> };
-</code><code id="L5761"><span class="ln">5761</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L5762"><span class="ln">5762</span><span class="c"> <span class="s"> * </span>Raphael.el
-</span></code><code id="L5763"><span class="ln">5763</span><span class="c"> [ property (object) ]
-</span></code><code id="L5764"><span class="ln">5764</span><span class="c"> **
-</span></code><code id="L5765"><span class="ln">5765</span><span class="c"> <span class="s"> * </span>You can add your own method to elements. This is usefull when you want to hack <b>default</b> functionality or
-</span></code><code id="L5766"><span class="ln">5766</span><span class="c"> <span class="s"> * </span>want to wrap some common transformation or attributes <b>in</b> one method. In difference to canvas methods,
-</span></code><code id="L5767"><span class="ln">5767</span><span class="c"> <span class="s"> * </span>you can redefine element method at any time. Expending element methods wouldn’t affect set.
-</span></code><code id="L5768"><span class="ln">5768</span><span class="c"> > Usage
-</span></code><code id="L5769"><span class="ln">5769</span><span class="c"> <span class="s"> | </span>Raphael.el.red<span class="s"> = </span><b>function</b> () {
-</span></code><code id="L5770"><span class="ln">5770</span><span class="c"> <span class="s"> | </span> <b>this</b>.attr({fill: <i>"#f00"</i>});
-</span></code><code id="L5771"><span class="ln">5771</span><span class="c"> <span class="s"> | </span>};
-</span></code><code id="L5772"><span class="ln">5772</span><span class="c"> <span class="s"> | </span><span class="c">// then use it</span>
-</span></code><code id="L5773"><span class="ln">5773</span><span class="c"> <span class="s"> | </span>paper.circle(<span class="d">100</span>, <span class="d">100</span>, <span class="d">20</span>).red();
-</span></code><code id="L5774"><span class="ln">5774</span><span class="c"> \*/</span>
-</code><code id="L5775"><span class="ln">5775</span> R.el<span class="s"> = </span>elproto;
-</code><code id="L5776"><span class="ln">5776</span> R.st<span class="s"> = </span>setproto;
-</code><code id="L5777"><span class="ln">5777</span> <span class="c">// Firefox <<span class="d">3.6</span> fix: http://webreflection.blogspot.com/<span class="d">2009</span>/<span class="d">11</span>/<span class="d">195</span>-chars-to-help-lazy-loading.html</span>
-</code><code id="L5778"><span class="ln">5778</span> (<b>function</b> (doc, loaded, f) {
-</code><code id="L5779"><span class="ln">5779</span> <b>if</b> (doc.readyState<span class="s"> == </span><b>null</b><span class="s"> && </span>doc.addEventListener){
-</code><code id="L5780"><span class="ln">5780</span> doc.addEventListener(loaded, f<span class="s"> = </span><b>function</b> () {
-</code><code id="L5781"><span class="ln">5781</span> doc.removeEventListener(loaded, f, <b>false</b>);
-</code><code id="L5782"><span class="ln">5782</span> doc.readyState<span class="s"> = </span><i>"complete"</i>;
-</code><code id="L5783"><span class="ln">5783</span> }, <b>false</b>);
-</code><code id="L5784"><span class="ln">5784</span> doc.readyState<span class="s"> = </span><i>"loading"</i>;
-</code><code id="L5785"><span class="ln">5785</span> }
-</code><code id="L5786"><span class="ln">5786</span> <b>function</b> isLoaded() {
-</code><code id="L5787"><span class="ln">5787</span> (/<b>in</b>/).test(doc.readyState) ? setTimeout(isLoaded, <span class="d">9</span>) : eve(<i>"DOMload"</i>);
-</code><code id="L5788"><span class="ln">5788</span> }
-</code><code id="L5789"><span class="ln">5789</span> isLoaded();
-</code><code id="L5790"><span class="ln">5790</span> })(document, <i>"DOMContentLoaded"</i>);
-</code><code id="L5791"><span class="ln">5791</span>
-</code><code id="L5792"><span class="ln">5792</span> oldRaphael.was ? (g.win.Raphael<span class="s"> = </span>R) : (Raphael<span class="s"> = </span>R);
-</code><code id="L5793"><span class="ln">5793</span>
-</code><code id="L5794"><span class="ln">5794</span><span class="c"> /*
-</span></code><code id="L5795"><span class="ln">5795</span><span class="c"> <span class="s"> * </span>Eve <span class="d">0.2</span><span class="d">.1</span><span class="s"> - </span>JavaScript Events Library
-</span></code><code id="L5796"><span class="ln">5796</span><span class="c"> *
-</span></code><code id="L5797"><span class="ln">5797</span><span class="c"> <span class="s"> * </span>Copyright (c) <span class="d">2010</span> Dmitry Baranovskiy (http:<span class="c">//dmitry.baranovskiy.com/)</span>
-</span></code><code id="L5798"><span class="ln">5798</span><span class="c"> <span class="s"> * </span>Licensed under the MIT (http:<span class="c">//www.opensource.org/licenses/mit-license.php) license.</span>
-</span></code><code id="L5799"><span class="ln">5799</span><span class="c"> */</span>
-</code><code id="L5800"><span class="ln">5800</span>
-</code><code id="L5801"><span class="ln">5801</span> <b>var</b> eve<span class="s"> = </span>R.eve<span class="s"> = </span>(<b>function</b> () {
-</code><code id="L5802"><span class="ln">5802</span> <b>var</b> version<span class="s"> = </span><i>"<span class="d">0.2</span><span class="d">.1</span>"</i>,
-</code><code id="L5803"><span class="ln">5803</span> has<span class="s"> = </span><i>"hasOwnProperty"</i>,
-</code><code id="L5804"><span class="ln">5804</span> separator<span class="s"> = </span>/[\.\/]/,
-</code><code id="L5805"><span class="ln">5805</span> wildcard<span class="s"> = </span><i>"*"</i>,
-</code><code id="L5806"><span class="ln">5806</span> events<span class="s"> = </span>{n: {}},
-</code><code id="L5807"><span class="ln">5807</span> eve<span class="s"> = </span><b>function</b> (name, scope) {
-</code><code id="L5808"><span class="ln">5808</span> <b>var</b> e<span class="s"> = </span>events,
-</code><code id="L5809"><span class="ln">5809</span> args<span class="s"> = </span>Array.prototype.slice.call(arguments, <span class="d">2</span>),
-</code><code id="L5810"><span class="ln">5810</span> listeners<span class="s"> = </span>eve.listeners(name),
-</code><code id="L5811"><span class="ln">5811</span> errors<span class="s"> = </span>[];
-</code><code id="L5812"><span class="ln">5812</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>listeners.length; i < ii; i++) {
-</code><code id="L5813"><span class="ln">5813</span> <b>try</b> {
-</code><code id="L5814"><span class="ln">5814</span> listeners[i].apply(scope, args);
-</code><code id="L5815"><span class="ln">5815</span> } <b>catch</b> (ex) {
-</code><code id="L5816"><span class="ln">5816</span> errors.push({error: ex<span class="s"> && </span>ex.message<span class="s"> || </span>ex, func: listeners[i]});
-</code><code id="L5817"><span class="ln">5817</span> }
-</code><code id="L5818"><span class="ln">5818</span> }
-</code><code id="L5819"><span class="ln">5819</span> <b>if</b> (errors.length) {
-</code><code id="L5820"><span class="ln">5820</span> <b>return</b> errors;
-</code><code id="L5821"><span class="ln">5821</span> }
-</code><code id="L5822"><span class="ln">5822</span> };
-</code><code id="L5823"><span class="ln">5823</span> eve.listeners<span class="s"> = </span><b>function</b> (name) {
-</code><code id="L5824"><span class="ln">5824</span> <b>var</b> names<span class="s"> = </span>name.split(separator),
-</code><code id="L5825"><span class="ln">5825</span> e<span class="s"> = </span>events,
-</code><code id="L5826"><span class="ln">5826</span> item,
-</code><code id="L5827"><span class="ln">5827</span> items,
-</code><code id="L5828"><span class="ln">5828</span> k,
-</code><code id="L5829"><span class="ln">5829</span> i,
-</code><code id="L5830"><span class="ln">5830</span> ii,
-</code><code id="L5831"><span class="ln">5831</span> j,
-</code><code id="L5832"><span class="ln">5832</span> jj,
-</code><code id="L5833"><span class="ln">5833</span> nes,
-</code><code id="L5834"><span class="ln">5834</span> es<span class="s"> = </span>[e],
-</code><code id="L5835"><span class="ln">5835</span> out<span class="s"> = </span>[];
-</code><code id="L5836"><span class="ln">5836</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>names.length; i < ii; i++) {
-</code><code id="L5837"><span class="ln">5837</span> nes<span class="s"> = </span>[];
-</code><code id="L5838"><span class="ln">5838</span> <b>for</b> (j<span class="s"> = </span><span class="d">0</span>, jj<span class="s"> = </span>es.length; j < jj; j++) {
-</code><code id="L5839"><span class="ln">5839</span> e<span class="s"> = </span>es[j].n;
-</code><code id="L5840"><span class="ln">5840</span> items<span class="s"> = </span>[e[names[i]], e[wildcard]];
-</code><code id="L5841"><span class="ln">5841</span> k<span class="s"> = </span><span class="d">2</span>;
-</code><code id="L5842"><span class="ln">5842</span> <b>while</b> (k--) {
-</code><code id="L5843"><span class="ln">5843</span> item<span class="s"> = </span>items[k];
-</code><code id="L5844"><span class="ln">5844</span> <b>if</b> (item) {
-</code><code id="L5845"><span class="ln">5845</span> nes.push(item);
-</code><code id="L5846"><span class="ln">5846</span> out<span class="s"> = </span>out.concat(item.f<span class="s"> || </span>[]);
-</code><code id="L5847"><span class="ln">5847</span> }
-</code><code id="L5848"><span class="ln">5848</span> }
-</code><code id="L5849"><span class="ln">5849</span> }
-</code><code id="L5850"><span class="ln">5850</span> es<span class="s"> = </span>nes;
-</code><code id="L5851"><span class="ln">5851</span> }
-</code><code id="L5852"><span class="ln">5852</span> <b>return</b> out;
-</code><code id="L5853"><span class="ln">5853</span> };
-</code><code id="L5854"><span class="ln">5854</span> eve.on<span class="s"> = </span><b>function</b> (name, f) {
-</code><code id="L5855"><span class="ln">5855</span> <b>var</b> names<span class="s"> = </span>name.split(separator),
-</code><code id="L5856"><span class="ln">5856</span> e<span class="s"> = </span>events;
-</code><code id="L5857"><span class="ln">5857</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>names.length; i < ii; i++) {
-</code><code id="L5858"><span class="ln">5858</span> e<span class="s"> = </span>e.n;
-</code><code id="L5859"><span class="ln">5859</span> !e[names[i]]<span class="s"> && </span>(e[names[i]]<span class="s"> = </span>{n: {}});
-</code><code id="L5860"><span class="ln">5860</span> e<span class="s"> = </span>e[names[i]];
-</code><code id="L5861"><span class="ln">5861</span> }
-</code><code id="L5862"><span class="ln">5862</span> e.f<span class="s"> = </span>e.f<span class="s"> || </span>[];
-</code><code id="L5863"><span class="ln">5863</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>e.f.length; i < ii; i++) <b>if</b> (e.f[i]<span class="s"> == </span>f) {
-</code><code id="L5864"><span class="ln">5864</span> <b>return</b> <b>false</b>;
-</code><code id="L5865"><span class="ln">5865</span> }
-</code><code id="L5866"><span class="ln">5866</span> e.f.push(f);
-</code><code id="L5867"><span class="ln">5867</span> };
-</code><code id="L5868"><span class="ln">5868</span> eve.unbind<span class="s"> = </span><b>function</b> (name, f) {
-</code><code id="L5869"><span class="ln">5869</span> <b>var</b> names<span class="s"> = </span>name.split(separator),
-</code><code id="L5870"><span class="ln">5870</span> e,
-</code><code id="L5871"><span class="ln">5871</span> key,
-</code><code id="L5872"><span class="ln">5872</span> splice,
-</code><code id="L5873"><span class="ln">5873</span> cur<span class="s"> = </span>[events];
-</code><code id="L5874"><span class="ln">5874</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>names.length; i < ii; i++) {
-</code><code id="L5875"><span class="ln">5875</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">0</span>; j < cur.length; j += splice.length<span class="s"> - </span><span class="d">2</span>) {
-</code><code id="L5876"><span class="ln">5876</span> splice<span class="s"> = </span>[j, <span class="d">1</span>];
-</code><code id="L5877"><span class="ln">5877</span> e<span class="s"> = </span>cur[j].n;
-</code><code id="L5878"><span class="ln">5878</span> <b>if</b> (names[i] != wildcard) {
-</code><code id="L5879"><span class="ln">5879</span> <b>if</b> (e[names[i]]) {
-</code><code id="L5880"><span class="ln">5880</span> splice.push(e[names[i]]);
-</code><code id="L5881"><span class="ln">5881</span> }
-</code><code id="L5882"><span class="ln">5882</span> } <b>else</b> {
-</code><code id="L5883"><span class="ln">5883</span> <b>for</b> (key <b>in</b> e) <b>if</b> (e[has](key)) {
-</code><code id="L5884"><span class="ln">5884</span> splice.push(e[key]);
-</code><code id="L5885"><span class="ln">5885</span> }
-</code><code id="L5886"><span class="ln">5886</span> }
-</code><code id="L5887"><span class="ln">5887</span> cur.splice.apply(cur, splice);
-</code><code id="L5888"><span class="ln">5888</span> }
-</code><code id="L5889"><span class="ln">5889</span> }
-</code><code id="L5890"><span class="ln">5890</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>cur.length; i < ii; i++) {
-</code><code id="L5891"><span class="ln">5891</span> e<span class="s"> = </span>cur[i];
-</code><code id="L5892"><span class="ln">5892</span> <b>while</b> (e.n) {
-</code><code id="L5893"><span class="ln">5893</span> <b>if</b> (f) {
-</code><code id="L5894"><span class="ln">5894</span> <b>if</b> (e.f) {
-</code><code id="L5895"><span class="ln">5895</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>e.f.length; i < ii; i++) <b>if</b> (e.f[i]<span class="s"> == </span>f) {
-</code><code id="L5896"><span class="ln">5896</span> e.f.splice(i, <span class="d">1</span>);
-</code><code id="L5897"><span class="ln">5897</span> <b>break</b>;
-</code><code id="L5898"><span class="ln">5898</span> }
-</code><code id="L5899"><span class="ln">5899</span> !e.f.length<span class="s"> && </span><b>delete</b> e.f;
-</code><code id="L5900"><span class="ln">5900</span> }
-</code><code id="L5901"><span class="ln">5901</span> <b>for</b> (key <b>in</b> e.n) <b>if</b> (e.n[has](key)<span class="s"> && </span>e.n[key].f) {
-</code><code id="L5902"><span class="ln">5902</span> <b>var</b> funcs<span class="s"> = </span>e.n[key].f;
-</code><code id="L5903"><span class="ln">5903</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>funcs.length; i < ii; i++) <b>if</b> (funcs[i]<span class="s"> == </span>f) {
-</code><code id="L5904"><span class="ln">5904</span> funcs.splice(i, <span class="d">1</span>);
-</code><code id="L5905"><span class="ln">5905</span> <b>break</b>;
-</code><code id="L5906"><span class="ln">5906</span> }
-</code><code id="L5907"><span class="ln">5907</span> !funcs.length<span class="s"> && </span><b>delete</b> e.n[key].f;
-</code><code id="L5908"><span class="ln">5908</span> }
-</code><code id="L5909"><span class="ln">5909</span> } <b>else</b> {
-</code><code id="L5910"><span class="ln">5910</span> <b>delete</b> e.f;
-</code><code id="L5911"><span class="ln">5911</span> <b>for</b> (key <b>in</b> e.n) <b>if</b> (e.n[has](key)<span class="s"> && </span>e.n[key].f) {
-</code><code id="L5912"><span class="ln">5912</span> <b>delete</b> e.n[key].f;
-</code><code id="L5913"><span class="ln">5913</span> }
-</code><code id="L5914"><span class="ln">5914</span> }
-</code><code id="L5915"><span class="ln">5915</span> e<span class="s"> = </span>e.n;
-</code><code id="L5916"><span class="ln">5916</span> }
+</code><code id="L5657"><span class="ln">5657</span> setproto.animate<span class="s"> = </span><b>function</b> (params, ms, easing, callback) {
+</code><code id="L5658"><span class="ln">5658</span> (R.is(easing, <i>"<b>function</b>"</i>)<span class="s"> || </span>!easing)<span class="s"> && </span>(callback<span class="s"> = </span>easing<span class="s"> || </span><b>null</b>);
+</code><code id="L5659"><span class="ln">5659</span> <b>var</b> len<span class="s"> = </span><b>this</b>.items.length,
+</code><code id="L5660"><span class="ln">5660</span> i<span class="s"> = </span>len,
+</code><code id="L5661"><span class="ln">5661</span> item,
+</code><code id="L5662"><span class="ln">5662</span> set<span class="s"> = </span><b>this</b>,
+</code><code id="L5663"><span class="ln">5663</span> collector;
+</code><code id="L5664"><span class="ln">5664</span> callback<span class="s"> && </span>(collector<span class="s"> = </span><b>function</b> () {
+</code><code id="L5665"><span class="ln">5665</span> !--len<span class="s"> && </span>callback.call(set);
+</code><code id="L5666"><span class="ln">5666</span> });
+</code><code id="L5667"><span class="ln">5667</span> easing<span class="s"> = </span>R.is(easing, string) ? easing : collector;
+</code><code id="L5668"><span class="ln">5668</span> <b>var</b> anim<span class="s"> = </span>params <b>instanceof</b> Animation ? params : R.animation(params, ms, easing, collector);
+</code><code id="L5669"><span class="ln">5669</span> item<span class="s"> = </span><b>this</b>.items[--i].animate(anim);
+</code><code id="L5670"><span class="ln">5670</span> <b>while</b> (i--) {
+</code><code id="L5671"><span class="ln">5671</span> <b>this</b>.items[i]<span class="s"> && </span>!<b>this</b>.items[i].removed<span class="s"> && </span><b>this</b>.items[i].animateWith(item, anim);
+</code><code id="L5672"><span class="ln">5672</span> }
+</code><code id="L5673"><span class="ln">5673</span> <b>return</b> <b>this</b>;
+</code><code id="L5674"><span class="ln">5674</span> };
+</code><code id="L5675"><span class="ln">5675</span> setproto.insertAfter<span class="s"> = </span><b>function</b> (el) {
+</code><code id="L5676"><span class="ln">5676</span> <b>var</b> i<span class="s"> = </span><b>this</b>.items.length;
+</code><code id="L5677"><span class="ln">5677</span> <b>while</b> (i--) {
+</code><code id="L5678"><span class="ln">5678</span> <b>this</b>.items[i].insertAfter(el);
+</code><code id="L5679"><span class="ln">5679</span> }
+</code><code id="L5680"><span class="ln">5680</span> <b>return</b> <b>this</b>;
+</code><code id="L5681"><span class="ln">5681</span> };
+</code><code id="L5682"><span class="ln">5682</span> setproto.getBBox<span class="s"> = </span><b>function</b> () {
+</code><code id="L5683"><span class="ln">5683</span> <b>var</b> x<span class="s"> = </span>[],
+</code><code id="L5684"><span class="ln">5684</span> y<span class="s"> = </span>[],
+</code><code id="L5685"><span class="ln">5685</span> w<span class="s"> = </span>[],
+</code><code id="L5686"><span class="ln">5686</span> h<span class="s"> = </span>[];
+</code><code id="L5687"><span class="ln">5687</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><b>this</b>.items.length; i--;) <b>if</b> (!<b>this</b>.items[i].removed) {
+</code><code id="L5688"><span class="ln">5688</span> <b>var</b> box<span class="s"> = </span><b>this</b>.items[i].getBBox();
+</code><code id="L5689"><span class="ln">5689</span> x.push(box.x);
+</code><code id="L5690"><span class="ln">5690</span> y.push(box.y);
+</code><code id="L5691"><span class="ln">5691</span> w.push(box.x<span class="s"> + </span>box.width);
+</code><code id="L5692"><span class="ln">5692</span> h.push(box.y<span class="s"> + </span>box.height);
+</code><code id="L5693"><span class="ln">5693</span> }
+</code><code id="L5694"><span class="ln">5694</span> x<span class="s"> = </span>mmin[apply](<span class="d">0</span>, x);
+</code><code id="L5695"><span class="ln">5695</span> y<span class="s"> = </span>mmin[apply](<span class="d">0</span>, y);
+</code><code id="L5696"><span class="ln">5696</span> <b>return</b> {
+</code><code id="L5697"><span class="ln">5697</span> x: x,
+</code><code id="L5698"><span class="ln">5698</span> y: y,
+</code><code id="L5699"><span class="ln">5699</span> width: mmax[apply](<span class="d">0</span>, w)<span class="s"> - </span>x,
+</code><code id="L5700"><span class="ln">5700</span> height: mmax[apply](<span class="d">0</span>, h)<span class="s"> - </span>y
+</code><code id="L5701"><span class="ln">5701</span> };
+</code><code id="L5702"><span class="ln">5702</span> };
+</code><code id="L5703"><span class="ln">5703</span> setproto.clone<span class="s"> = </span><b>function</b> (s) {
+</code><code id="L5704"><span class="ln">5704</span> s<span class="s"> = </span><b>new</b> Set;
+</code><code id="L5705"><span class="ln">5705</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span><b>this</b>.items.length; i < ii; i++) {
+</code><code id="L5706"><span class="ln">5706</span> s.push(<b>this</b>.items[i].clone());
+</code><code id="L5707"><span class="ln">5707</span> }
+</code><code id="L5708"><span class="ln">5708</span> <b>return</b> s;
+</code><code id="L5709"><span class="ln">5709</span> };
+</code><code id="L5710"><span class="ln">5710</span> setproto.toString<span class="s"> = </span><b>function</b> () {
+</code><code id="L5711"><span class="ln">5711</span> <b>return</b> <i>"Rapha\xebl\u2018s set"</i>;
+</code><code id="L5712"><span class="ln">5712</span> };
+</code><code id="L5713"><span class="ln">5713</span>
+</code><code id="L5714"><span class="ln">5714</span> R.registerFont<span class="s"> = </span><b>function</b> (font) {
+</code><code id="L5715"><span class="ln">5715</span> <b>if</b> (!font.face) {
+</code><code id="L5716"><span class="ln">5716</span> <b>return</b> font;
+</code><code id="L5717"><span class="ln">5717</span> }
+</code><code id="L5718"><span class="ln">5718</span> <b>this</b>.fonts<span class="s"> = </span><b>this</b>.fonts<span class="s"> || </span>{};
+</code><code id="L5719"><span class="ln">5719</span> <b>var</b> fontcopy<span class="s"> = </span>{
+</code><code id="L5720"><span class="ln">5720</span> w: font.w,
+</code><code id="L5721"><span class="ln">5721</span> face: {},
+</code><code id="L5722"><span class="ln">5722</span> glyphs: {}
+</code><code id="L5723"><span class="ln">5723</span> },
+</code><code id="L5724"><span class="ln">5724</span> family<span class="s"> = </span>font.face[<i>"font-family"</i>];
+</code><code id="L5725"><span class="ln">5725</span> <b>for</b> (<b>var</b> prop <b>in</b> font.face) <b>if</b> (font.face[has](prop)) {
+</code><code id="L5726"><span class="ln">5726</span> fontcopy.face[prop]<span class="s"> = </span>font.face[prop];
+</code><code id="L5727"><span class="ln">5727</span> }
+</code><code id="L5728"><span class="ln">5728</span> <b>if</b> (<b>this</b>.fonts[family]) {
+</code><code id="L5729"><span class="ln">5729</span> <b>this</b>.fonts[family].push(fontcopy);
+</code><code id="L5730"><span class="ln">5730</span> } <b>else</b> {
+</code><code id="L5731"><span class="ln">5731</span> <b>this</b>.fonts[family]<span class="s"> = </span>[fontcopy];
+</code><code id="L5732"><span class="ln">5732</span> }
+</code><code id="L5733"><span class="ln">5733</span> <b>if</b> (!font.svg) {
+</code><code id="L5734"><span class="ln">5734</span> fontcopy.face[<i>"units-per-em"</i>]<span class="s"> = </span>toInt(font.face[<i>"units-per-em"</i>], <span class="d">10</span>);
+</code><code id="L5735"><span class="ln">5735</span> <b>for</b> (<b>var</b> glyph <b>in</b> font.glyphs) <b>if</b> (font.glyphs[has](glyph)) {
+</code><code id="L5736"><span class="ln">5736</span> <b>var</b> path<span class="s"> = </span>font.glyphs[glyph];
+</code><code id="L5737"><span class="ln">5737</span> fontcopy.glyphs[glyph]<span class="s"> = </span>{
+</code><code id="L5738"><span class="ln">5738</span> w: path.w,
+</code><code id="L5739"><span class="ln">5739</span> k: {},
+</code><code id="L5740"><span class="ln">5740</span> d: path.d<span class="s"> && </span><i>"M"</i><span class="s"> + </span>path.d.replace(/[mlcxtrv]/g, <b>function</b> (command) {
+</code><code id="L5741"><span class="ln">5741</span> <b>return</b> {l: <i>"L"</i>, c: <i>"C"</i>, x: <i>"z"</i>, t: <i>"m"</i>, r: <i>"l"</i>, v: <i>"c"</i>}[command]<span class="s"> || </span><i>"M"</i>;
+</code><code id="L5742"><span class="ln">5742</span> })<span class="s"> + </span><i>"z"</i>
+</code><code id="L5743"><span class="ln">5743</span> };
+</code><code id="L5744"><span class="ln">5744</span> <b>if</b> (path.k) {
+</code><code id="L5745"><span class="ln">5745</span> <b>for</b> (<b>var</b> k <b>in</b> path.k) <b>if</b> (path[has](k)) {
+</code><code id="L5746"><span class="ln">5746</span> fontcopy.glyphs[glyph].k[k]<span class="s"> = </span>path.k[k];
+</code><code id="L5747"><span class="ln">5747</span> }
+</code><code id="L5748"><span class="ln">5748</span> }
+</code><code id="L5749"><span class="ln">5749</span> }
+</code><code id="L5750"><span class="ln">5750</span> }
+</code><code id="L5751"><span class="ln">5751</span> <b>return</b> font;
+</code><code id="L5752"><span class="ln">5752</span> };
+</code><code id="L5753"><span class="ln">5753</span> paperproto.getFont<span class="s"> = </span><b>function</b> (family, weight, style, stretch) {
+</code><code id="L5754"><span class="ln">5754</span> stretch<span class="s"> = </span>stretch<span class="s"> || </span><i>"normal"</i>;
+</code><code id="L5755"><span class="ln">5755</span> style<span class="s"> = </span>style<span class="s"> || </span><i>"normal"</i>;
+</code><code id="L5756"><span class="ln">5756</span> weight<span class="s"> = </span>+weight<span class="s"> || </span>{normal: <span class="d">400</span>, bold: <span class="d">700</span>, lighter: <span class="d">300</span>, bolder: <span class="d">800</span>}[weight]<span class="s"> || </span><span class="d">400</span>;
+</code><code id="L5757"><span class="ln">5757</span> <b>if</b> (!R.fonts) {
+</code><code id="L5758"><span class="ln">5758</span> <b>return</b>;
+</code><code id="L5759"><span class="ln">5759</span> }
+</code><code id="L5760"><span class="ln">5760</span> <b>var</b> font<span class="s"> = </span>R.fonts[family];
+</code><code id="L5761"><span class="ln">5761</span> <b>if</b> (!font) {
+</code><code id="L5762"><span class="ln">5762</span> <b>var</b> name<span class="s"> = </span><b>new</b> RegExp(<i>"(^|\\s)"</i><span class="s"> + </span>family.replace(/[^\w\d\s+!~.:_-]/g, E)<span class="s"> + </span><i>"(\\s|$)"</i>, <i>"i"</i>);
+</code><code id="L5763"><span class="ln">5763</span> <b>for</b> (<b>var</b> fontName <b>in</b> R.fonts) <b>if</b> (R.fonts[has](fontName)) {
+</code><code id="L5764"><span class="ln">5764</span> <b>if</b> (name.test(fontName)) {
+</code><code id="L5765"><span class="ln">5765</span> font<span class="s"> = </span>R.fonts[fontName];
+</code><code id="L5766"><span class="ln">5766</span> <b>break</b>;
+</code><code id="L5767"><span class="ln">5767</span> }
+</code><code id="L5768"><span class="ln">5768</span> }
+</code><code id="L5769"><span class="ln">5769</span> }
+</code><code id="L5770"><span class="ln">5770</span> <b>var</b> thefont;
+</code><code id="L5771"><span class="ln">5771</span> <b>if</b> (font) {
+</code><code id="L5772"><span class="ln">5772</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>font.length; i < ii; i++) {
+</code><code id="L5773"><span class="ln">5773</span> thefont<span class="s"> = </span>font[i];
+</code><code id="L5774"><span class="ln">5774</span> <b>if</b> (thefont.face[<i>"font-weight"</i>]<span class="s"> == </span>weight<span class="s"> && </span>(thefont.face[<i>"font-style"</i>]<span class="s"> == </span>style<span class="s"> || </span>!thefont.face[<i>"font-style"</i>])<span class="s"> && </span>thefont.face[<i>"font-stretch"</i>]<span class="s"> == </span>stretch) {
+</code><code id="L5775"><span class="ln">5775</span> <b>break</b>;
+</code><code id="L5776"><span class="ln">5776</span> }
+</code><code id="L5777"><span class="ln">5777</span> }
+</code><code id="L5778"><span class="ln">5778</span> }
+</code><code id="L5779"><span class="ln">5779</span> <b>return</b> thefont;
+</code><code id="L5780"><span class="ln">5780</span> };
+</code><code id="L5781"><span class="ln">5781</span> paperproto.print<span class="s"> = </span><b>function</b> (x, y, string, font, size, origin, letter_spacing) {
+</code><code id="L5782"><span class="ln">5782</span> origin<span class="s"> = </span>origin<span class="s"> || </span><i>"middle"</i>; <span class="c">// baseline|middle</span>
+</code><code id="L5783"><span class="ln">5783</span> letter_spacing<span class="s"> = </span>mmax(mmin(letter_spacing<span class="s"> || </span><span class="d">0</span>, <span class="d">1</span>), -<span class="d">1</span>);
+</code><code id="L5784"><span class="ln">5784</span> <b>var</b> out<span class="s"> = </span><b>this</b>.set(),
+</code><code id="L5785"><span class="ln">5785</span> letters<span class="s"> = </span>Str(string).split(E),
+</code><code id="L5786"><span class="ln">5786</span> shift<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L5787"><span class="ln">5787</span> path<span class="s"> = </span>E,
+</code><code id="L5788"><span class="ln">5788</span> scale;
+</code><code id="L5789"><span class="ln">5789</span> R.is(font, string)<span class="s"> && </span>(font<span class="s"> = </span><b>this</b>.getFont(font));
+</code><code id="L5790"><span class="ln">5790</span> <b>if</b> (font) {
+</code><code id="L5791"><span class="ln">5791</span> scale<span class="s"> = </span>(size<span class="s"> || </span><span class="d">16</span>)<span class="s"> / </span>font.face[<i>"units-per-em"</i>];
+</code><code id="L5792"><span class="ln">5792</span> <b>var</b> bb<span class="s"> = </span>font.face.bbox.split(separator),
+</code><code id="L5793"><span class="ln">5793</span> top<span class="s"> = </span>+bb[<span class="d">0</span>],
+</code><code id="L5794"><span class="ln">5794</span> height<span class="s"> = </span>+bb[<span class="d">1</span>]<span class="s"> + </span>(origin<span class="s"> == </span><i>"baseline"</i> ? bb[<span class="d">3</span>]<span class="s"> - </span>bb[<span class="d">1</span>]<span class="s"> + </span>(+font.face.descent) : (bb[<span class="d">3</span>]<span class="s"> - </span>bb[<span class="d">1</span>])<span class="s"> / </span><span class="d">2</span>);
+</code><code id="L5795"><span class="ln">5795</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>letters.length; i < ii; i++) {
+</code><code id="L5796"><span class="ln">5796</span> <b>var</b> prev<span class="s"> = </span>i<span class="s"> && </span>font.glyphs[letters[i<span class="s"> - </span><span class="d">1</span>]]<span class="s"> || </span>{},
+</code><code id="L5797"><span class="ln">5797</span> curr<span class="s"> = </span>font.glyphs[letters[i]];
+</code><code id="L5798"><span class="ln">5798</span> shift += i ? (prev.w<span class="s"> || </span>font.w)<span class="s"> + </span>(prev.k<span class="s"> && </span>prev.k[letters[i]]<span class="s"> || </span><span class="d">0</span>)<span class="s"> + </span>(font.w<span class="s"> * </span>letter_spacing) : <span class="d">0</span>;
+</code><code id="L5799"><span class="ln">5799</span> curr<span class="s"> && </span>curr.d<span class="s"> && </span>out.push(<b>this</b>.path(curr.d).attr({fill: <i>"#<span class="d">000</span>"</i>, stroke: <i>"none"</i>, transform: [[<i>"t"</i>, shift, <span class="d">0</span>]]}));
+</code><code id="L5800"><span class="ln">5800</span> }
+</code><code id="L5801"><span class="ln">5801</span> out.scale(scale, scale, top, height).translate(x<span class="s"> - </span>top, y<span class="s"> - </span>height);
+</code><code id="L5802"><span class="ln">5802</span> }
+</code><code id="L5803"><span class="ln">5803</span> <b>return</b> out;
+</code><code id="L5804"><span class="ln">5804</span> };
+</code><code id="L5805"><span class="ln">5805</span>
+</code><code id="L5806"><span class="ln">5806</span> R.format<span class="s"> = </span><b>function</b> (token, params) {
+</code><code id="L5807"><span class="ln">5807</span> <b>var</b> args<span class="s"> = </span>R.is(params, array) ? [<span class="d">0</span>][concat](params) : arguments;
+</code><code id="L5808"><span class="ln">5808</span> token<span class="s"> && </span>R.is(token, string)<span class="s"> && </span>args.length<span class="s"> - </span><span class="d">1</span><span class="s"> && </span>(token<span class="s"> = </span>token.replace(formatrg, <b>function</b> (str, i) {
+</code><code id="L5809"><span class="ln">5809</span> <b>return</b> args[++i]<span class="s"> == </span><b>null</b> ? E : args[i];
+</code><code id="L5810"><span class="ln">5810</span> }));
+</code><code id="L5811"><span class="ln">5811</span> <b>return</b> token<span class="s"> || </span>E;
+</code><code id="L5812"><span class="ln">5812</span> };
+</code><code id="L5813"><span class="ln">5813</span> R.ninja<span class="s"> = </span><b>function</b> () {
+</code><code id="L5814"><span class="ln">5814</span> oldRaphael.was ? (g.win.Raphael<span class="s"> = </span>oldRaphael.is) : <b>delete</b> Raphael;
+</code><code id="L5815"><span class="ln">5815</span> <b>return</b> R;
+</code><code id="L5816"><span class="ln">5816</span> };
+</code><code id="L5817"><span class="ln">5817</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L5818"><span class="ln">5818</span><span class="c"> <span class="s"> * </span>Raphael.el
+</span></code><code id="L5819"><span class="ln">5819</span><span class="c"> [ property (object) ]
+</span></code><code id="L5820"><span class="ln">5820</span><span class="c"> **
+</span></code><code id="L5821"><span class="ln">5821</span><span class="c"> <span class="s"> * </span>You can add your own method to elements. This is usefull when you want to hack <b>default</b> functionality or
+</span></code><code id="L5822"><span class="ln">5822</span><span class="c"> <span class="s"> * </span>want to wrap some common transformation or attributes <b>in</b> one method. In difference to canvas methods,
+</span></code><code id="L5823"><span class="ln">5823</span><span class="c"> <span class="s"> * </span>you can redefine element method at any time. Expending element methods wouldn’t affect set.
+</span></code><code id="L5824"><span class="ln">5824</span><span class="c"> > Usage
+</span></code><code id="L5825"><span class="ln">5825</span><span class="c"> <span class="s"> | </span>Raphael.el.red<span class="s"> = </span><b>function</b> () {
+</span></code><code id="L5826"><span class="ln">5826</span><span class="c"> <span class="s"> | </span> <b>this</b>.attr({fill: <i>"#f00"</i>});
+</span></code><code id="L5827"><span class="ln">5827</span><span class="c"> <span class="s"> | </span>};
+</span></code><code id="L5828"><span class="ln">5828</span><span class="c"> <span class="s"> | </span><span class="c">// then use it</span>
+</span></code><code id="L5829"><span class="ln">5829</span><span class="c"> <span class="s"> | </span>paper.circle(<span class="d">100</span>, <span class="d">100</span>, <span class="d">20</span>).red();
+</span></code><code id="L5830"><span class="ln">5830</span><span class="c"> \*/</span>
+</code><code id="L5831"><span class="ln">5831</span> R.el<span class="s"> = </span>elproto;
+</code><code id="L5832"><span class="ln">5832</span> R.st<span class="s"> = </span>setproto;
+</code><code id="L5833"><span class="ln">5833</span> <span class="c">// Firefox <<span class="d">3.6</span> fix: http://webreflection.blogspot.com/<span class="d">2009</span>/<span class="d">11</span>/<span class="d">195</span>-chars-to-help-lazy-loading.html</span>
+</code><code id="L5834"><span class="ln">5834</span> (<b>function</b> (doc, loaded, f) {
+</code><code id="L5835"><span class="ln">5835</span> <b>if</b> (doc.readyState<span class="s"> == </span><b>null</b><span class="s"> && </span>doc.addEventListener){
+</code><code id="L5836"><span class="ln">5836</span> doc.addEventListener(loaded, f<span class="s"> = </span><b>function</b> () {
+</code><code id="L5837"><span class="ln">5837</span> doc.removeEventListener(loaded, f, <b>false</b>);
+</code><code id="L5838"><span class="ln">5838</span> doc.readyState<span class="s"> = </span><i>"complete"</i>;
+</code><code id="L5839"><span class="ln">5839</span> }, <b>false</b>);
+</code><code id="L5840"><span class="ln">5840</span> doc.readyState<span class="s"> = </span><i>"loading"</i>;
+</code><code id="L5841"><span class="ln">5841</span> }
+</code><code id="L5842"><span class="ln">5842</span> <b>function</b> isLoaded() {
+</code><code id="L5843"><span class="ln">5843</span> (/<b>in</b>/).test(doc.readyState) ? setTimeout(isLoaded, <span class="d">9</span>) : eve(<i>"DOMload"</i>);
+</code><code id="L5844"><span class="ln">5844</span> }
+</code><code id="L5845"><span class="ln">5845</span> isLoaded();
+</code><code id="L5846"><span class="ln">5846</span> })(document, <i>"DOMContentLoaded"</i>);
+</code><code id="L5847"><span class="ln">5847</span>
+</code><code id="L5848"><span class="ln">5848</span> oldRaphael.was ? (g.win.Raphael<span class="s"> = </span>R) : (Raphael<span class="s"> = </span>R);
+</code><code id="L5849"><span class="ln">5849</span>
+</code><code id="L5850"><span class="ln">5850</span><span class="c"> /*
+</span></code><code id="L5851"><span class="ln">5851</span><span class="c"> <span class="s"> * </span>Eve <span class="d">0.2</span><span class="d">.1</span><span class="s"> - </span>JavaScript Events Library
+</span></code><code id="L5852"><span class="ln">5852</span><span class="c"> *
+</span></code><code id="L5853"><span class="ln">5853</span><span class="c"> <span class="s"> * </span>Copyright (c) <span class="d">2010</span> Dmitry Baranovskiy (http:<span class="c">//dmitry.baranovskiy.com/)</span>
+</span></code><code id="L5854"><span class="ln">5854</span><span class="c"> <span class="s"> * </span>Licensed under the MIT (http:<span class="c">//www.opensource.org/licenses/mit-license.php) license.</span>
+</span></code><code id="L5855"><span class="ln">5855</span><span class="c"> */</span>
+</code><code id="L5856"><span class="ln">5856</span>
+</code><code id="L5857"><span class="ln">5857</span> <b>var</b> eve<span class="s"> = </span>R.eve<span class="s"> = </span>(<b>function</b> () {
+</code><code id="L5858"><span class="ln">5858</span> <b>var</b> version<span class="s"> = </span><i>"<span class="d">0.2</span><span class="d">.1</span>"</i>,
+</code><code id="L5859"><span class="ln">5859</span> has<span class="s"> = </span><i>"hasOwnProperty"</i>,
+</code><code id="L5860"><span class="ln">5860</span> separator<span class="s"> = </span>/[\.\/]/,
+</code><code id="L5861"><span class="ln">5861</span> wildcard<span class="s"> = </span><i>"*"</i>,
+</code><code id="L5862"><span class="ln">5862</span> events<span class="s"> = </span>{n: {}},
+</code><code id="L5863"><span class="ln">5863</span> eve<span class="s"> = </span><b>function</b> (name, scope) {
+</code><code id="L5864"><span class="ln">5864</span> <b>var</b> e<span class="s"> = </span>events,
+</code><code id="L5865"><span class="ln">5865</span> args<span class="s"> = </span>Array.prototype.slice.call(arguments, <span class="d">2</span>),
+</code><code id="L5866"><span class="ln">5866</span> listeners<span class="s"> = </span>eve.listeners(name),
+</code><code id="L5867"><span class="ln">5867</span> errors<span class="s"> = </span>[];
+</code><code id="L5868"><span class="ln">5868</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>listeners.length; i < ii; i++) {
+</code><code id="L5869"><span class="ln">5869</span> <b>try</b> {
+</code><code id="L5870"><span class="ln">5870</span> listeners[i].apply(scope, args);
+</code><code id="L5871"><span class="ln">5871</span> } <b>catch</b> (ex) {
+</code><code id="L5872"><span class="ln">5872</span> errors.push({error: ex<span class="s"> && </span>ex.message<span class="s"> || </span>ex, func: listeners[i]});
+</code><code id="L5873"><span class="ln">5873</span> }
+</code><code id="L5874"><span class="ln">5874</span> }
+</code><code id="L5875"><span class="ln">5875</span> <b>if</b> (errors.length) {
+</code><code id="L5876"><span class="ln">5876</span> <b>return</b> errors;
+</code><code id="L5877"><span class="ln">5877</span> }
+</code><code id="L5878"><span class="ln">5878</span> };
+</code><code id="L5879"><span class="ln">5879</span> eve.listeners<span class="s"> = </span><b>function</b> (name) {
+</code><code id="L5880"><span class="ln">5880</span> <b>var</b> names<span class="s"> = </span>name.split(separator),
+</code><code id="L5881"><span class="ln">5881</span> e<span class="s"> = </span>events,
+</code><code id="L5882"><span class="ln">5882</span> item,
+</code><code id="L5883"><span class="ln">5883</span> items,
+</code><code id="L5884"><span class="ln">5884</span> k,
+</code><code id="L5885"><span class="ln">5885</span> i,
+</code><code id="L5886"><span class="ln">5886</span> ii,
+</code><code id="L5887"><span class="ln">5887</span> j,
+</code><code id="L5888"><span class="ln">5888</span> jj,
+</code><code id="L5889"><span class="ln">5889</span> nes,
+</code><code id="L5890"><span class="ln">5890</span> es<span class="s"> = </span>[e],
+</code><code id="L5891"><span class="ln">5891</span> out<span class="s"> = </span>[];
+</code><code id="L5892"><span class="ln">5892</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>names.length; i < ii; i++) {
+</code><code id="L5893"><span class="ln">5893</span> nes<span class="s"> = </span>[];
+</code><code id="L5894"><span class="ln">5894</span> <b>for</b> (j<span class="s"> = </span><span class="d">0</span>, jj<span class="s"> = </span>es.length; j < jj; j++) {
+</code><code id="L5895"><span class="ln">5895</span> e<span class="s"> = </span>es[j].n;
+</code><code id="L5896"><span class="ln">5896</span> items<span class="s"> = </span>[e[names[i]], e[wildcard]];
+</code><code id="L5897"><span class="ln">5897</span> k<span class="s"> = </span><span class="d">2</span>;
+</code><code id="L5898"><span class="ln">5898</span> <b>while</b> (k--) {
+</code><code id="L5899"><span class="ln">5899</span> item<span class="s"> = </span>items[k];
+</code><code id="L5900"><span class="ln">5900</span> <b>if</b> (item) {
+</code><code id="L5901"><span class="ln">5901</span> nes.push(item);
+</code><code id="L5902"><span class="ln">5902</span> out<span class="s"> = </span>out.concat(item.f<span class="s"> || </span>[]);
+</code><code id="L5903"><span class="ln">5903</span> }
+</code><code id="L5904"><span class="ln">5904</span> }
+</code><code id="L5905"><span class="ln">5905</span> }
+</code><code id="L5906"><span class="ln">5906</span> es<span class="s"> = </span>nes;
+</code><code id="L5907"><span class="ln">5907</span> }
+</code><code id="L5908"><span class="ln">5908</span> <b>return</b> out;
+</code><code id="L5909"><span class="ln">5909</span> };
+</code><code id="L5910"><span class="ln">5910</span> eve.on<span class="s"> = </span><b>function</b> (name, f) {
+</code><code id="L5911"><span class="ln">5911</span> <b>var</b> names<span class="s"> = </span>name.split(separator),
+</code><code id="L5912"><span class="ln">5912</span> e<span class="s"> = </span>events;
+</code><code id="L5913"><span class="ln">5913</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>names.length; i < ii; i++) {
+</code><code id="L5914"><span class="ln">5914</span> e<span class="s"> = </span>e.n;
+</code><code id="L5915"><span class="ln">5915</span> !e[names[i]]<span class="s"> && </span>(e[names[i]]<span class="s"> = </span>{n: {}});
+</code><code id="L5916"><span class="ln">5916</span> e<span class="s"> = </span>e[names[i]];
</code><code id="L5917"><span class="ln">5917</span> }
-</code><code id="L5918"><span class="ln">5918</span> <b>return</b> <b>true</b>;
-</code><code id="L5919"><span class="ln">5919</span> };
-</code><code id="L5920"><span class="ln">5920</span> eve.version<span class="s"> = </span>version;
-</code><code id="L5921"><span class="ln">5921</span> eve.toString<span class="s"> = </span><b>function</b> () {
-</code><code id="L5922"><span class="ln">5922</span> <b>return</b> <i>"You are running Eve "</i><span class="s"> + </span>version;
+</code><code id="L5918"><span class="ln">5918</span> e.f<span class="s"> = </span>e.f<span class="s"> || </span>[];
+</code><code id="L5919"><span class="ln">5919</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>e.f.length; i < ii; i++) <b>if</b> (e.f[i]<span class="s"> == </span>f) {
+</code><code id="L5920"><span class="ln">5920</span> <b>return</b> <b>false</b>;
+</code><code id="L5921"><span class="ln">5921</span> }
+</code><code id="L5922"><span class="ln">5922</span> e.f.push(f);
</code><code id="L5923"><span class="ln">5923</span> };
-</code><code id="L5924"><span class="ln">5924</span> <b>return</b> eve;
-</code><code id="L5925"><span class="ln">5925</span> })();
-</code><code id="L5926"><span class="ln">5926</span>})();
+</code><code id="L5924"><span class="ln">5924</span> eve.unbind<span class="s"> = </span><b>function</b> (name, f) {
+</code><code id="L5925"><span class="ln">5925</span> <b>var</b> names<span class="s"> = </span>name.split(separator),
+</code><code id="L5926"><span class="ln">5926</span> e,
+</code><code id="L5927"><span class="ln">5927</span> key,
+</code><code id="L5928"><span class="ln">5928</span> splice,
+</code><code id="L5929"><span class="ln">5929</span> cur<span class="s"> = </span>[events];
+</code><code id="L5930"><span class="ln">5930</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>names.length; i < ii; i++) {
+</code><code id="L5931"><span class="ln">5931</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">0</span>; j < cur.length; j += splice.length<span class="s"> - </span><span class="d">2</span>) {
+</code><code id="L5932"><span class="ln">5932</span> splice<span class="s"> = </span>[j, <span class="d">1</span>];
+</code><code id="L5933"><span class="ln">5933</span> e<span class="s"> = </span>cur[j].n;
+</code><code id="L5934"><span class="ln">5934</span> <b>if</b> (names[i] != wildcard) {
+</code><code id="L5935"><span class="ln">5935</span> <b>if</b> (e[names[i]]) {
+</code><code id="L5936"><span class="ln">5936</span> splice.push(e[names[i]]);
+</code><code id="L5937"><span class="ln">5937</span> }
+</code><code id="L5938"><span class="ln">5938</span> } <b>else</b> {
+</code><code id="L5939"><span class="ln">5939</span> <b>for</b> (key <b>in</b> e) <b>if</b> (e[has](key)) {
+</code><code id="L5940"><span class="ln">5940</span> splice.push(e[key]);
+</code><code id="L5941"><span class="ln">5941</span> }
+</code><code id="L5942"><span class="ln">5942</span> }
+</code><code id="L5943"><span class="ln">5943</span> cur.splice.apply(cur, splice);
+</code><code id="L5944"><span class="ln">5944</span> }
+</code><code id="L5945"><span class="ln">5945</span> }
+</code><code id="L5946"><span class="ln">5946</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>cur.length; i < ii; i++) {
+</code><code id="L5947"><span class="ln">5947</span> e<span class="s"> = </span>cur[i];
+</code><code id="L5948"><span class="ln">5948</span> <b>while</b> (e.n) {
+</code><code id="L5949"><span class="ln">5949</span> <b>if</b> (f) {
+</code><code id="L5950"><span class="ln">5950</span> <b>if</b> (e.f) {
+</code><code id="L5951"><span class="ln">5951</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>e.f.length; i < ii; i++) <b>if</b> (e.f[i]<span class="s"> == </span>f) {
+</code><code id="L5952"><span class="ln">5952</span> e.f.splice(i, <span class="d">1</span>);
+</code><code id="L5953"><span class="ln">5953</span> <b>break</b>;
+</code><code id="L5954"><span class="ln">5954</span> }
+</code><code id="L5955"><span class="ln">5955</span> !e.f.length<span class="s"> && </span><b>delete</b> e.f;
+</code><code id="L5956"><span class="ln">5956</span> }
+</code><code id="L5957"><span class="ln">5957</span> <b>for</b> (key <b>in</b> e.n) <b>if</b> (e.n[has](key)<span class="s"> && </span>e.n[key].f) {
+</code><code id="L5958"><span class="ln">5958</span> <b>var</b> funcs<span class="s"> = </span>e.n[key].f;
+</code><code id="L5959"><span class="ln">5959</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>funcs.length; i < ii; i++) <b>if</b> (funcs[i]<span class="s"> == </span>f) {
+</code><code id="L5960"><span class="ln">5960</span> funcs.splice(i, <span class="d">1</span>);
+</code><code id="L5961"><span class="ln">5961</span> <b>break</b>;
+</code><code id="L5962"><span class="ln">5962</span> }
+</code><code id="L5963"><span class="ln">5963</span> !funcs.length<span class="s"> && </span><b>delete</b> e.n[key].f;
+</code><code id="L5964"><span class="ln">5964</span> }
+</code><code id="L5965"><span class="ln">5965</span> } <b>else</b> {
+</code><code id="L5966"><span class="ln">5966</span> <b>delete</b> e.f;
+</code><code id="L5967"><span class="ln">5967</span> <b>for</b> (key <b>in</b> e.n) <b>if</b> (e.n[has](key)<span class="s"> && </span>e.n[key].f) {
+</code><code id="L5968"><span class="ln">5968</span> <b>delete</b> e.n[key].f;
+</code><code id="L5969"><span class="ln">5969</span> }
+</code><code id="L5970"><span class="ln">5970</span> }
+</code><code id="L5971"><span class="ln">5971</span> e<span class="s"> = </span>e.n;
+</code><code id="L5972"><span class="ln">5972</span> }
+</code><code id="L5973"><span class="ln">5973</span> }
+</code><code id="L5974"><span class="ln">5974</span> <b>return</b> <b>true</b>;
+</code><code id="L5975"><span class="ln">5975</span> };
+</code><code id="L5976"><span class="ln">5976</span> eve.version<span class="s"> = </span>version;
+</code><code id="L5977"><span class="ln">5977</span> eve.toString<span class="s"> = </span><b>function</b> () {
+</code><code id="L5978"><span class="ln">5978</span> <b>return</b> <i>"You are running Eve "</i><span class="s"> + </span>version;
+</code><code id="L5979"><span class="ln">5979</span> };
+</code><code id="L5980"><span class="ln">5980</span> <b>return</b> eve;
+</code><code id="L5981"><span class="ln">5981</span> })();
+</code><code id="L5982"><span class="ln">5982</span>})();
</code></body></html>
\ No newline at end of file