n;n++)o[n]-=a[n];this.zoomX=1,this.zoomY=1,this.setBoundingBox(o,!0)}return this},removeObject:function(e){var t,n;if(JXG.isArray(e))for(n=0;e.length>n;n++)this.removeObject(e[n]);if(e=JXG.getReference(this,e),!JXG.exists(e))return this;try{for(t in e.childElements)e.childElements[t].board.removeObject(e.childElements[t]);for(t in this.objects)JXG.exists(this.objects[t].childElements)&&delete this.objects[t].childElements[e.id];delete this.objects[e.id],delete this.elementsByName[e.name],JXG.exists(e.remove)&&e.remove()}catch(i){JXG.debug(e.id+": Could not be removed, JS says:\n\n"+i)}return this},removeAncestors:function(e){for(var t in e.ancestors)this.removeAncestors(e.ancestors[t]);return this.removeObject(e),this},initGeonextBoard:function(){var e,t,n,i,r;return e=this.create("point",[0,0],{id:this.id+"g00e0",name:"Ursprung",withLabel:!1,visible:!1,fixed:!0}),t=this.create("point",[1,0],{id:this.id+"gX0e0",name:"Punkt_1_0",withLabel:!1,visible:!1,fixed:!0}),n=this.create("point",[0,1],{id:this.id+"gY0e0",name:"Punkt_0_1",withLabel:!1,visible:!1,fixed:!0}),i=this.create("line",[e,t],{id:this.id+"gXLe0",name:"X-Achse",withLabel:!1,visible:!1}),r=this.create("line",[e,n],{id:this.id+"gYLe0",name:"Y-Achse",withLabel:!1,visible:!1}),this},initInfobox:function(){return this.infobox=this.create("text",[0,0,"0,0"],{id:this.id+"_infobox",display:"html"}),this.infobox.distanceX=-20,this.infobox.distanceY=25,this.renderer.hide(this.infobox),this},resizeContainer:function(e,t){return this.canvasWidth=parseFloat(e),this.canvasHeight=parseFloat(t),this.containerObj.style.width=this.canvasWidth+"px",this.containerObj.style.height=this.canvasHeight+"px",this.renderer.resize(this.canvasWidth,this.canvasHeight),this},showDependencies:function(){var e,t,n,i,r;t="\n";for(e in this.objects){r=0;for(n in this.objects[e].childElements)r++;r>=0&&(t+=""+this.objects[e].id+": ");for(n in this.objects[e].childElements)t+=this.objects[e].childElements[n].id+"("+this.objects[e].childElements[n].name+"), ";t+="
\n"}return t+="
\n",i=window.open(),i.document.open(),i.document.write(t),i.document.close(),this},showXML:function(){var e=window.open("");return e.document.open(),e.document.write(""+JXG.escapeHTML(this.xmlString)+"
"),e.document.close(),this},prepareUpdate:function(){var e,t;for(e in this.objects)t=this.objects[e],(this.needsFullUpdate||t.needsRegularUpdate)&&(t.needsUpdate=!0);return this},updateElements:function(e){var t,n;e=JXG.getRef(this,e);for(t in this.objects)n=this.objects[t],null==e||n.id!=e.id?n.update(!0):n.update(!1);return this},updateRenderer:function(e){var t,n;if("canvas"==this.options.renderer)this.updateRendererCanvas(e);else for(t in this.objects)n=this.objects[t],n.updateRenderer();return this},updateRendererCanvas:function(){var e,t,n,i,r,o=this.options.layer,a=this.options.layer.numlayers,s=Number.NEGATIVE_INFINITY;for(n=0;a>n;n++){i=Number.POSITIVE_INFINITY;for(r in o)o[r]>s&&i>o[r]&&(i=o[r]);s=i;for(e in this.objects)t=this.objects[e],t.visProp.layer===i&&t.prepareUpdate().updateRenderer()}return this},addHook:function(e,t,n){return JXG.exists(t)||(t="update"),n=n||this,this.hooks.push({fn:e,mode:t,context:n}),"update"==t&&e.apply(n,[this]),this.hooks.length-1},removeHook:function(e){return this.hooks[e]=null,this},updateHooks:function(e){var t,n=arguments.length>1?Array.prototype.slice.call(arguments,1):[];for(JXG.exists(e)||(e="update"),t=0;this.hooks.length>t;t++)null!=this.hooks[t]&&this.hooks[t].mode==e&&this.hooks[t].fn.apply(this.hooks[t].context,n);return this},addChild:function(e){return this.dependentBoards.push(e),this.update(),this},removeChild:function(e){var t;for(t=this.dependentBoards.length-1;t>=0;t--)this.dependentBoards[t]==e&&this.dependentBoards.splice(t,1);return this},update:function(e){var t,n,i,r;if(this.isSuspendedUpdate)return this;for(this.prepareUpdate(e).updateElements(e).updateConditions(),this.renderer.suspendRedraw(this),this.updateRenderer(e),this.renderer.unsuspendRedraw(),this.updateHooks(),n=this.dependentBoards.length,t=0;n>t;t++)i=this.dependentBoards[t].id,r=JXG.JSXGraph.boards[i],r!=this&&(r.updateQuality=this.updateQuality,r.prepareUpdate().updateElements().updateConditions(),r.renderer.suspendRedraw(),r.updateRenderer(),r.renderer.unsuspendRedraw(),r.updateHooks());return this},fullUpdate:function(){return this.needsFullUpdate=!0,this.update(),this.needsFullUpdate=!1,this},addGrid:function(){return this.create("grid",[]),this},removeGrids:function(){var e;for(e=0;this.grids.length>e;e++)this.removeObject(this.grids[e]);return this.grids.length=0,this.update(),this},create:function(e,t,n){var i,r;for(e=e.toLowerCase(),JXG.exists(t)||(t=[]),JXG.exists(n)||(n={}),r=0;t.length>r;r++)("text"!=e||2!=r)&&(t[r]=JXG.getReference(this,t[r]));if(null==JXG.JSXGraph.elements[e])throw Error("JSXGraph: JXG.createElement: Unknown element type given: "+e);return i="function"==typeof JXG.JSXGraph.elements[e]?JXG.JSXGraph.elements[e](this,t,n):JXG.JSXGraph.elements[e].creator(this,t,n),JXG.exists(i)?(i.prepareUpdate&&i.update&&i.updateRenderer&&i.prepareUpdate().update().updateRenderer(),i):(JXG.debug("JSXGraph: JXG.createElement: failure creating "+e),i)},createElement:JXG.shortcut(JXG.Board.prototype,"create"),clearTraces:function(){var e;for(e in this.objects)this.objects[e].visProp.trace&&this.objects[e].clearTrace();return this.numTraces=0,this},suspendUpdate:function(){return this.isSuspendedUpdate=!0,this},unsuspendUpdate:function(){return this.isSuspendedUpdate=!1,this.update(),this},setBoundingBox:function(e,t){if(!JXG.isArray(e))return this;var n,i,r=JXG.getDimensions(this.container);return this.canvasWidth=parseInt(r.width),this.canvasHeight=parseInt(r.height),i=this.canvasWidth,n=this.canvasHeight,t?(this.unitX=i/(e[2]-e[0]),this.unitY=n/(e[1]-e[3]),this.unitXt;t++)e.push(arguments[t])},createRoulette:function(e,t,n,i,r,o,a){var s=this,l=function(){var l,c=0,u=0,d=0,h=n,p=JXG.Math.Numerics.root(function(n){var i=e.X(h),r=e.Y(h),o=t.X(n),a=t.Y(n);return(i-o)*(i-o)+(r-a)*(r-a)},[0,2*Math.PI]),f=0,g=0,m=s.create("transform",[function(){return c}],{type:"rotate"}),v=s.create("transform",[function(){return c},function(){return e.X(h)},function(){return e.Y(h)}],{type:"rotate"}),b=s.create("transform",[function(){return u},function(){return d}],{type:"translate"}),y=function(e,t,n){var i=JXG.Math.Numerics.D(e.X)(t),r=JXG.Math.Numerics.D(e.Y)(t),o=JXG.Math.Numerics.D(e.X)(n),a=JXG.Math.Numerics.D(e.Y)(n),s=JXG.Math.Numerics.D(e.X)(.5*(t+n)),l=JXG.Math.Numerics.D(e.Y)(.5*(t+n)),c=Math.sqrt(i*i+r*r),u=Math.sqrt(o*o+a*a),d=Math.sqrt(s*s+l*l);return(c+4*d+u)*(n-t)/6},x=function(e){return l-y(t,p,e)},w=Math.PI/18,k=9*w,C=null;return this.rolling=function(){f=h+r*i,l=y(e,h,f),g=JXG.Math.Numerics.root(x,p);var n=new JXG.Complex(e.X(f),e.Y(f)),o=new JXG.Complex(t.X(g),t.Y(g)),C=new JXG.Complex(JXG.Math.Numerics.D(e.X)(f),JXG.Math.Numerics.D(e.Y)(f)),_=new JXG.Complex(JXG.Math.Numerics.D(t.X)(g),JXG.Math.Numerics.D(t.Y)(g)),T=JXG.C.div(C,_);c=Math.atan2(T.imaginary,T.real),T.div(JXG.C.abs(T)),T.mult(o),u=n.real-T.real,d=n.imaginary-T.imaginary,-w>c&&c>-k?(c=-w,v.applyOnce(a)):c>w&&k>c?(c=w,v.applyOnce(a)):(m.applyOnce(a),b.applyOnce(a),h=f,p=g),s.update()},this.start=function(){return o>0&&(C=setInterval(this.rolling,o)),this},this.stop=function(){return clearInterval(C),this},this};return new l}}),JXG.Options={showCopyright:!0,showNavigation:!0,takeSizeFromFile:!1,renderer:"svg",takeFirst:!1,zoom:{factorX:1.25,factorY:1.25},navbar:{strokeColor:"#aaaaaa",fillColor:"#f5f5f5",padding:"2px",position:"absolute",fontSize:"10px",cursor:"pointer",zIndex:"100",right:"5px",bottom:"5px"},elements:{strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",fillColor:"red",highlightFillColor:"none",strokeOpacity:1,highlightStrokeOpacity:1,fillOpacity:1,highlightFillOpacity:1,strokeWidth:2,highlightStrokeWidth:2,fixed:!1,frozen:!1,withLabel:!1,visible:!0,layer:0,dash:0,shadow:!1,trace:!1,needsRegularUpdate:!0,draft:{draft:!1,strokeColor:"#565656",fillColor:"#565656",strokeOpacity:.8,fillOpacity:.8,strokeWidth:1}},ticks:{drawLabels:!1,drawZero:!1,insertTicks:!1,minTicksDistance:50,minorHeight:4,majorHeight:10,minorTicks:4,ticksDistance:1,strokeOpacity:1,strokeWidth:1,strokeColor:"black",highlightStrokeColor:"#888888"},precision:{touch:30,mouse:4,epsilon:1e-4,hasPoint:4},layer:{numlayers:20,text:9,point:9,arc:8,line:7,circle:6,curve:5,polygon:3,sector:3,angle:3,integral:3,axis:2,grid:1,image:0,trace:0},angle:{withLabel:!0,radius:1,fillColor:"#FF7F00",highlightFillColor:"#FF7F00",strokeColor:"#FF7F00",textColor:"#0000FF",fillOpacity:.3,highlightFillOpacity:.3,point:{withLabel:!1,visible:!1,name:""},dot:{visible:!1,strokeColor:"none",fillColor:"black",size:2,face:"o",withLabel:!1,name:""}},arc:{firstArrow:!1,lastArrow:!1,fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",useDirection:!1,center:{visible:!1,withLabel:!1,fixed:!1,name:""}},axis:{needsRegularUpdate:!1,strokeWidth:1,strokeColor:"#666666",highlightStrokeWidth:1,highlightStrokeColor:"#888888",withTicks:!0,straightFirst:!0,straightLast:!0,lastArrow:!0,withLabel:!1,ticks:{needsRegularUpdate:!1,strokeWidth:1,strokeColor:"#666666",highlightStrokeColor:"#888888",drawLabels:!0,drawZero:!0,insertTicks:!0,minTicksDistance:50,minorHeight:4,majorHeight:-1,minorTicks:4,ticksDistance:1,strokeOpacity:.25},point1:{needsRegularUpdate:!1},point2:{needsRegularUpdate:!1}},bisector:{strokeColor:"#000000",point:{visible:!1,fixed:!1,withLabel:!1,name:""}},bisectorlines:{line1:{strokeColor:"red"},line2:{strokeColor:"black"}},chart:{chartStyle:"line",colors:["#B02B2C","#3F4C6B","#C79810","#D15600","#FFFF88","#C3D9FF","#4096EE","#008C00"],highlightcolors:null,fillcolor:null,highlightonsector:!1,highlightbysize:!1},circle:{fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",center:{visible:!1,withLabel:!1,fixed:!1,name:""}},circumcircle:{fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",point:{visible:!1,fixed:!1,withLabel:!1,name:""}},circumcirclesector:{useDirection:!0,fillColor:"#00FF00",highlightFillColor:"#00FF00",fillOpacity:.3,highlightFillOpacity:.3,strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",point:{visible:!1,fixed:!1,withLabel:!1,name:""}},conic:{fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",foci:{fixed:!1,visible:!1,withLabel:!1,name:""}},curve:{strokeWidth:1,strokeColor:"#0000ff",fillColor:"none",curveType:null,RDPsmoothing:!1,numberPointsHigh:1600,numberPointsLow:400,doAdvancedPlot:!0},grid:{needsRegularUpdate:!1,hasGrid:!1,gridX:1,gridY:1,strokeColor:"#C0C0C0",strokeOpacity:"0.5",strokeWidth:1,dash:2,snapToGrid:!1,snapSizeX:2,snapSizeY:2},image:{imageString:null,fillOpacity:1},incircle:{fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",point:{visible:!1,fixed:!1,withLabel:!1,name:""}},integral:{withLabel:!0,strokeWidth:0,strokeOpacity:0,start:{visible:!0},startproject:{visible:!1,fixed:!1,withLabel:!1,name:""},end:{visible:!0},endproject:{visible:!1,fixed:!1,withLabel:!1,name:""},text:{fontSize:20}},legend:{style:"vertical",labels:["1","2","3","4","5","6","7","8"],colors:["#B02B2C","#3F4C6B","#C79810","#D15600","#FFFF88","#C3D9FF","#4096EE","#008C00"]},line:{firstArrow:!1,lastArrow:!1,straightFirst:!0,straightLast:!0,fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#888888",withTicks:!1,point1:{visible:!1,withLabel:!1,fixed:!1,name:""},point2:{visible:!1,withLabel:!1,fixed:!1,name:""},ticks:{drawLabels:!0,drawZero:!1,insertTicks:!1,minTicksDistance:50,maxTicksDistance:300,minorHeight:4,majorHeight:-1,minorTicks:4,defaultDistance:1,strokeOpacity:.3},labelOffsets:[10,10]},locus:{translateToOrigin:!1,translateTo10:!1,stretch:!1,toOrigin:null,to10:null},parallel:{strokeColor:"#000000",point:{visible:!1,fixed:!0,withLabel:!1,name:""}},perpendicular:{strokeColor:"#000000",straightFirst:!1,straightLast:!1,point:{visible:!1,fixed:!0,withLabel:!1,name:""}},point:{withLabel:!0,style:5,face:"o",size:3,fillColor:"#ff0000",highlightFillColor:"#EEEEEE",strokeWidth:2,strokeColor:"#ff0000",highlightStrokeColor:"#C3D9FF",zoom:!1,showInfobox:!0,draft:!1},polygon:{fillColor:"#00FF00",highlightFillColor:"#00FF00",fillOpacity:.3,highlightFillOpacity:.3,withLines:!0,lines:{withLabel:!1,strokeWidth:1,highlightStrokeWidth:1,layer:5},points:{withLabel:!0,strokeColor:"#ff0000",fillColor:"#ff0000",fixed:!0}},riemannsum:{withLabel:!1,fillOpacity:.3,fillColor:"#ffff00"},sector:{fillColor:"#00FF00",highlightFillColor:"#00FF00",fillOpacity:.3,highlightFillOpacity:.3},slider:{snapWidth:-1,precision:2,firstArrow:!1,lastArrow:!1,withTicks:!0,withLabel:!0,point1:{needsRegularUpdate:!1,showInfobox:!1,withLabel:!1,visible:!1,fixed:!0,name:""},point2:{needsRegularUpdate:!1,showInfobox:!1,withLabel:!1,visible:!1,fixed:!0,name:""},glider:{showInfobox:!1,name:"",withLabel:!1,visible:!0,strokeColor:"#000000",highlightStrokeColor:"#888888",fillColor:"#ffffff",highlightFillColor:"none",size:6},segment1:{needsRegularUpdate:!1,name:"",strokeWidth:1,strokeColor:"#000000",highlightStrokeColor:"#888888"},ticks:{needsRegularUpdate:!1,drawLabels:!1,drawZero:!0,insertTicks:!0,minorHeight:4,majorHeight:10,minorTicks:0,defaultDistance:1,strokeOpacity:1,strokeWidth:1,strokeColor:"#000000"},segment2:{strokeWidth:3,name:"",strokeColor:"#000000",highlightStrokeColor:"#888888"},text:{strokeColor:"#000000"}},text:{fontSize:12,digits:2,isLabel:!1,strokeColor:"#000000",useASCIIMathML:!1,useMathJax:!1,display:"html",withLabel:!1},shortcuts:{color:["strokeColor","fillColor"],opacity:["strokeOpacity","fillOpacity"],highlightColor:["highlightStrokeColor","highlightFillColor"],highlightOpacity:["highlightStrokeOpacity","highlightFillOpacity"],strokeWidth:["strokeWidth","highlightStrokeWidth"]}},JXG.Validator=function(){var e,t=function(e){return/^[0-9]+px$/.test(e)
},n=function(e){return e in{html:0,internal:0}},i=function(e){return JXG.isString(e)},r=function(e){return JXG.exists(JXG.Point.prototype.normalizeFace.call(this,e))},o=function(e){return Math.abs(e-Math.round(e))0},s=function(e){return e.length>=2&&o(e[0])&&o(e[1])},l=function(e){return e in{vml:0,svg:0,canvas:0}},c={},u={color:i,defaultDistance:JXG.isNumber,display:n,doAdvancedPlot:!1,draft:!1,drawLabels:!1,drawZero:!1,face:r,factor:JXG.isNumber,fillColor:i,fillOpacity:JXG.isNumber,firstArrow:!1,fontSize:o,dash:o,gridX:JXG.isNumber,gridY:JXG.isNumber,hasGrid:!1,highlightFillColor:i,highlightFillOpacity:JXG.isNumber,highlightStrokeColor:i,highlightStrokeOpacity:JXG.isNumber,insertTicks:!1,labelOffsets:s,lastArrow:!1,majorHeight:o,maxTicksDistance:a,minorHeight:o,minorTicks:a,minTicksDistance:a,numberPointsHigh:a,numberPointsLow:a,opacity:JXG.isNumber,radius:JXG.isNumber,RDPsmoothing:!1,renderer:l,right:t,showCopyright:!1,showInfobox:!1,showNavigation:!1,size:o,snapSizeX:JXG.isNumber,snapSizeY:JXG.isNumber,snapWidth:JXG.isNumber,snapToGrid:!1,straightFirst:!1,straightLast:!1,stretch:!1,strokeColor:i,strokeOpacity:JXG.isNumber,strokeWidth:o,takeFirst:!1,takeSizeFromFile:!1,textColor:i,to10:!1,toOrigin:!1,translateTo10:!1,translateToOrigin:!1,useASCIIMathML:!1,useDirection:!1,useMathJax:!1,withLabel:!1,withTicks:!1,zoom:!1};for(e in u)c[e.toLowerCase()]=u[e];return c}(),JXG.useStandardOptions=function(e){var t,n,i,r,o=JXG.Options,a=e.hasGrid;e.options.grid.hasGrid=o.grid.hasGrid,e.options.grid.gridX=o.grid.gridX,e.options.grid.gridY=o.grid.gridY,e.options.grid.gridColor=o.grid.gridColor,e.options.grid.gridOpacity=o.grid.gridOpacity,e.options.grid.gridDash=o.grid.gridDash,e.options.grid.snapToGrid=o.grid.snapToGrid,e.options.grid.snapSizeX=o.grid.SnapSizeX,e.options.grid.snapSizeY=o.grid.SnapSizeY,e.takeSizeFromFile=o.takeSizeFromFile,r=function(e,t){e.visProp.fillcolor=t.fillColor,e.visProp.highlightfillcolor=t.highlightFillColor,e.visProp.strokecolor=t.strokeColor,e.visProp.highlightstrokecolor=t.highlightStrokeColor};for(t in e.objects)if(i=e.objects[t],i.elementClass==JXG.OBJECT_CLASS_POINT)r(i,o.point);else if(i.elementClass==JXG.OBJECT_CLASS_LINE){r(i,o.line);for(n in i.ticks)n.majorTicks=o.line.ticks.majorTicks,n.minTicksDistance=o.line.ticks.minTicksDistance,n.visProp.minorheight=o.line.ticks.minorHeight,n.visProp.majorheight=o.line.ticks.majorHeight}else i.elementClass==JXG.OBJECT_CLASS_CIRCLE?r(i,o.circle):i.type==JXG.OBJECT_TYPE_ANGLE?r(i,o.angle):i.type==JXG.OBJECT_TYPE_ARC?r(i,o.arc):i.type==JXG.OBJECT_TYPE_POLYGON?r(i,o.polygon):i.type==JXG.OBJECT_TYPE_CONIC?r(i,o.conic):i.type==JXG.OBJECT_TYPE_CURVE?r(i,o.curve):i.type==JXG.OBJECT_TYPE_SECTOR&&(i.arc.visProp.fillcolor=o.sector.fillColor,i.arc.visProp.highlightfillcolor=o.sector.highlightFillColor,i.arc.visProp.fillopacity=o.sector.fillOpacity,i.arc.visProp.highlightfillopacity=o.sector.highlightFillOpacity);e.fullUpdate(),a&&!e.hasGrid?e.removeGrids(e):!a&&e.hasGrid&&e.create("grid",[])},JXG.useBlackWhiteOptions=function(e){var t=JXG.Options;t.point.fillColor=JXG.rgb2bw(t.point.fillColor),t.point.highlightFillColor=JXG.rgb2bw(t.point.highlightFillColor),t.point.strokeColor=JXG.rgb2bw(t.point.strokeColor),t.point.highlightStrokeColor=JXG.rgb2bw(t.point.highlightStrokeColor),t.line.fillColor=JXG.rgb2bw(t.line.fillColor),t.line.highlightFillColor=JXG.rgb2bw(t.line.highlightFillColor),t.line.strokeColor=JXG.rgb2bw(t.line.strokeColor),t.line.highlightStrokeColor=JXG.rgb2bw(t.line.highlightStrokeColor),t.circle.fillColor=JXG.rgb2bw(t.circle.fillColor),t.circle.highlightFillColor=JXG.rgb2bw(t.circle.highlightFillColor),t.circle.strokeColor=JXG.rgb2bw(t.circle.strokeColor),t.circle.highlightStrokeColor=JXG.rgb2bw(t.circle.highlightStrokeColor),t.arc.fillColor=JXG.rgb2bw(t.arc.fillColor),t.arc.highlightFillColor=JXG.rgb2bw(t.arc.highlightFillColor),t.arc.strokeColor=JXG.rgb2bw(t.arc.strokeColor),t.arc.highlightStrokeColor=JXG.rgb2bw(t.arc.highlightStrokeColor),t.polygon.fillColor=JXG.rgb2bw(t.polygon.fillColor),t.polygon.highlightFillColor=JXG.rgb2bw(t.polygon.highlightFillColor),t.sector.fillColor=JXG.rgb2bw(t.sector.fillColor),t.sector.highlightFillColor=JXG.rgb2bw(t.sector.highlightFillColor),t.curve.strokeColor=JXG.rgb2bw(t.curve.strokeColor),t.grid.gridColor=JXG.rgb2bw(t.grid.gridColor),JXG.useStandardOptions(e)},JXG.JSXGraph={licenseText:"JSXGraph v0.92 Copyright (C) see http://jsxgraph.org",boards:{},elements:{},rendererType:function(){function e(){document.body.scrollLeft,document.body.scrollTop}var t,n;for(JXG.supportsSVG()?JXG.Options.renderer="svg":JXG.supportsVML()?(JXG.Options.renderer="vml",document.onmousemove=e):JXG.Options.renderer="canvas",n=JXG.rendererFiles[JXG.Options.renderer].split(","),t=0;n.length>t;t++)(function(e){JXG.require(JXG.requirePath+e+".js")})(n[t]);return JXG.Options.renderer}(),initBoard:function(e,t){var n,i,r,o,a,s,l,c,u,d,h,p,f,g,m;return c=JXG.getDimensions(e),t===void 0&&(t={}),t.boundingbox!==void 0?(u=t.boundingbox,s=parseInt(c.width),l=parseInt(c.height),t.keepaspectratio?(o=s/(u[2]-u[0]),a=l/(-u[3]+u[1]),a>o?a=o:o=a):(o=s/(u[2]-u[0]),a=l/(-u[3]+u[1])),i=-o*u[0],r=a*u[1]):(i=t.originX===void 0?150:t.originX,r=t.originY===void 0?150:t.originY,o=t.unitX===void 0?50:t.unitX,a=t.unitY===void 0?50:t.unitY),d=t.zoom===void 0?1:t.zoom,h=d*(t.zoomX===void 0?1:t.zoomX),p=d*(t.zoomY===void 0?1:t.zoomY),f=t.showCopyright===void 0?JXG.Options.showCopyright:t.showCopyright,n="svg"==JXG.Options.renderer?new JXG.SVGRenderer(document.getElementById(e)):"vml"==JXG.Options.renderer?new JXG.VMLRenderer(document.getElementById(e)):"silverlight"==JXG.Options.renderer?new JXG.SilverlightRenderer(document.getElementById(e),c.width,c.height):new JXG.CanvasRenderer(document.getElementById(e)),m=new JXG.Board(e,n,"",[i,r],h,p,o,a,c.width,c.height,f),this.boards[m.id]=m,m.keepaspectratio=t.keepaspectratio,m.suspendUpdate(),m.initInfobox(),t.axis&&(m.defaultAxes={},m.defaultAxes.x=m.create("axis",[[0,0],[1,0]],{ticks:{drawZero:!0}}),m.defaultAxes.y=m.create("axis",[[0,0],[0,1]],{ticks:{drawZero:!1}})),t.grid&&m.create("grid",[]),t.shownavigation!==void 0&&(t.showNavigation=t.shownavigation),g=t.showNavigation===void 0?m.options.showNavigation:t.showNavigation,g&&m.renderer.drawZoomBar(m),m.unsuspendUpdate(),m},loadBoardFromFile:function(e,t,n){var i,r,o;return i="svg"==JXG.Options.renderer?new JXG.SVGRenderer(document.getElementById(e)):"vml"==JXG.Options.renderer?new JXG.VMLRenderer(document.getElementById(e)):"silverlight"==JXG.Options.renderer?new JXG.SilverlightRenderer(document.getElementById(e),o.width,o.height):new JXG.CanvasRenderer(document.getElementById(e)),o=JXG.getDimensions(e),r=new JXG.Board(e,i,"",[150,150],1,1,50,50,o.width,o.height),r.initInfobox(),JXG.FileReader.parseFileContent(t,r,n),r.options.showNavigation&&r.renderer.drawZoomBar(r),this.boards[r.id]=r,r},loadBoardFromString:function(e,t,n){var i,r,o;return i="svg"==JXG.Options.renderer?new JXG.SVGRenderer(document.getElementById(e)):"vml"==JXG.Options.renderer?new JXG.VMLRenderer(document.getElementById(e)):"silverlight"==JXG.Options.renderer?new JXG.SilverlightRenderer(document.getElementById(e),r.width,r.height):new JXG.CanvasRenderer(document.getElementById(e)),r=JXG.getDimensions(e),o=new JXG.Board(e,i,"",[150,150],1,1,50,50,r.width,r.height),o.initInfobox(),JXG.FileReader.parseString(t,o,n,!0),o.options.showNavigation&&o.renderer.drawZoomBar(o),this.boards[o.id]=o,o},freeBoard:function(e){var t,n;"string"==typeof e&&(e=this.boards[e]),e.removeEventHandlers();for(t in e.objects)e.removeObject(e.objects[t]);for(n=0;e.containerObj.childNodes.length>n;n++)e.containerObj.removeChild(e.containerObj.childNodes[n]);for(t in e.objects)delete e.objects[t];delete e.renderer,delete e.algebra,delete this.boards[e.id]},registerElement:function(e,t){if(e=e.toLowerCase(),this.elements[e]=t,JXG.Board.prototype["_"+e])throw Error("JSXGraph: Can't create wrapper method in JXG.Board because member '_"+e+"' already exists'");JXG.Board.prototype["_"+e]=function(t,n){return this.create(e,t,n)}},unregisterElement:function(e){delete this.elements[e.toLowerCase()],delete JXG.Board.prototype["_"+e.toLowerCase()]}},JXG.OBJECT_TYPE_ARC=1330921795,JXG.OBJECT_TYPE_ARROW=1330921815,JXG.OBJECT_TYPE_AXIS=1330921816,JXG.OBJECT_TYPE_AXISPOINT=83181904,JXG.OBJECT_TYPE_TICKS=1330926680,JXG.OBJECT_TYPE_CIRCLE=1330922316,JXG.OBJECT_TYPE_CONIC=1330922319,JXG.OBJECT_TYPE_CURVE=1330923344,JXG.OBJECT_TYPE_GLIDER=1330923340,JXG.OBJECT_TYPE_IMAGE=1330926157,JXG.OBJECT_TYPE_LINE=1330924622,JXG.OBJECT_TYPE_POINT=1330925652,JXG.OBJECT_TYPE_SLIDER=1330926404,JXG.OBJECT_TYPE_CAS=1330922320,JXG.OBJECT_TYPE_POLYGON=1330925657,JXG.OBJECT_TYPE_SECTOR=1330926403,JXG.OBJECT_TYPE_TEXT=1330926661,JXG.OBJECT_TYPE_ANGLE=1330921799,JXG.OBJECT_TYPE_INTERSECTION=1330926158,JXG.OBJECT_TYPE_TURTLE=5198933,JXG.OBJECT_TYPE_VECTOR=1330927188,JXG.OBJECT_CLASS_POINT=1,JXG.OBJECT_CLASS_LINE=2,JXG.OBJECT_CLASS_CIRCLE=3,JXG.OBJECT_CLASS_CURVE=4,JXG.OBJECT_CLASS_AREA=5,JXG.OBJECT_CLASS_OTHER=6,JXG.GeometryElement=function(e,t,n,i){var r,o;if(this.needsUpdate=!0,this.isDraggable=!1,this.isReal=!0,this.childElements={},this.hasLabel=!1,this.notExistingParents={},this.traces={},this.numTraces=0,this.transformations=[],this.baseElement=null,this.descendants={},this.ancestors={},this.symbolic={},this.stdform=[1,0,0,0,1,1,0,0],this.quadraticform=[[1,0,0],[0,1,0],[0,0,1]],arguments.length>0){this.board=e,this.type=n,this.elementClass=i||JXG.OBJECT_CLASS_OTHER,this.id=t.id,r=t.name,JXG.exists(r)||(r=this.board.generateName(this)),this.board.elementsByName[r]=this,this.name=r,this.needsRegularUpdate=t.needsregularupdate,this.visProp={},JXG.clearVisPropOld(this),t=this.resolveShortcuts(t);for(o in t)this._set(o,t[o]);this.visProp.draft=t.draft&&t.draft.draft,this.visProp.gradientangle="270",this.visProp.gradientsecondopacity=this.visProp.fillopacity,this.visProp.gradientpositionx=.5,this.visProp.gradientpositiony=.5}},JXG.extend(JXG.GeometryElement.prototype,{addChild:function(e){var t,n;this.childElements[e.id]=e,this.addDescendants(e),e.ancestors[this.id]=this;for(t in this.descendants){this.descendants[t].ancestors[this.id]=this;for(n in this.ancestors)this.descendants[t].ancestors[this.ancestors[n].id]=this.ancestors[n]}for(t in this.ancestors)for(n in this.descendants)this.ancestors[t].descendants[this.descendants[n].id]=this.descendants[n];return this},addDescendants:function(e){var t;this.descendants[e.id]=e;for(t in e.childElements)this.addDescendants(e.childElements[t]);return this},countChildren:function(){var e,t,n=0;t=this.childElements;for(e in t)t.hasOwnProperty(e)&&0>e.indexOf("Label")&&n++;return n},draggable:function(){return this.isDraggable&&!this.visProp.fixed&&!this.visProp.frozen&&this.type!=JXG.OBJECT_TYPE_GLIDER&&1>=this.countChildren()?!0:!1},generatePolynomial:function(){return[]},animate:function(e,t,n){n=n||{};var i,r,o,a=35,s=Math.ceil(t/(1*a)),l=this;this.animationData={};var c=function(e,t,n){var i,r,a,c,u;for(i=JXG.rgb2hsv(e),r=JXG.rgb2hsv(t),a=(r[0]-i[0])/(1*s),c=(r[1]-i[1])/(1*s),u=(r[2]-i[2])/(1*s),l.animationData[n]=Array(s),o=0;s>o;o++)l.animationData[n][s-o-1]=JXG.hsv2rgb(i[0]+(o+1)*a,i[1]+(o+1)*c,i[2]+(o+1)*u)},u=function(e,t,n){if(e=parseFloat(e),t=parseFloat(t),!isNaN(e)&&!isNaN(t)){var i=(t-e)/(1*s);for(l.animationData[n]=Array(s),o=0;s>o;o++)l.animationData[n][s-o-1]=e+(o+1)*i}};for(i in e)switch(r=i.toLowerCase()){case"strokecolor":case"fillcolor":c(this.visProp[r],e[i],r);break;case"strokeopacity":case"strokewidth":case"fillopacity":u(this.visProp[r],e[i],r)}return this.animationCallback=n.callback,this.board.addAnimation(this),this},update:function(){return this.visProp.trace&&this.cloneToBackground(!0),this},updateRenderer:function(){return this},hideElement:function(){return this.visProp.visible=!1,this.board.renderer.hide(this),null!=this.label&&this.hasLabel&&(this.label.hiddenByParent=!0,this.label.content.visProp.visible&&this.board.renderer.hide(this.label.content)),this},showElement:function(){return this.visProp.visible=!0,this.board.renderer.show(this),null!=this.label&&this.hasLabel&&this.label.hiddenByParent&&(this.label.hiddenByParent=!1,this.label.content.visProp.visible&&this.board.renderer.show(this.label.content)),this},_set:function(e,t){e=e.toLocaleLowerCase(),this.visProp.hasOwnProperty(e)&&e.indexOf("color")>=0&&JXG.isString(t)&&9==t.length&&"#"===t.charAt(0)?(t=JXG.rgba2rgbo(t),this.visProp[e]=t[0],this.visProp[e.replace("color","opacity")]=t[1]):this.visProp[e]=t},resolveShortcuts:function(e){var t,n;for(t in JXG.Options.shortcuts)if(JXG.exists(e[t]))for(n=0;JXG.Options.shortcuts[t].length>n;n++)JXG.exists(e[JXG.Options.shortcuts[t][n]])||(e[JXG.Options.shortcuts[t][n]]=e[t]);return e},setAttribute:JXG.shortcut(JXG.GeometryElement.prototype,"setProperty"),setProperty:function(){var e,t,n,i,r,o,a={};for(e=0;arguments.length>e;e++)i=arguments[e],JXG.isString(i)?(o=i.split(":"),a[JXG.trim(o[0])]=JXG.trim(o[1])):JXG.isArray(i)?a[i[0]]=i[1]:JXG.extend(a,i);a=this.resolveShortcuts(a);for(e in a)switch(t=e.replace(/\s+/g,"").toLowerCase(),n=a[e],t){case"name":delete this.board.elementsByName[this.name],this.name=n,this.board.elementsByName[this.name]=this;break;case"needsregularupdate":this.needsRegularUpdate=!("false"==n||0==n),this.board.renderer.setBuffering(this,this.needsRegularUpdate?"auto":"static");break;case"labelcolor":n=JXG.rgba2rgbo(n),r=n[1],n=n[0],0==r&&null!=this.label&&this.hasLabel&&this.label.content.hideElement(),null!=this.label&&this.hasLabel&&(this.label.color=n,this.board.renderer.setObjectStrokeColor(this.label.content,n,r)),this.type==JXG.OBJECT_TYPE_TEXT&&(this.visProp.strokecolor=n,this.visProp.strokeopacity=r,this.board.renderer.setObjectStrokeColor(this,this.visProp.strokecolor,this.visProp.strokeopacity));break;case"infoboxtext":this.infoboxText="string"==typeof n?n:!1;break;case"visible":"false"==n||0==n?(this.visProp.visible=!1,this.hideElement()):("true"==n||1==n)&&(this.visProp.visible=!0,this.showElement());break;case"face":this.elementClass==JXG.OBJECT_CLASS_POINT&&(this.visProp.face=n,this.board.renderer.changePointStyle(this));break;case"gradient":this.visProp.gradient=n,this.board.renderer.setGradient(this);break;case"gradientsecondcolor":n=JXG.rgba2rgbo(n),this.visProp.gradientsecondcolor=n[1],this.visProp.gradientsecondopacity=n[0],this.board.renderer.updateGradient(this);break;case"gradientsecondopacity":this.visProp.gradientsecondopacity=n,this.board.renderer.updateGradient(this);break;case"withlabel":this.visProp.withlabel=n,n?null!=this.label&&this.hasLabel?this.visProp.visible&&this.label.content.showElement():(this.createLabel(),this.visProp.visible||this.label.content.hideElement()):JXG.exists(this.label)&&this.hasLabel&&this.label.content.hideElement(),this.hasLabel=n;break;default:JXG.exists(this.visProp[t])&&(!JXG.Validator[t]||JXG.Validator[t]&&JXG.Validator[t](n))&&(n=n.toLowerCase&&"false"===n.toLowerCase()?!1:n,this._set(t,n))}return this.board.update(this),this},getAttribute:JXG.shortcut(JXG.GeometryElement.prototype,"getProperty"),getProperty:function(e){var t;switch(e=e.toLowerCase()){case"needsregularupdate":t=this.needsRegularUpdate;break;case"labelcolor":t=this.label.color;break;case"infoboxtext":t=this.infoboxText;break;case"withlabel":t=this.hasLabel;break;default:t=this.visProp[e]}return t},setDash:function(e){return this.setProperty({dash:e}),this},prepareUpdate:function(){return this.needsUpdate=!0,this},remove:function(){return this.board.renderer.remove(this.board.renderer.getElementById(this.id)),this.hasLabel&&this.board.renderer.remove(this.board.renderer.getElementById(this.label.content.id)),this},getTextAnchor:function(){return new JXG.Coords(JXG.COORDS_BY_USER,[0,0],this.board)},getLabelAnchor:function(){return new JXG.Coords(JXG.COORDS_BY_USER,[0,0],this.board)},setStraight:function(){return this},setArrow:function(e,t){return this.visProp.firstarrow=e,this.visProp.lastarrow=t,this.prepareUpdate().update(),this},createGradient:function(){("linear"===this.visProp.gradient||"radial"===this.visProp.gradient)&&this.board.renderer.setGradient(this)},createLabel:function(e){return JXG.exists(e)||(e=[10,10]),this.nameHTML=JXG.GeonextParser.replaceSup(JXG.GeonextParser.replaceSub(this.name)),this.label={},this.visProp.withlabel&&(this.label.relativeCoords=e,this.label.content=JXG.createText(this.board,[this.label.relativeCoords[0],-this.label.relativeCoords[1],this.nameHTML],{anchor:this,id:this.id+"Label",isLabel:!0,visible:this.visProp.visible,strokeColor:this.visProp.labelcolor||this.board.options.text.strokeColor}),this.label.color=this.label.content.visProp.strokecolor,this.visProp.visible||(this.label.hiddenByParent=!0,this.label.content.visProp.visible=!1),this.hasLabel=!0),this},highlight:function(){return this.board.renderer.highlight(this),this},noHighlight:function(){return this.board.renderer.noHighlight(this),this},clearTrace:function(){var e;for(e in this.traces)this.board.renderer.remove(this.traces[e]);return this.numTraces=0,this},cloneToBackground:function(){return this},bounds:function(){},normalize:function(){return this.stdform=JXG.Math.normalize(this.stdform),this},toJSON:function(){var e='{"name":'+this.name;e+=', "id":'+this.id;var t=[];for(var n in this.visProp)null!=this.visProp[n]&&t.push('"'+n+'":'+this.visProp[n]);return e+=', "visProp":{'+(""+t)+"}",e+="}"},highlightStrokeColor:function(e){return this.setProperty({highlightStrokeColor:e}),this},strokeColor:function(e){return this.setProperty({strokeColor:e}),this},strokeWidth:function(e){return this.setProperty({strokeWidth:e}),this},fillColor:function(e){return this.setProperty({fillColor:e}),this},highlightFillColor:function(e){return this.setProperty({highlightFillColor:e}),this},labelColor:function(e){return this.setProperty({labelColor:e}),this},dash:function(e){return this.setProperty({dash:e}),this},visible:function(e){return this.setProperty({visible:e}),this},shadow:function(e){return this.setProperty({shadow:e}),this}}),JXG.clearVisPropOld=function(e){e.visPropOld={strokecolor:"",strokeopacity:"",strokewidth:"",fillcolor:"",fillopacity:"",shadow:!1,firstarrow:!1,lastarrow:!1}},JXG.COORDS_BY_USER=1,JXG.COORDS_BY_SCREEN=2,JXG.Coords=function(e,t,n){this.board=n,this.usrCoords=[],this.scrCoords=[],this.setCoordinates(e,t)},JXG.extend(JXG.Coords.prototype,{normalizeUsrCoords:function(){var e=JXG.Math.eps;Math.abs(this.usrCoords[0])>e&&(this.usrCoords[1]/=this.usrCoords[0],this.usrCoords[2]/=this.usrCoords[0],this.usrCoords[0]=1)},usr2screen:function(e){var t=Math.round,n=this.board,i=this.usrCoords,r=n.origin.scrCoords;null===e||e?(this.scrCoords[0]=t(i[0]),this.scrCoords[1]=t(i[0]*r[1]+i[1]*n.unitX),this.scrCoords[2]=t(i[0]*r[2]-i[2]*n.unitY)):(this.scrCoords[0]=i[0],this.scrCoords[1]=i[0]*r[1]+i[1]*n.unitX,this.scrCoords[2]=i[0]*r[2]-i[2]*n.unitY)},screen2usr:function(){var e=this.board.origin.scrCoords,t=this.scrCoords,n=this.board;this.usrCoords[0]=1,this.usrCoords[1]=(t[1]-e[1])/n.unitX,this.usrCoords[2]=(e[2]-t[2])/n.unitY},distance:function(e,t){var n,i,r=0,o=this.usrCoords,a=this.scrCoords;return e===JXG.COORDS_BY_USER?(n=t.usrCoords,i=o[0]-n[0],r=i*i,i=o[1]-n[1],r+=i*i,i=o[2]-n[2],r+=i*i):(n=t.scrCoords,i=a[0]-n[0],r=i*i,i=a[1]-n[1],r+=i*i,i=a[2]-n[2],r+=i*i),Math.sqrt(r)},setCoordinates:function(e,t,n){var i=this.usrCoords,r=this.scrCoords;e===JXG.COORDS_BY_USER?(2===t.length?(i[0]=1,i[1]=t[0],i[2]=t[1]):(i[0]=t[0],i[1]=t[1],i[2]=t[2],this.normalizeUsrCoords()),this.usr2screen(n)):(r[1]=t[0],r[2]=t[1],this.screen2usr())}}),JXG.Point=function(e,t,n){this.constructor(e,n,JXG.OBJECT_TYPE_POINT,JXG.OBJECT_CLASS_POINT),null==t&&(t=[0,0]),this.coords=new JXG.Coords(JXG.COORDS_BY_USER,t,this.board),this.initialCoords=new JXG.Coords(JXG.COORDS_BY_USER,t,this.board),this.position=null,this.onPolygon=!1,this.slideObject=null,this.group=[],this.id=this.board.setId(this,"P"),this.board.renderer.drawPoint(this),this.board.finalizeAdding(this),this.createLabel()},JXG.Point.prototype=new JXG.GeometryElement,JXG.extend(JXG.Point.prototype,{hasPoint:function(e,t){var n,i=this.coords.scrCoords;return n=parseFloat(this.visProp.size),this.board.options.precision.hasPoint>n&&(n=this.board.options.precision.hasPoint),n+2>Math.abs(i[1]-e)&&n+2>Math.abs(i[2]-t)},updateConstraint:function(){return this},update:function(e){var t,n,i,r,o,a,s,l,c,u,d,h,p,f;if(!this.needsUpdate)return this;if(e===void 0&&(e=!1),this.visProp.trace&&this.cloneToBackground(!0),this.type==JXG.OBJECT_TYPE_GLIDER)if(this.slideObject.elementClass==JXG.OBJECT_CLASS_CIRCLE)e?(this.coords.setCoordinates(JXG.COORDS_BY_USER,[this.slideObject.midpoint.X()+Math.cos(this.position),this.slideObject.midpoint.Y()+Math.sin(this.position)]),this.coords=JXG.Math.Geometry.projectPointToCircle(this,this.slideObject,this.board)):(this.coords=JXG.Math.Geometry.projectPointToCircle(this,this.slideObject,this.board),this.position=JXG.Math.Geometry.rad([this.slideObject.midpoint.X()+1,this.slideObject.midpoint.Y()],this.slideObject.midpoint,this));else if(this.slideObject.elementClass==JXG.OBJECT_CLASS_LINE){if(this.coords=JXG.Math.Geometry.projectPointToLine(this,this.slideObject,this.board),n=this.slideObject.point1.coords,i=this.slideObject.point2.coords,e?Math.abs(n.usrCoords[0])>=JXG.Math.eps&&Math.abs(i.usrCoords[0])>=JXG.Math.eps&&this.coords.setCoordinates(JXG.COORDS_BY_USER,[n.usrCoords[1]+this.position*(i.usrCoords[1]-n.usrCoords[1]),n.usrCoords[2]+this.position*(i.usrCoords[2]-n.usrCoords[2])]):(r=1,o=n.distance(JXG.COORDS_BY_USER,this.coords),a=n.distance(JXG.COORDS_BY_USER,i),s=i.distance(JXG.COORDS_BY_USER,this.coords),(o>a||s>a)&&s>o&&(r=-1),this.position=r*o/a,this.visProp.snapwidth>0&&Math.abs(this._smax-this._smin)>=JXG.Math.eps&&(0>this.position&&(this.position=0),this.position>1&&(this.position=1),l=this.position*(this._smax-this._smin)+this._smin,l=Math.round(l/this.visProp.snapwidth)*this.visProp.snapwidth,this.position=(l-this._smin)/(this._smax-this._smin),this.update(!0))),c=this.slideObject.point1.coords.scrCoords,u=this.slideObject.point2.coords.scrCoords,t=0==this.slideObject.getSlope()?1:2,d=this.coords.scrCoords[t],this.slideObject.visProp.straightfirst||(c[t]d&&(this.coords=this.slideObject.point1.coords,this.position=0):c[t]>u[t]&&d>c[t]&&(this.coords=this.slideObject.point1.coords,this.position=0)),this.slideObject.visProp.straightlast||(c[t]u[t]&&(this.coords=this.slideObject.point2.coords,this.position=1):c[t]>u[t]&&u[t]>d&&(this.coords=this.slideObject.point2.coords,this.position=1)),this.onPolygon)if(h=this.slideObject.point1.coords,p=this.slideObject.point2.coords,Math.abs(this.coords.scrCoords[1]-h.scrCoords[1])t;t++)if(this.slideObject==f.borders[t]){this.slideObject=f.borders[(t-1+f.borders.length)%f.borders.length];break}}else if(Math.abs(this.coords.scrCoords[1]-p.scrCoords[1])t;t++)if(this.slideObject==f.borders[t]){this.slideObject=f.borders[(t+1+f.borders.length)%f.borders.length];break}}else this.slideObject.type==JXG.OBJECT_TYPE_TURTLE?(this.updateConstraint(),this.coords=JXG.Math.Geometry.projectPointToTurtle(this,this.slideObject,this.board)):this.slideObject.elementClass==JXG.OBJECT_CLASS_CURVE&&(this.updateConstraint(),this.coords=JXG.Math.Geometry.projectPointToCurve(this,this.slideObject,this.board));return this.type==JXG.OBJECT_TYPE_CAS&&this.updateConstraint(),this.updateTransform(),this},updateRenderer:function(){if(!this.needsUpdate)return this;if(this.visProp.visible){var e=this.isReal;this.isReal=!isNaN(this.coords.usrCoords[1]+this.coords.usrCoords[2]),this.isReal=Math.abs(this.coords.usrCoords[0])>JXG.Math.eps?this.isReal:!1,this.isReal?(e!=this.isReal&&(this.board.renderer.show(this),this.hasLabel&&this.label.content.visProp.visible&&this.board.renderer.show(this.label.content)),this.board.renderer.updatePoint(this)):e!=this.isReal&&(this.board.renderer.hide(this),this.hasLabel&&this.label.content.visProp.visible&&this.board.renderer.hide(this.label.content))}return this.hasLabel&&this.visProp.visible&&this.label.content&&this.label.content.visProp.visible&&this.isReal&&(this.label.content.update(),this.board.renderer.updateText(this.label.content)),this.needsUpdate=!1,this},X:function(){return this.coords.usrCoords[1]},Y:function(){return this.coords.usrCoords[2]},Z:function(){return this.coords.usrCoords[0]},XEval:function(){return this.coords.usrCoords[1]},YEval:function(){return this.coords.usrCoords[2]},ZEval:function(){return this.coords.usrCoords[0]},bounds:function(){return this.coords.usrCoords.slice(1).concat(this.coords.usrCoords.slice(1))},Dist:function(e){var t,n,i=e.coords.usrCoords,r=this.coords.usrCoords;return n=r[0]-i[0],t=n*n,n=r[1]-i[1],t+=n*n,n=r[2]-i[2],t+=n*n,Math.sqrt(t)},setPositionDirectly:function(e,t,n){var i,r,o,a,s,l,c=this.coords;if(this.coords=new JXG.Coords(e,[t,n],this.board),0!=this.group.length){for(r=this.coords.usrCoords[1]-c.usrCoords[1],o=this.coords.usrCoords[2]-c.usrCoords[2],i=0;this.group.length>i;i++)for(a in this.group[i].objects)s=this.group[i].objects[a],s.initialCoords=new JXG.Coords(JXG.COORDS_BY_USER,[s.initialCoords.usrCoords[1]+r,s.initialCoords.usrCoords[2]+o],this.board);this.group[this.group.length-1].dX=this.coords.scrCoords[1]-c.scrCoords[1],this.group[this.group.length-1].dY=this.coords.scrCoords[2]-c.scrCoords[2],this.group[this.group.length-1].update(this)}else{for(i=this.transformations.length-1;i>=0;i--)l=e==JXG.COORDS_BY_SCREEN?new JXG.Coords(e,[t,n],this.board).usrCoords:[1,t,n],this.initialCoords=new JXG.Coords(JXG.COORDS_BY_USER,JXG.Math.matVecMult(JXG.Math.inverse(this.transformations[i].matrix),l),this.board);this.update()}return this},setPositionByTransform:function(e,t,n){var i=this.board.create("transform",[t,n],{type:"translate"});return this.transformations.length>0&&this.transformations[this.transformations.length-1].isNumericMatrix?this.transformations[this.transformations.length-1].melt(i):this.addTransform(this,i),0==this.group.length&&this.update(),this},setPosition:function(e,t,n){return this.setPositionDirectly(e,t,n),this},makeGlider:function(e){return this.slideObject=JXG.getReference(this.board,e),this.type=JXG.OBJECT_TYPE_GLIDER,this.visProp.snapwidth=-1,this.slideObject.addChild(this),this.isDraggable=!0,this.generatePolynomial=function(){return this.slideObject.generatePolynomial(this)},this},addConstraint:function(e){this.type=JXG.OBJECT_TYPE_CAS,this.board.elementsByName;var t,n=[];this.isDraggable=!1;for(var i=0;e.length>i;i++){var r=e[i];if("string"==typeof r){var o=JXG.GeonextParser.geonext2JS(r,this.board);n[i]=Function("","return "+o+";")}else"function"==typeof r?n[i]=r:"number"==typeof r?n[i]=function(e){return function(){return e}}(r):"object"==typeof r&&"function"==typeof r.Value&&(n[i]=function(e){return function(){return e.Value()}}(r))}return 1==e.length?this.updateConstraint=function(){var e=n[0]();JXG.isArray(e)?this.coords.setCoordinates(JXG.COORDS_BY_USER,e):this.coords=e}:2==e.length?(this.XEval=n[0],this.YEval=n[1],t="this.coords.setCoordinates(JXG.COORDS_BY_USER,[this.XEval(),this.YEval()]);",this.updateConstraint=Function("",t)):(this.ZEval=n[0],this.XEval=n[1],this.YEval=n[2],t="this.coords.setCoordinates(JXG.COORDS_BY_USER,[this.ZEval(),this.XEval(),this.YEval()]);",this.updateConstraint=Function("",t)),this},updateTransform:function(){if(0!=this.transformations.length&&null!=this.baseElement){var e,t;for(e=this===this.baseElement?this.transformations[0].apply(this.baseElement,"self"):this.transformations[0].apply(this.baseElement),this.coords.setCoordinates(JXG.COORDS_BY_USER,e),t=1;this.transformations.length>t;t++)this.coords.setCoordinates(JXG.COORDS_BY_USER,this.transformations[t].apply(this));return this}},addTransform:function(e,t){var n,i,r;for(0==this.transformations.length&&(this.baseElement=e),n=JXG.isArray(t)?t:[t],r=n.length,i=0;r>i;i++)this.transformations.push(n[i]);return this},startAnimation:function(e,t){return this.type==JXG.OBJECT_TYPE_GLIDER&&this.intervalCode===void 0&&(this.intervalCode=window.setInterval("JXG.JSXGraph.boards['"+this.board.id+"'].objects['"+this.id+"']._anim("+e+", "+t+")",250),this.intervalCount===void 0&&(this.intervalCount=0)),this},stopAnimation:function(){return this.intervalCode!==void 0&&(window.clearInterval(this.intervalCode),delete this.intervalCode),this},moveAlong:function(e,t,n){n=n||{};var i,r,o=[],a=35,s=function(t,n){return function(){return e[t][n]}},l=[],c=t/a;if(JXG.isArray(e)){for(i=0;e.length>i;i++)l[i]=JXG.isPoint(e[i])?e[i]:{elementClass:JXG.OBJECT_CLASS_POINT,X:s(i,0),Y:s(i,1)};if(t=t||0,0===t)return this.setPosition(JXG.COORDS_BY_USER,l[l.length-1].X(),l[l.length-1].Y()),this.board.update(this);for(r=JXG.Math.Numerics.Neville(l),i=0;c>i;i++)o[i]=[],o[i][0]=r[0]((c-i)/c*r[3]()),o[i][1]=r[1]((c-i)/c*r[3]());this.animationPath=o}else JXG.isFunction(e)&&(this.animationPath=e,this.animationStart=(new Date).getTime());return this.animationCallback=n.callback,this.board.addAnimation(this),this},moveTo:function(e,t,n){if(t===void 0||0==t)return this.setPosition(JXG.COORDS_BY_USER,e[0],e[1]),this.board.update(this);n=n||{};var i,r=35,o=Math.ceil(t/(1*r)),a=Array(o+1),s=this.coords.usrCoords[1],l=this.coords.usrCoords[2],c=e[0]-s,u=e[1]-l,d=function(e){return n.effect&&"<>"==n.effect?Math.pow(Math.sin(e/(1*o)*Math.PI/2),2):e/o};if(Math.abs(c)=0;i--)a[o-i]=[s+c*d(i),l+u*d(i)];return this.animationPath=a,this.animationCallback=n.callback,this.board.addAnimation(this),this},visit:function(e,t,n){"number"==typeof n?n={repeat:n}:(n=n||{},n.repeat===void 0&&(n.repeat=1));var i,r,o=35,a=Math.ceil(t/(1*o)),s=Array(repeat*(a+1)),l=this.coords.usrCoords[1],c=this.coords.usrCoords[2],u=e[0]-l,d=e[1]-c,h=function(e){return n.effect&&"<>"==n.effect?Math.pow(Math.sin(e/(1*a)*Math.PI/2),2):e/a};for(r=0;n.repeat>r;r++)for(i=a;i>=0;i--)s[r*(a+1)+a-i]=[l+u*h(i),c+d*h(i)];return this.animationPath=s,this.animationCallback=n.callback,this.board.addAnimation(this),this},_anim:function(e,t){var n,i,r,o,a,s,l,c,u=1;return this.intervalCount++,this.intervalCount>t&&(this.intervalCount=0),this.slideObject.elementClass==JXG.OBJECT_CLASS_LINE?(n=this.slideObject.point1.coords.distance(JXG.COORDS_BY_SCREEN,this.slideObject.point2.coords),i=this.slideObject.getSlope(),"INF"!=i?(a=Math.atan(i),r=Math.round(this.intervalCount/t*n*Math.cos(a)),o=Math.round(this.intervalCount/t*n*Math.sin(a))):(r=0,o=Math.round(this.intervalCount/t*n)),0>e?(s=this.slideObject.point2,this.slideObject.point2.coords.scrCoords[1]-this.slideObject.point1.coords.scrCoords[1]>0?u=-1:0==this.slideObject.point2.coords.scrCoords[1]-this.slideObject.point1.coords.scrCoords[1]&&this.slideObject.point2.coords.scrCoords[2]-this.slideObject.point1.coords.scrCoords[2]>0&&(u=-1)):(s=this.slideObject.point1,this.slideObject.point1.coords.scrCoords[1]-this.slideObject.point2.coords.scrCoords[1]>0?u=-1:0==this.slideObject.point1.coords.scrCoords[1]-this.slideObject.point2.coords.scrCoords[1]&&this.slideObject.point1.coords.scrCoords[2]-this.slideObject.point2.coords.scrCoords[2]>0&&(u=-1)),this.coords.setCoordinates(JXG.COORDS_BY_SCREEN,[s.coords.scrCoords[1]+u*r,s.coords.scrCoords[2]+u*o])):this.slideObject.elementClass==JXG.OBJECT_CLASS_CURVE?(l=e>0?Math.round(this.intervalCount/t*this.board.canvasWidth):Math.round((t-this.intervalCount)/t*this.board.canvasWidth),this.coords.setCoordinates(JXG.COORDS_BY_SCREEN,[l,0]),this.coords=JXG.Math.Geometry.projectPointToCurve(this,this.slideObject,this.board)):this.slideObject.elementClass==JXG.OBJECT_CLASS_CIRCLE&&(a=0>e?2*(this.intervalCount/t)*Math.PI:2*((t-this.intervalCount)/t)*Math.PI,c=this.slideObject.Radius(),this.coords.setCoordinates(JXG.COORDS_BY_USER,[this.slideObject.midpoint.coords.usrCoords[1]+c*Math.cos(a),this.slideObject.midpoint.coords.usrCoords[2]+c*Math.sin(a)])),this.board.update(this),this
},setStyle:function(e){var t=["cross","cross","cross","circle","circle","circle","circle","square","square","square","plus","plus","plus"],n=[2,3,4,1,2,3,4,2,3,4,2,3,4];return this.visProp.face=t[e],this.visProp.size=n[e],this.board.renderer.changePointStyle(this),this},normalizeFace:function(e){var t={cross:"x",x:"x",circle:"o",o:"o",square:"[]","[]":"[]",plus:"+","+":"+",diamond:"<>","<>":"<>",triangleup:"^",a:"^","^":"^",triangledown:"v",v:"v",triangleleft:"<","<":"<",triangleright:">",">":">"};return t[e]},remove:function(){this.hasLabel&&this.board.renderer.remove(this.board.renderer.getElementById(this.label.content.id)),this.board.renderer.remove(this.board.renderer.getElementById(this.id))},getTextAnchor:function(){return this.coords},getLabelAnchor:function(){return this.coords},face:function(e){this.setProperty({face:e})},size:function(e){this.setProperty({size:e})},cloneToBackground:function(){var e={};return e.id=this.id+"T"+this.numTraces,this.numTraces++,e.coords=this.coords,e.visProp=this.visProp,e.visProp.layer=this.board.options.layer.trace,e.elementClass=JXG.OBJECT_CLASS_POINT,e.board=this.board,JXG.clearVisPropOld(e),this.board.renderer.drawPoint(e),this.traces[e.id]=e.rendNode,this}}),JXG.createPoint=function(e,t,n){var i,r,o,a=!1;for(o=JXG.copyAttributes(n,e.options,"point"),r=0;t.length>r;r++)("function"==typeof t[r]||"string"==typeof t[r])&&(a=!0);if(a)i=new JXG.Point(e,[0/0,0/0],o),i.addConstraint(t);else if(JXG.isNumber(t[0])&&JXG.isNumber(t[1]))i=new JXG.Point(e,t,o),JXG.exists(o.slideobject)?i.makeGlider(o.slideobject):i.baseElement=i,i.isDraggable=!0;else{if("object"!=typeof t[0]||"object"!=typeof t[1])throw Error("JSXGraph: Can't create point with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [x,y], [z,x,y], [point,transformation]");i=new JXG.Point(e,[0,0],o),i.addTransform(t[0],t[1]),i.isDraggable=!1}return i},JXG.createGlider=function(e,t,n){var i,r=JXG.copyAttributes(n,e.options,"point");return i=1===t.length?e.create("point",[0,0],r):e.create("point",t.slice(0,2),r),i.makeGlider(t[t.length-1]),i},JXG.createIntersectionPoint=function(e,t,n){var i;return t.length>=3&&(3==t.length&&t.push(null),i=e.create("point",[e.intersection(t[0],t[1],t[2],t[3])],n)),t[0].addChild(i),t[1].addChild(i),i.generatePolynomial=function(){var e=t[0].generatePolynomial(i),n=t[1].generatePolynomial(i);return 0==e.length||0==n.length?[]:[e[0],n[0]]},i},JXG.createOtherIntersectionPoint=function(e,t,n){var i;if(3!=t.length||!JXG.isPoint(t[2])||t[0].elementClass!=JXG.OBJECT_CLASS_LINE&&t[0].elementClass!=JXG.OBJECT_CLASS_CIRCLE||t[1].elementClass!=JXG.OBJECT_CLASS_LINE&&t[1].elementClass!=JXG.OBJECT_CLASS_CIRCLE)throw Error("JSXGraph: Can't create 'other intersection point' with parent types '"+typeof t[0]+"', '"+typeof t[1]+"'and '"+typeof t[2]+"'.\nPossible parent types: [circle|line,circle|line,point]");return i=e.create("point",[e.otherIntersection(t[0],t[1],t[2])],n),t[0].addChild(i),t[1].addChild(i),i.generatePolynomial=function(){var e=t[0].generatePolynomial(i),n=t[1].generatePolynomial(i);return 0==e.length||0==n.length?[]:[e[0],n[0]]},i},JXG.JSXGraph.registerElement("point",JXG.createPoint),JXG.JSXGraph.registerElement("glider",JXG.createGlider),JXG.JSXGraph.registerElement("intersection",JXG.createIntersectionPoint),JXG.JSXGraph.registerElement("otherintersection",JXG.createOtherIntersectionPoint),JXG.Line=function(e,t,n,i){this.constructor(e,i,JXG.OBJECT_TYPE_LINE,JXG.OBJECT_CLASS_LINE),this.point1=JXG.getReference(this.board,t),this.point2=JXG.getReference(this.board,n),this.ticks=[],this.defaultTicks=null,this.parentPolygon=null,this.labelOffsets=[].concat(i.labeloffsets),this.labelOffsets[0]=Math.abs(this.labelOffsets[0]),this.labelOffsets[1]=Math.abs(this.labelOffsets[1]),this.id=this.board.setId(this,"L"),this.board.renderer.drawLine(this),this.board.finalizeAdding(this),this.createLabel(),this.point1.addChild(this),this.point2.addChild(this),this.updateStdform()},JXG.Line.prototype=new JXG.GeometryElement,JXG.extend(JXG.Line.prototype,{hasPoint:function(e,t){var n,i,r,o,a,s,l=[],c=[1,e,t],u=[];l[0]=this.stdform[0]-this.stdform[1]*this.board.origin.scrCoords[1]/this.board.unitX+this.stdform[2]*this.board.origin.scrCoords[2]/this.board.unitY,l[1]=this.stdform[1]/this.board.unitX,l[2]=this.stdform[2]/-this.board.unitY;var u=[0,l[1],l[2]];if(u=JXG.Math.crossProduct(u,c),u=JXG.Math.crossProduct(u,l),u[1]/=u[0],u[2]/=u[0],u[0]=1,n=(c[0]-u[0])*(c[0]-u[0])+(c[1]-u[1])*(c[1]-u[1])+(c[2]-u[2])*(c[2]-u[2]),isNaN(n)||n>this.board.options.precision.hasPoint*this.board.options.precision.hasPoint)return!1;if(this.visProp.straightfirst&&this.visProp.straightlast)return!0;if(i=this.point1.coords.scrCoords,r=this.point2.coords.scrCoords,s=(r[1]-i[1])*(r[1]-i[1])+(r[2]-i[2])*(r[2]-i[2]),o=(u[1]-i[1])*(u[1]-i[1])+(u[2]-i[2])*(u[2]-i[2]),a=(u[1]-r[1])*(u[1]-r[1])+(u[2]-r[2])*(u[2]-r[2]),o>s||a>s)if(a>o){if(!this.visProp.straightfirst)return!1}else if(!this.visProp.straightlast)return!1;return!0},update:function(){var e;return this.needsUpdate&&(this.constrained&&(this.funps!==void 0?(e=this.funps(),this.point1=e[0],this.point2=e[1]):(this.point1=this.funp1(),this.point2=this.funp2())),this.updateStdform(),this.visProp.trace&&this.cloneToBackground(!0)),this},updateStdform:function(){var e=JXG.Math.crossProduct(this.point1.coords.usrCoords,this.point2.coords.usrCoords);this.stdform[0]=e[0],this.stdform[1]=e[1],this.stdform[2]=e[2],this.stdform[3]=0,this.normalize()},updateRenderer:function(){var e;return this.needsUpdate&&this.visProp.visible&&(e=this.isReal,this.isReal=!isNaN(this.point1.coords.usrCoords[1]+this.point1.coords.usrCoords[2]+this.point2.coords.usrCoords[1]+this.point2.coords.usrCoords[2])&&JXG.Math.innerProduct(this.stdform,this.stdform,3)>=JXG.Math.eps*JXG.Math.eps,this.isReal?(e!=this.isReal&&(this.board.renderer.show(this),this.hasLabel&&this.label.content.visProp.visible&&this.board.renderer.show(this.label.content)),this.board.renderer.updateLine(this)):e!=this.isReal&&(this.board.renderer.hide(this),this.hasLabel&&this.label.content.visProp.visible&&this.board.renderer.hide(this.label.content)),this.needsUpdate=!1),this.hasLabel&&this.label.content.visProp.visible&&this.isReal&&(this.label.content.update(),this.board.renderer.updateText(this.label.content)),this},generatePolynomial:function(e){var t=this.point1.symbolic.x,n=this.point1.symbolic.y,i=this.point2.symbolic.x,r=this.point2.symbolic.y,o=e.symbolic.x,a=e.symbolic.y;return[["(",n,")*(",o,")-(",n,")*(",i,")+(",a,")*(",i,")-(",t,")*(",a,")+(",t,")*(",r,")-(",o,")*(",r,")"].join("")]},getRise:function(){return Math.abs(this.stdform[2])>=JXG.Math.eps?-this.stdform[0]/this.stdform[2]:1/0},getSlope:function(){return Math.abs(this.stdform[2])>=JXG.Math.eps?-this.stdform[1]/this.stdform[2]:1/0},getAngle:function(){var e=Math.atan2(this.point2.Y()-this.point1.Y(),this.point2.X()-this.point1.X());return e},setStraight:function(e,t){return this.visProp.straightfirst=e,this.visProp.straightlast=t,this.board.renderer.updateLine(this),this},getTextAnchor:function(){return new JXG.Coords(JXG.COORDS_BY_USER,[.5*(this.point2.X()+this.point1.X()),.5*(this.point2.Y()+this.point1.Y())],this.board)},setLabelRelativeCoords:function(e){JXG.exists(this.label.content)&&(this.label.content.relativeCoords=new JXG.Coords(JXG.COORDS_BY_SCREEN,[e[0],-e[1]],this.board))},getLabelAnchor:function(){var e,t,n,i,r,o=this.labelOffsets[0],a=this.labelOffsets[1];return this.visProp.straightfirst||this.visProp.straightlast?(t=new JXG.Coords(JXG.COORDS_BY_USER,this.point1.coords.usrCoords,this.board),n=new JXG.Coords(JXG.COORDS_BY_USER,this.point2.coords.usrCoords,this.board),JXG.Math.Geometry.calcStraight(this,t,n),e=this.visProp.straightfirst&&this.type!=JXG.OBJECT_TYPE_AXIS?t:n,null!=this.label.content&&(i=[0,0],r=this.getSlope(),0==e.scrCoords[2]?i=1/0==r?[o,-a]:r>=0?[o,-a]:[-o,-a]:e.scrCoords[2]==this.board.canvasHeight&&(i=1/0==r?[o,a]:r>=0?[-o,a]:[o,a]),0==e.scrCoords[1]?i=1/0==r?[o,a]:r>=0?[o,-a]:[o,a]:e.scrCoords[1]==this.board.canvasWidth&&(i=1/0==r?[-o,a]:r>=0?[-o,a]:[-o,-a]),this.setLabelRelativeCoords(i)),e):(this.setLabelRelativeCoords(this.labelOffsets),new JXG.Coords(JXG.COORDS_BY_USER,[this.point2.X()-.5*(this.point2.X()-this.point1.X()),this.point2.Y()-.5*(this.point2.Y()-this.point1.Y())],this.board))},cloneToBackground:function(){var e,t,n,i={};i.id=this.id+"T"+this.numTraces,i.elementClass=JXG.OBJECT_CLASS_LINE,this.numTraces++,i.point1=this.point1,i.point2=this.point2,i.stdform=this.stdform,i.board=this.board,i.visProp=this.visProp,i.visProp.layer=this.board.options.layer.trace,JXG.clearVisPropOld(i),t=this.getSlope(),e=this.getRise(),i.getSlope=function(){return t},i.getRise=function(){return e},n=this.board.renderer.enhancedRendering,this.board.renderer.enhancedRendering=!0,this.board.renderer.drawLine(i),this.board.renderer.enhancedRendering=n,this.traces[i.id]=i.rendNode,delete i},addTransform:function(e){var t,n;for(t=JXG.isArray(e)?e:[e],n=0;t.length>n;n++)this.point1.transformations.push(t[n]),this.point2.transformations.push(t[n])},setPosition:function(e,t,n){var i=this.board.create("transform",[t,n],{type:"translate"});this.point1.transformations.length>0&&this.point1.transformations[this.point1.transformations.length-1].isNumericMatrix?this.point1.transformations[this.point1.transformations.length-1].melt(i):this.point1.addTransform(this.point1,i),this.point2.transformations.length>0&&this.point2.transformations[this.point2.transformations.length-1].isNumericMatrix?this.point2.transformations[this.point2.transformations.length-1].melt(i):this.point2.addTransform(this.point2,i)},setPositionDirectly:function(e,t,n,i,r){var o,a,s,l=t-i,c=n-r;return this.point1.draggable()&&this.point2.draggable()?(s=this.point1.coords,e==JXG.COORDS_BY_SCREEN?(o=s.scrCoords[1]+l,a=s.scrCoords[2]+c):(o=s.usrCoords[1]+l,a=s.usrCoords[2]+c),this.point1.setPositionDirectly(e,o,a),s=this.point2.coords,e==JXG.COORDS_BY_SCREEN?(o=s.scrCoords[1]+l,a=s.scrCoords[2]+c):(o=s.usrCoords[1]+l,a=s.usrCoords[2]+c),this.point2.setPositionDirectly(e,o,a),this.update(),this):this},X:function(e){var t,n,i,r,o,a=this.stdform[1],s=this.stdform[2],l=this.stdform[0];return e*=Math.PI,t=a*Math.cos(e)+s*Math.sin(e),n=l,i=Math.sqrt(t*t+n*n),r=-n/i,o=t/i,Math.abs(o)=JXG.Math.eps?1:0},L:function(){return this.point1.Dist(this.point2)},minX:function(){return 0},maxX:function(){return 1},bounds:function(){var e=this.point1.coords.usrCoords,t=this.point2.coords.usrCoords;return[Math.min(e[1],t[1]),Math.max(e[2],t[2]),Math.max(e[1],t[1]),Math.min(e[2],t[2])]},addTicks:function(e){return(""==e.id||e.id===void 0)&&(e.id=this.id+"_ticks_"+(this.ticks.length+1)),this.board.renderer.drawTicks(e),this.ticks.push(e),e.id},removeAllTicks:function(){var e;for(e=this.ticks.length;e>0;e--)this.removeTicks(this.ticks[e-1]);this.ticks=[],this.board.update()},removeTicks:function(e){var t,n;for(null!=this.defaultTicks&&this.defaultTicks==e&&(this.defaultTicks=null),t=this.ticks.length;t>0;t--)if(this.ticks[t-1]==e){for(this.board.removeObject(this.ticks[t-1]),n=0;this.ticks[t-1].ticks.length>n;n++)null!=this.ticks[t-1].labels[n]&&this.board.removeObject(this.ticks[t-1].labels[n]);delete this.ticks[t-1];break}}}),JXG.createLine=function(e,t,n){var i,r,o,a,s,l,c=[],u=!1;if(2==t.length){if(JXG.isArray(t[0])&&t[0].length>1)s=JXG.copyAttributes(n,e.options,"line","point1"),r=e.create("point",t[0],s);else if(JXG.isString(t[0])||t[0].elementClass==JXG.OBJECT_CLASS_POINT)r=JXG.getReference(e,t[0]);else{if("function"!=typeof t[0]||t[0]().elementClass!=JXG.OBJECT_CLASS_POINT)throw Error("JSXGraph: Can't create line with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point], [[x1,y1],[x2,y2]], [a,b,c]");r=t[0](),u=!0}if(JXG.isArray(t[1])&&t[1].length>1)s=JXG.copyAttributes(n,e.options,"line","point2"),o=e.create("point",t[1],s);else if(JXG.isString(t[1])||t[1].elementClass==JXG.OBJECT_CLASS_POINT)o=JXG.getReference(e,t[1]);else{if("function"!=typeof t[1]||t[1]().elementClass!=JXG.OBJECT_CLASS_POINT)throw Error("JSXGraph: Can't create line with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point], [[x1,y1],[x2,y2]], [a,b,c]");o=t[1](),u=!0}s=JXG.copyAttributes(n,e.options,"line"),i=new JXG.Line(e,r,o,s),u?(i.constrained=!0,i.funp1=t[0],i.funp2=t[1]):i.isDraggable=!0}else if(3==t.length){for(l=!0,a=0;3>a;a++)if("number"==typeof t[a])c[a]=function(e){return function(){return e}}(t[a]);else{if("function"!=typeof t[a])throw Error("JSXGraph: Can't create line with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point], [[x1,y1],[x2,y2]], [a,b,c]");c[a]=t[a],l=!1}s=JXG.copyAttributes(n,e.options,"line","point1"),r=l?e.create("point",[c[2]()*c[2]()+c[1]()*c[1](),c[2]()-c[1]()*c[0]()+c[2](),-c[1]()-c[2]()*c[0]()-c[1]()],s):e.create("point",[function(){return.5*(0+c[2]()*c[2]()+c[1]()*c[1]())},function(){return.5*(c[2]()-c[1]()*c[0]()+c[2]())},function(){return.5*(-c[1]()-c[2]()*c[0]()-c[1]())}],s),s=JXG.copyAttributes(n,e.options,"line","point2"),o=l?e.create("point",[c[2]()*c[2]()+c[1]()*c[1](),-c[1]()*c[0]()+c[2](),-c[2]()*c[0]()-c[1]()],s):e.create("point",[function(){return c[2]()*c[2]()+c[1]()*c[1]()},function(){return-c[1]()*c[0]()+c[2]()},function(){return-c[2]()*c[0]()-c[1]()}],s),r.prepareUpdate().update(),o.prepareUpdate().update(),s=JXG.copyAttributes(n,e.options,"line"),i=new JXG.Line(e,r,o,s),i.isDraggable=l}else{if(1!=t.length||"function"!=typeof t[0]||2!=t[0]().length||t[0]()[0].elementClass!=JXG.OBJECT_CLASS_POINT||t[0]()[1].elementClass!=JXG.OBJECT_CLASS_POINT)throw Error("JSXGraph: Can't create line with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point], [[x1,y1],[x2,y2]], [a,b,c]");var d=t[0]();s=JXG.copyAttributes(n,e.options,"line"),i=new JXG.Line(e,d[0],d[1],s),i.constrained=!0,i.funps=t[0]}return i},JXG.JSXGraph.registerElement("line",JXG.createLine),JXG.createSegment=function(e,t,n){return n.straightFirst=!1,n.straightLast=!1,e.create("line",t,n)},JXG.JSXGraph.registerElement("segment",JXG.createSegment),JXG.createArrow=function(e,t,n){var i;return i=e.create("line",t,n).setStraight(!1,!1),i.setArrow(!1,!0),i.type=JXG.OBJECT_TYPE_VECTOR,i},JXG.JSXGraph.registerElement("arrow",JXG.createArrow),JXG.createAxis=function(e,t,n){var i,r,o;if(!JXG.isArray(t[0])&&!JXG.isPoint(t[0])||!JXG.isArray(t[1])&&!JXG.isPoint(t[1]))throw Error("JSXGraph: Can't create point with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point], [[x1,y1],[x2,y2]]");i=JXG.copyAttributes(n,e.options,"axis"),r=e.create("line",t,i),r.type=JXG.OBJECT_TYPE_AXIS;for(var a in r.ancestors)r.ancestors[a].type=JXG.OBJECT_TYPE_AXISPOINT;return i=JXG.copyAttributes(n,e.options,"axis","ticks"),o=JXG.exists(i.ticksdistance)?i.ticksdistance:JXG.isArray(i.ticks)?i.ticks:1,r.defaultTicks=e.create("ticks",[r,o],i),r},JXG.JSXGraph.registerElement("axis",JXG.createAxis),JXG.createTangent=function(e,t,n){var i,r,o,a,s,l,c,u;if(1==t.length)i=t[0],r=i.slideObject;else{if(2!=t.length)throw Error("JSXGraph: Can't create tangent with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [glider], [point,line|curve|circle|conic]");if(JXG.isPoint(t[0]))i=t[0],r=t[1];else{if(!JXG.isPoint(t[1]))throw Error("JSXGraph: Can't create tangent with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [glider], [point,line|curve|circle|conic]");r=t[0],i=t[1]}}return r.elementClass==JXG.OBJECT_CLASS_LINE?u=e.create("line",[r.point1,r.point2],n):r.elementClass==JXG.OBJECT_CLASS_CURVE&&r.type!=JXG.OBJECT_TYPE_CONIC?"plot"!=r.visProp.curvetype?(o=r.X,a=r.Y,u=e.create("line",[function(){return-i.X()*e.D(a)(i.position)+i.Y()*e.D(o)(i.position)},function(){return e.D(a)(i.position)},function(){return-e.D(o)(i.position)}],n),i.addChild(u),u.glider=i):(u=e.create("line",[function(){return s=Math.floor(i.position),s==r.numberPoints-1&&s--,0>s?1:r.Y(s)*r.X(s+1)-r.X(s)*r.Y(s+1)},function(){return s=Math.floor(i.position),s==r.numberPoints-1&&s--,0>s?0:r.Y(s+1)-r.Y(s)},function(){return s=Math.floor(i.position),s==r.numberPoints-1&&s--,0>s?0:r.X(s)-r.X(s+1)}],n),i.addChild(u),u.glider=i):r.type==JXG.OBJECT_TYPE_TURTLE?(u=e.create("line",[function(){for(s=Math.floor(i.position),l=0;r.objects.length>l;l++)if(c=r.objects[l],c.type==JXG.OBJECT_TYPE_CURVE){if(c.numberPoints>s)break;s-=c.numberPoints}return s==c.numberPoints-1&&s--,0>s?1:c.Y(s)*c.X(s+1)-c.X(s)*c.Y(s+1)},function(){for(s=Math.floor(i.position),l=0;r.objects.length>l;l++)if(c=r.objects[l],c.type==JXG.OBJECT_TYPE_CURVE){if(c.numberPoints>s)break;s-=c.numberPoints}return s==c.numberPoints-1&&s--,0>s?0:c.Y(s+1)-c.Y(s)},function(){for(s=Math.floor(i.position),l=0;r.objects.length>l;l++)if(c=r.objects[l],c.type==JXG.OBJECT_TYPE_CURVE){if(c.numberPoints>s)break;s-=c.numberPoints}return s==c.numberPoints-1&&s--,0>s?0:c.X(s)-c.X(s+1)}],n),i.addChild(u),u.glider=i):(r.elementClass==JXG.OBJECT_CLASS_CIRCLE||r.type==JXG.OBJECT_TYPE_CONIC)&&(u=e.create("line",[function(){return JXG.Math.matVecMult(r.quadraticform,i.coords.usrCoords)[0]},function(){return JXG.Math.matVecMult(r.quadraticform,i.coords.usrCoords)[1]},function(){return JXG.Math.matVecMult(r.quadraticform,i.coords.usrCoords)[2]}],n),i.addChild(u),u.glider=i),u},JXG.JSXGraph.registerElement("tangent",JXG.createTangent),JXG.JSXGraph.registerElement("polar",JXG.createTangent),JXG.Group=function(e,t,n){var i,r,o,a,s;if(this.board=e,this.objects={},i=this.board.numObjects,this.board.numObjects++,this.id=""!=t&&JXG.exists(t)?t:this.board.id+"Group"+i,this.board.groups[this.id]=this,this.type=JXG.OBJECT_TYPE_POINT,this.elementClass=JXG.OBJECT_CLASS_POINT,this.name=""!=n&&JXG.exists(n)?n:"group_"+this.board.generateName(this),delete this.type,4==arguments.length&&JXG.isArray(arguments[3]))r=arguments[3];else for(r=[],o=3;arguments.length>o;o++)r.push(arguments[o]);for(o=0;r.length>o;o++)a=JXG.getReference(this.board,r[o]),a.visProp.fixed||a.type!=JXG.OBJECT_TYPE_POINT&&a.type!=JXG.OBJECT_TYPE_GLIDER||(0!=a.group.length?this.addGroup(a.group[a.group.length-1]):this.addPoint(a));for(s in this.objects)this.objects[s].group.push(this);this.dX=0,this.dY=0},JXG.extend(JXG.Group.prototype,{ungroup:function(){var e;for(e in this.objects)this.objects[e].group[this.objects[e].group.length-1]==this&&this.objects[e].group.pop(),delete this.objects[e]},update:function(e){var t,n=null;for(t in this.objects)n=this.objects[t],n.id!=e.id&&(n.coords=new JXG.Coords(JXG.COORDS_BY_SCREEN,[n.coords.scrCoords[1]+this.dX,n.coords.scrCoords[2]+this.dY],n.board));for(t in this.objects)JXG.exists(this.board.objects[t])?this.objects[t].update(!1):delete this.objects[t];return this},addPoint:function(e){this.objects[e.id]=e},addPoints:function(e){var t;for(t in e)this.objects[t.id]=t},addGroup:function(e){var t;for(t in e.objects)this.addPoint(e.objects[t])}}),JXG.createGroup=function(e,t,n){return new JXG.Group(e,n.id,n.name,t)},JXG.JSXGraph.registerElement("group",JXG.createGroup),JXG.Circle=function(e,t,n,i,r){this.constructor(e,r,JXG.OBJECT_TYPE_CIRCLE,JXG.OBJECT_CLASS_CIRCLE),this.method=t,this.midpoint=JXG.getReference(this.board,n),this.point2=null,this.radius=0,this.line=null,this.circle=null,"twoPoints"==t?(this.point2=JXG.getReference(e,i),this.radius=this.Radius()):"pointRadius"==t?(this.generateTerm(i),this.updateRadius()):"pointLine"==t?(this.line=JXG.getReference(e,i),this.radius=this.line.point1.coords.distance(JXG.COORDS_BY_USER,this.line.point2.coords)):"pointCircle"==t&&(this.circle=JXG.getReference(e,i),this.radius=this.circle.Radius()),this.id=this.board.setId(this,"C"),this.board.renderer.drawEllipse(this),this.board.finalizeAdding(this),this.createGradient(),this.createLabel(),this.midpoint.addChild(this),"pointRadius"==t?this.notifyParents(i):"pointLine"==t?this.line.addChild(this):"pointCircle"==t?this.circle.addChild(this):"twoPoints"==t&&this.point2.addChild(this)},JXG.Circle.prototype=new JXG.GeometryElement,JXG.extend(JXG.Circle.prototype,{hasPoint:function(e,t){var n=this.board.options.precision.hasPoint/this.board.unitX,i=this.midpoint.coords.usrCoords,r=new JXG.Coords(JXG.COORDS_BY_SCREEN,[e,t],this.board),o=this.Radius(),a=Math.sqrt((i[1]-r.usrCoords[1])*(i[1]-r.usrCoords[1])+(i[2]-r.usrCoords[2])*(i[2]-r.usrCoords[2]));return n>Math.abs(a-o)},generatePolynomial:function(e){var t=this.midpoint.symbolic.x,n=this.midpoint.symbolic.y,i=e.symbolic.x,r=e.symbolic.y,o=this.generateRadiusSquared();if(""==o)return[];var a="(("+i+")-("+t+"))^2 + (("+r+")-("+n+"))^2 - ("+o+")";return[a]},generateRadiusSquared:function(){var e="";if("twoPoints"==this.method){var t=this.midpoint.symbolic.x,n=this.midpoint.symbolic.y,i=this.point2.symbolic.x,r=this.point2.symbolic.y;e="(("+i+")-("+t+"))^2 + (("+r+")-("+n+"))^2"}else if("pointRadius"==this.method)"number"==typeof this.radius&&(e=""+this.radius*this.radius);else if("pointLine"==this.method){var i=this.line.point1.symbolic.x,r=this.line.point1.symbolic.y,o=this.line.point2.symbolic.x,a=this.line.point2.symbolic.y;e="(("+i+")-("+o+"))^2 + (("+r+")-("+a+"))^2"}else"pointCircle"==this.method&&(e=this.circle.Radius());return e},update:function(){return this.needsUpdate&&(this.visProp.trace&&this.cloneToBackground(!0),"pointLine"==this.method?this.radius=this.line.point1.coords.distance(JXG.COORDS_BY_USER,this.line.point2.coords):"pointCircle"==this.method?this.radius=this.circle.Radius():"pointRadius"==this.method&&(this.radius=this.updateRadius()),this.updateStdform(),this.updateQuadraticform()),this},updateQuadraticform:function(){var e=this.midpoint,t=e.X(),n=e.Y(),i=this.Radius();this.quadraticform=[[t*t+n*n-i*i,-t,-n],[-t,1,0],[-n,0,1]]},updateStdform:function(){this.stdform[3]=.5,this.stdform[4]=this.Radius(),this.stdform[1]=-this.midpoint.coords.usrCoords[1],this.stdform[2]=-this.midpoint.coords.usrCoords[2],this.normalize()},updateRenderer:function(){if(this.needsUpdate&&this.visProp.visible){var e=this.isReal;this.isReal=isNaN(this.midpoint.coords.usrCoords[1]+this.midpoint.coords.usrCoords[2]+this.Radius())?!1:!0,this.isReal?(e!=this.isReal&&(this.board.renderer.show(this),this.hasLabel&&this.label.content.visProp.visible&&this.board.renderer.show(this.label.content)),this.board.renderer.updateEllipse(this)):e!=this.isReal&&(this.board.renderer.hide(this),this.hasLabel&&this.label.content.visProp.visible&&this.board.renderer.hide(this.label.content)),this.needsUpdate=!1}this.hasLabel&&this.label.content.visProp.visible&&this.isReal&&(this.label.content.update(),this.board.renderer.updateText(this.label.content))},generateTerm:function(e){if("string"==typeof e){this.board.elementsByName;var t=JXG.GeonextParser.geonext2JS(e+"",this.board);this.updateRadius=Function("return "+t+";")}else this.updateRadius="number"==typeof e?function(){return e}:e},notifyParents:function(e){this.board.elementsByName,"string"==typeof e&&JXG.GeonextParser.findDependencies(this,e+"",this.board)},Radius:function(){return"twoPoints"==this.method?Math.sqrt(Math.pow(this.midpoint.coords.usrCoords[1]-this.point2.coords.usrCoords[1],2)+Math.pow(this.midpoint.coords.usrCoords[2]-this.point2.coords.usrCoords[2],2)):"pointLine"==this.method||"pointCircle"==this.method?this.radius:"pointRadius"==this.method?this.updateRadius():void 0},getRadius:function(){return this.Radius()},getTextAnchor:function(){return this.midpoint.coords},getLabelAnchor:function(){if("twoPoints"==this.method){var e=this.midpoint.coords.usrCoords[1]-this.point2.coords.usrCoords[1],t=this.midpoint.coords.usrCoords[2]-this.point2.coords.usrCoords[2];return new JXG.Coords(JXG.COORDS_BY_USER,[this.midpoint.coords.usrCoords[1]+e,this.midpoint.coords.usrCoords[2]+t],this.board)}return"pointLine"==this.method||"pointCircle"==this.method||"pointRadius"==this.method?new JXG.Coords(JXG.COORDS_BY_USER,[this.midpoint.coords.usrCoords[1]-this.Radius(),this.midpoint.coords.usrCoords[2]],this.board):void 0},cloneToBackground:function(){var e,t,n={};n.id=this.id+"T"+this.numTraces,n.elementClass=JXG.OBJECT_CLASS_CIRCLE,this.numTraces++,n.midpoint={},n.midpoint.coords=this.midpoint.coords,e=this.Radius(),n.Radius=function(){return e},n.getRadius=function(){return e},n.board=this.board,n.visProp=this.visProp,n.visProp.layer=this.board.options.layer.trace,JXG.clearVisPropOld(n),t=this.board.renderer.enhancedRendering,this.board.renderer.enhancedRendering=!0,this.board.renderer.drawEllipse(n),this.board.renderer.enhancedRendering=t,this.traces[n.id]=n.rendNode},addTransform:function(e){var t;t=JXG.isArray(e)?e:[e];for(var n=0;t.length>n;n++)this.midpoint.transformations.push(t[n]),"twoPoints"==this.method&&this.point2.transformations.push(t[n])},setPosition:function(e,t,n){var i=this.board.create("transform",[t,n],{type:"translate"});return this.addTransform(i),this},setPositionDirectly:function(e,t,n,i,r){var o,a,s=t-i,l=n-r;return this.midpoint.draggable()?"twoPoints"!=this.method||this.point2.draggable()?(e==JXG.COORDS_BY_SCREEN?(o=this.midpoint.coords.scrCoords[1]+s,a=this.midpoint.coords.scrCoords[2]+l):(o=this.midpoint.coords.usrCoords[1]+s,a=this.midpoint.coords.usrCoords[2]+l),this.midpoint.setPositionDirectly(e,o,a),"twoPoints"==this.method&&(e==JXG.COORDS_BY_SCREEN?(o=this.point2.coords.scrCoords[1]+s,a=this.point2.coords.scrCoords[2]+l):(o=this.point2.coords.usrCoords[1]+s,a=this.point2.coords.usrCoords[2]+l),this.point2.setPositionDirectly(e,o,a)),this.update(),this):this:this},X:function(e){return e*=2*Math.PI,this.Radius()*Math.cos(e)+this.midpoint.coords.usrCoords[1]},Y:function(e){return e*=2*Math.PI,this.Radius()*Math.sin(e)+this.midpoint.coords.usrCoords[2]},minX:function(){return 0},maxX:function(){return 1},Area:function(){var e=this.Radius();return e*e*Math.PI},bounds:function(){var e=this.midpoint.coords.usrCoords,t=this.Radius();return[e[1]-t,e[2]+t,e[1]+t,e[2]-t]}}),JXG.createCircle=function(e,t,n){var i,r,o,a,s=!0;for(r=[],o=0;t.length>o;o++)JXG.isPoint(t[o])?r[o]=t[o]:t[o].length>1?(a=JXG.copyAttributes(n,e.options,"circle","center"),r[o]=e.create("point",t[o],a)):r[o]=t[o];if(a=JXG.copyAttributes(n,e.options,"circle"),2==t.length&&JXG.isPoint(r[0])&&JXG.isPoint(r[1]))i=new JXG.Circle(e,"twoPoints",r[0],r[1],a);else if((JXG.isNumber(r[0])||JXG.isFunction(r[0])||JXG.isString(r[0]))&&JXG.isPoint(r[1]))i=new JXG.Circle(e,"pointRadius",r[1],r[0],a);else if((JXG.isNumber(r[1])||JXG.isFunction(r[1])||JXG.isString(r[1]))&&JXG.isPoint(r[0]))i=new JXG.Circle(e,"pointRadius",r[0],r[1],a);else if(r[0].elementClass==JXG.OBJECT_CLASS_CIRCLE&&JXG.isPoint(r[1]))i=new JXG.Circle(e,"pointCircle",r[1],r[0],a);else if(r[1].elementClass==JXG.OBJECT_CLASS_CIRCLE&&JXG.isPoint(r[0]))i=new JXG.Circle(e,"pointCircle",r[0],r[1],a);else if(r[0].elementClass==JXG.OBJECT_CLASS_LINE&&JXG.isPoint(r[1]))i=new JXG.Circle(e,"pointLine",r[1],r[0],a);else if(r[1].elementClass==JXG.OBJECT_CLASS_LINE&&JXG.isPoint(r[0]))i=new JXG.Circle(e,"pointLine",r[0],r[1],a);else{if(!(3==t.length&&JXG.isPoint(r[0])&&JXG.isPoint(r[1])&&JXG.isPoint(r[2])))throw Error("JSXGraph: Can't create circle with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point], [point,number], [point,function], [point,circle], [point,point,point]");i=JXG.createCircumcircle(e,r,n),i.midpoint.setProperty({visible:!1}),s=!1}return i.isDraggable=s,i},JXG.JSXGraph.registerElement("circle",JXG.createCircle),JXG.createEllipse=function(e,t,n){var i,r,o,a,s=[],l=JXG.copyAttributes(n,e.options,"conic","foci"),c=JXG.copyAttributes(n,e.options,"conic");for(o=0;2>o;o++)if(t[o].length>1)s[o]=e.create("point",t[o],l);else if(JXG.isPoint(t[o]))s[o]=JXG.getReference(e,t[o]);else if("function"==typeof t[o]&&t[o]().elementClass===JXG.OBJECT_CLASS_POINT)s[o]=t[o]();else{if(!JXG.isString(t[o]))throw Error("JSXGraph: Can't create Ellipse with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point,point], [point,point,number|function]");s[o]=JXG.getReference(e,t[o])}if(JXG.isNumber(t[2]))r=JXG.createFunction(t[2],e);else if("function"==typeof t[2]&&JXG.isNumber(t[2]()))r=t[2];else{if(JXG.isPoint(t[2]))i=JXG.getReference(e,t[2]);else if(t[2].length>1)i=e.create("point",t[2],l);else if("function"==typeof t[2]&&t[2]().elementClass==JXG.OBJECT_CLASS_POINT)i=t[2]();else{if(!JXG.isString(t[2]))throw Error("JSXGraph: Can't create Ellipse with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point,point], [point,point,number|function]");i=JXG.getReference(e,t[2])}r=function(){return i.Dist(s[0])+i.Dist(s[1])}}t[4]===void 0&&(t[4]=1.0001*Math.PI),t[3]===void 0&&(t[3]=-1.0001*Math.PI);var u=e.create("point",[function(){return.5*(s[0].X()+s[1].X())},function(){return.5*(s[0].Y()+s[1].Y())}],l),d=function(){var e,t,n,i=s[0].X(),r=s[0].Y(),o=s[1].X(),a=s[1].Y(),l=o-i>0?1:-1;e=Math.abs(o-i)>1e-7?Math.atan2(a-r,o-i)+(0>l?Math.PI:0):(a-r>0?.5:-.5)*Math.PI,t=Math.cos(e),n=Math.sin(e);var c=[[1,0,0],[u.X(),t,-n],[u.Y(),n,t]];return c},h=e.create("curve",[function(){return 0},function(){return 0},t[3],t[4]],c),p=function(e,t){var n,i,o=.5*r(),l=o*o,c=.5*s[1].Dist(s[0]),p=l-c*c,f=Math.sqrt(p),g=[[1,0,0],[0,1,0],[0,0,1]];return t||(a=d(),n=u.X(),i=u.Y(),g[0][0]=a[0][0],g[0][1]=0,g[0][2]=0,g[1][0]=n*(1-a[1][1])+i*a[1][2],g[1][1]=a[1][1],g[1][2]=a[2][1],g[2][0]=i*(1-a[1][1])-n*a[1][2],g[2][1]=a[1][2],g[2][2]=a[2][2],h.quadraticform=JXG.Math.matMatMult(JXG.Math.transpose(g),JXG.Math.matMatMult([[-1+n*n/(o*o)+i*i/p,-n/l,-n/p],[-n/l,1/l,0],[-i/p,0,1/p]],g))),JXG.Math.matVecMult(a,[1,o*Math.cos(e),f*Math.sin(e)])};return h.X=function(e,t){return p(e,t)[1]},h.Y=function(e,t){return p(e,t)[2]},h.midpoint=u,h.type=JXG.OBJECT_TYPE_CONIC,h},JXG.createHyperbola=function(e,t,n){var i,r,o,a,s=[],l=JXG.copyAttributes(n,e.options,"conic","foci"),c=JXG.copyAttributes(n,e.options,"conic");for(o=0;2>o;o++)if(t[o].length>1)s[o]=e.create("point",t[o],attr_focu);else if(JXG.isPoint(t[o]))s[o]=JXG.getReference(e,t[o]);else if("function"==typeof t[o]&&t[o]().elementClass==JXG.OBJECT_CLASS_POINT)s[o]=t[o]();else{if(!JXG.isString(t[o]))throw Error("JSXGraph: Can't create Hyperbola with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point,point], [point,point,number|function]");s[o]=JXG.getReference(e,t[o])}if(JXG.isNumber(t[2]))r=JXG.createFunction(t[2],e);else if("function"==typeof t[2]&&JXG.isNumber(t[2]()))r=t[2];else{if(JXG.isPoint(t[2]))i=JXG.getReference(e,t[2]);else if(t[2].length>1)i=e.create("point",t[2],l);else if("function"==typeof t[2]&&t[2]().elementClass==JXG.OBJECT_CLASS_POINT)i=t[2]();else{if(!JXG.isString(t[2]))throw Error("JSXGraph: Can't create Hyperbola with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point,point], [point,point,number|function]");i=JXG.getReference(e,t[2])}r=function(){return i.Dist(s[0])-i.Dist(s[1])}}t[4]===void 0&&(t[4]=1.0001*Math.PI),t[3]===void 0&&(t[3]=-1.0001*Math.PI);var u=e.create("point",[function(){return.5*(s[0].X()+s[1].X())},function(){return.5*(s[0].Y()+s[1].Y())}],l),d=function(){var e,t=s[0].X(),n=s[0].Y(),i=s[1].X(),r=s[1].Y(),o=i-t>0?1:-1;e=Math.abs(i-t)>1e-7?Math.atan2(r-n,i-t)+(0>o?Math.PI:0):(r-n>0?.5:-.5)*Math.PI;var a=[[1,0,0],[u.X(),Math.cos(e),-Math.sin(e)],[u.Y(),Math.sin(e),Math.cos(e)]];return a},h=e.create("curve",[function(){return 0},function(){return 0},t[3],t[4]],c),p=function(e,t){var n,i,o=.5*r(),l=o*o,c=.5*s[1].Dist(s[0]),p=Math.sqrt(-o*o+c*c),f=p*p,g=[[1,0,0],[0,1,0],[0,0,1]];
return t||(a=d(),n=u.X(),i=u.Y(),g[0][0]=a[0][0],g[0][1]=0,g[0][2]=0,g[1][0]=n*(1-a[1][1])+i*a[1][2],g[1][1]=a[1][1],g[1][2]=a[2][1],g[2][0]=i*(1-a[1][1])-n*a[1][2],g[2][1]=a[1][2],g[2][2]=a[2][2],h.quadraticform=JXG.Math.matMatMult(JXG.Math.transpose(g),JXG.Math.matMatMult([[-1+n*n/l+i*i/f,-n/l,i/f],[-n/l,1/l,0],[i/f,0,-1/f]],g))),JXG.Math.matVecMult(a,[1,o/Math.cos(e),p*Math.tan(e)])};return h.X=function(e,t){return p(e,t)[1]},h.Y=function(e,t){return p(e,t)[2]},h.midpoint=u,h.type=JXG.OBJECT_TYPE_CONIC,h},JXG.createParabola=function(e,t,n){var i,r=t[0],o=t[1],a=JXG.copyAttributes(n,e.options,"conic","foci"),s=JXG.copyAttributes(n,e.options,"conic");if(t[0].length>1)r=e.create("point",t[0],a);else if(JXG.isPoint(t[0]))r=JXG.getReference(e,t[0]);else if("function"==typeof t[0]&&t[0]().elementClass==JXG.OBJECT_CLASS_POINT)r=t[0]();else{if(!JXG.isString(t[0]))throw Error("JSXGraph: Can't create Parabola with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,line]");r=JXG.getReference(e,t[0])}t[3]===void 0&&(t[3]=10),t[2]===void 0&&(t[2]=-10);var l=e.create("point",[function(){var t=[0,o.stdform[1],o.stdform[2]];return t=JXG.Math.crossProduct(t,r.coords.usrCoords),JXG.Math.Geometry.meetLineLine(t,o.stdform,0,e).usrCoords}],a),c=function(){var e=Math.atan(o.getSlope()),t=.5*(l.X()+r.X()),n=.5*(l.Y()+r.Y());e+=0>r.Y()-l.Y()||r.Y()==l.Y()&&r.X()>l.X()?Math.PI:0;var i=[[1,0,0],[t*(1-Math.cos(e))+n*Math.sin(e),Math.cos(e),-Math.sin(e)],[n*(1-Math.cos(e))-t*Math.sin(e),Math.sin(e),Math.cos(e)]];return i},u=e.create("curve",[function(){return 0},function(){return 0},t[2],t[3]],s),d=function(e,t){var n=.5*l.Dist(r),o=[[1,0,0],[0,1,0],[0,0,1]],a=.5*(l.X()+r.X()),s=.5*(l.Y()+r.Y());return t||(i=c(),o[0][0]=i[0][0],o[0][1]=0,o[0][2]=0,o[1][0]=a*(1-i[1][1])+s*i[1][2],o[1][1]=i[1][1],o[1][2]=i[2][1],o[2][0]=s*(1-i[1][1])-a*i[1][2],o[2][1]=i[1][2],o[2][2]=i[2][2],u.quadraticform=JXG.Math.matMatMult(JXG.Math.transpose(o),JXG.Math.matMatMult([[4*-s*n-a*a,a,2*n],[a,-1,0],[2*n,0,0]],o))),JXG.Math.matVecMult(i,[1,e+a,e*e/(4*n)+s])};return u.X=function(e,t){return d(e,t)[1]},u.Y=function(e,t){return d(e,t)[2]},u.type=JXG.OBJECT_TYPE_CONIC,u},JXG.createConic=function(e,t,n){var i,r,o,a,s,l,c,u,d,h=[[1,0,0],[0,1,0],[0,0,1]],p=[[1,0,0],[0,1,0],[0,0,1]],f=[],g=[],m=JXG.copyAttributes(n,e.options,"conic","foci"),v=JXG.copyAttributes(n,e.options,"conic");if(5==t.length)d=!0;else{if(6!=t.length)throw Error("JSXGraph: Can't create generic Conic with "+parent.length+" parameters.");d=!1}if(d)for(c=0;5>c;c++)if(t[c].length>1)f[c]=e.create("point",t[c],m);else if(JXG.isPoint(t[c]))f[c]=JXG.getReference(e,t[c]);else if("function"==typeof t[c]&&t[c]().elementClass==JXG.OBJECT_CLASS_POINT)f[c]=t[c]();else{if(!JXG.isString(t[c]))throw Error("JSXGraph: Can't create Conic section with parent types '"+typeof t[c]+"'.\nPossible parent types: [point,point,point,point,point], [a00,a11,a22,a01,a02,a12]");f[c]=JXG.getReference(e,t[c])}else u=[[0,0,0],[0,0,0],[0,0,0]],u[0][0]=JXG.isFunction(t[2])?function(){return t[2]()}:function(){return t[2]},u[0][1]=JXG.isFunction(t[4])?function(){return t[4]()}:function(){return t[4]},u[0][2]=JXG.isFunction(t[5])?function(){return t[5]()}:function(){return t[5]},u[1][1]=JXG.isFunction(t[0])?function(){return t[0]()}:function(){return t[0]},u[1][2]=JXG.isFunction(t[3])?function(){return t[3]()}:function(){return t[3]},u[2][2]=JXG.isFunction(t[1])?function(){return t[1]()}:function(){return t[1]};var b=function(e){var t,n;for(t=0;3>t;t++)for(n=t;3>n;n++)e[t][n]+=e[n][t];for(t=0;3>t;t++)for(n=0;t>n;n++)e[t][n]=e[n][t];return e},y=function(e,t){var n,i,r=[[0,0,0],[0,0,0],[0,0,0]];for(n=0;3>n;n++)for(i=0;3>i;i++)r[n][i]=e[n]*t[i];return b(r)},x=function(e,t,n){var i,r,o,a,s,l=[[0,0,0],[0,0,0],[0,0,0]];for(o=JXG.Math.matVecMult(t,n),i=JXG.Math.innerProduct(n,o),o=JXG.Math.matVecMult(e,n),r=JXG.Math.innerProduct(n,o),a=0;3>a;a++)for(s=0;3>s;s++)l[a][s]=i*e[a][s]-r*t[a][s];return l},w=e.create("curve",[function(){return 0},function(){return 0},0,2*Math.PI],v),k=function(e,t){var n,c,m,v;if(!t){if(d){for(n=0;5>n;n++)g[n]=f[n].coords.usrCoords;s=y(JXG.Math.crossProduct(g[0],g[1]),JXG.Math.crossProduct(g[2],g[3])),l=y(JXG.Math.crossProduct(g[0],g[2]),JXG.Math.crossProduct(g[1],g[3])),p=x(s,l,g[4])}else for(n=0;3>n;n++)for(c=n;3>c;c++)p[n][c]=u[n][c](),c>n&&(p[c][n]=p[n][c]);for(w.quadraticform=p,i=JXG.Math.Numerics.Jacobi(p),0>i[0][0][0]&&(i[0][0][0]*=-1,i[0][1][1]*=-1,i[0][2][2]*=-1),n=0;3>n;n++){for(m=0,c=0;3>c;c++)m+=i[1][c][n]*i[1][c][n];for(m=Math.sqrt(m),c=0;3>c;c++);}h=i[1],a=Math.sqrt(Math.abs(i[0][0][0])),r=Math.sqrt(Math.abs(i[0][1][1])),o=Math.sqrt(Math.abs(i[0][2][2]))}return 0>=i[0][1][1]&&0>=i[0][2][2]?v=JXG.Math.matVecMult(h,[1/a,Math.cos(e)/r,Math.sin(e)/o]):0>=i[0][1][1]&&i[0][2][2]>0?v=JXG.Math.matVecMult(h,[Math.cos(e)/a,1/r,Math.sin(e)/o]):0>i[0][2][2]&&(v=JXG.Math.matVecMult(h,[Math.sin(e)/a,Math.cos(e)/r,1/o])),v[1]/=v[0],v[2]/=v[0],v[0]=1,v};return w.X=function(e,t){return k(e,t)[1]},w.Y=function(e,t){return k(e,t)[2]},w.midpoint=e.create("point",[function(){var e=w.quadraticform;return[e[1][1]*e[2][2]-e[1][2]*e[1][2],e[1][2]*e[0][2]-e[2][2]*e[0][1],e[0][1]*e[1][2]-e[1][1]*e[0][2]]}],m),w.type=JXG.OBJECT_TYPE_CONIC,w},JXG.JSXGraph.registerElement("ellipse",JXG.createEllipse),JXG.JSXGraph.registerElement("hyperbola",JXG.createHyperbola),JXG.JSXGraph.registerElement("parabola",JXG.createParabola),JXG.JSXGraph.registerElement("conic",JXG.createConic),JXG.Polygon=function(e,t,n){this.constructor(e,n,JXG.OBJECT_TYPE_POLYGON,JXG.OBJECT_CLASS_AREA);var i,r,o,a=JXG.copyAttributes(n,e.options,"polygon","lines");for(this.withLines=n.withlines,this.vertices=[],i=0;t.length>i;i++)r=JXG.getRef(this.board,t[i]),this.vertices[i]=r;if(this.vertices[this.vertices.length-1]!=this.vertices[0]&&this.vertices.push(this.vertices[0]),this.borders=[],this.withLines)for(i=0;this.vertices.length-1>i;i++)a.id=a.ids&&a.ids[i],a.strokecolor=JXG.isArray(a.colors)&&a.colors[i%a.colors.length]||a.strokecolor,a.strokecolor===!1&&(a.strokecolor="none"),o=JXG.createSegment(e,[this.vertices[i],this.vertices[i+1]],a),this.borders[i]=o,o.parentPolygon=this;for(i=0;this.vertices.length-1>i;i++)r=JXG.getReference(this.board,this.vertices[i]),r.addChild(this);this.createLabel([0,0]),this.id=this.board.setId(this,"Py"),this.board.renderer.drawPolygon(this),this.board.finalizeAdding(this)},JXG.Polygon.prototype=new JXG.GeometryElement,JXG.extend(JXG.Polygon.prototype,{hasPoint:function(e,t){var n,i,r=!1;for(n=0,i=this.vertices.length-2;this.vertices.length-1>n;i=n++)this.vertices[n].coords.scrCoords[2]>t!=this.vertices[i].coords.scrCoords[2]>t&&(this.vertices[i].coords.scrCoords[1]-this.vertices[n].coords.scrCoords[1])*(t-this.vertices[n].coords.scrCoords[2])/(this.vertices[i].coords.scrCoords[2]-this.vertices[n].coords.scrCoords[2])+this.vertices[n].coords.scrCoords[1]>e&&(r=!r);return r},updateRenderer:function(){this.needsUpdate&&(this.board.renderer.updatePolygon(this),this.needsUpdate=!1),this.hasLabel&&this.label.content.visProp.visible&&(this.label.content.update(),this.board.renderer.updateText(this.label.content))},getTextAnchor:function(){var e,t=this.vertices[0].X(),n=this.vertices[0].Y(),i=t,r=n;for(e=0;this.vertices.length>e;e++)t>this.vertices[e].X()&&(t=this.vertices[e].X()),this.vertices[e].X()>i&&(i=this.vertices[e].X()),this.vertices[e].Y()>n&&(n=this.vertices[e].Y()),r>this.vertices[e].Y()&&(r=this.vertices[e].Y());return new JXG.Coords(JXG.COORDS_BY_USER,[.5*(t+i),.5*(n+r)],this.board)},getLabelAnchor:JXG.shortcut(JXG.Polygon.prototype,"getTextAnchor"),cloneToBackground:function(){var e,t={};t.id=this.id+"T"+this.numTraces,this.numTraces++,t.vertices=this.vertices,t.visProp=this.visProp,t.visProp.layer=this.board.options.layer.trace,t.board=this.board,JXG.clearVisPropOld(t),e=this.board.renderer.enhancedRendering,this.board.renderer.enhancedRendering=!0,this.board.renderer.drawPolygon(t),this.board.renderer.enhancedRendering=e,this.traces[t.id]=t.rendNode},hideElement:function(){var e;for(this.visProp.visible=!1,this.board.renderer.hide(this),e=0;this.borders.length>e;e++)this.borders[e].hideElement();this.hasLabel&&JXG.exists(this.label)&&(this.label.hiddenByParent=!0,this.label.content.visProp.visible&&this.board.renderer.hide(this.label.content))},showElement:function(){var e;for(this.visProp.visible=!0,this.board.renderer.show(this),e=0;this.borders.length>e;e++)this.borders[e].showElement();this.hasLabel&&JXG.exists(this.label)&&this.label.content.visProp.visible&&this.board.renderer.show(this.label.content)},Area:function(){var e,t=0;for(e=0;this.vertices.length-1>e;e++)t+=this.vertices[e].X()*this.vertices[e+1].Y()-this.vertices[e+1].X()*this.vertices[e].Y();return t/=2,Math.abs(t)},remove:function(){var e;for(e=0;this.borders.length>e;e++)this.borders[e].remove();this.board.renderer.remove(this.rendNode)}}),JXG.createPolygon=function(e,t,n){var i,r,o=JXG.copyAttributes(n,e.options,"polygon");for(r=0;t.length>r;r++)if(t[r]=JXG.getReference(e,t[r]),!JXG.isPoint(t[r]))throw Error("JSXGraph: Can't create polygon with parent types other than 'point'.");return i=new JXG.Polygon(e,t,o)},JXG.createRegularPolygon=function(e,t,n){var i,r,o,a,s,l,c,u=[];if(JXG.isNumber(t[t.length-1])&&3!=t.length)throw Error("JSXGraph: A regular polygon needs two point and a number as input.");if(s=t.length,o=t[s-1],!JXG.isNumber(o)&&!JXG.isPoint(JXG.getReference(e,o))||3>o)throw Error("JSXGraph: The third parameter has to be number greater than 2 or a point.");for(JXG.isPoint(JXG.getReference(e,o))?(o=s,l=!0):(s--,l=!1),r=0;s>r;r++)if(t[r]=JXG.getReference(e,t[r]),!JXG.isPoint(t[r]))throw Error("JSXGraph: Can't create regular polygon if the first two parameters aren't points.");for(u[0]=t[0],u[1]=t[1],c=JXG.copyAttributes(n,e.options,"polygon","points"),r=2;o>r;r++)a=e.create("transform",[Math.PI*(2-(o-2)/o),u[r-1]],{type:"rotate"}),l?(u[r]=t[r],u[r].addTransform(t[r-2],a)):u[r]=e.create("point",[u[r-2],a],c);return c=JXG.copyAttributes(n,e.options,"polygon"),i=e.create("polygon",u,c)},JXG.JSXGraph.registerElement("polygon",JXG.createPolygon),JXG.JSXGraph.registerElement("regularpolygon",JXG.createRegularPolygon),JXG.Curve=function(e,t,n){this.constructor(e,n,JXG.OBJECT_TYPE_CURVE,JXG.OBJECT_CLASS_CURVE),this.points=[],this.doAdvancedPlot=n.doadvancedplot,this.numberPointsHigh=n.numberpointshigh,this.numberPointsLow=n.numberpointslow,this.numberPoints=this.numberPointsHigh,this.dataX=null,this.dataY=null,this.varname=null!=t[0]?t[0]:"x",this.xterm=t[1],this.yterm=t[2],this.generateTerm(this.varname,this.xterm,this.yterm,t[3],t[4]),this.updateCurve(),this.id=this.board.setId(this,"G"),this.board.renderer.drawCurve(this),this.board.finalizeAdding(this),this.createGradient(),this.createLabel(),"string"==typeof this.xterm&&this.notifyParents(this.xterm),"string"==typeof this.yterm&&this.notifyParents(this.yterm)},JXG.Curve.prototype=new JXG.GeometryElement,JXG.extend(JXG.Curve.prototype,{minX:function(){if("polar"==this.visProp.curvetype)return 0;var e=new JXG.Coords(JXG.COORDS_BY_SCREEN,[0,0],this.board);return e.usrCoords[1]},maxX:function(){var e;return"polar"==this.visProp.curvetype?2*Math.PI:(e=new JXG.Coords(JXG.COORDS_BY_SCREEN,[this.board.canvasWidth,0],this.board),e.usrCoords[1])},hasPoint:function(e,t){var n,i,r,o,a,s,l,c,u,d,h,p,f,g,m,v,b,y,x,w,k=1/0,C=this.numberPointsLow,_=(this.maxX()-this.minX())/C,T=this.board.options.precision.hasPoint/this.board.unitX,E=!0;if(T*=T,x=new JXG.Coords(JXG.COORDS_BY_SCREEN,[e,t],this.board),e=x.usrCoords[1],t=x.usrCoords[2],"parameter"==this.visProp.curvetype||"polar"==this.visProp.curvetype||"functiongraph"==this.visProp.curvetype)for(w=this.transformations.length,o=0,n=this.minX();C>o;o++){for(s=this.X(n,E),l=this.Y(n,E),a=0;w>a;a++)r=this.transformations[a],r.update(),i=JXG.Math.matVecMult(r.matrix,[1,s,l]),s=i[1],l=i[2];if(k=(e-s)*(e-s)+(t-l)*(t-l),T>k)return!0;n+=_}else if("plot"==this.visProp.curvetype){for(w=this.numberPoints,o=0;w-1>o;o++)if(c=this.X(o),u=this.X(o+1),d=this.Y(o),h=this.Y(o+1),m=u-c,v=h-d,f=e-c,g=t-d,y=m*m+v*v,y>=JXG.Math.eps?(b=f*m+g*v,p=b/y,k=f*f+g*g-p*b):(p=0,k=f*f+g*g),p>=0&&1>=p&&T>k)return!0;return!1}return T>k},allocatePoints:function(){var e,t;if(t=this.numberPoints,this.points.lengthe;e++)this.points[e]=new JXG.Coords(JXG.COORDS_BY_USER,[0,0],this.board)},update:function(){return this.needsUpdate&&(this.visProp.trace&&this.cloneToBackground(!0),this.updateCurve()),this},updateRenderer:function(){return this.needsUpdate&&(this.board.renderer.updateCurve(this),this.needsUpdate=!1,this.hasLabel&&this.label.content.visProp.visible&&(this.label.content.update(),this.board.renderer.updateText(this.label.content))),this},updateDataArray:function(){return this},updateCurve:function(){var e,t,n,i,r,o,a=!1;if(this.updateDataArray(),t=this.minX(),n=this.maxX(),null!=this.dataX)for(this.numberPoints=this.dataX.length,e=this.numberPoints,this.allocatePoints(),o=0;e>o;o++)i=o,r=null!=this.dataY?o:this.X(i),this.points[o].setCoordinates(JXG.COORDS_BY_USER,[this.X(i,a),this.Y(r,a)],!1),this.updateTransform(this.points[o]),a=!0;else this.doAdvancedPlot?this.updateParametricCurve(t,n,e):(this.numberPoints=this.board.updateQuality==this.board.BOARD_QUALITY_HIGH?this.numberPointsHigh:this.numberPointsLow,e=this.numberPoints,this.allocatePoints(),this.updateParametricCurveNaive(t,n,e));return this},updateParametricCurveNaive:function(e,t,n){var i,r,o=!1,a=(t-e)/n;for(i=0;n>i;i++)r=e+i*a,this.points[i].setCoordinates(JXG.COORDS_BY_USER,[this.X(r,o),this.Y(r,o)],!1),this.updateTransform(this.points[i]),o=!0;return this},updateParametricCurve:function(e,t){var n,i,r,o,a,s,l,c,u,d,h,p,f,g=!1,m=new JXG.Coords(JXG.COORDS_BY_USER,[0,0],this.board),v=[],b=[],y=[],x=[],w=!1,k=0,C=function(e,t,n){var i,r,o=n[1]-e[1],a=n[2]-e[2],s=t[0]-e[1],l=t[1]-e[2],c=s*s+l*l;return c>=JXG.Math.eps&&(i=(o*s+a*l)/c,i>0&&(1>=i?(o-=i*s,a-=i*l):(o-=s,a-=l))),r=o*o+a*a,Math.sqrt(r)};for(this.board.updateQuality==this.board.BOARD_QUALITY_LOW?(d=15,h=10,p=10):(d=21,h=.7,p=.7),x[0]=t-e,n=1;d>n;n++)x[n]=.5*x[n-1];n=1,v[0]=1,b[0]=0,i=e,m.setCoordinates(JXG.COORDS_BY_USER,[this.X(i,g),this.Y(i,g)],!1),g=!0,s=m.scrCoords[1],l=m.scrCoords[2],r=i,i=t,m.setCoordinates(JXG.COORDS_BY_USER,[this.X(i,g),this.Y(i,g)],!1),o=m.scrCoords[1],a=m.scrCoords[2],y[0]=[o,a],c=1,u=0,this.points=[],this.points[k++]=new JXG.Coords(JXG.COORDS_BY_SCREEN,[s,l],this.board);do{for(w=this.isDistOK(o-s,a-l,h,p)||this.isSegmentOutside(s,l,o,a);d>u&&(!w||3>u)&&(this.isSegmentDefined(s,l,o,a)||7>=u);)v[c]=n,b[c]=u,y[c]=[o,a],c++,n=2*n-1,u++,i=e+n*x[u],m.setCoordinates(JXG.COORDS_BY_USER,[this.X(i,g),this.Y(i,g)],!1),o=m.scrCoords[1],a=m.scrCoords[2],w=this.isDistOK(o-s,a-l,h,p)||this.isSegmentOutside(s,l,o,a);k>1&&(f=C(this.points[k-2].scrCoords,[o,a],this.points[k-1].scrCoords),.015>f&&k--),this.points[k]=new JXG.Coords(JXG.COORDS_BY_SCREEN,[o,a],this.board),this.updateTransform(this.points[k]),k++,s=o,l=a,r=i,c--,o=y[c][0],a=y[c][1],u=b[c]+1,n=2*v[c]}while(c>0&&5e5>k);return this.numberPoints=this.points.length,this},isSegmentOutside:function(e,t,n,i){return 0>t&&0>i?!0:t>this.board.canvasHeight&&i>this.board.canvasHeight?!0:0>e&&0>n?!0:e>this.board.canvasWidth&&n>this.board.canvasWidth?!0:!1},isDistOK:function(e,t,n,i){return isNaN(e+t)?!1:i>Math.abs(e)&&i>Math.abs(t)},isSegmentDefined:function(e,t,n,i){return!(isNaN(e+t)&&isNaN(n+i))},updateTransform:function(e){var t,n,i,r=this.transformations.length;if(0==r)return e;for(i=0;r>i;i++)t=this.transformations[i],t.update(),n=JXG.Math.matVecMult(t.matrix,e.usrCoords),e.setCoordinates(JXG.COORDS_BY_USER,[n[1],n[2]]);return e},addTransform:function(e){var t,n,i;for(t=JXG.isArray(e)?e:[e],i=t.length,n=0;i>n;n++)this.transformations.push(t[n]);return this},setPosition:function(e,t,n){var i=this.board.create("transform",[t,n],{type:"translate"});return this.transformations.length>0&&this.transformations[this.transformations.length-1].isNumericMatrix?this.transformations[this.transformations.length-1].melt(i):this.addTransform(i),this},generateTerm:function(e,t,n,i,r){var o,a;JXG.isArray(t)?(this.dataX=t,this.X=function(e){var t,n,i=parseInt(Math.floor(e));return 0>e?i=0:e>this.dataX.length-2&&(i=this.dataX.length-2),i==e?this.dataX[i]:(t=this.dataX[i],n=this.dataX[i+1],t+(n-t)*(e-i))},this.visProp.curvetype="plot",this.numberPoints=this.dataX.length):(this.X=JXG.createFunction(t,this.board,e),JXG.isString(t)?this.visProp.curvetype="functiongraph":(JXG.isFunction(t)||JXG.isNumber(t))&&(this.visProp.curvetype="parameter")),JXG.isArray(n)?(this.dataY=n,this.Y=function(e){var t,n,i=parseInt(Math.floor(e));return 0>e?i=0:e>this.dataY.length-2&&(i=this.dataY.length-2),i==e?JXG.isFunction(this.dataY[i])?this.dataY[i]():this.dataY[i]:(t=JXG.isFunction(this.dataY[i])?this.dataY[i]():this.dataY[i],n=JXG.isFunction(this.dataY[i+1])?this.dataY[i+1]():this.dataY[i+1],t+(n-t)*(e-i))}):this.Y=JXG.createFunction(n,this.board,e),JXG.isFunction(t)&&JXG.isArray(n)&&(o=JXG.createFunction(n[0],this.board,""),a=JXG.createFunction(n[1],this.board,""),this.X=function(e){return t(e)*Math.cos(e)+o()},this.Y=function(e){return t(e)*Math.sin(e)+a()},this.visProp.curvetype="polar"),null!=i&&(this.minX=JXG.createFunction(i,this.board,"")),null!=r&&(this.maxX=JXG.createFunction(r,this.board,""))},notifyParents:function(e){JXG.GeonextParser.findDependencies(this,e,this.board)},getLabelAnchor:function(){var e=new JXG.Coords(JXG.COORDS_BY_SCREEN,[0,.5*this.board.canvasHeight],this.board);return e=JXG.Math.Geometry.projectCoordsToCurve(e.usrCoords[1],e.usrCoords[2],0,this,this.board)[0]},cloneToBackground:function(){var e,t={};t.id=this.id+"T"+this.numTraces,t.elementClass=JXG.OBJECT_CLASS_CURVE,this.numTraces++,t.points=this.points.slice(0),t.numberPoints=this.numberPoints,t.board=this.board,t.visProp=this.visProp,t.visProp.layer=this.board.options.layer.trace,t.visProp.curvetype=this.visProp.curvetype,JXG.clearVisPropOld(t),e=this.board.renderer.enhancedRendering,this.board.renderer.enhancedRendering=!0,this.board.renderer.drawCurve(t),this.board.renderer.enhancedRendering=e,this.traces[t.id]=t.rendNode},bounds:function(){var e,t,n,i,r,o,a,s,l=this.numberPointsLow,c=(this.maxX()-this.minX())/l,u=[this.minX(),0,this.maxX(),0];if("parameter"==this.visProp.curvetype||"polar"==this.visProp.curvetype||"functiongraph"==this.visProp.curvetype)for(o=this.transformations.length,i=this.minX(),e=0;l>e;e++){for(a=this.X(i,!0),s=this.Y(i,!0),t=0;o>t;t++)n=this.transformations[t],n.update(),r=JXG.Math.matVecMult(n.matrix,[1,a,s]),a=r[1],s=r[2];s>u[1]&&(u[1]=s),u[3]>s&&(u[3]=s),i+=c}else if("plot"==this.visProp.curvetype)for(o=this.numberPoints,e=0;o>e;e++)s=this.Y(e),s>u[1]&&(u[1]=s),u[3]>s&&(u[3]=s);return u}}),JXG.createCurve=function(e,t,n){var i=JXG.copyAttributes(n,e.options,"curve");return new JXG.Curve(e,["x"].concat(t),i)},JXG.JSXGraph.registerElement("curve",JXG.createCurve),JXG.createFunctiongraph=function(e,t,n){var i,r=["x","x"].concat(t);return i=JXG.copyAttributes(n,e.options,"curve"),i.curvetype="functiongraph",new JXG.Curve(e,r,i)},JXG.JSXGraph.registerElement("functiongraph",JXG.createFunctiongraph),JXG.JSXGraph.registerElement("plot",JXG.createFunctiongraph),JXG.createSpline=function(e,t,n){var i;return i=function(){var e,n=[],i=[],r=function(r,o){var a;if(!o){if(n=[],i=[],2==t.length&&JXG.isArray(t[0])&&JXG.isArray(t[1])&&t[0].length==t[1].length)for(a=0;t[0].length>a;a++)"function"==typeof t[0][a]?n.push(t[0][a]()):n.push(t[0][a]),"function"==typeof t[1][a]?i.push(t[1][a]()):i.push(t[1][a]);else for(a=0;t.length>a;a++)if(JXG.isPoint(t[a]))n.push(t[a].X()),i.push(t[a].Y());else if(JXG.isArray(t[a])&&2==t[a].length)for(a=0;t.length>a;a++)"function"==typeof t[a][0]?n.push(t[a][0]()):n.push(t[a][0]),"function"==typeof t[a][1]?i.push(t[a][1]()):i.push(t[a][1]);e=JXG.Math.Numerics.splineDef(n,i)}return JXG.Math.Numerics.splineEval(r,n,i,e)};return r},e.create("curve",["x",i()],n)},JXG.JSXGraph.registerElement("spline",JXG.createSpline),JXG.createRiemannsum=function(e,t,n){var i,r,o,a,s,l;if(l=JXG.copyAttributes(n,e.options,"riemannsum"),l.curvetype="plot",o=t[0],i=JXG.createFunction(t[1],e,""),null==i)throw Error("JSXGraph: JXG.createRiemannsum: argument '2' n has to be number or function.\nPossible parent types: [function,n:number|function,type,start:number|function,end:number|function]");if(r=JXG.createFunction(t[2],e,"",!1),null==r)throw Error("JSXGraph: JXG.createRiemannsum: argument 3 'type' has to be string or function.\nPossible parent types: [function,n:number|function,type,start:number|function,end:number|function]");return a=[[0],[0]].concat(t.slice(3)),s=e.create("curve",a,l),s.updateDataArray=function(){var e=JXG.Math.Numerics.riemann(o,i(),r(),this.minX(),this.maxX());this.dataX=e[0],this.dataY=e[1]},s},JXG.JSXGraph.registerElement("riemannsum",JXG.createRiemannsum),JXG.createArc=function(e,t,n){var i,r;if(!(t=JXG.checkParents("arc",t,[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT],[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]])))throw Error("JSXGraph: Can't create Arc with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point,point]");return r=JXG.copyAttributes(n,e.options,"arc"),i=e.create("curve",[[0],[0]],r),i.type=JXG.OBJECT_TYPE_ARC,i.midpoint=JXG.getReference(e,t[0]),i.radiuspoint=JXG.getReference(e,t[1]),i.point2=i.radiuspoint,i.anglepoint=JXG.getReference(e,t[2]),i.point3=i.anglepoint,i.midpoint.addChild(i),i.radiuspoint.addChild(i),i.anglepoint.addChild(i),i.useDirection=r.usedirection,i.updateDataArray=function(){var e,n,i,r,o,a,s,l,c,u,d=this.radiuspoint,h=this.midpoint,p=this.anglepoint,f=JXG.Math.Geometry.rad(d,h,p),g=Math.ceil(90*(f/Math.PI))+1,m=f/g,v=h.X(),b=h.Y();for(this.useDirection&&(l=t[1].coords.usrCoords,c=t[3].coords.usrCoords,u=t[2].coords.usrCoords,s=(l[1]-u[1])*(l[2]-c[2])-(l[2]-u[2])*(l[1]-c[1]),0>s?(this.radiuspoint=t[1],this.anglepoint=t[2]):(this.radiuspoint=t[2],this.anglepoint=t[1])),this.dataX=[d.X()],this.dataY=[d.Y()],e=m,o=1;g>=o;o++,e+=m)n=Math.cos(e),i=Math.sin(e),r=[[1,0,0],[v*(1-n)+b*i,n,-i],[b*(1-n)-v*i,i,n]],a=JXG.Math.matVecMult(r,d.coords.usrCoords),this.dataX.push(a[1]/a[0]),this.dataY.push(a[2]/a[0]);this.updateStdform(),this.updateQuadraticform()},i.Radius=function(){return this.radiuspoint.Dist(this.midpoint)},i.getRadius=function(){return this.Radius()},i.hasPoint=function(e,t){var n,i=this.board.options.precision.hasPoint/this.board.unitX,r=new JXG.Coords(JXG.COORDS_BY_SCREEN,[e,t],this.board),o=this.Radius(),a=this.midpoint.coords.distance(JXG.COORDS_BY_USER,r),s=i>Math.abs(a-o);return s&&(n=JXG.Math.Geometry.rad(this.radiuspoint,this.midpoint,r.usrCoords.slice(1)),n>JXG.Math.Geometry.rad(this.radiuspoint,this.midpoint,this.anglepoint)&&(s=!1)),s},i.hasPointSector=function(e,t){var n,i=new JXG.Coords(JXG.COORDS_BY_SCREEN,[e,t],this.board),r=this.Radius(),o=this.midpoint.coords.distance(JXG.COORDS_BY_USER,i),a=r>o;return a&&(n=JXG.Math.Geometry.rad(this.radiuspoint,this.midpoint,i.usrCoords.slice(1)),n>JXG.Math.Geometry.rad(this.radiuspoint,this.midpoint,this.anglepoint)&&(a=!1)),a},i.getTextAnchor=function(){return this.midpoint.coords},i.getLabelAnchor=function(){var e,t,n,i,r=JXG.Math.Geometry.rad(this.radiuspoint,this.midpoint,this.anglepoint),o=10/this.board.unitX,a=10/this.board.unitY,s=this.point2.coords.usrCoords,l=this.midpoint.coords.usrCoords,c=s[1]-l[1],u=s[2]-l[2];return null!=this.label.content&&(this.label.content.relativeCoords=new JXG.Coords(JXG.COORDS_BY_SCREEN,[0,0],this.board)),e=new JXG.Coords(JXG.COORDS_BY_USER,[l[1]+Math.cos(.5*r)*c-Math.sin(.5*r)*u,l[2]+Math.sin(.5*r)*c+Math.cos(.5*r)*u],this.board),t=e.usrCoords[1]-l[1],n=e.usrCoords[2]-l[2],i=Math.sqrt(t*t+n*n),t=t*(i+o)/i,n=n*(i+a)/i,new JXG.Coords(JXG.COORDS_BY_USER,[l[1]+t,l[2]+n],this.board)},i.updateQuadraticform=function(){var e=this.midpoint,t=e.X(),n=e.Y(),i=this.Radius();this.quadraticform=[[t*t+n*n-i*i,-t,-n],[-t,1,0],[-n,0,1]]},i.updateStdform=function(){this.stdform[3]=.5,this.stdform[4]=this.Radius(),this.stdform[1]=-this.midpoint.coords.usrCoords[1],this.stdform[2]=-this.midpoint.coords.usrCoords[2],this.normalize()},i.prepareUpdate().update(),i},JXG.JSXGraph.registerElement("arc",JXG.createArc),JXG.createSemicircle=function(e,t,n){var i,r,o;if(!JXG.isPoint(t[0])||!JXG.isPoint(t[1]))throw Error("JSXGraph: Can't create Semicircle with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point]");return o=JXG.copyAttributes(n,e.options,"circle","center"),r=e.create("midpoint",[t[0],t[1]],o),o=JXG.copyAttributes(n,e.options,"circle"),i=e.create("arc",[r,t[1],t[0]],o),i.midpoint=r,i},JXG.JSXGraph.registerElement("semicircle",JXG.createSemicircle),JXG.createCircumcircleArc=function(e,t,n){var i,r,o;if(!(JXG.isPoint(t[0])&&JXG.isPoint(t[1])&&JXG.isPoint(t[2])))throw Error("JSXGraph: create Circumcircle Arc with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point,point]");return o=JXG.copyAttributes(n,e.options,"arc","center"),r=e.create("circumcirclemidpoint",[t[0],t[1],t[2]],o),o=JXG.copyAttributes(n,e.options,"arc"),o.usedirection=!0,i=e.create("arc",[r,t[0],t[2],t[1]],o),i.midpoint=r,i},JXG.JSXGraph.registerElement("circumcirclearc",JXG.createCircumcircleArc),JXG.createSector=function(e,t,n){var i,r;if(!(JXG.isPoint(t[0])&&JXG.isPoint(t[1])&&JXG.isPoint(t[2])))throw Error("JSXGraph: Can't create Sector with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"' and '"+typeof t[2]+"'.");return r=JXG.copyAttributes(n,e.options,"sector"),i=e.create("curve",[[0],[0]],r),i.type=JXG.OBJECT_TYPE_SECTOR,i.point1=JXG.getReference(e,t[0]),i.point2=JXG.getReference(e,t[1]),i.point3=JXG.getReference(e,t[2]),i.point1.addChild(i),i.point2.addChild(i),i.point3.addChild(i),i.useDirection=n.usedirection,i.updateDataArray=function(){var e,n,i,r,o,a,s,l,c,u,d=this.point2,h=this.point1,p=this.point3,f=JXG.Math.Geometry.rad(d,h,p),g=Math.ceil(90*(f/Math.PI))+1,m=f/g,v=h.X(),b=h.Y();for(this.useDirection&&(l=t[1].coords.usrCoords,c=t[3].coords.usrCoords,u=t[2].coords.usrCoords,s=(l[1]-u[1])*(l[2]-c[2])-(l[2]-u[2])*(l[1]-c[1]),0>s?(this.point2=t[1],this.point3=t[2]):(this.point2=t[2],this.point3=t[1])),this.dataX=[h.X(),d.X()],this.dataY=[h.Y(),d.Y()],e=m,o=1;g>=o;o++,e+=m)n=Math.cos(e),i=Math.sin(e),r=[[1,0,0],[v*(1-n)+b*i,n,-i],[b*(1-n)-v*i,i,n]],a=JXG.Math.matVecMult(r,d.coords.usrCoords),this.dataX.push(a[1]/a[0]),this.dataY.push(a[2]/a[0]);this.dataX.push(h.X()),this.dataY.push(h.Y())},i.Radius=function(){return this.point2.Dist(this.point1)},i.getRadius=function(){return this.Radius()},i.hasPointSector=function(e,t){var n,i=new JXG.Coords(JXG.COORDS_BY_SCREEN,[e,t],this.board),r=this.Radius(),o=this.point1.coords.distance(JXG.COORDS_BY_USER,i),a=r>o;return a&&(n=JXG.Math.Geometry.rad(this.point2,this.point1,i.usrCoords.slice(1)),n>JXG.Math.Geometry.rad(this.point2,this.point1,this.point3)&&(a=!1)),a},i.getTextAnchor=function(){return this.point1.coords},i.getLabelAnchor=function(){var e,t,n,i,r=JXG.Math.Geometry.rad(this.point2,this.point1,this.point3),o=10/this.board.unitX,a=10/this.board.unitY,s=this.point2.coords.usrCoords,l=this.point1.coords.usrCoords,c=s[1]-l[1],u=s[2]-l[2];return null!=this.label.content&&(this.label.content.relativeCoords=new JXG.Coords(JXG.COORDS_BY_SCREEN,[0,0],this.board)),e=new JXG.Coords(JXG.COORDS_BY_USER,[l[1]+Math.cos(.5*r)*c-Math.sin(.5*r)*u,l[2]+Math.sin(.5*r)*c+Math.cos(.5*r)*u],this.board),t=e.usrCoords[1]-l[1],n=e.usrCoords[2]-l[2],i=Math.sqrt(t*t+n*n),t=t*(i+o)/i,n=n*(i+a)/i,new JXG.Coords(JXG.COORDS_BY_USER,[l[1]+t,l[2]+n],this.board)},i.prepareUpdate().update(),i},JXG.JSXGraph.registerElement("sector",JXG.createSector),JXG.createCircumcircleSector=function(e,t,n){var i,r,o;if(!(JXG.isPoint(t[0])&&JXG.isPoint(t[1])&&JXG.isPoint(t[2])))throw Error("JSXGraph: Can't create circumcircle sector with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"' and '"+typeof t[2]+"'.");return o=JXG.copyAttributes(n,e.options,"circumcirclesector","point"),r=e.create("circumcirclemidpoint",[t[0],t[1],t[2]],o),o=JXG.copyAttributes(n,e.options,"circumcirclesector"),i=e.create("sector",[r,t[0],t[2],t[1]],o),i},JXG.JSXGraph.registerElement("circumcirclesector",JXG.createCircumcircleSector),JXG.createAngle=function(e,t,n){var i,r,o,a,s,l,c,u,d,h,p=["α","β","γ","δ","ε","ζ","&eta","θ","ι","κ","λ","μ","ν","ξ","ο","π","ρ","ς","σ","τ","υ","φ","χ","ψ","ω"],f=0;if(!(JXG.isPoint(t[0])&&JXG.isPoint(t[1])&&JXG.isPoint(t[2])))throw Error("JSXGraph: Can't create angle with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"' and '"+typeof t[2]+"'.");if(o=n.text,""==o){for(;p.length>f;){s=f,l=p[f];for(i in e.objects)if(e.objects[i].type==JXG.OBJECT_TYPE_ANGLE&&e.objects[i].text==l){f++;break}f==s&&(o=l,f=p.length+1)}if(f==p.length)for(c="α_{",u="}",d=!1,s=0;!d;){for(i in e.objects)if(e.objects[i].type==JXG.OBJECT_TYPE_ANGLE&&e.objects[i].text==c+s+u){d=!0;break}d?d=!1:(d=!0,o=c+s+u)}}for(a=JXG.copyAttributes(n,e.options,"angle","point"),r=e.create("point",[function(){var e=t[0],n=t[1],i=a.radius,r=n.Dist(e);return[n.X()+(e.X()-n.X())*i/r,n.Y()+(e.Y()-n.Y())*i/r]}],a),a=JXG.copyAttributes(n,e.options,"angle"),i=e.create("sector",[t[1],r,t[2]],a),i.radiuspoint=r,h=JXG.copyAttributes(n,e.options,"angle","dot"),i.dot=e.create("point",[function(){if(JXG.exists(i.dot)&&i.dot.visProp.visible===!1)return[0,0];var n=r.coords.usrCoords,o=e.create("transform",[-t[1].X(),-t[1].Y()],{type:"translate"});return o.melt(e.create("transform",[.5,.5],{type:"scale"})),o.melt(e.create("transform",[JXG.Math.Geometry.rad(t[0],t[1],t[2])/2,0,0],{type:"rotate"})),o.melt(e.create("transform",[t[1].X(),t[1].Y()],{type:"translate"})),o.update(),JXG.Math.matVecMult(o.matrix,n)}],h),f=0;3>f;f++)JXG.getRef(e,t[f]).addChild(r),JXG.getRef(e,t[f]).addChild(i.dot);return i.type=JXG.OBJECT_TYPE_ANGLE,i.visProp.withlabel&&(i.label.content.setText(o),i.label.content.setProperty({fontSize:i.visProp.fontsize,strokeColor:i.visProp.textcolor})),JXG.getRef(e,t[0]).addChild(i),i.getLabelAnchor=function(){var e,t,n,i,r=JXG.Math.Geometry.rad(this.point2,this.point1,this.point3),o=10/this.board.unitX,a=10/this.board.unitY,s=this.point2.coords.usrCoords,l=this.point1.coords.usrCoords,c=s[1]-l[1],u=s[2]-l[2];return null!=this.label.content&&(this.label.content.relativeCoords=new JXG.Coords(JXG.COORDS_BY_SCREEN,[0,0],this.board)),e=new JXG.Coords(JXG.COORDS_BY_USER,[l[1]+Math.cos(1.125*.5*r)*c-Math.sin(1.125*.5*r)*u,l[2]+Math.sin(1.125*.5*r)*c+Math.cos(1.125*.5*r)*u],this.board),t=e.usrCoords[1]-l[1],n=e.usrCoords[2]-l[2],i=Math.sqrt(t*t+n*n),t=t*(i+o)/i,n=n*(i+a)/i,new JXG.Coords(JXG.COORDS_BY_USER,[l[1]+t,l[2]+n],this.board)},i},JXG.JSXGraph.registerElement("angle",JXG.createAngle),JXG.Composition=function(e){var t,n=["setProperty","prepareUpdate","updateRenderer","update","highlight","noHighlight"],i=function(e){return function(){var t;for(t in r.elements)JXG.exists(r.elements[t][e])&&r.elements[t][e].apply(r.elements[t],arguments);return r}},r=this;for(t=0;n.length>t;t++)this[n[t]]=i(n[t]);this.elements={};for(t in e)e.hasOwnProperty(t)&&this.add(t,e[t])},JXG.extend(JXG.Composition.prototype,{add:function(e,t){return!JXG.exists(this[e])&&JXG.exists(t)?(JXG.exists(t.id)?this.elements[t.id]=t:this.elements[e]=t,this[e]=t,!0):!1},remove:function(e){var t,n=!1;for(t in this.elements)if(this.elements[t].id===this[e].id){n=!0;break}return n&&(delete this.elements[this[e].id],delete this[e]),n}}),JXG.createPerpendicularPoint=function(e,t,n){var i,r,o;if(JXG.isPoint(t[0])&&t[1].elementClass==JXG.OBJECT_CLASS_LINE)r=t[0],i=t[1];else{if(!JXG.isPoint(t[1])||t[0].elementClass!=JXG.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create perpendicular point with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,line]");
r=t[1],i=t[0]}return o=e.create("point",[function(){return JXG.Math.Geometry.perpendicular(i,r,e)[0]}],n),r.addChild(o),i.addChild(o),o.update(),o.generatePolynomial=function(){var e=i.point1.symbolic.x,t=i.point1.symbolic.y,n=i.point2.symbolic.x,a=i.point2.symbolic.y,s=r.symbolic.x,l=r.symbolic.y,c=o.symbolic.x,u=o.symbolic.y,d="("+t+")*("+c+")-("+t+")*("+n+")+("+u+")*("+n+")-("+e+")*("+u+")+("+e+")*("+a+")-("+c+")*("+a+")",h="("+l+")*("+t+")-("+l+")*("+a+")-("+u+")*("+t+")+("+u+")*("+a+")+("+s+")*("+e+")-("+s+")*("+n+")-("+c+")*("+e+")+("+c+")*("+n+")";return[d,h]},o},JXG.createPerpendicular=function(e,t,n){var i,r,o,a,s;if(t[0]=JXG.getReference(e,t[0]),t[1]=JXG.getReference(e,t[1]),JXG.isPoint(t[0])&&t[1].elementClass==JXG.OBJECT_CLASS_LINE)r=t[1],i=t[0];else{if(!JXG.isPoint(t[1])||t[0].elementClass!=JXG.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create perpendicular with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [line,point]");r=t[0],i=t[1]}return s=JXG.copyAttributes(n,e.options,"perpendicular","point"),a=JXG.createPerpendicularPoint(e,[r,i],s),JXG.exists(n.layer)||(n.layer=e.options.layer.line),s=JXG.copyAttributes(n,e.options,"perpendicular"),o=JXG.createLine(e,[function(){return JXG.Math.Geometry.perpendicular(r,i,e)[1]?[a,i]:[i,a]}],s),o.perpendicularpoint=a,o},JXG.createMidpoint=function(e,t,n){var i,r,o;if(2==t.length&&JXG.isPoint(t[0])&&JXG.isPoint(t[1]))i=t[0],r=t[1];else{if(1!=t.length||t[0].elementClass!=JXG.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create midpoint.\nPossible parent types: [point,point], [line]");i=t[0].point1,r=t[0].point2}return o=e.create("point",[function(){return(i.coords.usrCoords[1]+r.coords.usrCoords[1])/2},function(){return(i.coords.usrCoords[2]+r.coords.usrCoords[2])/2}],n),i.addChild(o),r.addChild(o),o.prepareUpdate().update(),o.generatePolynomial=function(){var e=i.symbolic.x,t=i.symbolic.y,n=r.symbolic.x,a=r.symbolic.y,s=o.symbolic.x,l=o.symbolic.y,c="("+t+")*("+s+")-("+t+")*("+n+")+("+l+")*("+n+")-("+e+")*("+l+")+("+e+")*("+a+")-("+s+")*("+a+")",u="("+e+")^2 - 2*("+e+")*("+s+")+("+t+")^2-2*("+t+")*("+l+")-("+n+")^2+2*("+n+")*("+s+")-("+a+")^2+2*("+a+")*("+l+")";return[c,u]},o},JXG.createParallelPoint=function(e,t,n){var i,r,o,a;if(3==t.length&&t[0].elementClass==JXG.OBJECT_CLASS_POINT&&t[1].elementClass==JXG.OBJECT_CLASS_POINT&&t[2].elementClass==JXG.OBJECT_CLASS_POINT)i=t[0],r=t[1],o=t[2];else if(t[0].elementClass==JXG.OBJECT_CLASS_POINT&&t[1].elementClass==JXG.OBJECT_CLASS_LINE)o=t[0],i=t[1].point1,r=t[1].point2;else{if(t[1].elementClass!=JXG.OBJECT_CLASS_POINT||t[0].elementClass!=JXG.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create parallel point with parent types '"+typeof t[0]+"', '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [line,point], [point,point,point]");o=t[1],i=t[0].point1,r=t[0].point2}return a=e.create("point",[function(){return o.coords.usrCoords[1]+r.coords.usrCoords[1]-i.coords.usrCoords[1]},function(){return o.coords.usrCoords[2]+r.coords.usrCoords[2]-i.coords.usrCoords[2]}],n),i.addChild(a),r.addChild(a),o.addChild(a),a.prepareUpdate().update(),a.generatePolynomial=function(){var e=i.symbolic.x,t=i.symbolic.y,n=r.symbolic.x,s=r.symbolic.y,l=o.symbolic.x,c=o.symbolic.y,u=a.symbolic.x,d=a.symbolic.y,h="("+s+")*("+u+")-("+s+")*("+l+")-("+t+")*("+u+")+("+t+")*("+l+")-("+d+")*("+n+")+("+d+")*("+e+")+("+c+")*("+n+")-("+c+")*("+e+")",p="("+d+")*("+e+")-("+d+")*("+l+")-("+s+")*("+e+")+("+s+")*("+l+")-("+u+")*("+t+")+("+u+")*("+c+")+("+n+")*("+t+")-("+n+")*("+c+")";return[h,p]},a},JXG.createParallel=function(e,t,n){var i,r,o,a;try{a=JXG.copyAttributes(n,e.options,"parallel","point"),r=JXG.createParallelPoint(e,t,a)}catch(s){throw Error("JSXGraph: Can't create parallel with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [line,point], [point,point,point]")}return i=null,3==t.length?i=t[2]:t[0].elementClass==JXG.OBJECT_CLASS_POINT?i=t[0]:t[1].elementClass==JXG.OBJECT_CLASS_POINT&&(i=t[1]),JXG.exists(n.layer)||(n.layer=e.options.layer.line),a=JXG.copyAttributes(n,e.options,"parallel"),o=e.create("line",[i,r],a),o.parallelpoint=r,o},JXG.createArrowParallel=function(e,t,n){try{return JXG.createParallel(e,t,n).setStraight(!1,!1).setArrow(!1,!0)}catch(i){throw Error("JSXGraph: Can't create arrowparallel with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [line,point], [point,point,point]")}},JXG.createNormal=function(e,t,n){var i,r;if(1==t.length)i=t[0],r=i.slideObject;else{if(2!=t.length)throw Error("JSXGraph: Can't create normal with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,line], [point,circle], [glider]");if(JXG.isPoint(t[0]))i=t[0],r=t[1];else{if(!JXG.isPoint(t[1]))throw Error("JSXGraph: Can't create normal with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,line], [point,circle], [glider]");r=t[0],i=t[1]}}if(r.elementClass==JXG.OBJECT_CLASS_LINE)return e.create("line",[function(){return r.stdform[1]*i.Y()-r.stdform[2]*i.X()},function(){return r.stdform[2]*i.Z()},function(){return-r.stdform[1]*i.Z()}],n);if(r.elementClass==JXG.OBJECT_CLASS_CIRCLE)return e.create("line",[r.midpoint,i],n);if(r.elementClass==JXG.OBJECT_CLASS_CURVE){if("plot"!=r.visProp.curvetype){var o=r.X,a=r.Y;return e.create("line",[function(){return-i.X()*e.D(o)(i.position)-i.Y()*e.D(a)(i.position)},function(){return e.D(o)(i.position)},function(){return e.D(a)(i.position)}],n)}return e.create("line",[function(){var e=Math.floor(i.position),t=i.position-e;return e==r.numberPoints-1&&(e--,t=1),0>e?1:(r.Y(e)+t*(r.Y(e+1)-r.Y(e)))*(r.Y(e)-r.Y(e+1))-(r.X(e)+t*(r.X(e+1)-r.X(e)))*(r.X(e+1)-r.X(e))},function(){var e=Math.floor(i.position);return e==r.numberPoints-1&&e--,0>e?0:r.X(e+1)-r.X(e)},function(){var e=Math.floor(i.position);return e==r.numberPoints-1&&e--,0>e?0:r.Y(e+1)-r.Y(e)}],n)}if(r.type==JXG.OBJECT_TYPE_TURTLE)return e.create("line",[function(){var e,t,n=Math.floor(i.position),o=i.position-n;for(t=0;r.objects.length>t;t++)if(e=r.objects[t],e.type==JXG.OBJECT_TYPE_CURVE){if(e.numberPoints>n)break;n-=e.numberPoints}return n==e.numberPoints-1&&(n--,o=1),0>n?1:(e.Y(n)+o*(e.Y(n+1)-e.Y(n)))*(e.Y(n)-e.Y(n+1))-(e.X(n)+o*(e.X(n+1)-e.X(n)))*(e.X(n+1)-e.X(n))},function(){var e,t,n=Math.floor(i.position);for(t=0;r.objects.length>t;t++)if(e=r.objects[t],e.type==JXG.OBJECT_TYPE_CURVE){if(e.numberPoints>n)break;n-=e.numberPoints}return n==e.numberPoints-1&&n--,0>n?0:e.X(n+1)-e.X(n)},function(){var e,t,n=Math.floor(i.position);for(t=0;r.objects.length>t;t++)if(e=r.objects[t],e.type==JXG.OBJECT_TYPE_CURVE){if(e.numberPoints>n)break;n-=e.numberPoints}return n==e.numberPoints-1&&n--,0>n?0:e.Y(n+1)-e.Y(n)}],n);throw Error("JSXGraph: Can't create normal with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,line], [point,circle], [glider]")},JXG.createBisector=function(e,t,n){var i,r,o,a;if(t[0].elementClass==JXG.OBJECT_CLASS_POINT&&t[1].elementClass==JXG.OBJECT_CLASS_POINT&&t[2].elementClass==JXG.OBJECT_CLASS_POINT){for(a=JXG.copyAttributes(n,e.options,"bisector","point"),i=e.create("point",[function(){return JXG.Math.Geometry.angleBisector(t[0],t[1],t[2],e)}],a),o=0;3>o;o++)t[o].addChild(i);return JXG.exists(n.layer)||(n.layer=e.options.layer.line),a=JXG.copyAttributes(n,e.options,"bisector"),r=JXG.createLine(e,[t[1],i],a)}throw Error("JSXGraph: Can't create angle bisector with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point,point]")},JXG.createAngularBisectorsOfTwoLines=function(e,t,n){var i,r,o,a,s=JXG.getReference(e,t[0]),l=JXG.getReference(e,t[1]);if(s.elementClass!=JXG.OBJECT_CLASS_LINE||l.elementClass!=JXG.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create angle bisectors of two lines with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [line,line]");return JXG.exists(n.layer)||(n.layer=e.options.layer.line),o=JXG.copyAttributes(n,e.options,"bisectorlines","line1"),i=e.create("line",[function(){var e=Math.sqrt(s.stdform[1]*s.stdform[1]+s.stdform[2]*s.stdform[2]),t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]);return s.stdform[0]/e-l.stdform[0]/t},function(){var e=Math.sqrt(s.stdform[1]*s.stdform[1]+s.stdform[2]*s.stdform[2]),t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]);return s.stdform[1]/e-l.stdform[1]/t},function(){var e=Math.sqrt(s.stdform[1]*s.stdform[1]+s.stdform[2]*s.stdform[2]),t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]);return s.stdform[2]/e-l.stdform[2]/t}],o),JXG.exists(n.layer)||(n.layer=e.options.layer.line),o=JXG.copyAttributes(n,e.options,"bisectorlines","line2"),r=e.create("line",[function(){var e=Math.sqrt(s.stdform[1]*s.stdform[1]+s.stdform[2]*s.stdform[2]),t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]);return s.stdform[0]/e+l.stdform[0]/t},function(){var e=Math.sqrt(s.stdform[1]*s.stdform[1]+s.stdform[2]*s.stdform[2]),t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]);return s.stdform[1]/e+l.stdform[1]/t},function(){var e=Math.sqrt(s.stdform[1]*s.stdform[1]+s.stdform[2]*s.stdform[2]),t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]);return s.stdform[2]/e+l.stdform[2]/t}],o),a=new JXG.Composition({line1:i,line2:r})},JXG.createCircumcircleMidpoint=function(e,t,n){var i,r;if(t[0].elementClass==JXG.OBJECT_CLASS_POINT&&t[1].elementClass==JXG.OBJECT_CLASS_POINT&&t[2].elementClass==JXG.OBJECT_CLASS_POINT){for(i=JXG.createPoint(e,[function(){return JXG.Math.Geometry.circumcenterMidpoint(t[0],t[1],t[2],e)}],n),r=0;3>r;r++)t[r].addChild(i);return i.generatePolynomial=function(){var e=a.symbolic.x,t=a.symbolic.y,n=b.symbolic.x,r=b.symbolic.y,o=c.symbolic.x,s=c.symbolic.y,l=i.symbolic.x,u=i.symbolic.y,d=["((",l,")-(",e,"))^2+((",u,")-(",t,"))^2-((",l,")-(",n,"))^2-((",u,")-(",r,"))^2"].join(""),h=["((",l,")-(",e,"))^2+((",u,")-(",t,"))^2-((",l,")-(",o,"))^2-((",u,")-(",s,"))^2"].join("");return[d,h]},i}throw Error("JSXGraph: Can't create circumcircle midpoint with parent types '"+typeof t[0]+"', '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point,point]")},JXG.createIncenter=function(e,t,n){var i,r,o,a;if(!(t.length>=3&&JXG.isPoint(t[0])&&JXG.isPoint(t[1])&&JXG.isPoint(t[2])))throw Error("JSXGraph: Can't create incenter with parent types '"+typeof t[0]+"', '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point,point]");return r=t[0],o=t[1],a=t[2],i=e.create("point",[function(){var t,n,i;return t=Math.sqrt((o.X()-a.X())*(o.X()-a.X())+(o.Y()-a.Y())*(o.Y()-a.Y())),n=Math.sqrt((r.X()-a.X())*(r.X()-a.X())+(r.Y()-a.Y())*(r.Y()-a.Y())),i=Math.sqrt((o.X()-r.X())*(o.X()-r.X())+(o.Y()-r.Y())*(o.Y()-r.Y())),new JXG.Coords(JXG.COORDS_BY_USER,[(t*r.X()+n*o.X()+i*a.X())/(t+n+i),(t*r.Y()+n*o.Y()+i*a.Y())/(t+n+i)],e)}],n),i},JXG.createCircumcircle=function(e,t,n){var i,r,o;try{o=JXG.copyAttributes(n,e.options,"circumcircle","point"),i=JXG.createCircumcircleMidpoint(e,t,o),JXG.exists(n.layer)||(n.layer=e.options.layer.circle),o=JXG.copyAttributes(n,e.options,"circumcircle"),r=JXG.createCircle(e,[i,t[0]],o)}catch(a){throw Error("JSXGraph: Can't create circumcircle with parent types '"+typeof t[0]+"', '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point,point]")}return r},JXG.createIncircle=function(e,t,n){var i,r,o;try{o=JXG.copyAttributes(n,e.options,"incircle","point"),i=JXG.createIncenter(e,t,o),JXG.exists(n.layer)||(n.layer=e.options.layer.circle),o=JXG.copyAttributes(n,e.options,"incircle"),r=JXG.createCircle(e,[i,function(){var e=Math.sqrt((t[1].X()-t[2].X())*(t[1].X()-t[2].X())+(t[1].Y()-t[2].Y())*(t[1].Y()-t[2].Y())),n=Math.sqrt((t[0].X()-t[2].X())*(t[0].X()-t[2].X())+(t[0].Y()-t[2].Y())*(t[0].Y()-t[2].Y())),i=Math.sqrt((t[1].X()-t[0].X())*(t[1].X()-t[0].X())+(t[1].Y()-t[0].Y())*(t[1].Y()-t[0].Y())),r=(e+n+i)/2;return Math.sqrt((r-e)*(r-n)*(r-i)/r)}],o)}catch(a){throw Error("JSXGraph: Can't create circumcircle with parent types '"+typeof t[0]+"', '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point,point]")}return r},JXG.createReflection=function(e,t,n){var i,r,o;if(t[0].elementClass==JXG.OBJECT_CLASS_POINT&&t[1].elementClass==JXG.OBJECT_CLASS_LINE)r=t[0],i=t[1];else{if(t[1].elementClass!=JXG.OBJECT_CLASS_POINT||t[0].elementClass!=JXG.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create reflection point with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [line,point]");r=t[1],i=t[0]}return o=JXG.createPoint(e,[function(){return JXG.Math.Geometry.reflection(i,r,e)}],n),r.addChild(o),i.addChild(o),o.prepareUpdate().update(),o.generatePolynomial=function(){var e=i.point1.symbolic.x,t=i.point1.symbolic.y,n=i.point2.symbolic.x,a=i.point2.symbolic.y,s=r.symbolic.x,l=r.symbolic.y,c=o.symbolic.x,u=o.symbolic.y,d=["((",u,")-(",l,"))*((",t,")-(",a,"))+((",e,")-(",n,"))*((",c,")-(",s,"))"].join(""),h=["((",c,")-(",e,"))^2+((",u,")-(",t,"))^2-((",s,")-(",e,"))^2-((",l,")-(",t,"))^2"].join("");return[d,h]},o},JXG.createMirrorPoint=function(e,t,n){var i,r;if(!JXG.isPoint(t[0])||!JXG.isPoint(t[1]))throw Error("JSXGraph: Can't create mirror point with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point]");for(i=JXG.createPoint(e,[function(){return JXG.Math.Geometry.rotation(t[0],t[1],Math.PI,e)}],n),r=0;2>r;r++)t[r].addChild(i);return i.prepareUpdate().update(),i},JXG.createIntegral=function(e,t,n){var i,r,o,a,s,l,c,u,d,h,p,f,g,m,v=0,b=0,y=1;if(JXG.isArray(t[0])&&t[1].elementClass==JXG.OBJECT_CLASS_CURVE)i=t[0],r=t[1];else{if(!JXG.isArray(t[1])||t[0].elementClass!=JXG.OBJECT_CLASS_CURVE)throw Error("JSXGraph: Can't create integral with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [[number|function,number|function],curve]");i=t[1],r=t[0]}return v=i[0],b=i[1],JXG.isFunction(v)?(a=v,s=function(){return r.yterm(a())},v=a()):(a=v,s=r.yterm(v)),JXG.isFunction(v)?(l=b,c=function(){return r.yterm(l())},b=l()):(l=b,c=r.yterm(b)),v>b&&(y=-1),o=JXG.copyAttributes(n,e.options,"integral","start"),u=e.create("glider",[a,s,r],o),JXG.isFunction(a)&&u.hideElement(),o=JXG.copyAttributes(n,e.options,"integral","startproject"),d=e.create("point",[function(){return u.X()},0],o),o=JXG.copyAttributes(n,e.options,"integral","end"),h=e.create("glider",[l,c,r],o),JXG.isFunction(l)&&h.hideElement(),o=JXG.copyAttributes(n,e.options,"integral","endproject"),p=e.create("point",[function(){return h.X()},0],o),o=JXG.copyAttributes(n,e.options,"integral"),o.withLabel!==!1&&(o=JXG.copyAttributes(n,e.options,"integral","text"),f=JXG.Math.Numerics.I([v,b],r.yterm),g=e.create("text",[function(){return h.X()+.2},function(){return h.Y()-.8},function(){var e=JXG.Math.Numerics.I([d.X(),p.X()],r.yterm);return"∫ = "+e.toFixed(4)}],o),u.addChild(g),h.addChild(g)),o=JXG.copyAttributes(n,e.options,"integral"),m=e.create("curve",[[0],[0]],o),m.updateDataArray=function(){var e,t,n,i,o;for(d.X()n;n++)r.points[n].usrCoords[1]>=i&&o>=r.points[n].usrCoords[1]&&(e.push(r.points[n].usrCoords[1]),t.push(r.points[n].usrCoords[2]));e.push(o),t.push(r.yterm(o)),e.push(o),t.push(0),e.push(i),t.push(0),this.dataX=e,this.dataY=t},u.addChild(m),h.addChild(m),m.baseLeft=d,m.baseRight=p,m.curveLeft=u,m.curveRight=h,m.label={content:g},m},JXG.createLocus=function(e,t,n){var i,r;if(!JXG.isArray(t)||1!=t.length||t[0].elementClass!=JXG.OBJECT_CLASS_POINT)throw Error("JSXGraph: Can't create locus with parent of type other than point.\nPossible parent types: [point]");return r=t[0],i=e.create("curve",[[null],[null]],n),i.dontCallServer=!1,i.updateDataArray=function(){if(!(i.board.mode>0)){var t=JXG.Math.Symbolic.generatePolynomials(e,r,!0).join("|");if(t!==i.spe){i.spe=t;var n=function(e,t,n,r){i.dataX=e,i.dataY=t,i.eq=n,i.ctime=r,i.generatePolynomial=function(e){return function(t){var n,i="("+t.symbolic.x+")",r="("+t.symbolic.y+")",o=[];for(n=0;e.length>n;n++)o[n]=e[n].replace(/\*\*/g,"^").replace(/x/g,i).replace(/y/g,r);return o}}(n)},o=JXG.Math.Symbolic.geometricLocusByGroebnerBase(e,r,n);n(o.datax,o.datay,o.polynomial,o.exectime)}}},i},JXG.createGrid=function(e,t,n){var i,r;return r=JXG.copyAttributes(n,e.options,"grid"),i=e.create("curve",[[null],[null]],r),e.options.grid.dash&&i.setProperty({dash:2}),i.updateDataArray=function(){var t,n=e.options.grid.gridX,r=e.options.grid.gridY,o=new JXG.Coords(JXG.COORDS_BY_SCREEN,[0,0],e),a=new JXG.Coords(JXG.COORDS_BY_SCREEN,[e.canvasWidth,e.canvasHeight],e);for(e.options.grid.hasGrid=!0,o.setCoordinates(JXG.COORDS_BY_USER,[Math.floor(o.usrCoords[1]/n)*n,Math.ceil(o.usrCoords[2]/r)*r]),a.setCoordinates(JXG.COORDS_BY_USER,[Math.ceil(a.usrCoords[1]/n)*n,Math.floor(a.usrCoords[2]/r)*r]),i.dataX=[],i.dataY=[],t=o.usrCoords[2];t>a.usrCoords[2]-r;t-=r)i.dataX.push(o.usrCoords[1],a.usrCoords[1],0/0),i.dataY.push(t,t,0/0);for(t=o.usrCoords[1];a.usrCoords[1]+n>t;t+=n)i.dataX.push(t,t,0/0),i.dataY.push(o.usrCoords[2],a.usrCoords[2],0/0)},i.hasPoint=function(){return!1},e.grids.push(i),i},JXG.JSXGraph.registerElement("arrowparallel",JXG.createArrowParallel),JXG.JSXGraph.registerElement("bisector",JXG.createBisector),JXG.JSXGraph.registerElement("bisectorlines",JXG.createAngularBisectorsOfTwoLines),JXG.JSXGraph.registerElement("circumcircle",JXG.createCircumcircle),JXG.JSXGraph.registerElement("circumcirclemidpoint",JXG.createCircumcircleMidpoint),JXG.JSXGraph.registerElement("circumcenter",JXG.createCircumcircleMidpoint),JXG.JSXGraph.registerElement("incenter",JXG.createIncenter),JXG.JSXGraph.registerElement("incircle",JXG.createIncircle),JXG.JSXGraph.registerElement("integral",JXG.createIntegral),JXG.JSXGraph.registerElement("midpoint",JXG.createMidpoint),JXG.JSXGraph.registerElement("mirrorpoint",JXG.createMirrorPoint),JXG.JSXGraph.registerElement("normal",JXG.createNormal),JXG.JSXGraph.registerElement("parallel",JXG.createParallel),JXG.JSXGraph.registerElement("parallelpoint",JXG.createParallelPoint),JXG.JSXGraph.registerElement("perpendicular",JXG.createPerpendicular),JXG.JSXGraph.registerElement("perpendicularpoint",JXG.createPerpendicularPoint),JXG.JSXGraph.registerElement("reflection",JXG.createReflection),JXG.JSXGraph.registerElement("locus",JXG.createLocus),JXG.JSXGraph.registerElement("grid",JXG.createGrid),JXG.Text=function(e,t,n,i){if(this.constructor(e,i,JXG.OBJECT_TYPE_TEXT,JXG.OBJECT_CLASS_OTHER),this.content=t,this.plaintext="",this.element=JXG.getRef(this.board,i.anchor)){var r;this.visProp.islabel?(r=this.element.getLabelAnchor(),this.relativeCoords=new JXG.Coords(JXG.COORDS_BY_SCREEN,[parseFloat(n[0]),parseFloat(n[1])],this.board)):(r=this.element.getTextAnchor(),this.relativeCoords=new JXG.Coords(JXG.COORDS_BY_USER,[parseFloat(n[0]),parseFloat(n[1])],this.board)),this.element.addChild(this),this.coords=new JXG.Coords(JXG.COORDS_BY_SCREEN,[this.relativeCoords.scrCoords[1]+r.scrCoords[1],this.relativeCoords.scrCoords[2]+r.scrCoords[2]],this.board),this.isDraggable=!0}else{JXG.isFunction(n[0])||JXG.isFunction(n[1])||(this.isDraggable=!0),this.X=JXG.createFunction(n[0],this.board,""),this.Y=JXG.createFunction(n[1],this.board,""),this.coords=new JXG.Coords(JXG.COORDS_BY_USER,[this.X(),this.Y()],this.board);var o="this.coords.setCoordinates(JXG.COORDS_BY_USER,[this.X(),this.Y()]);";this.updateCoords=Function("",o)}return"function"==typeof this.content?this.updateText=function(){this.plaintext=this.content()}:(this.content=JXG.isNumber(this.content)?this.content.toFixed(this.visProp.digits):this.visProp.useasciimathml?"'`"+this.content+"`'":this.generateTerm(this.content),this.updateText=Function("this.plaintext = "+this.content+";")),this.updateText(),this.id=this.board.setId(this,"T"),this.board.renderer.drawText(this),this.visProp.visible||this.board.renderer.hide(this),"string"==typeof this.content&&this.notifyParents(this.content),this.size=[1,1],this},JXG.Text.prototype=new JXG.GeometryElement,JXG.extend(JXG.Text.prototype,{hasPoint:function(e,t){var n=e-this.coords.scrCoords[1],i=this.coords.scrCoords[2]-t,r=this.board.options.precision.hasPoint;return n>=-r&&2*r>=n&&i>=-r&&2*r>=i?!0:!1},setText:function(e){return"function"==typeof e?this.updateText=function(){this.plaintext=e()}:(this.content=JXG.isNumber(e)?e.toFixed(this.visProp.digits):this.visProp.useasciimathml?"'`"+e+"`'":this.generateTerm(e),this.updateText=Function("this.plaintext = "+this.content+";")),this.updateText(),this.updateSize(),this},updateSize:function(){"html"==this.display&&"vml"!=this.board.renderer.type?this.size=[this.rendNode.offsetWidth,this.rendNode.offsetHeight]:"internal"==this.display&&"svg"==this.board.renderer.type?this.size=[this.rendNode.getBBox().width,this.rendNode.getBBox().height]:("vml"==this.board.renderer.type||"internal"==this.display&&"canvas"==this.board.renderer.type)&&(this.size=[.45*parseFloat(this.visProp.fontsize)*this.plaintext.length,.9*parseFloat(this.visProp.fontsize)])},getSize:function(){return this.size},setCoords:function(e,t){return this.X=function(){return e},this.Y=function(){return t},this.coords=new JXG.Coords(JXG.COORDS_BY_USER,[e,t],this.board),this},update:function(){var e;return this.needsUpdate&&(this.relativeCoords?this.visProp.islabel?(e=this.element.getLabelAnchor(),this.coords.setCoordinates(JXG.COORDS_BY_SCREEN,[this.relativeCoords.scrCoords[1]+e.scrCoords[1],this.relativeCoords.scrCoords[2]+e.scrCoords[2]])):(e=this.element.getTextAnchor(),this.coords.setCoordinates(JXG.COORDS_BY_USER,[this.relativeCoords.usrCoords[1]+e.usrCoords[1],this.relativeCoords.usrCoords[2]+e.usrCoords[2]])):this.updateCoords(),this.updateText(),this.updateSize(),this.updateTransform()),this},updateRenderer:function(){return this.needsUpdate&&(this.board.renderer.updateText(this),this.needsUpdate=!1),this},updateTransform:function(){if(0!=this.transformations.length)for(var e=0;this.transformations.length>e;e++)this.transformations[e].update()},generateTerm:function(e){var t,n,i='""';e=e||"",e=e.replace(/\r/g,""),e=e.replace(/\n/g,""),e=e.replace(/\"/g,'\\"'),e=e.replace(/\'/g,"\\'"),e=e.replace(/&arc;/g,"∠"),e=e.replace(//g,"∠"),e=e.replace(//g,"√");var r;r=e.indexOf("");var o=e.indexOf("");if(r>=0)for(;r>=0;)i+=' + "'+JXG.GeonextParser.replaceSub(JXG.GeonextParser.replaceSup(e.slice(0,r)))+'"',n=e.slice(r+7,o),t=JXG.GeonextParser.geonext2JS(n,this.board),t=t.replace(/\\"/g,'"'),t=t.replace(/\\'/g,"'"),i+=0>t.indexOf("toFixed")?JXG.isNumber(JXG.bind(Function("return "+t+";"),this)())?"+("+t+").toFixed("+this.visProp.digits+")":"+("+t+")":"+("+t+")",e=e.slice(o+8),r=e.indexOf(""),o=e.indexOf("");return i+=' + "'+JXG.GeonextParser.replaceSub(JXG.GeonextParser.replaceSup(e))+'"',i=i.replace(//g,""),i=i.replace(/<\/overline>/g,""),i=i.replace(//g,""),i=i.replace(/<\/arrow>/g,""),i=i.replace(/&/g,"&")},notifyParents:function(e){var t=null;do{var n=/([\w\s\*\/\^\-\+\(\)\[\],<>=!]+)<\/value>/;t=n.exec(e),null!=t&&(JXG.GeonextParser.findDependencies(this,t[1],this.board),e=e.substr(t.index),e=e.replace(n,""))}while(null!=t);return this},bounds:function(){var e=this.coords.usrCoords;return this.visProp.islabel?[0,0,0,0]:[e[1],e[2]+this.size[1],e[1]+this.size[0],e[2]]},setPositionDirectly:function(e,t,n,i,r){var o,a,s,l;return this.relativeCoords?this.visProp.islabel?(e==JXG.COORDS_BY_USER?(l=new JXG.Coords(JXG.COORDS_BY_USER,[i,r],this.board),s=new JXG.Coords(JXG.COORDS_BY_USER,[t,n],this.board),o=s.scrCoords[1]-l.scrCoords[1],a=s.scrCoords[2]-l.scrCoords[2]):(o=t-i,a=n-r),this.relativeCoords.scrCoords[1]+=o,this.relativeCoords.scrCoords[2]+=a):(e==JXG.COORDS_BY_SCREEN?(l=new JXG.Coords(JXG.COORDS_BY_SCREEN,[i,r],this.board),s=new JXG.Coords(JXG.COORDS_BY_SCREEN,[t,n],this.board),o=s.usrCoords[1]-l.usrCoords[1],a=s.usrCoords[2]-l.usrCoords[2]):(o=t-i,a=n-r),this.relativeCoords.usrCoords[1]+=o,this.relativeCoords.usrCoords[2]+=a):(e==JXG.COORDS_BY_SCREEN&&(s=new JXG.Coords(JXG.COORDS_BY_SCREEN,[t,n],this.board),t=s.usrCoords[1],n=s.usrCoords[2]),this.X=JXG.createFunction(t,this.board,""),this.Y=JXG.createFunction(n,this.board,"")),this}}),JXG.createText=function(e,t,n){var i;return i=JXG.copyAttributes(n,e.options,"text"),i.anchor=i.parent||i.anchor,new JXG.Text(e,t[t.length-1],t,i)},JXG.JSXGraph.registerElement("text",JXG.createText),JXG.Image=function(e,t,n,i,r){this.constructor(e,r,JXG.OBJECT_TYPE_IMAGE,JXG.OBJECT_CLASS_OTHER),this.initialCoords=new JXG.Coords(JXG.COORDS_BY_USER,n,this.board),JXG.isFunction(n[0])||JXG.isFunction(n[1])||(this.isDraggable=!0),this.X=JXG.createFunction(n[0],this.board,""),this.Y=JXG.createFunction(n[1],this.board,""),this.W=JXG.createFunction(i[0],this.board,""),this.H=JXG.createFunction(i[1],this.board,""),this.coords=new JXG.Coords(JXG.COORDS_BY_USER,[this.X(),this.Y()],this.board),this.updateCoords=Function("","this.coords.setCoordinates(JXG.COORDS_BY_USER,[this.X(),this.Y()]);"),this.updateSize=Function("","this.coords.setCoordinates(JXG.COORDS_BY_USER,[this.W(),this.H()]);"),this.usrSize=[this.W(),this.H()],this.size=[this.usrSize[0]*e.unitX,this.usrSize[1]*e.unitY],this.url=t,this.parent=JXG.getRef(r.anchor),this.id=this.board.setId(this,"Im"),this.board.renderer.drawImage(this),this.visProp.visible||this.board.renderer.hide(this)},JXG.Image.prototype=new JXG.GeometryElement,JXG.extend(JXG.Image.prototype,{hasPoint:function(e,t){var n=e-this.coords.scrCoords[1],i=this.coords.scrCoords[2]-t,r=this.board.options.precision.hasPoint;return n>=-r&&2*r>=n&&i>=-r&&r>=i?!0:!1},update:function(){return this.needsUpdate&&(this.updateCoords(),this.usrSize=[this.W(),this.H()],this.size=[this.usrSize[0]*this.board.unitX,this.usrSize[1]*this.board.unitY],this.updateTransform()),this},updateRenderer:function(){return this.needsUpdate&&(this.board.renderer.updateImage(this),this.needsUpdate=!1),this},updateTransform:function(){if(0!=this.transformations.length)for(var e=0;this.transformations.length>e;e++)this.transformations[e].update()},addTransform:function(e){if(JXG.isArray(e))for(var t=0;e.length>t;t++)this.transformations.push(e[t]);else this.transformations.push(e)},setPositionDirectly:function(e,t,n){var i;return e==JXG.COORDS_BY_SCREEN&&(i=new JXG.Coords(JXG.COORDS_BY_SCREEN,[t,n],this.board),t=i.usrCoords[1],n=i.usrCoords[2]),this.X=JXG.createFunction(t,this.board,""),this.Y=JXG.createFunction(n,this.board,""),this}}),JXG.createImage=function(e,t,n){var i;return i=JXG.copyAttributes(n,e.options,"image"),new JXG.Image(e,t[0],t[1],t[2],i)},JXG.JSXGraph.registerElement("image",JXG.createImage),JXG.createSlider=function(e,t,n){var i,r,o,a,s,l,c,u,d,h,p,f,g,m,v,b,y,x,w,k,C;return i=t[0],r=t[1],o=t[2][0],a=t[2][1],s=t[2][2],l=s-o,C=JXG.copyAttributes(n,e.options,"slider"),w=C.withticks,x=C.withlabel,k=C.snapwidth,precision=C.precision,C=JXG.copyAttributes(n,e.options,"slider","point1"),c=e.create("point",i,C),C=JXG.copyAttributes(n,e.options,"slider","point2"),u=e.create("point",r,C),e.create("group",[c,u]),C=JXG.copyAttributes(n,e.options,"slider","segment1"),d=e.create("segment",[c,u],C),d.updateStdform(),w&&(C=JXG.copyAttributes(n,e.options,"slider","ticks"),h=2,p=e.create("ticks",[d,u.Dist(c)/h],C)),f=i[0]+(r[0]-i[0])*(a-o)/(s-o),g=i[1]+(r[1]-i[1])*(a-o)/(s-o),C=JXG.copyAttributes(n,e.options,"slider","glider"),n.name&&""!=n.name&&(C.name=n.name),m=e.create("glider",[f,g,d],C),m.setProperty({snapwidth:k}),C=JXG.copyAttributes(n,e.options,"slider","segment2"),v=e.create("segment",[c,m],C),m.Value=function(){return this.position*l+o},m._smax=s,m._smin=o,x&&(b=n.name&&""!=n.name?n.name+" = ":"",C=JXG.copyAttributes(n,e.options,"slider","text"),y=e.create("text",[function(){return.05*(u.X()-c.X())+u.X()},function(){return.05*(u.Y()-c.Y())+u.Y()},function(){return b+m.Value().toFixed(precision)}],C),m.text=y),m.point1=c,m.point2=u,m.baseline=d,m.highline=v,w&&(m.ticks=p),m.remove=function(){x&&e.removeObject(y),e.removeObject(v),w&&d.removeTicks(p),e.removeObject(d),e.removeObject(u),e.removeObject(c),JXG.Point.prototype.remove.call(m)},m},JXG.JSXGraph.registerElement("slider",JXG.createSlider),JXG.Chart=function(e,t,n){this.constructor(e,n);var i,r,o,a,s,l;if(!JXG.isArray(t)||0===t.length)throw Error("JSXGraph: Can't create a chart without data");if(this.elements=[],JXG.isNumber(t[0]))for(r=t,i=[],o=0;r.length>o;o++)i[o]=o+1;else if(1===t.length&&JXG.isArray(t[0]))for(r=t[0],i=[],l=JXG.evaluate(r).length,o=0;l>o;o++)i[o]=o+1;else 2===t.length&&(l=Math.min(t[0].length,t[1].length),i=t[0].slice(0,l),r=t[1].slice(0,l));if(JXG.isArray(r)&&0===r.length)throw Error("JSXGraph: Can't create charts without data.");for(s=n.chartstyle.replace(/ /g,"").split(","),o=0;s.length>o;o++){switch(s[o]){case"bar":a=this.drawBar(e,i,r,n);break;case"line":a=this.drawLine(e,i,r,n);break;case"fit":a=this.drawFit(e,i,r,n);break;case"spline":a=this.drawSpline(e,i,r,n);break;case"pie":a=this.drawPie(e,r,n);break;case"point":a=this.drawPoints(e,i,r,n);break;case"radar":a=this.drawRadar(e,t,n)}this.elements.push(a)}return this.id=this.board.setId(this,"Chart"),this.elements},JXG.Chart.prototype=new JXG.GeometryElement,JXG.extend(JXG.Chart.prototype,{drawLine:function(e,t,n,i){return i.fillcolor="none",i.highlightfillcolor="none",e.create("curve",[t,n],i)},drawSpline:function(e,t,n,i){return i.fillColor="none",i.highlightfillcolor="none",e.create("spline",[t,n],i)},drawFit:function(e,t,n,i){var r=i.degree;return r=!JXG.exists(r)||0/0==parseInt(r)||1>parseInt(r)?1:parseInt(r),i.fillcolor="none",i.highlightfillcolor="none",e.create("functiongraph",[JXG.Math.Numerics.regressionPolynomial(r,t,n)],i)},drawBar:function(e,t,n,i){var r,o,a,s,l,c,u,d,h,p,f,g=[],m=[],v={fixed:!0,withLabel:!1,visible:!1,name:""};if(JXG.exists(i.fillopacity)||(i.fillopacity=.6),i&&i.width)c=i.width;else{if(1>=t.length)c=1;else for(c=t[1]-t[0],r=1;t.length-1>r;r++)c=c>t[r+1]-t[r]?t[r+1]-t[r]:c;c*=.8}for(a=i.fillcolor,s=parseFloat(e.options.text.fontSize),r=0;t.length>r;r++)isNaN(JXG.evaluate(t[r]))||isNaN(n[r]),JXG.isFunction(t[r])?(u=function(){return t[r]()-.5*c},d=function(){return t[r]()},h=function(){return t[r]()+.5*c}):(u=t[r]-.5*c,d=t[r],h=t[r]+.5*c),p=n[r],"horizontal"==i.dir?(m[0]=e.create("point",[0,u],v),m[1]=e.create("point",[p,u],v),m[2]=e.create("point",[p,h],v),m[3]=e.create("point",[0,h],v),JXG.exists(i.labels)&&JXG.exists(i.labels[r])&&(o=(""+i.labels[r]).length,o=2*o*s/e.unitX,p>=0?p+=.5*s/e.unitX:p-=s*o/e.unitX,d-=.2*s/e.unitY,l=e.create("text",[p,d,i.labels[r]],i))):(m[0]=e.create("point",[u,0],v),m[1]=e.create("point",[u,p],v),m[2]=e.create("point",[h,p],v),m[3]=e.create("point",[h,0],v),JXG.exists(i.labels)&&JXG.exists(i.labels[r])&&(o=(""+i.labels[r]).length,o=.6*o*s/e.unitX,p>=0?p+=.5*s/e.unitY:p-=1*s/e.unitY,l=e.create("text",[d-.5*o,p,i.labels[r]],i))),i.withlines=!1,JXG.exists(i.colors)&&JXG.isArray(i.colors)&&(f=i.colors,i.fillcolor=f[r%f.length]),g[r]=e.create("polygon",m,i),JXG.exists(i.labels)&&JXG.exists(i.labels[r])&&(g[r].text=l);return g},drawPoints:function(e,t,n,i){var r,o=[],a=i.infoboxarray;for(i.fixed=!0,i.name="",r=0;t.length>r;r++)i.infoboxtext=a?a[r%a.length]:!1,o[r]=e.create("point",[t[r],n[r]],i);return o},drawPie:function(e,t,n){var i,r,o=[],a=[],s=(JXG.Math.Statistics.sum(t),n.colors),l=n.highlightcolors,c=n.labels,u=n.radius||4,d=u,h=n.center||[0,0],p=h[0],f=h[1],g={fixed:!0,withLabel:!1,visible:!1,name:""};if(!JXG.isArray(c))for(c=[],i=0;t.length>i;i++)c[i]="";for(JXG.isFunction(u)||(d=function(){return u}),n.highlightonsector=n.highlightonsector||!1,n.straightfirst=!1,n.straightlast=!1,r=e.create("point",[p,f],g),o[0]=e.create("point",[function(){return d()+p},function(){return f}],g),i=0;t.length>i;i++)o[i+1]=e.create("point",[function(e){return function(){var n,i,r,o=0;for(i=0;e>=i;i++)o+=parseFloat(JXG.evaluate(t[i]));
for(n=o,i=e+1;t.length>i;i++)n+=parseFloat(JXG.evaluate(t[i]));return r=0!=n?2*Math.PI*o/n:0,d()*Math.cos(r)+p}}(i),function(e){return function(){var n,i,r,o=0;for(i=0;e>=i;i++)o+=parseFloat(JXG.evaluate(t[i]));for(n=o,i=e+1;t.length>i;i++)n+=parseFloat(JXG.evaluate(t[i]));return r=0!=n?2*Math.PI*o/n:0,d()*Math.sin(r)+f}}(i)],g),n.name=c[i],n.withlabel=""!=n.name,n.fillcolor=s&&s[i%s.length],n.labelcolor=s&&s[i%s.length],n.highlightfillcolor=l&&l[i%l.length],a[i]=e.create("sector",[r,o[i],o[i+1]],n),n.highlightonsector&&(a[i].hasPoint=a[i].hasPointSector),n.highlightbysize&&(a[i].highlight=function(){this.board.renderer.highlight(this);var e=-this.point1.coords.usrCoords[1]+this.point2.coords.usrCoords[1],t=-this.point1.coords.usrCoords[2]+this.point2.coords.usrCoords[2];null!=this.label.content&&(this.label.content.rendNode.style.fontSize=2*this.board.options.text.fontSize+"px"),this.point2.coords=new JXG.Coords(JXG.COORDS_BY_USER,[this.point1.coords.usrCoords[1]+1.1*e,this.point1.coords.usrCoords[2]+1.1*t],this.board),this.prepareUpdate().update().updateRenderer()},a[i].noHighlight=function(){this.board.renderer.noHighlight(this);var e=-this.point1.coords.usrCoords[1]+this.point2.coords.usrCoords[1],t=-this.point1.coords.usrCoords[2]+this.point2.coords.usrCoords[2];null!=this.label.content&&(this.label.content.rendNode.style.fontSize=this.board.options.text.fontSize+"px"),this.point2.coords=new JXG.Coords(JXG.COORDS_BY_USER,[this.point1.coords.usrCoords[1]+e/1.1,this.point1.coords.usrCoords[2]+t/1.1],this.board),this.prepareUpdate().update().updateRenderer()});return{sectors:a,points:o,midpoint:r}},drawRadar:function(e,t,n){var i,r,o,a,s,l,c,u,d,h,p,f,g,m,v,b,y,x,w,k,C,_,T,E,S,A,I,O,L,D,R,P,M,N,B,F,j,z,G,H,X,$=t.length;if(0>=$)return JXG.debug("No data"),void 0;if(o=n.paramarray,!JXG.exists(o))return JXG.debug("Need paramArray attribute"),void 0;if(a=o.length,1>=a)return JXG.debug("Need more than 1 param"),void 0;for(i=0;$>i;i++)if(a!=t[i].length)return JXG.debug("Use data length equal to number of params ("+t[i].length+" != "+a+")"),void 0;for(s=Array(a),l=Array(a),r=0;a>r;r++)s[r]=t[0][r],l[r]=s[r];for(i=1;$>i;i++)for(r=0;a>r;r++)t[i][r]>s[r]&&(s[r]=t[i][r]),t[i][r]i;i++)c[i]="",u[i]=[];for(d=Array(a),h=Array(a),p=n.startshiftratio||0,f=n.endshiftratio||0,i=0;a>i;i++)d[i]=(s[i]-l[i])*p,h[i]=(s[i]-l[i])*f;if(g=n.startshiftarray||d,m=n.endshiftarray||h,v=n.startarray||l,JXG.exists(n.start))for(i=0;a>i;i++)v[i]=n.start;if(b=n.endarray||s,JXG.exists(n.end))for(i=0;a>i;i++)b[i]=n.end;if(g.length!=a)return JXG.debug("Start shifts length is not equal to number of parameters"),void 0;if(m.length!=a)return JXG.debug("End shifts length is not equal to number of parameters"),void 0;if(v.length!=a)return JXG.debug("Starts length is not equal to number of parameters"),void 0;if(b.length!=a)return JXG.debug("Ends length is not equal to number of parameters"),void 0;y=n.labelarray||c,x=n.colors,w=n.highlightcolors,k=n.radius||10,C={},JXG.exists(n.highlightonsector)||(n.highlightonsector=!1),C.name=n.name,C.id=n.id,C.strokewidth=n.strokewidth||1,C.polystrokewidth=n.polystrokewidth||2*C.strokewidth,C.strokecolor=n.strokecolor||"black",C.straightfirst=!1,C.straightlast=!1,C.fillcolor=n.fillcolor||"#FFFF88",C.fillopacity=n.fillopacity||.4,C.highlightfillcolor=n.highlightfillcolor||"#FF7400",C.highlightstrokecolor=n.highlightstrokecolor||"black",C.gradient=n.gradient||"none",_=n.center||[0,0],T=_[0],E=_[1],S=e.create("point",[T,E],{name:"",fixed:!0,withlabel:!1,visible:!1}),A=Math.PI/2-Math.PI/a,(n.startangle||0===n.startangle)&&(A=n.startangle),I=A,O=[],L=[];var J=function(){var e,t,n,i,r=[].concat(this.labelOffsets);return e=this.point1.X(),t=this.point2.X(),n=this.point1.Y(),i=this.point2.Y(),e>t&&(r[0]=-r[0]),n>i&&(r[1]=-r[1]),this.setLabelRelativeCoords(r),new JXG.Coords(JXG.COORDS_BY_USER,[this.point2.X(),this.point2.Y()],this.board)},W=function(t,n){var i,r,o;return i=e.create("transform",[-(v[n]-g[n]),0],{type:"translate"}),r=e.create("transform",[k/(b[n]+m[n]-(v[n]-g[n])),1],{type:"scale"}),i.melt(r),o=e.create("transform",[t],{type:"rotate"}),i.melt(o),i};for(i=0;a>i;i++)for(I+=2*Math.PI/a,R=k*Math.cos(I)+T,P=k*Math.sin(I)+E,O[i]=e.create("point",[R,P],{name:"",fixed:!0,withlabel:!1,visible:!1}),L[i]=e.create("line",[S,O[i]],{name:o[i],strokeColor:C.strokecolor,strokeWidth:C.strokewidth,strokeOpacity:1,straightFirst:!1,straightLast:!1,withLabel:!0,highlightStrokeColor:C.highlightstrokecolor}),L[i].getLabelAnchor=J,D=W(I,i),r=0;t.length>r;r++){var K=t[r][i];u[r][i]=e.create("point",[K,0],{name:"",fixed:!0,withlabel:!1,visible:!1}),u[r][i].addTransform(u[r][i],D)}for(M=Array($),i=0;$>i;i++)for(C.labelcolor=x&&x[i%x.length],C.strokecolor=x&&x[i%x.length],C.fillcolor=x&&x[i%x.length],M[i]=e.create("polygon",u[i],{withLines:!0,withLabel:!1,fillColor:C.fillcolor,fillOpacity:C.fillopacity}),r=0;a>r;r++)M[i].borders[r].setProperty("strokecolor:"+x[i%x.length]),M[i].borders[r].setProperty("strokewidth:"+C.polystrokewidth);switch(N=n.legendposition||"none"){case"right":var U=n.legendleftoffset||2,V=n.legendtopoffset||1;this.legend=e.create("legend",[T+k+U,E+k-V],{labelArray:y,colorArray:x});break;case"none":break;default:JXG.debug("Unknown legend position")}if(B=[],0!=n.showcircles){for(F=[],i=0;6>i;i++)F[i]=20*i;if(F[0]="0",j=n.circlelabelarray||F,z=j.length,2>z)return alert("Too less circles"),void 0;for(G=[],H=A+Math.PI/a,D=W(H,0),C.fillcolor="none",C.highlightfillcolor="none",C.strokecolor=n.strokecolor||"black",C.strokewidth=n.circlestrokewidth||.5,X=(b[0]-v[0])/(z-1),i=0;z>i;i++)G[i]=e.create("point",[v[0]+i*X,0],{name:j[i],size:0,withLabel:!0,visible:!0}),G[i].addTransform(G[i],D),B[i]=e.create("circle",[S,G[i]],C)}return this.rendNode=M[0].rendNode,{circles:B,lines:L,points:u,midpoint:S,polygons:M}},updateRenderer:function(){return this},update:function(){return this.needsUpdate&&this.updateDataArray(),this},updateDataArray:function(){}}),JXG.createChart=function(e,t,n){if(1==t.length&&"string"==typeof t[0]){var i,r,o,a,s,l,c,u,d,h,p,f,g,m,v,b,y=document.getElementById(t[0]),x=[];if(JXG.exists(y)){if(b=JXG.copyAttributes(n,e.options,"chart"),y=(new JXG.DataSource).loadFromTable(t[0],b.withheaders,b.withheaders),i=y.data,s=y.columnHeaders,r=y.rowHeaders,d=b.width,h=b.name,p=b.strokecolor,f=b.fillcolor,g=b.highlightstrokecolor,m=b.highlightfillcolor,e.suspendUpdate(),v=i.length,u=[],b.rows&&JXG.isArray(b.rows)){for(o=0;v>o;o++)for(a=0;b.rows.length>a;a++)if(b.rows[a]==o||b.withheaders&&b.rows[a]==r[o]){u.push(i[o]);break}}else u=i;for(v=u.length,o=0;v>o;o++){if(c=[],b.chartstyle&&-1!=b.chartstyle.indexOf("bar")){for(l=d?d:.8,c.push(1-l/2+(o+.5)*l/(1*v)),a=1;u[o].length>a;a++)c.push(c[a-1]+1);b.width=l/(1*v)}h&&h.length==v?b.name=h[o]:b.withheaders&&(b.name=s[o]),b.strokecolor=p&&p.length==v?p[o]:JXG.hsv2rgb(360*((o+1)/(1*v)),.9,.6),b.fillcolor=f&&f.length==v?f[o]:JXG.hsv2rgb(360*((o+1)/(1*v)),.9,1),b.highlightstrokecolor=g&&g.length==v?g[o]:JXG.hsv2rgb(360*((o+1)/(1*v)),.9,1),b.highlightfillcolor=m&&m.length==v?m[o]:JXG.hsv2rgb(360*((o+1)/(1*v)),.9,.6),b.chartstyle&&-1!=b.chartstyle.indexOf("bar")?x.push(new JXG.Chart(e,[c,u[o]],b)):x.push(new JXG.Chart(e,[u[o]],b))}e.unsuspendUpdate()}return x}return b=JXG.copyAttributes(n,e.options,"chart"),new JXG.Chart(e,t,b)},JXG.JSXGraph.registerElement("chart",JXG.createChart),JXG.Legend=function(e,t,n){var i;switch(this.constructor(),i=JXG.copyAttributes(n,e.options,"legend"),this.board=e,this.coords=new JXG.Coords(JXG.COORDS_BY_USER,t,this.board),this.myAtts={},this.label_array=i.labelarray||i.labels,this.color_array=i.colorarray||i.colors,this.lines=[],this.myAtts.strokewidth=i.strokewidth||5,this.myAtts.straightfirst=!1,this.myAtts.straightlast=!1,this.myAtts.withlabel=!0,this.style=i.legendstyle||i.style,this.style){case"vertical":this.drawVerticalLegend(e,i);break;default:throw Error("JSXGraph: Unknown legend style: "+this.style)}},JXG.Legend.prototype=new JXG.GeometryElement,JXG.Legend.prototype.drawVerticalLegend=function(e,t){var n,i=t.linelength||1,r=(t.rowheight||20)/this.board.unitY;for(n=0;this.label_array.length>n;n++)this.myAtts.strokecolor=this.color_array[n],this.myAtts.highlightstrokecolor=this.color_array[n],this.myAtts.name=this.label_array[n],this.myAtts.labeloffsets=[10,0],this.lines[n]=e.create("line",[[this.coords.usrCoords[1],this.coords.usrCoords[2]-n*r],[this.coords.usrCoords[1]+i,this.coords.usrCoords[2]-n*r]],this.myAtts),this.lines[n].getLabelAnchor=function(){return this.setLabelRelativeCoords(this.labelOffsets),new JXG.Coords(JXG.COORDS_BY_USER,[this.point2.X(),this.point2.Y()],this.board)}},JXG.createLegend=function(e,t,n){var i=[0,0];return JXG.exists(t)&&2==t.length&&(i=t),new JXG.Legend(e,i,n)},JXG.JSXGraph.registerElement("legend",JXG.createLegend),JXG.Transformation=function(e,t,n){this.elementClass=JXG.OBJECT_CLASS_OTHER,this.matrix=[[1,0,0],[0,1,0],[0,0,1]],this.board=e,this.isNumericMatrix=!1,this.setMatrix(e,t,n)},JXG.Transformation.prototype={},JXG.extend(JXG.Transformation.prototype,{update:function(){return this},setMatrix:function(e,t,n){var i;for(this.isNumericMatrix=!0,i=0;n.length>i;i++)if("number"!=typeof n[i]){this.isNumericMatrix=!1;break}"translate"==t?(this.evalParam=JXG.createEvalFunction(e,n,2),this.update=function(){this.matrix[1][0]=this.evalParam(0),this.matrix[2][0]=this.evalParam(1)}):"scale"==t?(this.evalParam=JXG.createEvalFunction(e,n,2),this.update=function(){this.matrix[1][1]=this.evalParam(0),this.matrix[2][2]=this.evalParam(1)}):"reflect"==t?(4>n.length&&(n[0]=JXG.getReference(e,n[0])),2==n.length&&(n[1]=JXG.getReference(e,n[1])),4==n.length&&(this.evalParam=JXG.createEvalFunction(e,n,4)),this.update=function(){var e,t,i,r,o;1==n.length?(e=n[0].point2.X()-n[0].point1.X(),t=n[0].point2.Y()-n[0].point1.Y(),i=n[0].point1.X(),r=n[0].point1.Y()):2==n.length?(e=n[1].X()-n[0].X(),t=n[1].Y()-n[0].Y(),i=n[0].X(),r=n[0].Y()):4==n.length&&(e=this.evalParam(2)-this.evalParam(0),t=this.evalParam(3)-this.evalParam(1),i=this.evalParam(0),r=this.evalParam(1)),o=e*e+t*t,this.matrix[1][1]=(e*e-t*t)/o,this.matrix[1][2]=2*e*t/o,this.matrix[2][1]=2*e*t/o,this.matrix[2][2]=(-e*e+t*t)/o,this.matrix[1][0]=i*(1-this.matrix[1][1])-r*this.matrix[1][2],this.matrix[2][0]=r*(1-this.matrix[2][2])-i*this.matrix[2][1]}):"rotate"==t?(3==n.length?this.evalParam=JXG.createEvalFunction(e,n,3):2>=n.length&&(this.evalParam=JXG.createEvalFunction(e,n,1),2==n.length&&(n[1]=JXG.getReference(e,n[1]))),this.update=function(){var e,t,i=this.evalParam(0),r=Math.cos(i),o=Math.sin(i);this.matrix[1][1]=r,this.matrix[1][2]=-o,this.matrix[2][1]=o,this.matrix[2][2]=r,n.length>1&&(3==n.length?(e=this.evalParam(1),t=this.evalParam(2)):(e=n[1].X(),t=n[1].Y()),this.matrix[1][0]=e*(1-r)+t*o,this.matrix[2][0]=t*(1-r)-e*o)}):"shear"==t?(this.evalParam=JXG.createEvalFunction(e,n,1),this.update=function(){var e=this.evalParam(0);this.matrix[1][1]=Math.tan(e)}):"generic"==t&&(this.evalParam=JXG.createEvalFunction(e,n,9),this.update=function(){this.matrix[0][0]=this.evalParam(0),this.matrix[0][1]=this.evalParam(1),this.matrix[0][2]=this.evalParam(2),this.matrix[1][0]=this.evalParam(3),this.matrix[1][1]=this.evalParam(4),this.matrix[1][2]=this.evalParam(5),this.matrix[2][0]=this.evalParam(6),this.matrix[2][1]=this.evalParam(7),this.matrix[2][2]=this.evalParam(8)})},apply:function(e){return this.update(),null!=arguments[1]?JXG.Math.matVecMult(this.matrix,e.initialCoords.usrCoords):JXG.Math.matVecMult(this.matrix,e.coords.usrCoords)},applyOnce:function(e){var t,n,i;if(JXG.isArray(e))for(n=e.length,i=0;n>i;i++)this.update(),t=JXG.Math.matVecMult(this.matrix,e[i].coords.usrCoords),e[i].coords.setCoordinates(JXG.COORDS_BY_USER,[t[1],t[2]]);else this.update(),t=JXG.Math.matVecMult(this.matrix,e.coords.usrCoords),e.coords.setCoordinates(JXG.COORDS_BY_USER,[t[1],t[2]])},bindTo:function(e){var t,n;if(JXG.isArray(e))for(n=e.length,t=0;n>t;t++)e[t].transformations.push(this);else e.transformations.push(this)},setProperty:function(){},melt:function(e){var t,n,i,r,o,a,s=[];for(n=e.matrix.length,i=this.matrix[0].length,t=0;n>t;t++)s[t]=[];for(this.update(),e.update(),t=0;n>t;t++)for(a=0;i>a;a++){for(o=0,r=0;n>r;r++)o+=e.matrix[t][r]*this.matrix[r][a];s[t][a]=o}return this.update=function(){var e=this.matrix.length,n=this.matrix[0].length;for(t=0;e>t;t++)for(a=0;n>a;a++)this.matrix[t][a]=s[t][a]},!0}}),JXG.createTransform=function(e,t,n){return new JXG.Transformation(e,n.type,t)},JXG.JSXGraph.registerElement("transform",JXG.createTransform),JXG.Turtle=function(e,t,n){this.constructor(e,n,JXG.OBJECT_TYPE_TURTLE,JXG.OBJECT_CLASS_OTHER);var i,r,o;return this.turtleIsHidden=!1,this.board=e,this.attributes=JXG.checkAttributes(n,{withLabel:!1,layer:null}),this.attributes.straightFirst=!1,this.attributes.straightLast=!1,i=0,r=0,o=90,0!=t.length&&(3==t.length?(i=t[0],r=t[1],o=t[2]):2==t.length?JXG.isArray(t[0])?(i=t[0][0],r=t[0][1],o=t[1]):(i=t[0],r=t[1]):(i=t[0][0],r=t[0][1])),this.init(i,r,o),this},JXG.Turtle.prototype=new JXG.GeometryElement,JXG.extend(JXG.Turtle.prototype,{init:function(e,t,n){this.arrowLen=20/Math.sqrt(this.board.unitX*this.board.unitX+this.board.unitY*this.board.unitY),this.pos=[e,t],this.isPenDown=!0,this.dir=90,this.stack=[],this.objects=[],this.attributes.curveType="plot",this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this.attributes),this.objects.push(this.curve),this.turtle=this.board.create("point",this.pos,{fixed:!0,name:" ",visible:!1,withLabel:!1}),this.objects.push(this.turtle),this.turtle2=this.board.create("point",[this.pos[0],this.pos[1]+this.arrowLen],{fixed:!0,name:" ",visible:!1,withLabel:!1}),this.objects.push(this.turtle2);var i=this.attributes.strokeWidth||this.attributes.strokewidth||2;this.arrow=this.board.create("line",[this.turtle,this.turtle2],{strokeColor:"#ff0000",straightFirst:!1,straightLast:!1,strokeWidth:i,withLabel:!1,lastArrow:!0}),this.objects.push(this.arrow),this.right(90-n),this.board.update()},forward:function(e){if(0===e)return this;var t=e*Math.cos(this.dir*Math.PI/180),n=e*Math.sin(this.dir*Math.PI/180);if(!this.turtleIsHidden){var i=this.board.create("transform",[t,n],{type:"translate"});i.applyOnce(this.turtle),i.applyOnce(this.turtle2)}return this.isPenDown&&this.curve.dataX.length>=8192&&(this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this.attributes),this.objects.push(this.curve)),this.pos[0]+=t,this.pos[1]+=n,this.isPenDown&&(this.curve.dataX.push(this.pos[0]),this.curve.dataY.push(this.pos[1])),this.board.update(),this},back:function(e){return this.forward(-e)},right:function(e){if(this.dir-=e,this.dir%=360,!this.turtleIsHidden){var t=this.board.create("transform",[-e*Math.PI/180,this.turtle],{type:"rotate"});t.applyOnce(this.turtle2)}return this.board.update(),this},left:function(e){return this.right(-e)},penUp:function(){return this.isPenDown=!1,this},penDown:function(){return this.isPenDown=!0,this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this.attributes),this.objects.push(this.curve),this},clean:function(){for(var e=0;this.objects.length>e;e++){var t=this.objects[e];t.type==JXG.OBJECT_TYPE_CURVE&&(this.board.removeObject(t.id),this.objects.splice(e,1))}return this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this.attributes),this.objects.push(this.curve),this.board.update(),this},clearScreen:function(){for(var e=0;this.objects.length>e;e++){var t=this.objects[e];this.board.removeObject(t.id)}return this.init(0,0,90),this},setPos:function(e,t){if(this.pos=JXG.isArray(e)?e:[e,t],!this.turtleIsHidden){this.turtle.setPositionDirectly(JXG.COORDS_BY_USER,e,t),this.turtle2.setPositionDirectly(JXG.COORDS_BY_USER,e,t+this.arrowLen);var n=this.board.create("transform",[-(this.dir-90)*Math.PI/180,this.turtle],{type:"rotate"});n.applyOnce(this.turtle2)}return this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this.attributes),this.objects.push(this.curve),this.board.update(),this},setPenSize:function(e){return this.attributes.strokeWidth=e,this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this.attributes),this.objects.push(this.curve),this},setPenColor:function(e){return this.attributes.strokeColor=e,this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this.attributes),this.objects.push(this.curve),this},setHighlightPenColor:function(e){return this.attributes.highlightStrokeColor=e,this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this.attributes),this.objects.push(this.curve),this},setProperty:function(){var e,t,n,i,r;for(n=0;arguments.length>n;n++){if(t=arguments[n],"string"==typeof t)e=t.split(":");else{if(!JXG.isArray(t)){for(var r in t)this.setProperty([r,t[r]]);return this}e=t}this.attributes[e[0]]=e[1]}for(n=0;this.objects.length>n;n++)i=this.objects[n],i.type==JXG.OBJECT_TYPE_CURVE&&i.setProperty(this.attributes);return this},showTurtle:function(){return this.turtleIsHidden=!1,this.arrow.setProperty("visible:true"),this.setPos(this.pos[0],this.pos[1]),this.board.update(),this},hideTurtle:function(){return this.turtleIsHidden=!0,this.arrow.setProperty("visible:false"),this.setPos(this.pos[0],this.pos[1]),this.board.update(),this},home:function(){return this.pos=[0,0],this.setPos(this.pos[0],this.pos[1]),this},pushTurtle:function(){return this.stack.push([this.pos[0],this.pos[1],this.dir]),this},popTurtle:function(){var e=this.stack.pop();return this.pos[0]=e[0],this.pos[1]=e[1],this.dir=e[2],this.setPos(this.pos[0],this.pos[1]),this},lookTo:function(e){if(JXG.isArray(e)){var t,n=this.pos[0],i=this.pos[1],r=e[0],o=e[1];t=Math.atan2(o-i,r-n),this.right(this.dir-180*t/Math.PI)}else JXG.isNumber(e)&&this.right(this.dir-e);return this},moveTo:function(e){if(JXG.isArray(e)){var t=e[0]-this.pos[0],n=e[1]-this.pos[1];if(!this.turtleIsHidden){var i=this.board.create("transform",[t,n],{type:"translate"});i.applyOnce(this.turtle),i.applyOnce(this.turtle2)}this.isPenDown&&this.curve.dataX.length>=8192&&(this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this.attributes),this.objects.push(this.curve)),this.pos[0]=e[0],this.pos[1]=e[1],this.isPenDown&&(this.curve.dataX.push(this.pos[0]),this.curve.dataY.push(this.pos[1])),this.board.update()}return this},fd:function(e){return this.forward(e)},bk:function(e){return this.back(e)},lt:function(e){return this.left(e)},rt:function(e){return this.right(e)},pu:function(){return this.penUp()},pd:function(){return this.penDown()},ht:function(){return this.hideTurtle()},st:function(){return this.showTurtle()},cs:function(){return this.clearScreen()},push:function(){return this.pushTurtle()},pop:function(){return this.popTurtle()},X:function(){return this.pos[0]},Y:function(){return this.pos[1]},hasPoint:function(e,t){var n,i;for(n=0;this.objects.length>n;n++)if(i=this.objects[n],i.type==JXG.OBJECT_TYPE_CURVE&&i.hasPoint(e,t))return!0;return!1}}),JXG.createTurtle=function(e,t,n){return t=t||[],new JXG.Turtle(e,t,n)},JXG.JSXGraph.registerElement("turtle",JXG.createTurtle),JXG.rgbParser=function(){if(0==arguments.length)return[0,0,0];arguments.length>=3&&(arguments[0]=[arguments[0],arguments[1],arguments[2]],arguments.length=1);var e=arguments[0];if(JXG.isArray(e)){var t,n=!1;for(t=0;3>t;t++)n|=/\./.test(""+arguments[0][t]);for(t=0;3>t;t++)n&=arguments[0][t]>=0&1>=arguments[0][t];return n?[Math.ceil(255*arguments[0][0]),Math.ceil(255*arguments[0][1]),Math.ceil(255*arguments[0][2])]:(arguments[0].length=3,arguments[0])}"string"==typeof arguments[0]&&(e=arguments[0]);var i,r,o;"#"==e.charAt(0)&&(e=e.substr(1,6)),e=e.replace(/ /g,""),e=e.toLowerCase();var a={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"};for(var s in a)e==s&&(e=a[s]);for(var l=[{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function(e){return[parseInt(e[1]),parseInt(e[2]),parseInt(e[3])]}},{re:/^(\w{2})(\w{2})(\w{2})$/,example:["#00ff00","336699"],process:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}}],t=0;l.length>t;t++){var c,u=l[t].re,d=l[t].process,h=u.exec(e);h&&(c=d(h),i=c[0],r=c[1],o=c[2])}return i=0>i||isNaN(i)?0:i>255?255:i,r=0>r||isNaN(r)?0:r>255?255:r,o=0>o||isNaN(o)?0:o>255?255:o,[i,r,o]},JXG.rgb2css=function(){var e,t,n;return e=JXG.rgbParser.apply(JXG.rgbParser,arguments),t=e[1],n=e[2],e=e[0],"rgb("+e+", "+t+", "+n+")"},JXG.rgb2hex=function(){var e,t,n;return e=JXG.rgbParser.apply(JXG.rgbParser,arguments),t=e[1],n=e[2],e=e[0],e=e.toString(16),t=t.toString(16),n=n.toString(16),1==e.length&&(e="0"+e),1==t.length&&(t="0"+t),1==n.length&&(n="0"+n),"#"+e+t+n},JXG.hsv2rgb=function(e,t,n){var i,r,o,a,s,l,c,u,d;if(e=(e%360+360)%360,0==t){if(!(isNaN(e)||JXG.Math.eps>e))return"#ffffff";i=n,r=n,o=n}else switch(l=e>=360?0:e,l/=60,s=Math.floor(l),a=l-s,c=n*(1-t),u=n*(1-t*a),d=n*(1-t*(1-a)),s){case 0:i=n,r=d,o=c;break;case 1:i=u,r=n,o=c;break;case 2:i=c,r=n,o=d;break;case 3:i=c,r=u,o=n;break;case 4:i=d,r=c,o=n;break;case 5:i=n,r=c,o=u}return i=Math.round(255*i).toString(16),i=2==i.length?i:1==i.length?"0"+i:"00",r=Math.round(255*r).toString(16),r=2==r.length?r:1==r.length?"0"+r:"00",o=Math.round(255*o).toString(16),o=2==o.length?o:1==o.length?"0"+o:"00",["#",i,r,o].join("")},JXG.rgb2hsv=function(){var e,t,n,i,r,o,a,s,l,c,u,d,h,p;return e=JXG.rgbParser.apply(JXG.rgbParser,arguments),t=e[1],n=e[2],e=e[0],p=JXG.Math.Statistics,i=e/255,r=t/255,o=n/255,d=p.max([e,t,n]),h=p.min([e,t,n]),a=d/255,s=h/255,u=a,c=0,u>0&&(c=(u-s)/(1*u)),l=1/(a-s),c>0&&(l=d==e?(r-o)*l:d==t?2+(o-i)*l:4+(i-r)*l),l*=60,0>l&&(l+=360),d==h&&(l=0),[l,c,u]},JXG.rgb2LMS=function(){var e,t,n,i,r,o,a,s=[[.05059983,.08585369,.0095242],[.01893033,.08925308,.01370054],[.00292202,.00975732,.07145979]];return e=JXG.rgbParser.apply(JXG.rgbParser,arguments),t=e[1],n=e[2],e=e[0],e=Math.pow(e,.476190476),t=Math.pow(t,.476190476),n=Math.pow(n,.476190476),i=e*s[0][0]+t*s[0][1]+n*s[0][2],r=e*s[1][0]+t*s[1][1]+n*s[1][2],o=e*s[2][0]+t*s[2][1]+n*s[2][2],a=[i,r,o],a.l=i,a.m=r,a.s=o,a},JXG.LMS2rgb=function(e,t,n){var i,r,o,a,s=[[30.830854,-29.832659,1.610474],[-6.481468,17.715578,-2.532642],[-.37569,-1.199062,14.273846]];i=e*s[0][0]+t*s[0][1]+n*s[0][2],r=e*s[1][0]+t*s[1][1]+n*s[1][2],o=e*s[2][0]+t*s[2][1]+n*s[2][2];var l=function(e){for(var t=127,n=64;n>0;){if(Math.pow(t,.476190476)>e)t-=n;else{if(Math.pow(t+1,.476190476)>e)return t;t+=n}n/=2}return 254==t&&e>13.994955247?255:t};return i=l(i),r=l(r),o=l(o),a=[i,r,o],a.r=i,a.g=r,a.b=o,a},JXG.rgba2rgbo=function(e){var t;return 9==e.length&&"#"==e.charAt(0)?(t=parseInt(e.substr(7,2).toUpperCase(),16)/255,e=e.substr(0,7)):t=1,[e,t]},JXG.rgb2bw=function(e){if("none"==e)return e;var t,n,i,r="0123456789ABCDEF";return i=JXG.rgbParser(e),t=.3*i[0]+.59*i[1]+.11*i[2],n=r.charAt(15&t>>4)+r.charAt(15&t),e="#"+n+n+n},JXG.rgb2cb=function(e,t){if("none"==e)return e;var n,i,r,o,a,s,l,c,u,d,h,p,f;switch(a=JXG.rgb2LMS(e),i=a.l,r=a.m,o=a.s,t=t.toLowerCase()){case"protanopia":l=-.06150039994295001,c=.08277001656812001,u=-.013200141220000003,d=.05858939668799999,h=-.07934519995360001,p=.013289415272000003,f=.6903216543277437,s=o/r,i=f>s?-(c*r+u*o)/l:-(h*r+p*o)/d;break;case"tritanopia":l=-.00058973116217,c=.007690316482,u=-.01011703519052,d=.025495080838999994,h=-.0422740347,p=.017005316784,f=.8349489908460004,s=r/i,o=f>s?-(l*i+c*r)/u:-(d*i+h*r)/p;break;default:l=-.06150039994295001,c=.08277001656812001,u=-.013200141220000003,d=.05858939668799999,h=-.07934519995360001,p=.013289415272000003,f=.5763833686400911,s=o/i,r=f>s?-(l*i+u*o)/c:-(d*i+p*o)/h}n=JXG.LMS2rgb(i,r,o);var g="0123456789ABCDEF";return s=g.charAt(15&n.r>>4)+g.charAt(15&n.r),e="#"+s,s=g.charAt(15&n.g>>4)+g.charAt(15&n.g),e+=s,s=g.charAt(15&n.b>>4)+g.charAt(15&n.b),e+=s},JXG.extend(JXG.Board.prototype,{angle:function(e,t,n){return JXG.Math.Geometry.angle(e,t,n)},rad:function(e,t,n){return JXG.Math.Geometry.rad(e,t,n)},distance:function(e,t){return JXG.Math.Geometry.distance(e,t)},pow:function(e,t){return JXG.Math.pow(e,t)},round:function(e,t){return e.toFixed(t)},cosh:function(e){return JXG.Math.cosh(e)},sinh:function(e){return JXG.Math.sinh(e)},sgn:function(e){return 0==e?0:e/Math.abs(e)},D:function(e,t){return JXG.Math.Numerics.D(e,t)},I:function(e,t){return JXG.Math.Numerics.I(e,t)},root:function(e,t,n){return JXG.Math.Numerics.root(e,t,n)},lagrangePolynomial:function(e){return JXG.Math.Numerics.lagrangePolynomial(e)},neville:function(e){return JXG.Math.Numerics.Neville(e)},riemannsum:function(e,t,n,i,r){return JXG.Math.Numerics.riemannsum(e,t,n,i,r)},abs:Math.abs,acos:Math.acos,asin:Math.asin,atan:Math.atan,ceil:Math.ceil,cos:Math.cos,exp:Math.exp,floor:Math.floor,log:Math.log,max:Math.max,min:Math.min,random:Math.random,sin:Math.sin,sqrt:Math.sqrt,tan:Math.tan,trunc:Math.ceil,factorial:function(e){return JXG.Math.factorial(e)},binomial:function(e,t){return JXG.Math.binomial(e,t)},getElement:function(e){return JXG.getReference(this,e)},intersectionOptions:["point",[[JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_LINE],[JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_CIRCLE],[JXG.OBJECT_CLASS_CIRCLE,JXG.OBJECT_CLASS_CIRCLE]]],intersection:function(e,t,n,i){return e=JXG.getReference(this,e),t=JXG.getReference(this,t),e.elementClass==JXG.OBJECT_CLASS_CURVE&&t.elementClass==JXG.OBJECT_CLASS_CURVE?function(){return JXG.Math.Geometry.meetCurveCurve(e,t,n,i,e.board)}:e.type==JXG.OBJECT_TYPE_ARC&&t.elementClass==JXG.OBJECT_CLASS_LINE||t.type==JXG.OBJECT_TYPE_ARC&&e.elementClass==JXG.OBJECT_CLASS_LINE?function(){return JXG.Math.Geometry.meet(e.stdform,t.stdform,n,e.board)}:e.elementClass==JXG.OBJECT_CLASS_CURVE&&t.elementClass==JXG.OBJECT_CLASS_LINE||t.elementClass==JXG.OBJECT_CLASS_CURVE&&e.elementClass==JXG.OBJECT_CLASS_LINE?function(){return JXG.Math.Geometry.meetCurveLine(e,t,n,e.board)}:function(){return JXG.Math.Geometry.meet(e.stdform,t.stdform,n,e.board)}},intersectionFunc:function(e,t,n,i){return this.intersection(e,t,n,i)},otherIntersection:function(e,t,n){return e=JXG.getReference(this,e),t=JXG.getReference(this,t),function(){var i=JXG.Math.Geometry.meet(e.stdform,t.stdform,0,e.board);return Math.abs(n.X()-i.usrCoords[1])>JXG.Math.eps||Math.abs(n.Y()-i.usrCoords[2])>JXG.Math.eps||Math.abs(n.Z()-i.usrCoords[0])>JXG.Math.eps?i:JXG.Math.Geometry.meet(e.stdform,t.stdform,1,e.board)}},pointFunc:function(){return[null]},pointOptions:["point",[[JXG.OBJECT_CLASS_POINT]]],lineFunc:function(){return arguments},lineOptions:["line",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],linesegmentFunc:function(){return arguments},linesegmentOptions:["line",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],linesegmentAtts:{straightFirst:!1,straightLast:!1},arrowFunc:function(){return arguments},arrowOptions:["arrow",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],circleFunc:function(){return arguments},circleOptions:["circle",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT],[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE],[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_CIRCLE]]],arrowparallelOptions:["arrowparallel",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],arrowparallelFunc:function(){return arguments},bisectorOptions:["bisector",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],bisectorFunc:function(){return arguments},circumcircleOptions:["circumcircle",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],circumcircleFunc:function(){return arguments},circumcirclemidpointOptions:["circumcirclemidpoint",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],circumcirclemidpointFunc:function(){return arguments},integralOptions:["integral",[[]]],integralFunc:function(){return arguments},midpointOptions:["midpoint",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT],[JXG.OBJECT_CLASS_LINE]]],midpointFunc:function(){return arguments},mirrorpointOptions:["mirrorpoint",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],mirrorpointFunc:function(){return arguments},normalOptions:["normal",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],normalFunc:function(){return arguments},parallelOptions:["parallel",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],parallelFunc:function(){return arguments},parallelpointOptions:["parallelpoint",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],parallelpointFunc:function(){return arguments},perpendicularOptions:["perpendicular",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],perpendicularFunc:function(){return arguments},perpendicularpointOptions:["perpendicularpoint",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],perpendicularpointFunc:function(){return arguments},reflectionOptions:["reflection",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],reflectionFunc:function(){return arguments}}),JXG.Point.prototype.setPositionX=function(e,t){var n=e==JXG.COORDS_BY_USER?this.coords.usrCoords[2]:this.coords.scrCoords[2];this.setPosition(e,t,n)},JXG.Point.prototype.setPositionY=function(e,t){var n=e==JXG.COORDS_BY_USER?this.coords.usrCoords[1]:this.coords.scrCoords[1];this.setPosition(e,n,t)},JXG.Ticks=function(e,t,n){if(this.constructor(e.board,n,JXG.OBJECT_TYPE_TICKS,JXG.OBJECT_CLASS_OTHER),this.line=e,this.board=this.line.board,this.ticksFunction=null,this.fixedTicks=null,this.equidistant=!1,JXG.isFunction(t))throw this.ticksFunction=t,Error("Function arguments are no longer supported.");
JXG.isArray(t)?this.fixedTicks=t:(Math.abs(t)this.visProp.minorheight&&(this.visProp.minorheight=2*(this.board.canvasWidth+this.board.canvasHeight)),0>this.visProp.majorheight&&(this.visProp.majorheight=2*(this.board.canvasWidth+this.board.canvasHeight));var e,t,n,i,r,o,a,s,l=this.line.point1,c=this.line.point2,u=l.coords.distance(JXG.COORDS_BY_USER,c.coords),d=(c.coords.usrCoords[1]-l.coords.usrCoords[1])/u,h=(c.coords.usrCoords[2]-l.coords.usrCoords[2])/u,p=l.coords.distance(JXG.COORDS_BY_SCREEN,new JXG.Coords(JXG.COORDS_BY_USER,[l.coords.usrCoords[1]+d,l.coords.usrCoords[2]+h],this.board)),f=this.equidistant?this.ticksFunction(1):1,g=5,m=function(e,t,n,i,r){var o,s;return i?(o=""+e,Math.abs(e)5||-1!=o.indexOf("e"))&&(o=""+e.toPrecision(3)),o.indexOf(".")>-1&&(o=o.replace(/0+$/,""),o=o.replace(/\.$/,"")),s=JXG.createText(n,[t.usrCoords[1],t.usrCoords[2],o],{id:r+a+"Label",isLabel:!0,layer:n.options.layer.line,highlightStrokeColor:n.options.text.strokeColor,highlightStrokeWidth:n.options.text.strokeWidth,highlightStrokeOpacity:n.options.text.strokeOpacity}),s.isDraggable=!1,s.distanceX=4,s.distanceY=-parseInt(s.visProp.fontsize)+3,s.setCoords(t.usrCoords[1]+s.distanceX/n.unitX,t.usrCoords[2]+s.distanceY/n.unitY),s.visProp.visible=i,s.prepareUpdate().update().updateRenderer(),s):null},v=function(e){return Math.ceil(e/f)*f},b=JXG.Math.eps,y=-this.line.getSlope(),x=this.visProp.majorheight/2,w=this.visProp.minorheight/2,k=0,C=0,_=0,T=0;if(b>Math.abs(y)?(k=0,C=x,_=0,T=w):Math.abs(y)>1/b||isNaN(y)?(k=x,C=0,_=w,T=0):(k=-x/Math.sqrt(1/(y*y)+1),C=k/y,_=-w/Math.sqrt(1/(y*y)+1),T=_/y),this.removeTickLabels(),this.ticks=[],this.labels=[],e=new JXG.Coords(JXG.COORDS_BY_USER,[l.coords.usrCoords[1],l.coords.usrCoords[2]],this.board),t=new JXG.Coords(JXG.COORDS_BY_USER,[c.coords.usrCoords[1],c.coords.usrCoords[2]],this.board),JXG.Math.Geometry.calcStraight(this.line,e,t),!this.equidistant){var E=l.coords.usrCoords[1]-e.usrCoords[1],S=l.coords.usrCoords[2]-e.usrCoords[2],A=Math.sqrt(E*E+S*S),I=l.coords.usrCoords[1]-t.usrCoords[1],O=l.coords.usrCoords[2]-t.usrCoords[2],L=Math.sqrt(I*I+O*O),D=0,R=0;for(a=0;this.fixedTicks.length>a;a++)this.fixedTicks[a]>=-A&&L>=this.fixedTicks[a]&&(0>this.fixedTicks[a]?(D=Math.abs(E)*this.fixedTicks[a]/A,R=Math.abs(S)*this.fixedTicks[a]/A):(D=Math.abs(I)*this.fixedTicks[a]/L,R=Math.abs(O)*this.fixedTicks[a]/L),r=new JXG.Coords(JXG.COORDS_BY_USER,[l.coords.usrCoords[1]+D,l.coords.usrCoords[2]+R],this.board),this.ticks.push(r),this.ticks[this.ticks.length-1].major=!0,this.labels.push(m(this.fixedTicks[a],r,this.board,this.visProp.drawlabels,this.id)));return this.dxMaj=k,this.dyMaj=C,this.dxMin=_,this.dyMin=T,void 0}if(this.visProp.insertticks&&this.minTicksDistance>JXG.Math.eps){for(;p>4*this.minTicksDistance;)f/=10,p=l.coords.distance(JXG.COORDS_BY_SCREEN,new JXG.Coords(JXG.COORDS_BY_USER,[l.coords.usrCoords[1]+d*f,l.coords.usrCoords[2]+h*f],this.board));for(;this.minTicksDistance>p;)f*=g,g=5==g?2:5,p=l.coords.distance(JXG.COORDS_BY_SCREEN,new JXG.Coords(JXG.COORDS_BY_USER,[l.coords.usrCoords[1]+d*f,l.coords.usrCoords[2]+h*f],this.board))}for(JXG.Math.Geometry.isSameDirection(l.coords,e,t)?(n=l.coords.distance(JXG.COORDS_BY_USER,e),i=l.coords.distance(JXG.COORDS_BY_USER,t),JXG.Math.Geometry.isSameDirection(l.coords,c.coords,e)?this.line.visProp.straightfirst&&(n-=2*f):(i=-1*i,n=-1*n,this.line.visProp.straightfirst&&(n-=2*f)),n>i&&(a=n,n=i,i=a),n=v(n),this.line.visProp.straightlast&&(i+=2*f)):(n=this.line.visProp.straightfirst?-v(l.coords.distance(JXG.COORDS_BY_USER,e)):0,i=this.line.visProp.straightlast?l.coords.distance(JXG.COORDS_BY_USER,t):u),o=new JXG.Coords(JXG.COORDS_BY_USER,[l.coords.usrCoords[1]+n*d,l.coords.usrCoords[2]+n*h],this.board),r=new JXG.Coords(JXG.COORDS_BY_USER,[l.coords.usrCoords[1]+n*d,l.coords.usrCoords[2]+n*h],this.board),d/=this.visProp.minorticks+1,h/=this.visProp.minorticks+1,a=0,s=n;o.distance(JXG.COORDS_BY_USER,r)e;e++)null!=this.labels[e]&&this.labels[e].visProp.visible&&this.board.removeObject(this.labels[e])},update:function(){return this.needsUpdate&&this.calculateTicksCoordinates(),this},updateRenderer:function(){return this.needsUpdate&&(this.ticks&&this.board.renderer.updateTicks(this,this.dxMaj,this.dyMaj,this.dxMin,this.dyMin),this.needsUpdate=!1),this},hideElement:function(){var e;for(this.visProp.visible=!1,this.board.renderer.hide(this),e=0;this.labels.length>e;e++)JXG.exists(this.labels[e])&&this.labels[e].hideElement();return this},showElement:function(){var e;for(this.visProp.visible=!0,this.board.renderer.show(this),e=0;this.labels.length>e;e++)JXG.exists(this.labels[e])&&this.labels[e].showElement();return this}}),JXG.createTicks=function(e,t,n){var i,r,o=JXG.copyAttributes(n,e.options,"ticks");if(r=2>t.length?n.ticksDistance:t[1],t[0].elementClass!=JXG.OBJECT_CLASS_LINE||!(JXG.isFunction(t[1])||JXG.isArray(t[1])||JXG.isNumber(t[1])))throw Error("JSXGraph: Can't create Ticks with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.");return i=new JXG.Ticks(t[0],r,o)},JXG.JSXGraph.registerElement("ticks",JXG.createTicks),JXG.Util={},JXG.Util.Unzip=function(e){function t(){return M+=8,D.length>R?D[R++]:-1}function n(){P=1}function i(){var e;return M++,e=1&P,P>>=1,0==P&&(P=t(),e=1&P,P=128|P>>1),e}function r(e){for(var t=0,n=e;n--;)t=t<<1|i();return e&&(t=E[t]>>8-e),t}function o(){_=0}function a(e){v++,C[_++]=e,y.push(String.fromCharCode(e)),32768==_&&(_=0)}function s(){this.b0=0,this.b1=0,this.jump=null,this.jumppos=-1}function l(){for(;;){if($[X]>=W)return-1;if(J[$[X]]==X)return $[X]++;$[X]++}}function c(){var e,t=H[G];if(x&&document.write("
len:"+X+" treepos:"+G),17==X)return-1;if(G++,X++,e=l(),x&&document.write("
IsPat "+e),e>=0)t.b0=e,x&&document.write("
b0 "+t.b0);else if(t.b0=32768,x&&document.write("
b0 "+t.b0),c())return-1;if(e=l(),e>=0)t.b1=e,x&&document.write("
b1 "+t.b1),t.jump=null;else if(t.b1=32768,x&&document.write("
b1 "+t.b1),t.jump=H[G],t.jumppos=G,c())return-1;return X--,0}function u(e,t,n,i){var r;for(x&&document.write("currentTree "+e+" numval "+t+" lengths "+n+" show "+i),H=e,G=0,J=n,W=t,r=0;17>r;r++)$[r]=0;if(X=0,c())return x&&alert("invalid huffman tree\n"),-1;if(x){document.write("
Tree: "+H.length);for(var o=0;32>o;o++)document.write("Places["+o+"].b0="+H[o].b0+"
"),document.write("Places["+o+"].b1="+H[o].b1+"
")}return 0}function d(e){for(var t,n,r,o=0,a=e[o];;)if(r=i(),x&&document.write("b="+r),r){if(!(32768&a.b1))return x&&document.write("ret1"),a.b1;for(a=a.jump,t=e.length,n=0;t>n;n++)if(e[n]===a){o=n;break}}else{if(!(32768&a.b0))return x&&document.write("ret2"),a.b0;o++,a=e[o]}return x&&document.write("ret3"),-1}function h(){var e,l,c,h,p;do{switch(e=i(),c=r(2)){case 0:x&&alert("Stored\n");break;case 1:x&&alert("Fixed Huffman codes\n");break;case 2:x&&alert("Dynamic Huffman codes\n");break;case 3:x&&alert("Reserved block type!!\n");break;default:x&&alert("Unexpected value %d!\n",c)}if(0==c){var f,g;for(n(),f=t(),f|=t()<<8,g=t(),g|=t()<<8,65535&(f^~g)&&document.write("BlockLen checksum mismatch\n");f--;)l=t(),a(l)}else if(1==c)for(var m;;)if(m=E[r(7)]>>1,m>23?(m=m<<1|i(),m>199?(m-=128,m=m<<1|i()):(m-=48,m>143&&(m+=136))):m+=256,256>m)a(m);else{if(256==m)break;var p,v;for(m-=257,p=r(A[m])+S[m],m=E[r(5)]>>3,O[m]>8?(v=r(8),v|=r(O[m]-8)<<8):v=r(O[m]),v+=I[m],m=0;p>m;m++){var l=C[32767&_-v];a(l)}}else if(2==c){var m,b,y,w,k,T=Array(320);for(y=257+r(5),w=1+r(5),k=4+r(4),m=0;19>m;m++)T[m]=0;for(m=0;k>m;m++)T[L[m]]=r(3);for(p=z.length,h=0;p>h;h++)z[h]=new s;if(u(z,19,T,0))return o(),1;if(x){document.write("
distanceTree");for(var D=0;z.length>D;D++)document.write("
"+z[D].b0+" "+z[D].b1+" "+z[D].jump+" "+z[D].jumppos)}b=y+w,h=0;var R=-1;for(x&&document.write("
n="+b+" bits: "+M+"
");b>h;)if(R++,m=d(z),x&&document.write("
"+R+" i:"+h+" decode: "+m+" bits "+M+"
"),16>m)T[h++]=m;else if(16==m){var P;if(m=3+r(2),h+m>b)return o(),1;for(P=h?T[h-1]:0;m--;)T[h++]=P}else{if(m=17==m?3+r(3):11+r(7),h+m>b)return o(),1;for(;m--;)T[h++]=0}for(p=j.length,h=0;p>h;h++)j[h]=new s;if(u(j,y,T,0))return o(),1;for(p=j.length,h=0;p>h;h++)z[h]=new s;var N=[];for(h=y;T.length>h;h++)N[h-y]=T[h];if(u(z,w,N,0))return o(),1;for(x&&document.write("
literalTree");;)if(m=d(j),m>=256){var p,v;if(m-=256,0==m)break;for(m--,p=r(A[m])+S[m],m=d(z),O[m]>8?(v=r(8),v|=r(O[m]-8)<<8):v=r(O[m]),v+=I[m];p--;){var l=C[32767&_-v];a(l)}}else a(m)}}while(!e);return o(),n(),0}function p(){x&&alert("NEXTFILE"),y=[];var e=[];if(T=!1,e[0]=t(),e[1]=t(),x&&alert("type: "+e[0]+" "+e[1]),e[0]==parseInt("78",16)&&e[1]==parseInt("da",16)&&(x&&alert("GEONExT-GZIP"),h(),x&&alert(y.join("")),k[w]=Array(2),k[w][0]=y.join(""),k[w][1]="geonext.gxt",w++),e[0]==parseInt("1f",16)&&e[1]==parseInt("8b",16)&&(x&&alert("GZIP"),f(),x&&alert(y.join("")),k[w]=Array(2),k[w][0]=y.join(""),k[w][1]="file",w++),e[0]==parseInt("50",16)&&e[1]==parseInt("4b",16)&&(T=!0,e[2]=t(),e[3]=t(),e[2]==parseInt("3",16)&&e[3]==parseInt("4",16))){e[0]=t(),e[1]=t(),x&&alert("ZIP-Version: "+e[1]+" "+e[0]/10+"."+e[0]%10),g=t(),g|=t()<<8,x&&alert("gpflags: "+g);var n=t();n|=t()<<8,x&&alert("method: "+n),t(),t(),t(),t();var i=t();i|=t()<<8,i|=t()<<16,i|=t()<<24;var r=t();r|=t()<<8,r|=t()<<16,r|=t()<<24;var o=t();o|=t()<<8,o|=t()<<16,o|=t()<<24,x&&alert("local CRC: "+i+"\nlocal Size: "+o+"\nlocal CompSize: "+r);var a=t();a|=t()<<8;var s=t();for(s|=t()<<8,x&&alert("filelen "+a),c=0,B=[];a--;){var l=t();"/"==l|":"==l?c=0:N-1>c&&(B[c++]=String.fromCharCode(l))}x&&alert("nameBuf: "+B),b||(b=B);for(var c=0;s>c;)l=t(),c++;m=4294967295,v=0,(o=0)&&x&&alert("skipdir"),8==n&&(h(),x&&alert(y.join("")),k[w]=Array(2),k[w][0]=y.join(""),k[w][1]=B.join(""),w++),f()}}function f(){var e,n,i,r,o,a,s=[];if(8&g&&(s[0]=t(),s[1]=t(),s[2]=t(),s[3]=t(),s[0]==parseInt("50",16)&&s[1]==parseInt("4b",16)&&s[2]==parseInt("07",16)&&s[3]==parseInt("08",16)?(e=t(),e|=t()<<8,e|=t()<<16,e|=t()<<24):e=s[0]|s[1]<<8|s[2]<<16|s[3]<<24,n=t(),n|=t()<<8,n|=t()<<16,n|=t()<<24,i=t(),i|=t()<<8,i|=t()<<16,i|=t()<<24,x&&alert("CRC:")),T&&p(),s[0]=t(),8!=s[0])return x&&alert("Unknown compression method!"),0;if(g=t(),x&&g&~parseInt("1f",16)&&alert("Unknown flags set!"),t(),t(),t(),t(),t(),r=t(),4&g)for(s[0]=t(),s[2]=t(),X=s[0]+256*s[1],x&&alert("Extra field size: "+X),o=0;X>o;o++)t();if(8&g){for(o=0,B=[];a=t();)("7"==a||":"==a)&&(o=0),N-1>o&&(B[o++]=a);x&&alert("original file name: "+B)}if(16&g)for(;a=t(););2&g&&(t(),t()),h(),e=t(),e|=t()<<8,e|=t()<<16,e|=t()<<24,i=t(),i|=t()<<8,i|=t()<<16,i|=t()<<24,T&&p()}var g,m,v,b,y=[],x=!1,w=0,k=[],C=Array(32768),_=0,T=!1,E=[0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,8,136,72,200,40,168,104,232,24,152,88,216,56,184,120,248,4,132,68,196,36,164,100,228,20,148,84,212,52,180,116,244,12,140,76,204,44,172,108,236,28,156,92,220,60,188,124,252,2,130,66,194,34,162,98,226,18,146,82,210,50,178,114,242,10,138,74,202,42,170,106,234,26,154,90,218,58,186,122,250,6,134,70,198,38,166,102,230,22,150,86,214,54,182,118,246,14,142,78,206,46,174,110,238,30,158,94,222,62,190,126,254,1,129,65,193,33,161,97,225,17,145,81,209,49,177,113,241,9,137,73,201,41,169,105,233,25,153,89,217,57,185,121,249,5,133,69,197,37,165,101,229,21,149,85,213,53,181,117,245,13,141,77,205,45,173,109,237,29,157,93,221,61,189,125,253,3,131,67,195,35,163,99,227,19,147,83,211,51,179,115,243,11,139,75,203,43,171,107,235,27,155,91,219,59,187,123,251,7,135,71,199,39,167,103,231,23,151,87,215,55,183,119,247,15,143,79,207,47,175,111,239,31,159,95,223,63,191,127,255],S=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],A=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,99,99],I=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],O=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],L=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],D=e,R=0,P=1,M=0,N=256,B=[],F=288,j=Array(F),z=Array(32),G=0,H=null;Array(64),Array(64);var X=0,$=Array(17);$[0]=0;var J,W;JXG.Util.Unzip.prototype.unzipFile=function(e){var t;for(this.unzip(),t=0;k.length>t;t++)if(k[t][1]==e)return k[t][0]},JXG.Util.Unzip.prototype.unzip=function(){return x&&alert(D),p(),k}},JXG.Util.Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t,n,i,r,o,a,s,l=[],c=0;for(e=JXG.Util.Base64._utf8_encode(e);e.length>c;)t=e.charCodeAt(c++),n=e.charCodeAt(c++),i=e.charCodeAt(c++),r=t>>2,o=(3&t)<<4|n>>4,a=(15&n)<<2|i>>6,s=63&i,isNaN(n)?a=s=64:isNaN(i)&&(s=64),l.push([this._keyStr.charAt(r),this._keyStr.charAt(o),this._keyStr.charAt(a),this._keyStr.charAt(s)].join(""));return l.join("")},decode:function(e,t){var n,i,r,o,a,s,l,c=[],u=0;for(e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");e.length>u;)o=this._keyStr.indexOf(e.charAt(u++)),a=this._keyStr.indexOf(e.charAt(u++)),s=this._keyStr.indexOf(e.charAt(u++)),l=this._keyStr.indexOf(e.charAt(u++)),n=o<<2|a>>4,i=(15&a)<<4|s>>2,r=(3&s)<<6|l,c.push(String.fromCharCode(n)),64!=s&&c.push(String.fromCharCode(i)),64!=l&&c.push(String.fromCharCode(r));return c=c.join(""),t&&(c=JXG.Util.Base64._utf8_decode(c)),c},_utf8_encode:function(e){e=e.replace(/\r\n/g,"\n");for(var t="",n=0;e.length>n;n++){var i=e.charCodeAt(n);128>i?t+=String.fromCharCode(i):i>127&&2048>i?(t+=String.fromCharCode(192|i>>6),t+=String.fromCharCode(128|63&i)):(t+=String.fromCharCode(224|i>>12),t+=String.fromCharCode(128|63&i>>6),t+=String.fromCharCode(128|63&i))}return t},_utf8_decode:function(e){for(var t=[],n=0,i=0,r=0,o=0;e.length>n;)i=e.charCodeAt(n),128>i?(t.push(String.fromCharCode(i)),n++):i>191&&224>i?(r=e.charCodeAt(n+1),t.push(String.fromCharCode((31&i)<<6|63&r)),n+=2):(r=e.charCodeAt(n+1),o=e.charCodeAt(n+2),t.push(String.fromCharCode((15&i)<<12|(63&r)<<6|63&o)),n+=3);return t.join("")},_destrip:function(e,t){var n,i,r=[],o=[];for(null==t&&(t=76),e.replace(/ /g,""),n=e.length/t,i=0;n>i;i++)r[i]=e.substr(i*t,t);for(n!=e.length/t&&(r[r.length]=e.substr(n*t,e.length-n*t)),i=0;r.length>i;i++)o.push(r[i]);return o.join("\n")},decodeAsArray:function(e){var t,n=this.decode(e),i=[];for(t=0;n.length>t;t++)i[t]=n.charCodeAt(t);return i},decodeGEONExT:function(e){return decodeAsArray(destrip(e),!1)}},JXG.Util.asciiCharCodeAt=function(e,t){var n=e.charCodeAt(t);if(n>255)switch(n){case 8364:n=128;break;case 8218:n=130;break;case 402:n=131;break;case 8222:n=132;break;case 8230:n=133;break;case 8224:n=134;break;case 8225:n=135;break;case 710:n=136;break;case 8240:n=137;break;case 352:n=138;break;case 8249:n=139;break;case 338:n=140;break;case 381:n=142;break;case 8216:n=145;break;case 8217:n=146;break;case 8220:n=147;break;case 8221:n=148;break;case 8226:n=149;break;case 8211:n=150;break;case 8212:n=151;break;case 732:n=152;break;case 8482:n=153;break;case 353:n=154;break;case 8250:n=155;break;case 339:n=156;break;case 382:n=158;break;case 376:n=159;break;default:}return n},JXG.Util.utf8Decode=function(e){var t,n=[],i=0,r=0,o=0;if(!JXG.exists(e))return"";for(;e.length>i;)r=e.charCodeAt(i),128>r?(n.push(String.fromCharCode(r)),i++):r>191&&224>r?(o=e.charCodeAt(i+1),n.push(String.fromCharCode((31&r)<<6|63&o)),i+=2):(o=e.charCodeAt(i+1),t=e.charCodeAt(i+2),n.push(String.fromCharCode((15&r)<<12|(63&o)<<6|63&t)),i+=3);return n.join("")},JXG.Util.genUUID=function(){for(var e,t="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),n=Array(36),i=0,r=0;36>r;r++)8==r||13==r||18==r||23==r?n[r]="-":14==r?n[r]="4":(2>=i&&(i=0|33554432+16777216*Math.random()),e=15&i,i>>=4,n[r]=t[19==r?8|3&e:e]);return n.join("")},JXG.PsTricks={convert:function(e){var t,n,i=new JXG.Coords(JXG.COORDS_BY_SCREEN,[0,0],e),r=new JXG.Coords(JXG.COORDS_BY_SCREEN,[e.canvasWidth,e.canvasHeight],e),o=[];o.push("\\begin{pspicture*}("+i.usrCoords[1]+","+r.usrCoords[2]+")("+r.usrCoords[1]+","+i.usrCoords[2]+")\n");for(t in e.objects)if(n=e.objects[t],n.visProp.visible)switch(n.elementClass){case JXG.OBJECT_CLASS_CIRCLE:o.push(this.addCircle(n));break;case JXG.OBJECT_CLASS_LINE:o.push(this.addLine(n));break;case JXG.OBJECT_CLASS_POINT:o.push(this.addPoint(n));break;default:switch(n.type){case JXG.OBJECT_TYPE_ARC:o.push(this.addArc(n));break;case JXG.OBJECT_TYPE_SECTOR:o.push(this.addArc(n)),o.push(this.addSector(n));break;case JXG.OBJECT_TYPE_POLYGON:o.push(this.addPolygon(n));break;case JXG.OBJECT_TYPE_ANGLE:o.push(this.addAngle(n))}}return o.push("\\end{pspicture*}"),o.join("\n")},setArrows:function(e){var t="";return e.visProp.firstarrow&&e.visProp.lastarrow?t="{<->}":e.visProp.firstarrow?t="{<-}":e.visProp.lastarrow&&(t="{->}"),t},drawWedge:function(e,t,n,i,r,o){var a="";return"none"!=e&&t>0&&(a+="\\pswedge[linestyle=none, fillstyle=solid, fillcolor="+this.parseColor(e)+", opacity="+t.toFixed(5)+"]",a+="("+n.join(",")+"){"+i+"}{"+r+"}{"+o+"}\n"),a},addPoint:function(e){var t="\\psdot[linecolor="+this.parseColor(e.visProp.strokecolor)+",dotstyle=",n=e.normalizeFace(e.visProp.face)||"o",i=e.visProp.size>4?4:e.visProp.size,r=[0,0,"2pt 2","5pt 2","5pt 3"];return"x"==n?t+="x, dotsize="+r[i]:"o"==n?(t+="*, dotsize=",1==i?t+="2pt 2":2==i?t+="4pt 2":3==i?t+="6pt 2":4==i&&(t+="6pt 3")):"[]"==n?t+="square*, dotsize="+r[i]:"+"==n&&(t+="+, dotsize="+r[i]),t+="]("+e.coords.usrCoords.slice(1).join(",")+")\n",t+="\\rput("+(e.coords.usrCoords[1]+15/e.board.unitY)+","+(e.coords.usrCoords[2]+15/e.board.unitY)+"){\\small $"+e.name+"$}\n"},addLine:function(e){var t=new JXG.Coords(JXG.COORDS_BY_USER,e.point1.coords.usrCoords,e.board),n=new JXG.Coords(JXG.COORDS_BY_USER,e.point2.coords.usrCoords,e.board),i="\\psline[linecolor="+this.parseColor(e.visProp.strokecolor)+", linewidth="+e.visProp.strokewidth+"px]";return(e.visProp.straightfirst||e.visProp.straightlast)&&JXG.Math.Geometry.calcStraight(e,t,n),i+=this.setArrows(e),i+="("+t.usrCoords.slice(1).join(",")+")("+n.usrCoords.slice(2).join(",")+")\n"},addCircle:function(e){var t=e.Radius(),n="\\pscircle[linecolor="+this.parseColor(e.visProp.strokecolor)+", linewidth="+e.visProp.strokewidth+"px";return"none"!=e.visProp.fillcolor&&0!=e.visProp.fillopacity&&(n+=", fillstyle=solid, fillcolor="+this.parseColor(e.visProp.fillcolor)+", opacity="+e.visProp.fillopacity.toFixed(5)),n+="]("+e.midpoint.coords.usrCoords.slice(1).join("1")+"){"+t+"}\n"},addPolygon:function(e){var t,n="\\pspolygon[linestyle=none, fillstyle=solid, fillcolor="+this.parseColor(e.visProp.fillcolor)+", opacity="+e.visProp.fillopacity.toFixed(5)+"]";for(t=0;e.vertices.length>t;t++)n+="("+e.vertices[t].coords.usrCoords.slice(1).join(",")+")";return n+="\n"},addArc:function(e){var t=e.Radius(),n={coords:new JXG.Coords(JXG.COORDS_BY_USER,[e.board.canvasWidth/e.board.unitY,e.midpoint.coords.usrCoords[2]],e.board)},i=JXG.Math.Geometry.trueAngle(n,e.midpoint,e.point2).toFixed(4),r=JXG.Math.Geometry.trueAngle(n,e.midpoint,e.point3).toFixed(4),o="\\psarc[linecolor="+this.parseColor(e.visProp.strokecolor)+", linewidth="+e.visProp.strokewidth+"px]";return o+=this.setArrows(e),o+="("+e.midpoint.coords.usrCoords.slice(1).join(",")+"){"+t+"}{"+i+"}{"+r+"}\n"},addSector:function(e){var t=e.Radius(),n={coords:new JXG.Coords(JXG.COORDS_BY_USER,[e.board.canvasWidth/e.board.unitY,e.midpoint.coords.usrCoords[2]],e.board)},i=JXG.Math.Geometry.trueAngle(n,e.midpoint,e.point2).toFixed(4),r=JXG.Math.Geometry.trueAngle(n,e.midpoint,e.point3).toFixed(4);return this.drawWedge(e.visProp.fillcolor,e.visProp.fillopacity,e.midpoint.coords.usrCoords.slice(1),t,i,r)},addAngle:function(e){var t,n=e.radius,i={coords:new JXG.Coords(JXG.COORDS_BY_USER,[e.board.canvasWidth/e.board.unitY,e.point2.coords.usrCoords[2]],e.board)},r=JXG.Math.Geometry.trueAngle(i,e.point2,e.point1).toFixed(4),o=JXG.Math.Geometry.trueAngle(i,e.point2,e.point3).toFixed(4);return t=this.drawWedge(e.visProp.fillcolor,e.visProp.fillopacity,e.point2.coords.usrCoords.slice(1),n,r,o),t+="\\psarc[linecolor="+this.parseColor(e.visProp.strokecolor)+", linewidth="+e.visProp.strokewidth+"px]",t+="("+e.point2.coords.usrCoords.slice(1).join(",")+"){"+n+"}{"+r+"}{"+o+"}\n"},parseColor:function(e){var t=JXG.rgbParser(e);return"{[rgb]{"+t[0]/255+","+t[1]/255+","+t[2]/255+"}}"}},JXG.Server=function(){},JXG.Server.modules=function(){},JXG.Server.runningCalls={},JXG.Server.handleError=function(e){alert("error occured, server says: "+e.message)},JXG.Server.callServer=function(e,t,n,i){var r,o,a,s,l,c,u;i=i||!1,s="";for(u in n)s+="&"+escape(u)+"="+escape(n[u]);c=JXG.toJSON(n);do l=e+Math.floor(4096*Math.random());while(this.runningCalls[l]!==void 0);return this.runningCalls[l]={action:e},n.module!==void 0&&(this.runningCalls[l].module=n.module),r=JXG.serverBase+"JXGServer.py",o="action="+escape(e)+"&id="+l+"&dataJSON="+escape(JXG.Util.Base64.encode(c)),this.cbp=function(e){var n,i,r,o,a,s,l,c;if(n=new JXG.Util.Unzip(JXG.Util.Base64.decodeAsArray(e)).unzip(),JXG.isArray(n)&&n.length>0&&(n=n[0][0]),"string"==typeof n)if(i=window.JSON&&window.JSON.parse?window.JSON.parse(n):Function("return "+n)(),"error"==i.type)this.handleError(i);else if("response"==i.type){for(s=i.id,l=0;i.fields.length>l;l++)r=i.fields[l],o=r.namespace+("object"==typeof Function("return "+r.namespace)()?".":".prototype.")+r.name+" = "+r.value,Function(o)();for(l=0;i.handler.length>l;l++){for(r=i.handler[l],a=[],c=0;r.parameters.length>c;c++)a[c]='"'+r.parameters[c]+'": '+r.parameters[c];o="if(typeof JXG.Server.modules."+this.runningCalls[s].module+' == "undefined")JXG.Server.modules.'+this.runningCalls[s].module+" = {};",o+="JXG.Server.modules."+this.runningCalls[s].module+"."+r.name+"_cb = "+r.callback+";",o+="JXG.Server.modules."+this.runningCalls[s].module+"."+r.name+" = function ("+r.parameters.join(",")+', __JXGSERVER_CB__, __JXGSERVER_SYNC) {if(typeof __JXGSERVER_CB__ == "undefined") __JXGSERVER_CB__ = JXG.Server.modules.'+this.runningCalls[s].module+"."+r.name+"_cb;var __JXGSERVER_PAR__ = {"+a.join(",")+', "module": "'+this.runningCalls[s].module+'", "handler": "'+r.name+'" };JXG.Server.callServer("exec", __JXGSERVER_CB__, __JXGSERVER_PAR__, __JXGSERVER_SYNC);};',Function(o)()}delete this.runningCalls[s],t(i.data)}},this.cb=JXG.bind(this.cbp,this),window.XMLHttpRequest?(a=new XMLHttpRequest,a.overrideMimeType("text/plain; charset=iso-8859-1")):a=new ActiveXObject("Microsoft.XMLHTTP"),a?(a.open("POST",r,!i),a.setRequestHeader("Content-type","application/x-www-form-urlencoded"),i||(a.onreadystatechange=function(e){return function(){switch(a.readyState){case 4:200!=a.status||e(a.responseText);break;default:return!1}}}(this.cb)),a.send(o),i&&this.cb(a.responseText),void 0):!1},JXG.Server.loadModule_cb=function(e){var t;for(t=0;e.length>t;t++)alert(e[t].name+": "+e[t].value)},JXG.Server.loadModule=function(e){return JXG.Server.callServer("load",JXG.Server.loadModule_cb,{module:e},!0)},JXG.Server.load=JXG.Server.loadModule,JXG.DataSource=function(){return this.data=[],this.columnHeaders=[],this.rowHeaders=[],this},JXG.extend(JXG.DataSource.prototype,{loadFromArray:function(e,t,n){var i,r,o;if(t===void 0&&(t=!1),n===void 0&&(n=!1),JXG.isArray(t)&&(this.columnHeaders=t,t=!1),JXG.isArray(n)&&(this.rowHeaders=n,n=!1),this.data=[],t&&(this.columnHeaders=[]),n&&(this.rowHeaders=[]),e!==void 0){for(this.data=Array(e.length),i=0;e.length>i;i++)for(this.data[i]=Array(e[i].length),r=0;e[i].length>r;r++)o=e[i][r],this.data[i][r]=""+parseFloat(o)==o?parseFloat(o):"-"!=o?o:0/0;if(t&&(this.columnHeaders=this.data[0].slice(1),this.data=this.data.slice(1)),n)for(this.rowHeaders=[],i=0;this.data.length>i;i++)this.rowHeaders.push(this.data[i][0]),this.data[i]=this.data[i].slice(1)}return this},loadFromTable:function(e,t,n){var i,r,o,a,s;if(t===void 0&&(t=!1),n===void 0&&(n=!1),JXG.isArray(t)&&(this.columnHeaders=t,t=!1),JXG.isArray(n)&&(this.rowHeaders=n,n=!1),this.data=[],t&&(this.columnHeaders=[]),n&&(this.rowHeaders=[]),e=document.getElementById(e),e!==void 0){for(i=e.getElementsByTagName("tr"),this.data=Array(i.length),r=0;i.length>r;r++)for(a=i[r].getElementsByTagName("td"),this.data[r]=Array(a.length),o=0;a.length>o;o++)s=a[o].innerHTML,this.data[r][o]=""+parseFloat(s)==s?parseFloat(s):"-"!=s?s:0/0;if(t&&(this.columnHeaders=this.data[0].slice(1),this.data=this.data.slice(1)),n)for(this.rowHeaders=[],r=0;this.data.length>r;r++)this.rowHeaders.push(this.data[r][0]),this.data[r]=this.data[r].slice(1)}return this},addColumn:function(){},addRow:function(){},getColumn:function(e){var t,n=Array(this.data.length);if("string"==typeof e)for(t=0;this.columnHeaders.length>t;t++)if(e==this.columnHeaders[t]){e=t;break}for(t=0;this.data.length>t;t++)this.data[t].length>e&&(n[t]=parseFloat(this.data[t][e]));return n},getRow:function(e){var t,n;if("string"==typeof e)for(n=0;this.rowHeaders.length>n;n++)if(e==this.rowHeaders[n]){e=n;break}for(t=Array(this.data[e].length),n=0;this.data[e].length>n;n++)t[n]=this.data[e][n];return t}}),JXG.Board.prototype.construct=function(e,t,n,i,r){var o,a,s,l,c,u,d,h,p,f,g,m,v,b,y,x,w,k,C,_,T={};if(JXG.exists(t)?b=[]:t="normal",T.lines=[],T.circles=[],T.points=[],T.intersections=[],T.angles=[],T.macros=[],T.functions=[],T.texts=[],T.polygons=[],-1!=e.search(/\{/))for(p=e.match(/\{/),p=p.length,m=0,s=0;p>s;s++)g=e.slice(m).search(/\{/),x=e.slice(g),x=x.slice(0,x.search(/\}/)+1),x=x.replace(/;/g,"?"),e=e.slice(0,g)+x+e.slice(g+x.length),m=g+1;for(o=e.split(";"),a=0;o.length>a;a++)if(o[a]=o[a].replace(/^\s+/,"").replace(/\s+$/,""),-1!=o[a].search(/\{/)&&(o[a]=o[a].replace(/\?/g,";")),-1!=o[a].search(/Macro/))this.addMacro(o[a]);else if(o[a].length>0){if(w=!1,-1!=o[a].search(/=/)&&(l=o[a].split("="),C=l[1],C=C.replace(/^\s+/,"").replace(/\s+$/,""),-1!=l[0].search(/\./))){if(w=!0,l=l[0].split("."),k=l[l.length-1],k=k.replace(/^\s+/,"").replace(/\s+$/,""),l.pop(),l=l.join("."),"macro"==t)for(s=0;n.length>s;s++)l==n[s]&&(l=i[s]);JXG.getReference(this,l).setProperty(k+":"+C)}if(!w){for(-1!=o[a].search(/=/)?(l=o[a].split("="),o[a]=l[1].replace(/^\s+/,""),l=l[0].replace(/\s+$/,"")):l="",_={},y=!0;y;)-1!=o[a].search(/(.*)draft$/)&&(_.draft=!0,o[a]=RegExp.$1,o[a]=o[a].replace(/\s+$/,"")),-1!=o[a].search(/(.*)invisible$/)&&(_.visible=!1,o[a]=RegExp.$1,o[a]=o[a].replace(/\s+$/,"")),-1!=o[a].search(/(.*)nolabel$/)&&(_.withLabel=!1,o[a]=RegExp.$1,o[a]=o[a].replace(/\s+$/,"")),-1==o[a].search(/nolabel|invisible|draft/)&&(y=!1);if(f=!0,this.definedMacros)for(s=0;this.definedMacros.macros.length>s;s++)if(v=RegExp("^"+this.definedMacros.macros[s][0]+"\\s*\\("),-1!=o[a].search(v)){for(f=!1,o[a].match(/\((.*)\)/),p=RegExp.$1,p=p.split(","),g=0;p.length>g;g++)p[g].match(/\s*(\S*)\s*/),p[g]=RegExp.$1;T[l]=this.construct(this.definedMacros.macros[s][2],"macro",this.definedMacros.macros[s][1],p,l),T.macros.push(T[l]);break}if(f)if(-1!=o[a].search(/^[\[\]].*[\[\]]$/)){if(o[a].match(/([\[\]])(.*)([\[\]])/),_.straightFirst="["!=RegExp.$1,_.straightLast="["==RegExp.$3,c=RegExp.$2.replace(/^\s+/,"").replace(/\s+$/,""),-1!=c.search(/ /)&&(c.match(/(\S*) +(\S*)/),c=[],c[0]=RegExp.$1,c[1]=RegExp.$2),""!=l&&(JXG.exists(_.withLabel)||(_.withLabel=!0),_.name=l,"macro"==t&&b.push(l)),"macro"==t){if(""!=r)for(s=0;b.length>s;s++)c[0]==b[s]&&(c[0]=r+"."+c[0]),c[1]==b[s]&&(c[1]=r+"."+c[1]);for(s=0;n.length>s;s++)c[0]==n[s]&&(c=[i[s],c[1]]),c[1]==n[s]&&(c=[c[0],i[s]]);""!=r&&(_.id=r+"."+l)}c="string"==typeof c?[JXG.getReference(this,c.charAt(0)),JXG.getReference(this,c.charAt(1))]:[JXG.getReference(this,c[0]),JXG.getReference(this,c[1])],T.lines.push(this.create("line",c,_)),""!=l&&(T[l]=T.lines[T.lines.length-1])}else if(-1!=o[a].search(/k\s*\(.*/)){for(o[a].match(/k\s*\(\s*(\S.*\S|\S)\s*,\s*(\S.*\S|\S)\s*\)/),c=[],c[0]=RegExp.$1,c[1]=RegExp.$2,s=0;1>=s;s++)if(-1!=c[s].search(/[\[\]]/)){if(c[s].match(/^[\[\]]\s*(\S.*\S)\s*[\[\]]$/),c[s]=RegExp.$1,-1!=c[s].search(/ /)&&(c[s].match(/(\S*) +(\S*)/),c[s]=[],c[s][0]=RegExp.$1,c[s][1]=RegExp.$2),"macro"==t){if(""!=r)for(g=0;b.length>g;g++)c[s][0]==b[g]&&(c[s][0]=r+"."+c[s][0]),c[s][1]==b[g]&&(c[s][1]=r+"."+c[s][1]);for(g=0;n.length>g;g++)c[s][0]==n[g]&&(c[s]=[i[g],c[s][1]]),c[s][1]==n[g]&&(c[s]=[c[s][0],i[g]])}c[s]="string"==typeof c[s]?function(e,t){return function(){return JXG.getReference(t,e.charAt(0)).Dist(JXG.getReference(t,e.charAt(1)))}}(c[s],this):function(e,t){return function(){return JXG.getReference(t,e[0]).Dist(JXG.getReference(t,e[1]))}}(c[s],this)}else if(-1!=c[s].search(/[0-9\.\s]+/))c[s]=1*c[s];else{if("macro"==t){if(""!=r)for(g=0;b.length>g;g++)c[s]==b[g]&&(c[s]=r+"."+b[g]);for(g=0;n.length>g;g++)c[s]==n[g]&&(c[s]=i[g])}c[s]=JXG.getReference(this,c[s])}""!=l&&(JXG.exists(_.withLabel)||(_.withLabel=!0),_.name=l,"macro"==t&&(""!=r&&(_.id=r+"."+l),b.push(l))),T.circles.push(this.create("circle",c,_)),""!=l&&(T[l]=T.circles[T.circles.length-1])}else if(-1!=o[a].search(/^[A-Z]+.*\(\s*[0-9\.\-]+\s*[,\|]\s*[0-9\.\-]+\s*\)/)&&-1==o[a].search(/Macro\((.*)\)/))o[a].match(/^([A-Z]+\S*)\s*\(\s*(.*)\s*[,\|]\s*(.*)\s*\)$/),l=RegExp.$1,_.name=l,"macro"==t&&(""!=r&&(_.id=r+"."+l),b.push(l)),T.points.push(this.create("point",[1*RegExp.$2,1*RegExp.$3],_)),T[l]=T.points[T.points.length-1];else if(-1!=o[a].search(/^[A-Z]+.*\(.+(([,\|]\s*[0-9\.\-]+\s*){2})?/)&&-1==o[a].search(/Macro\((.*)\)/)){if(o[a].match(/([A-Z]+.*)\((.*)\)/),l=RegExp.$1,c=RegExp.$2,l=l.replace(/^\s+/,"").replace(/\s+$/,""),c=c.replace(/^\s+/,"").replace(/\s+$/,""),-1!=c.search(/[,\|]/)?(c.match(/(\S*)\s*[,\|]\s*([0-9\.]+)\s*[,\|]\s*([0-9\.]+)\s*/),c=[],c[0]=RegExp.$1,c[1]=1*RegExp.$2,c[2]=1*RegExp.$3):(u=c,c=[],c[0]=u,c[1]=0,c[2]=0),_.name=l,"macro"==t){if(""!=r)for(g=0;b.length>g;g++)c[0]==b[g]&&(c[0]=r+"."+b[g]);for(g=0;n.length>g;g++)c[0]==n[g]&&(c[0]=i[g]);""!=r&&(_.id=r+"."+l),b.push(l)}T.points.push(this.create("glider",[c[1],c[2],JXG.getReference(this,c[0])],_)),T[l]=T.points[T.points.length-1]}else if(-1!=o[a].search(/&/)){if(o[a].match(/(.*)&(.*)/),c=[],c[0]=RegExp.$1,c[1]=RegExp.$2,c[0]=c[0].replace(/\s+$/,""),c[1]=c[1].replace(/^\s+/,""),"macro"==t)for(s=0;1>=s;s++){if(""!=r)for(g=0;b.length>g;g++)c[s]==b[g]&&(c[s]=r+"."+b[g]);for(g=0;n.length>g;g++)c[s]==n[g]&&(c[s]=i[g])}c[0]=JXG.getReference(this,c[0]),c[1]=JXG.getReference(this,c[1]),c[0].elementClass!=JXG.OBJECT_CLASS_LINE&&c[0].elementClass!=JXG.OBJECT_CLASS_CURVE||c[1].elementClass!=JXG.OBJECT_CLASS_LINE&&c[1].elementClass!=JXG.OBJECT_CLASS_CURVE?(""!=l&&(_.name=l+"_1","macro"==t&&(""!=r&&(_.id=r+"."+l+"_1"),b.push(l+"_1"))),u=this.create("intersection",[c[0],c[1],0],_),T.intersections.push(u),""!=l&&(T[_.name]=u),""!=l&&(_.name=l+"_2","macro"==t&&(""!=r&&(_.id=r+"."+l+"_2"),b.push(l+"_2"))),u=this.create("intersection",[c[0],c[1],1],_),T.intersections.push(u),""!=l&&(T[_.name]=u)):(""!=l&&(_.name=l,"macro"==t&&(""!=r&&(_.id=r+"."+l),b.push(l))),u=this.create("intersection",[c[0],c[1],0],_),T.intersections.push(u),""!=l&&(T[_.name]=u))}else if(-1!=o[a].search(/\|[\|_]\s*\(/)){if(o[a].match(/\|([\|_])\s*\(\s*(\S*)\s*,\s*(\S*)\s*\)/),d=RegExp.$1,d="|"==d?"parallel":"normal",c=[],c[0]=RegExp.$2,c[1]=RegExp.$3,"macro"==t)for(s=0;1>=s;s++){if(""!=r)for(g=0;b.length>g;g++)c[s]==b[g]&&(c[s]=r+"."+b[g]);
for(g=0;n.length>g;g++)c[s]==n[g]&&(c[s]=i[g])}""!=l&&(_.name=l,JXG.exists(_.withLabel)||(_.withLabel=!0),"macro"==t&&(""!=r&&(_.id=r+"."+l),b.push(l))),T.lines.push(this.create(d,[JXG.getReference(this,c[0]),JXG.getReference(this,c[1])],_)),""!=l&&(T[l]=T.lines[T.lines.length-1])}else if(-1!=o[a].search(/^)){if(o[a].match(/<\s*\(\s*(\S*)\s*,\s*(\S*)\s*,\s*(\S*)\s*\)/),c=[],c[0]=RegExp.$1,c[1]=RegExp.$2,c[2]=RegExp.$3,"macro"==t)for(s=0;2>=s;s++){if(""!=r)for(g=0;b.length>g;g++)c[s]==b[g]&&(c[s]=r+"."+b[g]);for(g=0;n.length>g;g++)c[s]==n[g]&&(c[s]=i[g])}if(""==l)T.lines.push(this.create("angle",[JXG.getReference(this,c[0]),JXG.getReference(this,c[1]),JXG.getReference(this,c[2])],_));else{for(h=["alpha","beta","gamma","delta","epsilon","zeta","eta","theta","iota","kappa","lambda","mu","nu","xi","omicron","pi","rho","sigmaf","sigma","tau","upsilon","phi","chi","psi","omega"],d="",s=0;h.length>s;s++){if(l==h[s]){_.text="&"+l+";",_.name="&"+l+";",d="greek";break}s==h.length-1&&(_.text=l,_.name=l)}JXG.exists(_.withLabel)||(_.withLabel=!0),"macro"==t&&(""!=r&&(_.id=r+"."+l),b.push(l)),T.angles.push(this.create("angle",[JXG.getReference(this,c[0]),JXG.getReference(this,c[1]),JXG.getReference(this,c[2])],_)),T[l]=T.angles[T.angles.length-1]}}else if(-1!=o[a].search(/([0-9]+)\/([0-9]+)\(\s*(\S*)\s*,\s*(\S*)\s*\)/)){if(c=[],c[0]=1*RegExp.$1/(1*RegExp.$2),c[1]=RegExp.$3,c[2]=RegExp.$4,"macro"==t)for(s=1;2>=s;s++){if(""!=r)for(g=0;b.length>g;g++)c[s]==b[g]&&(c[s]=r+"."+b[g]);for(g=0;n.length>g;g++)c[s]==n[g]&&(c[s]=i[g])}c[1]=JXG.getReference(this,RegExp.$3),c[2]=JXG.getReference(this,RegExp.$4),u=[],u[0]=function(e){return function(){return(1-e[0])*e[1].coords.usrCoords[1]+e[0]*e[2].coords.usrCoords[1]}}(c,this),u[1]=function(e){return function(){return(1-e[0])*e[1].coords.usrCoords[2]+e[0]*e[2].coords.usrCoords[2]}}(c,this),""!=l&&(_.name=l,"macro"==t&&(""!=r&&(_.id=r+"."+l),b.push(l))),T.points.push(this.create("point",[u[0],u[1]],_)),""!=l&&(T[l]=T.points[T.points.length-1])}else if(-1!=o[a].search(/(\S*)\s*:\s*(.*)/))l=RegExp.$1,p=JXG.GeonextParser.geonext2JS(RegExp.$2,this),c=[Function("x","var y = "+p+"; return y;")],_.name=l,T.functions.push(this.create("functiongraph",c,_)),T[l]=T.functions[T.functions.length-1];else if(-1!=o[a].search(/#(.*)\(\s*([0-9])\s*[,|]\s*([0-9])\s*\)/))c=[],c[0]=RegExp.$1,c[1]=1*RegExp.$2,c[2]=1*RegExp.$3,c[0]=c[0].replace(/^\s+/,"").replace(/\s+$/,""),T.texts.push(this.create("text",[c[1],c[2],c[0]],_));else if(-1!=o[a].search(/(\S*)\s*\[(.*)\]/)){for(_.name=RegExp.$1,JXG.exists(_.withLabel)||(_.withLabel=!0),c=RegExp.$2,c=c.split(","),s=0;c.length>s;s++){if(c[s]=c[s].replace(/^\s+/,"").replace(/\s+$/,""),"macro"==t){if(""!=r)for(g=0;b.length>g;g++)c[s]==b[g]&&(c[s]=r+"."+b[g]);for(g=0;n.length>g;g++)c[s]==n[g]&&(c[s]=i[g])}c[s]=JXG.getReference(this,c[s])}T.polygons.push(this.create("polygon",c,_)),T[_.name]=T.polygons[T.polygons.length-1]}}}return this.update(),T},JXG.Board.prototype.addMacro=function(e){var t,n,i,r="";for(e.match(/(.*)\{(.*)\}/),t=RegExp.$1,n=RegExp.$2,-1!=t.search(/=/)&&(t.match(/\s*(\S*)\s*=.*/),r=RegExp.$1,t=t.split("=")[1]),t.match(/Macro\((.*)\)/),t=RegExp.$1,t=t.split(","),i=0;t.length>i;i++)t[i].match(/\s*(\S*)\s*/),t[i]=RegExp.$1;null==this.definedMacros&&(this.definedMacros={},this.definedMacros.macros=[]),this.definedMacros.macros.push([r,t,n]),""!=r&&(this.definedMacros.defName=this.definedMacros.macros[this.definedMacros.macros.length-1])},JXG.SVGRenderer=function(e){var t;for(this.type="svg",this.svgRoot=null,this.svgNamespace="http://www.w3.org/2000/svg",this.xlinkNamespace="http://www.w3.org/1999/xlink",this.container=e,this.container.style.MozUserSelect="none",this.container.style.overflow="hidden",""===this.container.style.position&&(this.container.style.position="relative"),this.svgRoot=this.container.ownerDocument.createElementNS(this.svgNamespace,"svg"),this.svgRoot.style.overflow="hidden",this.svgRoot.style.width=this.container.style.width,this.svgRoot.style.height=this.container.style.height,this.container.appendChild(this.svgRoot),this.defs=this.container.ownerDocument.createElementNS(this.svgNamespace,"defs"),this.svgRoot.appendChild(this.defs),this.filter=this.container.ownerDocument.createElementNS(this.svgNamespace,"filter"),this.filter.setAttributeNS(null,"id",this.container.id+"_f1"),this.filter.setAttributeNS(null,"width","300%"),this.filter.setAttributeNS(null,"height","300%"),this.filter.setAttributeNS(null,"filterUnits","userSpaceOnUse"),this.feOffset=this.container.ownerDocument.createElementNS(this.svgNamespace,"feOffset"),this.feOffset.setAttributeNS(null,"result","offOut"),this.feOffset.setAttributeNS(null,"in","SourceAlpha"),this.feOffset.setAttributeNS(null,"dx","5"),this.feOffset.setAttributeNS(null,"dy","5"),this.filter.appendChild(this.feOffset),this.feGaussianBlur=this.container.ownerDocument.createElementNS(this.svgNamespace,"feGaussianBlur"),this.feGaussianBlur.setAttributeNS(null,"result","blurOut"),this.feGaussianBlur.setAttributeNS(null,"in","offOut"),this.feGaussianBlur.setAttributeNS(null,"stdDeviation","3"),this.filter.appendChild(this.feGaussianBlur),this.feBlend=this.container.ownerDocument.createElementNS(this.svgNamespace,"feBlend"),this.feBlend.setAttributeNS(null,"in","SourceGraphic"),this.feBlend.setAttributeNS(null,"in2","blurOut"),this.feBlend.setAttributeNS(null,"mode","normal"),this.filter.appendChild(this.feBlend),this.defs.appendChild(this.filter),this.layer=[],t=0;JXG.Options.layer.numlayers>t;t++)this.layer[t]=this.container.ownerDocument.createElementNS(this.svgNamespace,"g"),this.svgRoot.appendChild(this.layer[t]);this.dashArray=["2, 2","5, 5","10, 10","20, 20","20, 10, 10, 10","20, 5, 10, 5"]},JXG.SVGRenderer.prototype=new JXG.AbstractRenderer,JXG.extend(JXG.SVGRenderer.prototype,{_createArrowHead:function(e,t){var n,i,r=e.id+"Triangle";return JXG.exists(t)&&(r+=t),n=this.createPrim("marker",r),n.setAttributeNS(null,"viewBox","0 0 10 6"),n.setAttributeNS(null,"refY","3"),n.setAttributeNS(null,"markerUnits","userSpaceOnUse"),n.setAttributeNS(null,"markerHeight","12"),n.setAttributeNS(null,"markerWidth","10"),n.setAttributeNS(null,"orient","auto"),n.setAttributeNS(null,"stroke",e.visProp.strokecolor),n.setAttributeNS(null,"stroke-opacity",e.visProp.strokeopacity),n.setAttributeNS(null,"fill",e.visProp.strokecolor),n.setAttributeNS(null,"fill-opacity",e.visProp.strokeopacity),i=this.container.ownerDocument.createElementNS(this.svgNamespace,"path"),"End"===t?(n.setAttributeNS(null,"refX","0"),i.setAttributeNS(null,"d","M 0 3 L 10 6 L 10 0 z")):(n.setAttributeNS(null,"refX","10"),i.setAttributeNS(null,"d","M 0 0 L 10 3 L 0 6 z")),n.appendChild(i),n},_setArrowAtts:function(e,t,n){e&&(e.setAttributeNS(null,"stroke",t),e.setAttributeNS(null,"stroke-opacity",n),e.setAttributeNS(null,"fill",t),e.setAttributeNS(null,"fill-opacity",n))},updateTicks:function(e,t,n,i,r){var o,a,s,l="",c=e.ticks.length;for(o=0;c>o;o++)a=e.ticks[o].scrCoords,e.ticks[o].major?((e.board.needsFullUpdate||e.needsRegularUpdate)&&e.labels[o]&&e.labels[o].visProp.visible&&this.updateText(e.labels[o]),l+="M "+(a[1]+t)+" "+(a[2]-n)+" L "+(a[1]-t)+" "+(a[2]+n)+" "):l+="M "+(a[1]+i)+" "+(a[2]-r)+" L "+(a[1]-i)+" "+(a[2]+r)+" ";s=this.getElementById(e.id),JXG.exists(s)||(s=this.createPrim("path",e.id),this.appendChildPrim(s,e.visProp.layer),this.appendNodesToElement(e,"path")),s.setAttributeNS(null,"stroke",e.visProp.strokecolor),s.setAttributeNS(null,"stroke-opacity",e.visProp.strokeopacity),s.setAttributeNS(null,"stroke-width",e.visProp.strokewidth),this.updatePathPrim(s,l,e.board)},displayCopyright:function(e,t){var n,i=this.createPrim("text","licenseText");i.setAttributeNS(null,"x","20px"),i.setAttributeNS(null,"y",2+t+"px"),i.setAttributeNS(null,"style","font-family:Arial,Helvetica,sans-serif; font-size:"+t+"px; fill:#356AA0; opacity:0.3;"),n=document.createTextNode(e),i.appendChild(n),this.appendChildPrim(i,0)},drawInternalText:function(e){var t=this.createPrim("text",e.id);return t.setAttributeNS(null,"class","JXGtext"),e.rendNodeText=document.createTextNode(""),t.appendChild(e.rendNodeText),this.appendChildPrim(t,9),t},updateInternalText:function(e){var t=e.plaintext;isNaN(e.coords.scrCoords[1]+e.coords.scrCoords[2])||(e.rendNode.setAttributeNS(null,"x",e.coords.scrCoords[1]+"px"),e.rendNode.setAttributeNS(null,"y",e.coords.scrCoords[2]+.5*this.vOffsetText+"px")),e.htmlStr!==t&&(e.rendNodeText.data=t,e.htmlStr=t),this.transformImage(e,e.transformations)},drawImage:function(e){var t=this.createPrim("image",e.id);t.setAttributeNS(null,"preserveAspectRatio","none"),this.appendChildPrim(t,e.visProp.layer),e.rendNode=t,this.updateImage(e)},transformImage:function(e,t){var n,i,r=e.rendNode,o="",a=t.length;a>0&&(n=this.joinTransforms(e,t),i=[n[1][1],n[2][1],n[1][2],n[2][2],n[1][0],n[2][0]].join(","),o+=" matrix("+i+") ",r.setAttributeNS(null,"transform",o))},updateImageURL:function(e){var t=JXG.evaluate(e.url);e.rendNode.setAttributeNS(this.xlinkNamespace,"xlink:href",t)},appendChildPrim:function(e,t){JXG.exists(t)?t>=JXG.Options.layer.numlayers&&(t=JXG.Options.layer.numlayers-1):t=0,this.layer[t].appendChild(e)},appendNodesToElement:function(e){e.rendNode=this.getElementById(e.id)},createPrim:function(e,t){var n=this.container.ownerDocument.createElementNS(this.svgNamespace,e);return n.setAttributeNS(null,"id",this.container.id+"_"+t),n.style.position="absolute","path"===e&&(n.setAttributeNS(null,"stroke-linecap","butt"),n.setAttributeNS(null,"stroke-linejoin","round")),n},remove:function(e){JXG.exists(e)&&JXG.exists(e.parentNode)&&e.parentNode.removeChild(e)},makeArrows:function(e){var t;(e.visPropOld.firstarrow!==e.visProp.firstarrow||e.visPropOld.lastarrow!==e.visProp.lastarrow)&&(e.visProp.firstarrow?(t=e.rendNodeTriangleStart,JXG.exists(t)||(t=this._createArrowHead(e,"End"),this.defs.appendChild(t),e.rendNodeTriangleStart=t,e.rendNode.setAttributeNS(null,"marker-start","url(#"+this.container.id+"_"+e.id+"TriangleEnd)"))):(t=e.rendNodeTriangleStart,JXG.exists(t)&&this.remove(t)),e.visProp.lastarrow?(t=e.rendNodeTriangleEnd,JXG.exists(t)||(t=this._createArrowHead(e,"Start"),this.defs.appendChild(t),e.rendNodeTriangleEnd=t,e.rendNode.setAttributeNS(null,"marker-end","url(#"+this.container.id+"_"+e.id+"TriangleStart)"))):(t=e.rendNodeTriangleEnd,JXG.exists(t)&&this.remove(t)),e.visPropOld.firstarrow=e.visProp.firstarrow,e.visPropOld.lastarrow=e.visProp.lastarrow)},updateEllipsePrim:function(e,t,n,i,r){e.setAttributeNS(null,"cx",t),e.setAttributeNS(null,"cy",n),e.setAttributeNS(null,"rx",i),e.setAttributeNS(null,"ry",r)},updateLinePrim:function(e,t,n,i,r){isNaN(t+n+i+r)||(e.setAttributeNS(null,"x1",t),e.setAttributeNS(null,"y1",n),e.setAttributeNS(null,"x2",i),e.setAttributeNS(null,"y2",r))},updatePathPrim:function(e,t){""==t&&(t="M 0 0"),e.setAttributeNS(null,"d",t)},updatePathStringPoint:function(e,t,n){var i="",r=e.coords.scrCoords,o=.5*t*Math.sqrt(3),a=.5*t;return"x"===n?i=" M "+(r[1]-t)+" "+(r[2]-t)+" L "+(r[1]+t)+" "+(r[2]+t)+" M "+(r[1]+t)+" "+(r[2]-t)+" L "+(r[1]-t)+" "+(r[2]+t):"+"===n?i=" M "+(r[1]-t)+" "+r[2]+" L "+(r[1]+t)+" "+r[2]+" M "+r[1]+" "+(r[2]-t)+" L "+r[1]+" "+(r[2]+t):"<>"===n?i=" M "+(r[1]-t)+" "+r[2]+" L "+r[1]+" "+(r[2]+t)+" L "+(r[1]+t)+" "+r[2]+" L "+r[1]+" "+(r[2]-t)+" Z ":"^"===n?i=" M "+r[1]+" "+(r[2]-t)+" L "+(r[1]-o)+" "+(r[2]+a)+" L "+(r[1]+o)+" "+(r[2]+a)+" Z ":"v"===n?i=" M "+r[1]+" "+(r[2]+t)+" L "+(r[1]-o)+" "+(r[2]-a)+" L "+(r[1]+o)+" "+(r[2]-a)+" Z ":">"===n?i=" M "+(r[1]+t)+" "+r[2]+" L "+(r[1]-a)+" "+(r[2]-o)+" L "+(r[1]-a)+" "+(r[2]+o)+" Z ":"<"===n&&(i=" M "+(r[1]-t)+" "+r[2]+" L "+(r[1]+a)+" "+(r[2]-o)+" L "+(r[1]+a)+" "+(r[2]+o)+" Z "),i},updatePathStringPrim:function(e){var t,n,i,r=" M ",o=" L ",a=r,s=5e3,l="",c="plot"!==e.visProp.curvetype;if(0>=e.numberPoints)return"";for(c&&e.board.options.curve.RDPsmoothing&&(e.points=JXG.Math.Numerics.RamerDouglasPeuker(e.points,.5)),i=Math.min(e.points.length,e.numberPoints),t=0;i>t;t++)n=e.points[t].scrCoords,isNaN(n[1])||isNaN(n[2])?a=r:(n[1]>s?n[1]=s:-s>n[1]&&(n[1]=-s),n[2]>s?n[2]=s:-s>n[2]&&(n[2]=-s),l+=[a,n[1]," ",n[2]].join(""),a=o);return l},updatePolygonPrim:function(e,t){var n,i,r="",o=t.vertices.length;for(e.setAttributeNS(null,"stroke","none"),i=0;o-1>i;i++)n=t.vertices[i].coords.scrCoords,r=r+n[1]+","+n[2],o-2>i&&(r+=" ");-1==r.indexOf("NaN")&&e.setAttributeNS(null,"points",r)},updateRectPrim:function(e,t,n,i,r){e.setAttributeNS(null,"x",t),e.setAttributeNS(null,"y",n),e.setAttributeNS(null,"width",i),e.setAttributeNS(null,"height",r)},setPropertyPrim:function(e,t,n){"stroked"!==t&&e.setAttributeNS(null,t,n)},show:function(e){var t;e&&e.rendNode&&(t=e.rendNode,t.setAttributeNS(null,"display","inline"),t.style.visibility="inherit")},hide:function(e){var t;e&&e.rendNode&&(t=e.rendNode,t.setAttributeNS(null,"display","none"),t.style.visibility="hidden")},setBuffering:function(e,t){e.rendNode.setAttribute("buffered-rendering",t)},setDashStyle:function(e){var t=e.visProp.dash,n=e.rendNode;e.visProp.dash>0?n.setAttributeNS(null,"stroke-dasharray",this.dashArray[t-1]):n.hasAttributeNS(null,"stroke-dasharray")&&n.removeAttributeNS(null,"stroke-dasharray")},setGradient:function(e){var t,n,i,r,o,a,s,l,c,u=e.rendNode;n=JXG.evaluate(e.visProp.fillopacity),n=n>0?n:0,t=JXG.evaluate(e.visProp.fillcolor),"linear"===e.visProp.gradient?(i=this.createPrim("linearGradient",e.id+"_gradient"),a="0%",s="100%",l="0%",c="0%",i.setAttributeNS(null,"x1",a),i.setAttributeNS(null,"x2",s),i.setAttributeNS(null,"y1",l),i.setAttributeNS(null,"y2",c),r=this.createPrim("stop",e.id+"_gradient1"),r.setAttributeNS(null,"offset","0%"),r.setAttributeNS(null,"style","stop-color:"+t+";stop-opacity:"+n),o=this.createPrim("stop",e.id+"_gradient2"),o.setAttributeNS(null,"offset","100%"),o.setAttributeNS(null,"style","stop-color:"+e.visProp.gradientsecondcolor+";stop-opacity:"+e.visProp.gradientsecondopacity),i.appendChild(r),i.appendChild(o),this.defs.appendChild(i),u.setAttributeNS(null,"style","fill:url(#"+this.container.id+"_"+e.id+"_gradient)"),e.gradNode1=r,e.gradNode2=o):"radial"===e.visProp.gradient?(i=this.createPrim("radialGradient",e.id+"_gradient"),i.setAttributeNS(null,"cx","50%"),i.setAttributeNS(null,"cy","50%"),i.setAttributeNS(null,"r","50%"),i.setAttributeNS(null,"fx",100*e.visProp.gradientpositionx+"%"),i.setAttributeNS(null,"fy",100*e.visProp.gradientpositiony+"%"),r=this.createPrim("stop",e.id+"_gradient1"),r.setAttributeNS(null,"offset","0%"),r.setAttributeNS(null,"style","stop-color:"+e.visProp.gradientsecondcolor+";stop-opacity:"+e.visProp.gradientsecondopacity),o=this.createPrim("stop",e.id+"_gradient2"),o.setAttributeNS(null,"offset","100%"),o.setAttributeNS(null,"style","stop-color:"+t+";stop-opacity:"+n),i.appendChild(r),i.appendChild(o),this.defs.appendChild(i),u.setAttributeNS(null,"style","fill:url(#"+this.container.id+"_"+e.id+"_gradient)"),e.gradNode1=r,e.gradNode2=o):u.removeAttributeNS(null,"style")},updateGradient:function(e){var t,n,i=e.gradNode1,r=e.gradNode2;JXG.exists(i)&&JXG.exists(r)&&(n=JXG.evaluate(e.visProp.fillopacity),n=n>0?n:0,t=JXG.evaluate(e.visProp.fillcolor),"linear"===e.visProp.gradient?(i.setAttributeNS(null,"style","stop-color:"+t+";stop-opacity:"+n),r.setAttributeNS(null,"style","stop-color:"+e.visProp.gradientsecondcolor+";stop-opacity:"+e.visProp.gradientsecondopacity)):"radial"===e.visProp.gradient&&(i.setAttributeNS(null,"style","stop-color:"+e.visProp.gradientsecondcolor+";stop-opacity:"+e.visProp.gradientsecondopacity),r.setAttributeNS(null,"style","stop-color:"+t+";stop-opacity:"+n)))},setObjectFillColor:function(e,t,n){var i,r,o,a,s=JXG.evaluate(t),l=JXG.evaluate(n);l=l>0?l:0,(e.visPropOld.fillcolor!==s||e.visPropOld.fillopacity!==l)&&(s!==!1&&(9!=s.length?(r=s,a=l):(o=JXG.rgba2rgbo(s),r=o[0],a=l*o[1]),i=e.rendNode,i.setAttributeNS(null,"fill",r),e.type===JXG.OBJECT_TYPE_IMAGE?i.setAttributeNS(null,"opacity",a):i.setAttributeNS(null,"fill-opacity",a),JXG.exists(e.visProp.gradient)&&this.updateGradient(e)),e.visPropOld.fillcolor=s,e.visPropOld.fillopacity=l)},setObjectStrokeColor:function(e,t,n){var i,r,o,a,s=JXG.evaluate(t),l=JXG.evaluate(n);l=l>0?l:0,(e.visPropOld.strokecolor!==s||e.visPropOld.strokeopacity!==l)&&(s!==!1&&(9!=s.length?(i=s,o=l):(r=JXG.rgba2rgbo(s),i=r[0],o=l*r[1]),a=e.rendNode,e.type===JXG.OBJECT_TYPE_TEXT?("html"===e.visProp.display?a.style.color=i:a.setAttributeNS(null,"style","fill:"+i),a.style.opacity=o):(a.setAttributeNS(null,"stroke",i),a.setAttributeNS(null,"stroke-opacity",o)),e.type===JXG.OBJECT_TYPE_ARROW?this._setArrowAtts(e.rendNodeTriangle,i,o):(e.elementClass===JXG.OBJECT_CLASS_CURVE||e.elementClass===JXG.OBJECT_CLASS_LINE)&&(e.visProp.firstarrow&&this._setArrowAtts(e.rendNodeTriangleStart,i,o),e.visProp.lastarrow&&this._setArrowAtts(e.rendNodeTriangleEnd,i,o))),e.visPropOld.strokecolor=s,e.visPropOld.strokeopacity=l)},setObjectStrokeWidth:function(e,t){var n,i=JXG.evaluate(t);e.visPropOld.strokewidth!==i&&(n=e.rendNode,this.setPropertyPrim(n,"stroked","true"),JXG.exists(i)&&this.setPropertyPrim(n,"stroke-width",i+"px"),e.visPropOld.strokewidth=i)},setShadow:function(e){e.visPropOld.shadow!==e.visProp.shadow&&(JXG.exists(e.rendNode)&&(e.visProp.shadow?e.rendNode.setAttributeNS(null,"filter","url(#"+this.container.id+"_f1)"):e.rendNode.removeAttributeNS(null,"filter")),e.visPropOld.shadow=e.visProp.shadow)},suspendRedraw:function(){},unsuspendRedraw:function(){},resize:function(e,t){this.svgRoot.style.width=parseFloat(e)+"px",this.svgRoot.style.height=parseFloat(t)+"px"}}),JXG.VMLRenderer=function(e){this.type="vml",this.container=e,this.container.style.overflow="hidden",this.container.onselectstart=function(){return!1},this.resolution=10,JXG.exists(JXG.vmlStylesheet)||(e.ownerDocument.namespaces.add("jxgvml","urn:schemas-microsoft-com:vml"),JXG.vmlStylesheet=this.container.ownerDocument.createStyleSheet(),JXG.vmlStylesheet.addRule(".jxgvml","behavior:url(#default#VML)"));try{!e.ownerDocument.namespaces.jxgvml&&e.ownerDocument.namespaces.add("jxgvml","urn:schemas-microsoft-com:vml"),this.createNode=function(t){return e.ownerDocument.createElement("')}}catch(t){this.createNode=function(t){return e.ownerDocument.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="jxgvml">')}}this.dashArray=["Solid","1 1","ShortDash","Dash","LongDash","ShortDashDot","LongDashDot"]},JXG.VMLRenderer.prototype=new JXG.AbstractRenderer,JXG.extend(JXG.VMLRenderer.prototype,{_setAttr:function(e,t,n,i){try{8===document.documentMode?e[t]=n:e.setAttribute(t,n,i)}catch(r){JXG.debug(e.id+" "+t+" "+n+"
\n")}},updateTicks:function(e,t,n,i,r){var o,a,s,l,c=[],u=this.resolution;for(a=e.ticks.length,o=0;a>o;o++)s=e.ticks[o].scrCoords,e.ticks[o].major?((e.board.needsFullUpdate||e.needsRegularUpdate)&&e.labels[o]&&e.labels[o].visProp.visible&&this.updateText(e.labels[o]),c.push(" m "+Math.round(u*(s[1]+t))+", "+Math.round(u*(s[2]-n))+" l "+Math.round(u*(s[1]-t))+", "+Math.round(u*(s[2]+n))+" ")):c.push(" m "+Math.round(u*(s[1]+i))+", "+Math.round(u*(s[2]-r))+" l "+Math.round(u*(s[1]-i))+", "+Math.round(u*(s[2]+r))+" ");JXG.exists(e)||(l=this.createPrim("path",e.id),this.appendChildPrim(l,e.visProp.layer),this.appendNodesToElement(e,"path")),this._setAttr(e.rendNode,"stroked","true"),this._setAttr(e.rendNode,"strokecolor",e.visProp.strokecolor,1),this._setAttr(e.rendNode,"strokeweight",e.visProp.strokewidth),this._setAttr(e.rendNodeStroke,"opacity",100*e.visProp.strokeopacity+"%"),this.updatePathPrim(e.rendNode,c,e.board)},displayCopyright:function(e,t){var n,i;n=this.createNode("textbox"),n.style.position="absolute",this._setAttr(n,"id",this.container.id+"_licenseText"),n.style.left=20,n.style.top=2,n.style.fontSize=t,n.style.color="#356AA0",n.style.fontFamily="Arial,Helvetica,sans-serif",this._setAttr(n,"opacity","30%"),n.style.filter="alpha(opacity = 30)",i=document.createTextNode(e),n.appendChild(i),this.appendChildPrim(n,0)},drawInternalText:function(e){var t;return t=this.createNode("textbox"),t.style.position="absolute",8===document.documentMode?t.setAttribute("class","JXGtext"):t.setAttribute(document.all?"className":"class","JXGtext"),e.rendNodeText=document.createTextNode(""),t.appendChild(e.rendNodeText),this.appendChildPrim(t,9),t},updateInternalText:function(e){var t=e.plaintext;isNaN(e.coords.scrCoords[1]+e.coords.scrCoords[2])||(e.rendNode.style.left=parseInt(e.coords.scrCoords[1])+"px",e.rendNode.style.top=parseInt(e.coords.scrCoords[2]-parseInt(e.visProp.fontsize)+this.vOffsetText)+"px"),e.htmlStr!==t&&(e.rendNodeText.data=t,e.htmlStr=t),this.transformImage(e,e.transformations)},drawImage:function(e){var t;t=this.container.ownerDocument.createElement("img"),t.style.position="absolute",this._setAttr(t,"id",this.container.id+"_"+e.id),this.container.appendChild(t),this.appendChildPrim(t,e.visProp.layer),t.style.filter=t.style["-ms-filter"]="progid:DXImageTransform.Microsoft.Matrix(M11='1.0', sizingMethod='auto expand')",e.rendNode=t,this.updateImage(e)},transformImage:function(e,t){var n,i,r,o,a,s,l,c=e.rendNode,u=[],d=t.length;if(e.type===JXG.OBJECT_TYPE_TEXT&&e.updateSize(),d>0){for(l=""+e.rendNode.style.filter,l.match(/DXImageTransform/)||(c.style.filter=c.style["-ms-filter"]="progid:DXImageTransform.Microsoft.Matrix(M11='1.0', sizingMethod='auto expand') "+l),n=this.joinTransforms(e,t),u[0]=JXG.Math.matVecMult(n,e.coords.scrCoords),u[0][1]/=u[0][0],u[0][2]/=u[0][0],u[1]=JXG.Math.matVecMult(n,[1,e.coords.scrCoords[1]+e.size[0],e.coords.scrCoords[2]]),u[1][1]/=u[1][0],u[1][2]/=u[1][0],u[2]=JXG.Math.matVecMult(n,[1,e.coords.scrCoords[1]+e.size[0],e.coords.scrCoords[2]-e.size[1]]),u[2][1]/=u[2][0],u[2][2]/=u[2][0],u[3]=JXG.Math.matVecMult(n,[1,e.coords.scrCoords[1],e.coords.scrCoords[2]-e.size[1]]),u[3][1]/=u[3][0],u[3][2]/=u[3][0],i=u[0][1],o=u[0][1],r=u[0][2],a=u[0][2],s=1;4>s;s++)i=Math.max(i,u[s][1]),o=Math.min(o,u[s][1]),r=Math.max(r,u[s][2]),a=Math.min(a,u[s][2]);c.style.left=parseInt(o)+"px",c.style.top=parseInt(a)+"px",c.filters.item(0).M11=n[1][1],c.filters.item(0).M12=n[1][2],c.filters.item(0).M21=n[2][1],c.filters.item(0).M22=n[2][2]}},updateImageURL:function(e){var t=JXG.evaluate(e.url);this._setAttr(e.rendNode,"src",t)},appendChildPrim:function(e,t){JXG.exists(t)||(t=0),e.style.zIndex=t,this.container.appendChild(e)},appendNodesToElement:function(e,t){("shape"===t||"path"===t||"polygon"===t)&&(e.rendNodePath=this.getElementById(e.id+"_path")),e.rendNodeFill=this.getElementById(e.id+"_fill"),e.rendNodeStroke=this.getElementById(e.id+"_stroke"),e.rendNodeShadow=this.getElementById(e.id+"_shadow"),e.rendNode=this.getElementById(e.id)},createPrim:function(e,t){var n,i,r=this.createNode("fill"),o=this.createNode("stroke"),a=this.createNode("shadow");return this._setAttr(r,"id",this.container.id+"_"+t+"_fill"),this._setAttr(o,"id",this.container.id+"_"+t+"_stroke"),this._setAttr(a,"id",this.container.id+"_"+t+"_shadow"),"circle"===e||"ellipse"===e?(n=this.createNode("oval"),n.appendChild(r),n.appendChild(o),n.appendChild(a)):"polygon"===e||"path"===e||"shape"===e||"line"===e?(n=this.createNode("shape"),n.appendChild(r),n.appendChild(o),n.appendChild(a),i=this.createNode("path"),this._setAttr(i,"id",this.container.id+"_"+t+"_path"),n.appendChild(i)):(n=this.createNode(e),n.appendChild(r),n.appendChild(o),n.appendChild(a)),n.style.position="absolute",n.style.left="0px",n.style.top="0px",this._setAttr(n,"id",this.container.id+"_"+t),n},remove:function(e){JXG.exists(e)&&e.removeNode(!0)},makeArrows:function(e){var t;(e.visPropOld.firstarrow!==e.visProp.firstarrow||e.visPropOld.lastarrow!==e.visProp.lastarrow)&&(e.visProp.firstarrow?(t=e.rendNodeStroke,this._setAttr(t,"startarrow","block"),this._setAttr(t,"startarrowlength","long")):(t=e.rendNodeStroke,JXG.exists(t)&&this._setAttr(t,"startarrow","none")),e.visProp.lastarrow?(t=e.rendNodeStroke,this._setAttr(t,"id",this.container.id+"_"+e.id+"stroke"),this._setAttr(t,"endarrow","block"),this._setAttr(t,"endarrowlength","long")):(t=e.rendNodeStroke,JXG.exists(t)&&this._setAttr(t,"endarrow","none")),e.visPropOld.firstarrow=e.visProp.firstarrow,e.visPropOld.lastarrow=e.visProp.lastarrow)},updateEllipsePrim:function(e,t,n,i,r){e.style.left=parseInt(t-i)+"px",e.style.top=parseInt(n-r)+"px",e.style.width=parseInt(2*i)+"px",e.style.height=parseInt(2*r)+"px"},updateLinePrim:function(e,t,n,i,r,o){var a,s=this.resolution;isNaN(t+n+i+r)||(a=["m ",parseInt(s*t),", ",parseInt(s*n)," l ",parseInt(s*i),", ",parseInt(s*r)],this.updatePathPrim(e,a,o))},updatePathPrim:function(e,t,n){var i=n.canvasWidth,r=n.canvasHeight;0>=t.length&&(t=["m 0,0"]),e.style.width=i,e.style.height=r,this._setAttr(e,"coordsize",[parseInt(this.resolution*i),parseInt(this.resolution*r)].join(",")),this._setAttr(e,"path",t.join(""))},updatePathStringPoint:function(e,t,n){var i=[],r=Math.round,o=e.coords.scrCoords,a=.5*t*Math.sqrt(3),s=.5*t,l=this.resolution;return"x"===n?i.push([" m ",r(l*(o[1]-t)),", ",r(l*(o[2]-t))," l ",r(l*(o[1]+t)),", ",r(l*(o[2]+t))," m ",r(l*(o[1]+t)),", ",r(l*(o[2]-t))," l ",r(l*(o[1]-t)),", ",r(l*(o[2]+t))].join("")):"+"===n?i.push([" m ",r(l*(o[1]-t)),", ",r(l*o[2])," l ",r(l*(o[1]+t)),", ",r(l*o[2])," m ",r(l*o[1]),", ",r(l*(o[2]-t))," l ",r(l*o[1]),", ",r(l*(o[2]+t))].join("")):"<>"===n?i.push([" m ",r(l*(o[1]-t)),", ",r(l*o[2])," l ",r(l*o[1]),", ",r(l*(o[2]+t))," l ",r(l*(o[1]+t)),", ",r(l*o[2])," l ",r(l*o[1]),", ",r(l*(o[2]-t))," x e "].join("")):"^"===n?i.push([" m ",r(l*o[1]),", ",r(l*(o[2]-t))," l ",r(l*(o[1]-a)),", ",r(l*(o[2]+s))," l ",r(l*(o[1]+a)),", ",r(l*(o[2]+s))," x e "].join("")):"v"===n?i.push([" m ",r(l*o[1]),", ",r(l*(o[2]+t))," l ",r(l*(o[1]-a)),", ",r(l*(o[2]-s))," l ",r(l*(o[1]+a)),", ",r(l*(o[2]-s))," x e "].join("")):">"===n?i.push([" m ",r(l*(o[1]+t)),", ",r(l*o[2])," l ",r(l*(o[1]-s)),", ",r(l*(o[2]-a))," l ",r(l*(o[1]-s)),", ",r(l*(o[2]+a))," l ",r(l*(o[1]+t)),", ",r(l*o[2])].join("")):"<"===n&&i.push([" m ",r(l*(o[1]-t)),", ",r(l*o[2])," l ",r(l*(o[1]+s)),", ",r(l*(o[2]-a))," l ",r(l*(o[1]+s)),", ",r(l*(o[2]+a))," x e "].join("")),i},updatePathStringPrim:function(e){var t,n,i=[],r=this.resolution,o=Math.round,a=" m ",s=" l ",l=a,c="plot"!==e.visProp.curvetype,u=Math.min(e.numberPoints,8192);if(0>=e.numberPoints)return"";for(c&&e.board.options.curve.RDPsmoothing&&(e.points=JXG.Math.Numerics.RamerDouglasPeuker(e.points,1)),u=Math.min(u,e.points.length),t=0;u>t;t++)n=e.points[t].scrCoords,isNaN(n[1])||isNaN(n[2])?l=a:(n[1]>2e4?n[1]=2e4:-2e4>n[1]&&(n[1]=-2e4),n[2]>2e4?n[2]=2e4:-2e4>n[2]&&(n[2]=-2e4),i.push([l,o(r*n[1]),", ",o(r*n[2])].join("")),l=s);return i.push(" e"),i},updatePolygonPrim:function(e,t){var n,i,r=t.vertices.length,o=this.resolution,a=[];if(this._setAttr(e,"stroked","false"),i=t.vertices[0].coords.scrCoords,!isNaN(i[1]+i[2])){for(a.push(["m ",parseInt(o*i[1]),",",parseInt(o*i[2])," l "].join("")),n=1;r-1>n;n++){if(i=t.vertices[n].coords.scrCoords,isNaN(i[1]+i[2]))return;a.push(parseInt(o*i[1])+","+parseInt(o*i[2])),r-2>n&&a.push(", ")}a.push(" x e"),this.updatePathPrim(e,a,t.board)}},updateRectPrim:function(e,t,n,i,r){e.style.left=parseInt(t)+"px",e.style.top=parseInt(n)+"px",i>=0&&(e.style.width=i+"px"),r>=0&&(e.style.height=r+"px")},setPropertyPrim:function(e,t,n){var i,r="";switch(t){case"stroke":r="strokecolor";break;case"stroke-width":r="strokeweight";break;case"stroke-dasharray":r="dashstyle"}""!==r&&(i=JXG.evaluate(n),this._setAttr(e,r,i))},show:function(e){e&&e.rendNode&&(e.rendNode.style.visibility="inherit")},hide:function(e){e&&e.rendNode&&(e.rendNode.style.visibility="hidden")},setDashStyle:function(e,t){var n;t.dash>=0&&(n=e.rendNodeStroke,this._setAttr(n,"dashstyle",this.dashArray[t.dash]))},setGradient:function(e){var t=e.rendNodeFill;"linear"===e.visProp.gradient?(this._setAttr(t,"type","gradient"),this._setAttr(t,"color2",e.visProp.gradientsecondcolor),this._setAttr(t,"opacity2",e.visProp.gradientsecondopacity),this._setAttr(t,"angle",e.visProp.gradientangle)):"radial"===e.visProp.gradient?(this._setAttr(t,"type","gradientradial"),this._setAttr(t,"color2",e.visProp.gradientsecondcolor),this._setAttr(t,"opacity2",e.visProp.gradientsecondopacity),this._setAttr(t,"focusposition",100*e.visProp.gradientpositionx+"%,"+100*e.visProp.gradientpositiony+"%"),this._setAttr(t,"focussize","0,0")):this._setAttr(t,"type","solid")},setObjectFillColor:function(e,t,n){var i,r,o,a,s=JXG.evaluate(t),l=JXG.evaluate(n);e.rendNode,l=l>0?l:0,(e.visPropOld.fillcolor!==s||e.visPropOld.fillopacity!==l)&&(9!=s.length?(i=s,o=l):(r=JXG.rgba2rgbo(s),i=r[0],o=l*r[1]),"none"===i||i===!1?this._setAttr(e.rendNode,"filled","false"):(this._setAttr(e.rendNode,"filled","true"),this._setAttr(e.rendNode,"fillcolor",i),JXG.exists(o)&&e.rendNodeFill&&this._setAttr(e.rendNodeFill,"opacity",100*o+"%")),e.type===JXG.OBJECT_TYPE_IMAGE&&(a=""+e.rendNode.style.filter,a.match(/alpha/)?e.rendNode.style.filter=a.replace(/alpha\(opacity *= *[0-9\.]+\)/,"alpha(opacity = "+100*o+")"):e.rendNode.style.filter+=" alpha(opacity = "+100*o+")"),e.visPropOld.fillcolor=s,e.visPropOld.fillopacity=l)},setObjectStrokeColor:function(e,t,n){var i,r,o,a,s=JXG.evaluate(t),l=JXG.evaluate(n),c=e.rendNode;l=l>0?l:0,(e.visPropOld.strokecolor!==s||e.visPropOld.strokeopacity!==l)&&(9!=s.length?(i=s,o=l):(r=JXG.rgba2rgbo(s),i=r[0],o=l*r[1]),e.type===JXG.OBJECT_TYPE_TEXT?(o=Math.round(100*o),c.style.filter=" alpha(opacity = "+o+")",c.style.color=i):(i!==!1&&(this._setAttr(c,"stroked","true"),this._setAttr(c,"strokecolor",i)),a=e.rendNodeStroke,JXG.exists(o)&&this._setAttr(a,"opacity",100*o+"%")),e.visPropOld.strokecolor=s,e.visPropOld.strokeopacity=l)},setObjectStrokeWidth:function(e,t){var n,i=JXG.evaluate(t);e.visPropOld.strokewidth!==i&&(n=e.rendNode,this.setPropertyPrim(n,"stroked","true"),JXG.exists(i)&&this.setPropertyPrim(n,"stroke-width",i),e.visPropOld.strokewidth=i)},setShadow:function(e){var t=e.rendNodeShadow;t&&e.visPropOld.shadow!==e.visProp.shadow&&(e.visProp.shadow?(this._setAttr(t,"On","True"),this._setAttr(t,"Offset","3pt,3pt"),this._setAttr(t,"Opacity","60%"),this._setAttr(t,"Color","#aaaaaa")):this._setAttr(t,"On","False"),e.visPropOld.shadow=e.visProp.shadow)},suspendRedraw:function(){this.container.style.display="none"},unsuspendRedraw:function(){this.container.style.display=""}}),JXG.CanvasRenderer=function(e){this.type="canvas",this.canvasRoot=null,this.suspendHandle=null,this.canvasId=JXG.Util.genUUID(),this.canvasNamespace=null,this.container=e,this.container.style.MozUserSelect="none",this.container.style.overflow="hidden",""===this.container.style.position&&(this.container.style.position="relative"),this.container.innerHTML=['