Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Putzlocher <mputzi@gmx.de>2013-08-10 10:27:12 (GMT)
committer Martin Putzlocher <mputzi@gmx.de>2013-08-10 10:27:12 (GMT)
commit9a3abec319e8ec66194979f414bf30abbe4642df (patch)
treea381ee771e5d81a3d7eabedf59a1e25b070cbf8c
parentf48f45a891970b73a8705214c64d97c4af929d1f (diff)
Sketchometry-3HEADmaster
based on Sketchometry 0.4.5 Signed-off-by: Martin Putzlocher <mputzi@gmx.de>
-rw-r--r--Sketchometry.activity/3dparty/hwr/handwriting.js854
-rw-r--r--Sketchometry.activity/3dparty/hwr/hwrstrokes.js28
-rw-r--r--Sketchometry.activity/3dparty/hwr/ndollar.js499
-rw-r--r--Sketchometry.activity/3dparty/hwr/pdollar.js312
-rw-r--r--Sketchometry.activity/3dparty/jQuery/jquery-1.7.1.min.js4
-rw-r--r--Sketchometry.activity/3dparty/jQuery/jquery.jsonp.js285
-rw-r--r--Sketchometry.activity/3dparty/jszip/jszip-deflate.min.js1
-rw-r--r--Sketchometry.activity/3dparty/jszip/jszip.min.js1
-rw-r--r--Sketchometry.activity/MANIFEST56
-rw-r--r--Sketchometry.activity/Sketchometry.pngbin0 -> 5772 bytes
-rwxr-xr-xSketchometry.activity/SketchometryActivity.py67
-rw-r--r--Sketchometry.activity/activity/Sketchometry.svg18
-rw-r--r--Sketchometry.activity/activity/activity.info11
-rw-r--r--Sketchometry.activity/audio/bubble.mp3bin0 -> 3449 bytes
-rw-r--r--Sketchometry.activity/audio/bubble.oggbin0 -> 5684 bytes
-rw-r--r--Sketchometry.activity/audio/click.mp3bin0 -> 1358 bytes
-rw-r--r--Sketchometry.activity/audio/click.oggbin0 -> 4415 bytes
-rw-r--r--Sketchometry.activity/audio/plastic.mp3bin0 -> 5958 bytes
-rw-r--r--Sketchometry.activity/audio/plastic.oggbin0 -> 7587 bytes
-rw-r--r--Sketchometry.activity/cache.manifest57
-rw-r--r--Sketchometry.activity/css/gallery-general.css119
-rw-r--r--Sketchometry.activity/css/gallery-ip3.css119
-rw-r--r--Sketchometry.activity/css/gallery-small.css119
-rw-r--r--Sketchometry.activity/css/gui-icons-hd.css314
-rw-r--r--Sketchometry.activity/css/gui-icons.css408
-rw-r--r--Sketchometry.activity/css/gui.css1115
-rw-r--r--Sketchometry.activity/index.html1234
-rw-r--r--Sketchometry.activity/js/GeonextReader.js1285
-rw-r--r--Sketchometry.activity/js/SketchReader.js1135
-rw-r--r--Sketchometry.activity/js/audio.js131
-rw-r--r--Sketchometry.activity/js/cache.js61
-rw-r--r--Sketchometry.activity/js/ext_ecma.js50
-rw-r--r--Sketchometry.activity/js/ext_jquery.js90
-rw-r--r--Sketchometry.activity/js/gui.js115
-rw-r--r--Sketchometry.activity/js/jsxgraph.js16
-rw-r--r--Sketchometry.activity/js/sk.js1
-rw-r--r--Sketchometry.activity/js/sketch.js24
-rw-r--r--Sketchometry.activity/js/url.js88
-rw-r--r--Sketchometry.activity/pics/cloud-logos.pngbin0 -> 11690 bytes
-rw-r--r--Sketchometry.activity/pics/icon-close.pngbin0 -> 979 bytes
-rw-r--r--Sketchometry.activity/pics/icon-logo.pngbin0 -> 6498 bytes
-rwxr-xr-xSketchometry.activity/pics/sketchometry.pngbin0 -> 9708 bytes
-rw-r--r--Sketchometry.activity/pics/sui-exo-icon-map-black-32.pngbin0 -> 57771 bytes
-rw-r--r--Sketchometry.activity/pics/sui-exo-icon-map-black-40.pngbin0 -> 73325 bytes
-rw-r--r--Sketchometry.activity/pics/sui-exo-icon-map-black-48.pngbin0 -> 89368 bytes
-rw-r--r--Sketchometry.activity/pics/sui-exo-icon-map-black-64.pngbin0 -> 121510 bytes
-rw-r--r--Sketchometry.activity/pics/sui-exo-icon-map-black-80.pngbin0 -> 154218 bytes
-rw-r--r--Sketchometry.activity/pics/sui-exo-icon-map-black-96.pngbin0 -> 190470 bytes
-rw-r--r--Sketchometry.activity/pics/sui-exo-icon-map-white-32.pngbin0 -> 53742 bytes
-rw-r--r--Sketchometry.activity/pics/sui-exo-icon-map-white-40.pngbin0 -> 68496 bytes
-rw-r--r--Sketchometry.activity/pics/sui-exo-icon-map-white-48.pngbin0 -> 83114 bytes
-rw-r--r--Sketchometry.activity/pics/sui-exo-icon-map-white-64.pngbin0 -> 113697 bytes
-rw-r--r--Sketchometry.activity/pics/sui-exo-icon-map-white-80.pngbin0 -> 143101 bytes
-rw-r--r--Sketchometry.activity/pics/sui-exo-icon-map-white-96.pngbin0 -> 175653 bytes
-rw-r--r--Sketchometry.activity/pics/wait-animation-big.gifbin0 -> 8238 bytes
-rw-r--r--Sketchometry.activity/pics/wait-animation.gifbin0 -> 5179 bytes
-rwxr-xr-xSketchometry.activity/setup.py25
57 files changed, 8642 insertions, 0 deletions
diff --git a/Sketchometry.activity/3dparty/hwr/handwriting.js b/Sketchometry.activity/3dparty/hwr/handwriting.js
new file mode 100644
index 0000000..3ec56a1
--- /dev/null
+++ b/Sketchometry.activity/3dparty/hwr/handwriting.js
@@ -0,0 +1,854 @@
+var JXGHWR = {
+
+ strokes: [],
+ points: [],
+ pointsRaw: [],
+ pointCloudsRaw: [],
+
+ strokeID: 0,
+ lastDate: 0,
+ startDate: 0,
+ minTimeDiff: 30,
+ minStrokeLength: 5,
+ maxDistance: 20,
+
+ types: {
+ 'D': ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
+ 'Sep': [',', '.'],
+ 'L': ['x', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'i', 'l', 'n', 'o', 's', 't'],
+ 'Op': ['+', '-', '*', '/', '^'],
+ 'K': ['(', ')','|'],
+ 'Ot': ['sqrt', '='],
+ 'V': ['x', 'y']
+ },
+
+ recognizerP: null,
+ recognizerN: null,
+
+ /**
+ * Canvas variables
+ */
+
+ canvas: null,
+ g: null,
+ rc: null,
+ timeout: null,
+
+ /**
+ *
+ */
+
+ needsClear: false,
+ isDown: false,
+
+ init: function(cv, tb) {
+
+ this.strokes = [];
+ this.points = [];
+ this.pointsRaw = [];
+
+ this.strokeID = 0;
+
+ this.canvas = cv;
+ this.textbox = tb;
+
+ this.initCanvas();
+
+ this.lastDate = new Date();
+
+ this.recognizerP = new JXGHWR_PDollarRecognizer();
+ this.recognizerN = new JXGHWR_NDollarRecognizer(true);
+
+ this.readGesturesFromLocalStorage();
+ },
+
+ readGesturesFromLocalStorage: function() {
+ var pointCloudsRaw, i, le;
+
+ if (localStorage) // otherwise IE 10 complains
+ pointCloudsRaw = JSON.parse(localStorage.getItem('JXGPointClouds'));
+
+ if (pointCloudsRaw!=null) {
+
+ this.pointCloudsRaw = pointCloudsRaw;
+ for (i = 0; i < pointCloudsRaw.length; ++i) {
+ this.recognizerP.AddGesture(
+ pointCloudsRaw[i].Name,
+ this.convertPoints(pointCloudsRaw[i].Points, 'p')
+ );
+
+ le = pointCloudsRaw[i].Points.length;
+ if (pointCloudsRaw[i].Points[le - 1][2] === 1) { // unistroke gesture
+ this.recognizerN.AddGesture(
+ pointCloudsRaw[i].Name,
+ true,
+ [this.convertPoints(pointCloudsRaw[i].Points)]
+ );
+ }
+ }
+ }
+
+ for (i = 0; i < this.recognizerP.PointClouds.length; ++i) {
+ le = this.recognizerP.PointClouds[i].Points.length;
+ this.recognizerP.PointClouds[i].NrStrokes = this.recognizerP.PointClouds[i].Points[le - 1].ID;
+ }
+ },
+
+ addGestureRaw: function(name, points) {
+ this.pointCloudsRaw.push({
+ Name: name,
+ Points: points.slice(0)
+ });
+ },
+
+ convertPoints: function(pointsRaw, type) {
+ var i, le, points, p;
+
+ points = [];
+ le = pointsRaw.length;
+ for (i = 0; i < le; ++i) {
+ p = {
+ X: pointsRaw[i][0],
+ Y: pointsRaw[i][1]
+ };
+
+ if (type === 'p') {
+ p.ID = pointsRaw[i][2] ;
+ }
+ points.push(p);
+ }
+ return points;
+ },
+
+ convertPointsN: function(pcRaw) {
+ var i, pc, le, name, points, p;
+
+ name = pcRaw.Name;
+ points = [];
+ le = pcRaw.Points.length;
+ for (i = 0; i < le; ++i) {
+ p = {
+ X: pcRaw.Points[i][0],
+ Y: pcRaw.Points[i][1]
+ };
+ points.push(p);
+ }
+ pc = new this.recognizerN.AddMultistroke(name, true, [points]);
+
+ return pc;
+ },
+
+ getBBox: function(stroke) {
+ var i, le = stroke.length, bb = [Infinity, Infinity, 0, 0];
+
+ for(i = 0; i < le; i++) {
+ bb[0] = (stroke[i].X < bb[0]) ? stroke[i].X : bb[0];
+ bb[1] = (stroke[i].Y < bb[1]) ? stroke[i].Y : bb[1];
+ bb[2] = (stroke[i].X > bb[2]) ? stroke[i].X : bb[2];
+ bb[3] = (stroke[i].Y > bb[3]) ? stroke[i].Y : bb[3];
+ }
+ return bb;
+ },
+
+ getType: function(c) {
+ var item, i, le;
+
+ for (item in this.types) {
+ le = this.types[item].length;
+ for (i = 0; i < le; i++) {
+ if (c === this.types[item][i]) {
+ return item;
+ }
+ }
+ }
+ return '';
+ },
+
+ getStrokeNr: function(stroke) {
+ return stroke[stroke.length - 1].ID;
+ },
+
+ makeGoodlist: function(c, txt, lastbb, actbb) {
+ var list = [], t, last2 = '',
+ height = lastbb[3] - lastbb[1];
+
+ if (height > 1) {
+ height *= 0.5;
+ }
+
+ if (txt.length > 1) {
+ last2 = txt.slice(-2);
+ }
+
+ t = this.getType(c);
+ if (c === '') {
+ list = list.concat(['+', '-']);
+ list = list.concat(this.types['D']);
+ list = list.concat(['(']);
+ list = list.concat(this.types['L']);
+ list = list.concat(this.types['V']);
+ list = list.concat(this.types['Ot']);
+ } else if (c !== '(' && c !== '|' && c !== '/' &&
+ actbb[3] - actbb[1] < 40 &&
+ lastbb[1] + 30 < actbb[1] && // if char is roughly in the middle of the previous it is - or +.
+ lastbb[3] - 30 > actbb[3]) {
+ list = list.concat(['+', '-']);
+ } else if (t === 'V') {
+ list = list.concat(this.types['Op']);
+ list = list.concat(this.types['K']);
+ } else if (t === 'D') {
+ list = list.concat(this.types['D']);
+ list = list.concat(this.types['V']);
+ list = list.concat(['sqrt']);
+
+ if (lastbb[3] + 5 < actbb[3] && // char has to be reach slichtly below last char
+ lastbb[3] - height < actbb[1]) { // char may reach at most to the middle of last char
+ list = list.concat([',']);
+ // Don't allow (e)l.
+ list = list.concat(['x', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'i', 'n', 'o', 's', 't']);
+ } else {
+ list = list.concat(this.types['Op']);
+ list = list.concat(this.types['K']);
+ list = list.concat(this.types['L']);
+ }
+
+ } else if (t === 'Op') {
+ list = list.concat(this.types['D']);
+ list = list.concat(['(']);
+ //list = list.concat(this.types['L']);
+ list = list.concat(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'l', 's', 't']);
+ list = list.concat(this.types['V']);
+ list = list.concat(['sqrt']);
+ } else if (c === '(') {
+ list = list.concat(this.types['D']);
+ list = list.concat(['(']);
+ list = list.concat(this.types['L']);
+ list = list.concat(this.types['V']);
+ list = list.concat(['sqrt']);
+ } else if (c === ')') {
+ list = list.concat(this.types['Op']);
+ list = list.concat(')');
+
+ //list = list.concat(this.types['D']);
+ //list = list.concat(this.types['L']);
+ //list = list.concat(this.types['V']);
+
+ } else if (last2 === 'si' || last2 === 'ta') {
+ list = list.concat(['n']);
+ } else if (last2 === 'co') {
+ list = list.concat(['s']);
+ } else if (last2 === 'lo') {
+ list = list.concat(['g']);
+ } else if (t === 'L') {
+ list = list.concat(this.types['V']);
+ list = list.concat(this.types['Op']);
+ list = list.concat(this.types['K']);
+ if (c === 's') {
+ list = list.concat(['i']); // sin
+ } else if (c === 'c') {
+ list = list.concat(['o']); // cos
+ } else if (c === 'l') {
+ list = list.concat(['o', 'n']); // log, ln
+ } else if (c === 't') {
+ list = list.concat(['a']); // ta
+ }
+ } else {
+ list = list.concat(this.types['D']);
+ list = list.concat(this.types['Op']);
+ list = list.concat(this.types['K']);
+ list = list.concat(this.types['L']);
+ list = list.concat(this.types['V']);
+ list = list.concat(this.types['Ot']);
+ }
+
+ return list;
+ },
+
+ /**
+ * Sort strokes from left to right
+ */
+ sortStrokes: function() {
+ var that = this;
+ this.strokes.sort(function(a,b){
+ var bba = that.getBBox(a), bbb = that.getBBox(b);
+ return bba[0]-bbb[0];
+ });
+ },
+
+ /**
+ * Collect left-over stroke before starting recognizerP.
+ */
+ collectStroke: function() {
+ if (this.strokeID !== 0) {
+ this.startDate = new Date();
+ if (this.startDate.getTime() - this.lastDate.getTime() > this.minTimeDiff) {
+ // Copy points for dollar p algorithm
+ this.strokes.push( this.points.slice(0) );
+ this.strokeID = 0;
+ }
+ }
+ },
+
+ /**
+ * Combine strokes which intersect each other or which are connected
+ * into single strokes.
+ */
+ recombineStrokes: function() {
+ var i, j, sid, le;
+
+
+ if (this.strokes.length > 1) {
+ for (i = 1; i < this.strokes.length; i++) {
+ if (this.isConnected(this.strokes[i-1], this.strokes[i]) ||
+ this.isCrossing(this.strokes[i-1], this.strokes[i])) {
+
+ // Adapt strokeID
+ le = this.strokes[i-1].length;
+ sid = this.strokes[i-1][le-1].ID;
+
+ le = this.strokes[i].length;
+ for (j = 0; j < le; j++) {
+ this.strokes[i][j].ID += sid;
+ }
+
+ // Copy stroke from stroke[i] to stroke[i-1]
+ this.strokes[i-1] = this.strokes[i-1].concat( this.strokes[i].slice(0) );
+ this.strokes.splice(i, 1);
+ }
+ }
+ }
+ },
+
+ /**
+ * Input: last char and two bounding boxes.
+ */
+ isExponent: function(last, lastbb, actbb) {
+ var height = lastbb[3] - lastbb[1];
+
+ if (height > 1) {
+ height *= 0.5;
+ }
+
+ if (last !== '.' && last !== ',' && last !== '-' &&
+ // top of char is slightly above top of last char
+ lastbb[1] > actbb[1] + 5 &&
+ // bottom of char is above middle height of last char
+ lastbb[3] - height > actbb[3]
+ ) {
+
+ return true;
+ }
+
+ return false;
+ },
+
+ /**
+ * Input: last bounding box and actual bounding box.
+ */
+ isEndExponent: function(lastbb, actbb) {
+ var height = lastbb[3] - lastbb[1];
+
+ if (height > 1) {
+ height *= 2.0/3.0;
+ }
+
+ if (
+ // bottom of char is below two third of height of last char
+ lastbb[3] - height < actbb[1] &&
+ lastbb[3] < actbb[3]
+ ) {
+
+ return true;
+ }
+
+ return false;
+ },
+
+ recognize: function() {
+ var txt = '',
+ result,
+ quality = '',
+ last = '',
+ i, list,
+ lastbb = [0,0,0,0], bb,
+ expLevel = 0,
+ botLine = [],
+ sqrtLevel = 0,
+ sqrtLine = [],
+ sqrtEnd = [],
+ st;
+
+ //st = new Date();
+
+ this.collectStroke();
+ this.sortStrokes();
+ this.recombineStrokes();
+
+ /**
+ * Apply $P or $N to every stroke.
+ */
+ for (i = 0; i < this.strokes.length; i++) {
+
+ // this.paintBBox(this.strokes[i]);
+ bb = this.getBBox(this.strokes[i]);
+
+
+ // Detect end of square roots
+ while (sqrtLevel > 0 && bb[2] > sqrtEnd[sqrtLevel]) {
+ last = ')';
+ txt += last;
+ lastbb[3] = sqrtLine[expLevel];
+ --sqrtLevel;
+ }
+ // Detect end of exponent
+ while (expLevel > 0 && this.isEndExponent(lastbb, bb)) {
+ last = ')';
+ txt += last;
+ --expLevel;
+ lastbb[3] = botLine[expLevel];
+ }
+
+ if (this.strokes[i].length >= this.minStrokeLength) {
+ // Detect exponents.
+ // This is needed before calling makeGoodlist(), because
+ // it influences the possible choices for the next symbol.
+ if (i>0 && this.isExponent(last, lastbb, bb)) {
+ last = '^';
+ txt += last;
+ last = '(';
+ txt += last;
+ botLine[expLevel] = lastbb[3];
+ ++expLevel;
+ }
+
+ list = this.makeGoodlist(last, txt, lastbb, bb);
+ this.strokes[i].NrStrokes = this.getStrokeNr(this.strokes[i]); // Determine number of strokes
+
+ if (this.strokes[i].NrStrokes === 1) {
+ result = this.recognizerN.Recognize([this.strokes[i]], true, false, true, list);
+ } else {
+ result = this.recognizerP.Recognize(this.strokes[i], list);
+ }
+
+ if (result.Name === '|' && bb[2] - bb[0] > 30) {
+ result.Name = '/';
+ }
+ quality += result.Score.toFixed(2) + ' ';
+
+ } else {
+ // We have a dot.
+ // There are three possibilities: ., i, or *
+ bb = this.getBBox(this.strokes[i]);
+ result = { Name:'' };
+
+ // If last symbol is digit and the dot is close to the baseline, it is a separator
+ if (last.match(/\d/) && bb[1] > lastbb[3] - 30 && bb[3] < lastbb[3] + 30) { // .
+ result.Name = '.';
+
+ // If the dot is close to the topline the last symbol is an "i"
+ } else if (bb[2] < lastbb[2] + 20 &&
+ bb[3] < lastbb[1] && bb[3] < lastbb[3]) { // i (only backward recognition)
+ result.Name = 'i';
+ txt = txt.slice(0, -1);
+ } else { // *
+ result.Name = '*';
+ }
+ // lastbb = [0,0,0,0];
+ quality += '1.0 ';
+ }
+
+ // Handle square root stretches
+ if (result.Name === 'sqrt') {
+ result.Name += '(';
+ ++sqrtLevel;
+ sqrtLine[sqrtLevel] = bb[3];
+ sqrtEnd[sqrtLevel] = bb[2];
+ }
+
+ last = result.Name;
+ lastbb = bb.slice(0);
+ txt += last;
+
+ /**
+ * Post processing. Better do it after each step.
+ */
+ // Handle '='
+ txt = txt.replace(/--/g, '=');
+ txt = txt.replace(/-\^-/g, '=');
+
+ // Handle i
+ txt = txt.replace(/,\*/g, 'i');
+ txt = txt.replace(/\|\*/g, 'i');
+ txt = txt.replace(/\(\*/g, 'i');
+ txt = txt.replace(/i\*/g, 'i');
+
+ // Handle the case 3.a which is probably 3*a
+ txt = txt.replace(/(\d)\.([a-z])/g, '$1*$2');
+
+ // Handle log, sin, cos
+ txt = txt.replace(/l0g/g, 'log');
+ txt = txt.replace(/\wi\D{1}/g, 'sin');
+ txt = txt.replace(/sin\*/g, 'sin');
+ txt = txt.replace(/co./g, 'cos');
+ txt = txt.replace(/c0s/g, 'cos');
+ }
+
+ // Add closing parenthesis for exponents and square roots
+ while (expLevel > 0) {
+ txt += ')';
+ --expLevel;
+ }
+ while (sqrtLevel > 0) {
+ txt += ')';
+ --sqrtLevel;
+ }
+
+ /**
+ * Finalize recognition
+ */
+ this.strokeID = 0; // signal to begin new gesture on next mouse-down
+
+ //txt += '\ntime:' + ((new Date()).getTime() - st.getTime());
+
+ return {
+ str: txt,
+ quality: quality
+ };
+ },
+
+ /**
+ * Euclidean distance between two "D points.
+ */
+ dist: function(a, b) {
+ return Math.sqrt((a.X - b.X) * (a.X - b.X) + (a.Y - b.Y) * (a.Y - b.Y));
+ },
+
+ rand: function(low, high) {
+ return Math.floor((high - low + 1) * Math.random()) + low;
+ },
+
+ /**
+ * Detect if two strokes are connected
+ */
+ isConnected: function(s1, s2) {
+ var thresh = this.maxDistance, isC = false;
+
+ if (this.dist(s1[0], s2[0]) <= thresh) {
+ isC = true;
+ } else if (this.dist(s1[0], s2[s2.length - 1]) <= thresh) {
+ isC = true;
+ } else if (this.dist(s1[s1.length - 1], s2[0]) <= thresh) {
+ isC = true;
+ } else if (this.dist(s1[s1.length - 1], s2[s2.length - 1]) <= thresh) {
+ isC = true;
+ }
+
+ return isC;
+ },
+
+ /**
+ * Detect if two strokes cross each other,
+ */
+ isCrossing: function(s1, s2) {
+ var i, j, le1 = s1.length, le2 = s2.length, isC = false,
+ a1, a2, b1, b2,
+ bb1, bb2, c1, c2;
+
+ if (le1 < 2 || le2 < 2) {
+ return isC;
+ }
+
+ for (i = 1; i < le1; i++) {
+ a1 = s1[i - 1];
+ a2 = s1[i];
+ bb1 = [Math.min(a1.X, a2.X), Math.min(a1.Y, a2.Y),
+ Math.max(a1.X, a2.X), Math.max(a1.Y, a2.Y)];
+
+ for (j = 1; j < le2; j++) {
+ b1 = s2[j - 1];
+ b2 = s2[j];
+ bb2 = [Math.min(b1.X, b2.X), Math.min(b1.Y, b2.Y),
+ Math.max(b1.X, b2.X), Math.max(b1.Y, b2.Y)];
+
+ if (bb1[2] >= bb2[0] && bb1[0] <= bb2[2] && bb1[1] <= bb2[3] && bb1[3] >= bb2[1]) {
+ c1 = (b1.X - a1.X) * (a2.Y - a1.Y) - (b1.Y - a1.Y) * (a2.X - a1.X);
+ c2 = (b2.X - a1.X) * (a2.Y - a1.Y) - (b2.Y - a1.Y) * (a2.X - a1.X);
+ if (c1 * c2 <= 0.0) {
+ isC = true;
+ return isC;
+ }
+ }
+ }
+ }
+
+ return isC;
+ },
+
+ initCanvas: function() {
+
+ this.g = this.canvas.getContext('2d');
+ this.g.lineWidth = 3;
+ this.g.font = "14px Arial";
+/*
+ // Draw top bar
+ var col = "rgb(" + this.rand(0,200) + "," + this.rand(0,200) + "," + this.rand(0,200) + ")";
+
+ this.g.fillStyle = col;
+ this.g.fillRect(0, 0, this.canvas.width, 20);
+*/
+ },
+
+ /**
+ * Get dimensions and upper left corner of the canvas element.
+
+ getCanvasRect: function() {
+ var canvas = this.canvas,
+ w = canvas.width,
+ h = canvas.height,
+ cx = canvas.offsetLeft,
+ cy = canvas.offsetTop;
+
+ while (canvas.offsetParent != null) {
+ canvas = canvas.offsetParent;
+ cx += canvas.offsetLeft;
+ cy += canvas.offsetTop;
+ }
+ return {x: cx, y: cy, width: w, height: h};
+ },
+ */
+
+ getScrollY: function() {
+ //var scrollY = 0, os;
+
+ // os = $(this.canvas).position();
+ // scrollY = os.top;
+
+
+ // if (typeof(document.body.parentElement) != 'undefined') {
+ // scrollY = document.body.parentElement.scrollTop; // IE
+ // } else if (typeof(window.pageYOffset) != 'undefined') {
+ // scrollY = window.pageYOffset; // FF
+ // }
+
+ //return scrollY;
+ return 0;
+ },
+
+ clearStrokes: function() {
+ this.points.length = 0;
+ this.pointsRaw.length = 0;
+ this.strokeID = 0;
+ this.strokes.length = 0;
+
+ this.g.clearRect(0, 0, this.canvas.width, this.canvas.height);
+ //this.drawText("Canvas cleared.");
+ this.needsClear = false;
+
+ if (this.textbox !== null) {
+ this.textbox.value = "";
+ }
+ },
+
+ downEvent: function(evt) {
+ var x = evt.pageX,
+ y = evt.pageY,
+ button = evt.button,
+ t = evt.targetTouches,
+ col;
+
+ if (t) {
+ button = 0;
+ x = t[0].pageX;
+ y = t[0].pageY;
+ }
+
+ if (this.needsClear) {
+ this.clearStrokes();
+ }
+
+ if (button <= 1 || typeof button === 'undefined') {
+ this.isDown = true;
+
+ x -= this.offsetX;
+ y -= this.offsetY;
+
+ //x -= this.rc.x;
+ //y -= this.rc.y; // - this.getScrollY();
+
+ if (this.strokeID !== 0) {
+ this.startDate = new Date();
+ if (this.startDate.getTime() - this.lastDate.getTime() > this.minTimeDiff) {
+
+ // Copy points for dollar p recognition
+ this.strokes.push( this.points.slice(0) );
+ this.strokeID = 0;
+ } else {
+ clearTimeout(this.timeout);
+ }
+ }
+
+ if (this.strokeID === 0) { // starting a new gesture
+ this.points.length = 0;
+ this.pointsRaw.length = 0;
+
+ // set random color
+ //col = "rgb(" + this.rand(0,200) + "," + this.rand(0,200) + "," + this.rand(0,200) + ")";
+ col = "rgb(20, 30, 200)";
+
+ this.g.fillStyle = col;
+ this.g.strokeStyle = col;
+ }
+
+ // Rectangle to mark the beginning of a stroke
+ //this.g.fillRect(x - 4, y - 3, 9, 9);
+ this.g.beginPath();
+ this.g.arc(x, y, 2, 0, 2 * Math.PI, false);
+ this.g.closePath();
+ this.g.fill();
+
+ // Start new stroke
+ ++this.strokeID;
+ this.points[this.points.length] = {
+ X: x,
+ Y: y,
+ ID: this.strokeID
+ };
+ this.pointsRaw.push([x, y, this.strokeID]);
+ }
+
+ if (evt && evt.preventDefault) {
+ evt.preventDefault();
+ } else if (window.event) {
+ window.event.returnValue = false;
+ }
+ },
+
+ moveEvent: function(evt) {
+ var x = evt.pageX,
+ y = evt.pageY,
+ t = evt.targetTouches;
+
+ if (t) {
+ x = t[0].pageX;
+ y = t[0].pageY;
+ }
+
+ if (this.isDown) {
+
+ x -= this.offsetX;
+ y -= this.offsetY;
+
+ //x -= this.rc.x;
+ //y -= this.rc.y; // - this.getScrollY();
+
+ // Append point
+ this.points[this.points.length] = {
+ X: x,
+ Y: y,
+ ID: this.strokeID
+ };
+ this.pointsRaw.push([x, y, this.strokeID]);
+
+ this.drawConnectedPoint(this.pointsRaw.length - 2, this.pointsRaw.length - 1);
+ }
+ },
+
+ upEvent: function() {
+ if (this.isDown) {
+ this.isDown = false;
+ this.lastDate = new Date();
+ }
+ },
+
+ drawConnectedPoint: function(from, to) {
+ this.g.beginPath();
+ this.g.moveTo(this.pointsRaw[from][0], this.pointsRaw[from][1]);
+ this.g.lineTo(this.pointsRaw[to][0], this.pointsRaw[to][1]);
+ this.g.closePath();
+ this.g.stroke();
+ },
+
+ drawText: function(str) {
+ this.g.fillStyle = "rgb(255,255,136)";
+ this.g.fillRect(0, 0, this.canvas.width, 20);
+ this.g.fillStyle = "rgb(0,0,255)";
+ this.g.fillText(str, 1, 14);
+ },
+
+ paintBBox: function(stroke) {
+ var bb = this.getBBox(stroke),
+ col = "rgb(100,100,100)";
+
+ bb[0] -= 3;
+ bb[1] -= 3;
+ bb[2] += 3;
+ bb[3] += 3;
+
+ this.g.lineWidth = 1;
+ this.g.strokeStyle = col;
+ this.g.beginPath();
+ this.g.moveTo(bb[0], bb[1]);
+ this.g.lineTo(bb[2], bb[1]);
+ this.g.lineTo(bb[2], bb[3]);
+ this.g.lineTo(bb[0], bb[3]);
+ this.g.closePath();
+ this.g.stroke();
+ this.g.lineWidth = 3;
+ },
+
+ /**
+ * Manage gestures
+ */
+
+ onAddGesture: function(name) {
+ if (this.pointsRaw.length >= this.minStrokeLength && name.length > 0) {
+ this.addGestureRaw(name, this.pointsRaw);
+ }
+ this.clearStrokes();
+ },
+
+ onSave: function() {
+ localStorage.removeItem('JXGPointClouds');
+ localStorage.setItem('JXGPointClouds', JSON.stringify(this.pointCloudsRaw));
+ if (this.textbox !== null) {
+ this.textbox.value = this.pointCloudsRaw.length + " gestures saved";
+ }
+ },
+
+ onDeleteAll: function() {
+ localStorage.removeItem('JXGPointClouds');
+ this.pointCloudsRaw = [];
+ if (this.textbox !== null) {
+ this.textbox.value = JSON.stringify(this.pointCloudsRaw);
+ }
+ },
+
+ /**
+ * 'pointcloud' has to be a (hidden) input element of the form.
+ */
+
+ onSubmit: function() {
+ GUI.getId('pointcloud').value = JSON.stringify(this.pointCloudsRaw);
+ GUI.getId('SEND').submit();
+ },
+
+ printStats: function() {
+ var stat = {}, i, t = '';
+
+ for (i = 0; i < this.pointCloudsRaw.length; ++i) {
+ if (stat[this.pointCloudsRaw[i].Name]) {
+ stat[this.pointCloudsRaw[i].Name]++;
+ } else {
+ stat[this.pointCloudsRaw[i].Name] = 1;
+ }
+ }
+
+ for (i in stat) {
+ t += '"' + i + '": ' + stat[i] + '\n';
+ }
+
+ if (this.textbox !== null) {
+ this.textbox.value = t;
+ }
+ }
+};
diff --git a/Sketchometry.activity/3dparty/hwr/hwrstrokes.js b/Sketchometry.activity/3dparty/hwr/hwrstrokes.js
new file mode 100644
index 0000000..d6a1319
--- /dev/null
+++ b/Sketchometry.activity/3dparty/hwr/hwrstrokes.js
@@ -0,0 +1,28 @@
+JXGHWR.loadStrokes = function() {
+ var le, i, pointCloudsRaw = JSON.parse('[{\"Name\":\"0\",\"Points\":[[230,137,1],[218,133,1],[211,133,1],[203,133,1],[192,141,1],[181,149,1],[171,160,1],[162,171,1],[158,181,1],[153,194,1],[151,206,1],[151,218,1],[152,230,1],[155,240,1],[161,248,1],[170,253,1],[179,254,1],[191,254,1],[204,247,1],[216,235,1],[226,223,1],[231,209,1],[236,198,1],[238,185,1],[239,176,1],[239,167,1],[236,161,1],[232,155,1],[228,151,1],[225,147,1],[223,145,1],[220,144,1],[220,143,1],[220,142,1],[223,142,1],[231,142,1]]},{\"Name\":\"0\",\"Points\":[[231,135,1],[220,126,1],[214,126,1],[208,126,1],[199,130,1],[189,138,1],[181,147,1],[171,157,1],[165,169,1],[158,181,1],[154,193,1],[152,206,1],[151,218,1],[151,231,1],[153,243,1],[158,254,1],[163,263,1],[171,268,1],[178,273,1],[186,273,1],[197,273,1],[206,270,1],[216,262,1],[225,253,1],[231,240,1],[237,229,1],[241,218,1],[244,208,1],[245,198,1],[245,187,1],[245,176,1],[241,166,1],[236,157,1],[232,148,1],[228,142,1],[226,139,1],[225,136,1],[223,133,1]]},{\"Name\":\"0\",\"Points\":[[199,147,1],[186,148,1],[180,152,1],[171,161,1],[164,171,1],[159,181,1],[154,194,1],[152,206,1],[151,218,1],[151,231,1],[152,244,1],[156,255,1],[161,267,1],[169,275,1],[178,282,1],[187,286,1],[196,287,1],[208,286,1],[220,279,1],[229,271,1],[237,259,1],[242,251,1],[248,240,1],[250,228,1],[252,217,1],[252,208,1],[252,198,1],[248,188,1],[243,180,1],[236,172,1],[228,165,1],[223,162,1],[216,157,1],[211,154,1],[205,151,1],[202,149,1],[199,148,1],[196,147,1],[195,147,1],[195,148,1],[195,154,1]]},{\"Name\":\"1\",\"Points\":[[129,223,1],[129,213,1],[134,207,1],[144,195,1],[156,183,1],[169,167,1],[179,157,1],[189,144,1],[198,134,1],[204,128,1],[208,124,1],[211,121,1],[213,120,1],[214,123,1],[214,131,1],[214,141,1],[212,152,1],[209,164,1],[206,177,1],[204,194,1],[203,210,1],[200,227,1],[198,244,1],[196,259,1],[194,273,1],[193,287,1],[192,297,1],[191,304,1],[191,310,1],[191,314,1],[191,317,1],[190,318,1]]},{\"Name\":\"1\",\"Points\":[[153,204,1],[159,190,1],[166,185,1],[179,176,1],[188,167,1],[199,159,1],[206,151,1],[213,143,1],[218,139,1],[221,137,1],[223,135,1],[225,134,1],[226,134,1],[226,136,1],[226,141,1],[226,147,1],[226,157,1],[224,165,1],[223,176,1],[221,188,1],[220,201,1],[219,215,1],[218,229,1],[218,242,1],[217,255,1],[216,268,1],[214,280,1],[213,292,1],[213,300,1],[213,307,1],[212,315,1],[211,320,1],[211,323,1],[211,324,1],[211,325,1],[211,324,1],[210,324,1]]},{\"Name\":\"1\",\"Points\":[[208,162,1],[212,152,1],[217,147,1],[222,142,1],[226,141,1],[226,139,1],[229,138,1],[231,138,1],[231,139,1],[232,142,1],[232,149,1],[232,156,1],[232,164,1],[232,172,1],[232,181,1],[232,189,1],[232,199,1],[232,210,1],[232,221,1],[232,231,1],[232,243,1],[232,253,1],[232,262,1],[231,272,1],[230,279,1],[229,288,1],[228,295,1],[227,300,1],[227,305,1],[226,310,1],[226,312,1],[226,315,1],[226,316,1],[226,318,1],[226,319,1]]},{\"Name\":\"2\",\"Points\":[[148,142,1],[147,130,1],[150,122,1],[159,115,1],[171,106,1],[183,100,1],[194,97,1],[206,94,1],[216,93,1],[226,93,1],[235,96,1],[244,100,1],[251,110,1],[259,120,1],[264,133,1],[269,146,1],[270,159,1],[271,173,1],[272,188,1],[272,204,1],[269,219,1],[264,234,1],[256,249,1],[248,264,1],[237,277,1],[225,292,1],[213,301,1],[199,312,1],[184,320,1],[172,323,1],[161,324,1],[152,324,1],[144,324,1],[140,321,1],[138,318,1],[138,311,1],[138,305,1],[142,299,1],[148,296,1],[153,293,1],[159,292,1],[167,292,1],[175,296,1],[181,299,1],[187,305,1],[195,311,1],[203,316,1],[210,320,1],[220,324,1],[230,328,1],[243,330,1],[257,330,1],[273,330,1],[289,328,1],[303,324,1],[316,319,1],[329,313,1],[338,310,1],[348,307,1]]},{\"Name\":\"2\",\"Points\":[[134,138,1],[131,126,1],[132,120,1],[137,113,1],[148,104,1],[160,97,1],[174,91,1],[187,86,1],[199,83,1],[208,82,1],[222,82,1],[231,87,1],[241,94,1],[250,102,1],[257,115,1],[263,126,1],[267,141,1],[269,154,1],[270,170,1],[270,188,1],[270,204,1],[266,222,1],[260,240,1],[252,257,1],[241,275,1],[230,292,1],[218,306,1],[205,317,1],[192,326,1],[179,333,1],[167,338,1],[158,339,1],[149,339,1],[143,339,1],[139,338,1],[137,336,1],[137,333,1],[137,330,1],[137,329,1],[140,327,1],[146,326,1],[154,326,1],[161,326,1],[171,327,1],[183,329,1],[195,331,1],[208,332,1],[223,332,1],[236,332,1],[250,332,1],[263,331,1],[275,330,1],[284,329,1],[293,329,1],[299,328,1],[304,327,1],[308,326,1],[311,326,1],[312,326,1],[312,327,1]]},{\"Name\":\"2\",\"Points\":[[167,156,1],[161,146,1],[161,141,1],[164,132,1],[171,124,1],[181,114,1],[189,106,1],[199,101,1],[209,97,1],[222,96,1],[231,95,1],[244,95,1],[254,97,1],[264,101,1],[271,108,1],[277,117,1],[281,124,1],[283,138,1],[284,149,1],[284,163,1],[281,179,1],[275,194,1],[269,209,1],[260,226,1],[250,244,1],[239,259,1],[227,274,1],[215,288,1],[204,300,1],[192,311,1],[181,320,1],[173,324,1],[166,328,1],[162,329,1],[160,330,1],[159,330,1],[161,329,1],[167,329,1],[176,328,1],[185,327,1],[195,326,1],[207,325,1],[219,324,1],[231,324,1],[244,322,1],[256,321,1],[268,320,1],[277,320,1],[286,320,1],[294,319,1],[300,318,1],[306,317,1],[310,316,1],[313,316,1],[315,316,1],[315,316,1],[315,316,1]]},{\"Name\":\"3\",\"Points\":[[137,86,1],[144,80,1],[157,80,1],[171,80,1],[185,81,1],[204,83,1],[218,87,1],[231,92,1],[242,98,1],[251,108,1],[258,116,1],[262,125,1],[263,135,1],[263,145,1],[259,154,1],[249,163,1],[241,169,1],[230,175,1],[219,180,1],[212,183,1],[205,185,1],[202,185,1],[199,186,1],[202,186,1],[209,189,1],[221,192,1],[231,197,1],[242,202,1],[252,208,1],[261,216,1],[269,224,1],[274,232,1],[278,240,1],[279,250,1],[279,258,1],[279,266,1],[273,275,1],[262,282,1],[248,290,1],[231,297,1],[213,300,1],[192,304,1],[172,305,1],[154,306,1],[139,306,1],[127,305,1],[119,303,1],[114,301,1],[111,299,1],[110,297,1]]},{\"Name\":\"3\",\"Points\":[[138,97,1],[143,89,1],[153,89,1],[166,89,1],[183,89,1],[199,92,1],[215,96,1],[228,100,1],[241,105,1],[251,113,1],[261,121,1],[268,130,1],[271,140,1],[273,150,1],[273,162,1],[269,171,1],[262,180,1],[252,187,1],[243,192,1],[236,195,1],[228,198,1],[224,198,1],[220,198,1],[218,198,1],[223,198,1],[229,201,1],[239,204,1],[248,209,1],[257,217,1],[265,225,1],[272,233,1],[277,243,1],[280,253,1],[282,261,1],[283,271,1],[283,279,1],[279,290,1],[272,298,1],[260,309,1],[246,317,1],[228,324,1],[211,329,1],[191,332,1],[173,333,1],[159,333,1],[145,333,1],[137,332,1],[132,331,1],[129,329,1],[128,326,1]]},{\"Name\":\"3\",\"Points\":[[178,97,1],[183,96,1],[189,96,1],[195,96,1],[203,97,1],[210,97,1],[217,100,1],[224,104,1],[228,109,1],[234,115,1],[238,122,1],[241,129,1],[244,138,1],[245,144,1],[246,152,1],[246,160,1],[243,165,1],[239,171,1],[235,176,1],[230,180,1],[224,182,1],[218,184,1],[213,184,1],[208,184,1],[204,184,1],[200,184,1],[198,184,1],[197,183,1],[198,182,1],[199,182,1],[204,182,1],[208,182,1],[215,185,1],[221,188,1],[226,191,1],[233,194,1],[240,198,1],[246,202,1],[250,206,1],[255,210,1],[259,214,1],[262,219,1],[264,225,1],[266,230,1],[267,235,1],[268,241,1],[268,245,1],[267,251,1],[264,255,1],[259,260,1],[252,265,1],[245,268,1],[235,273,1],[226,275,1],[215,277,1],[204,279,1],[194,281,1],[185,282,1],[175,283,1],[167,284,1],[160,284,1],[155,284,1],[150,284,1],[148,284,1],[145,284,1],[144,285,1],[143,285,1],[143,286,1],[143,288,1],[145,291,1]]},{\"Name\":\"4\",\"Points\":[[236,96,1],[227,106,1],[220,119,1],[212,136,1],[201,155,1],[191,172,1],[181,188,1],[174,201,1],[166,214,1],[161,223,1],[158,230,1],[157,236,1],[157,241,1],[157,245,1],[159,249,1],[167,250,1],[180,253,1],[194,253,1],[213,253,1],[233,253,1],[254,253,1],[273,252,1],[289,252,1],[304,252,1],[315,252,1],[325,252,1],[334,253,1],[338,254,1],[340,254,1],[248,214,2],[241,222,2],[239,231,2],[236,241,2],[233,253,2],[231,266,2],[229,278,2],[228,291,2],[226,299,2],[226,310,2],[224,319,2]]},{\"Name\":\"4\",\"Points\":[[226,87,1],[219,92,1],[214,99,1],[209,108,1],[204,119,1],[198,129,1],[192,139,1],[186,149,1],[180,162,1],[173,173,1],[165,185,1],[158,197,1],[152,208,1],[147,217,1],[142,222,1],[138,228,1],[137,231,1],[136,233,1],[136,235,1],[137,235,1],[141,235,1],[148,235,1],[159,235,1],[173,235,1],[186,235,1],[201,235,1],[214,235,1],[226,235,1],[240,234,1],[250,233,1],[260,232,1],[269,231,1],[275,231,1],[280,230,1],[283,230,1],[286,230,1],[287,230,1],[288,230,1],[287,230,1],[216,183,2],[211,187,2],[211,193,2],[211,200,2],[211,208,2],[211,219,2],[211,230,2],[210,244,2],[210,256,2],[208,269,2],[207,282,2],[204,296,2],[203,308,2],[200,319,2],[197,328,2],[194,336,2],[193,342,2]]},{\"Name\":\"4\",\"Points\":[[209,96,1],[204,96,1],[201,104,1],[193,118,1],[185,130,1],[175,145,1],[165,160,1],[156,175,1],[147,189,1],[139,202,1],[135,214,1],[133,223,1],[133,230,1],[133,235,1],[135,240,1],[141,244,1],[152,246,1],[165,247,1],[184,247,1],[204,247,1],[225,247,1],[246,246,1],[265,246,1],[283,245,1],[297,245,1],[309,245,1],[318,245,1],[325,245,1],[329,245,1],[330,246,1],[328,247,1],[227,213,2],[224,222,2],[223,229,2],[223,240,2],[220,251,2],[218,262,2],[217,272,2],[213,284,2],[211,295,2],[208,305,2],[204,315,2]]},{\"Name\":\"5\",\"Points\":[[172,113,1],[168,115,1],[168,119,1],[168,129,1],[167,141,1],[166,152,1],[164,164,1],[162,171,1],[162,179,1],[162,184,1],[162,188,1],[163,191,1],[168,195,1],[176,198,1],[184,203,1],[194,208,1],[204,214,1],[212,222,1],[220,229,1],[226,236,1],[231,245,1],[234,253,1],[236,261,1],[237,271,1],[238,278,1],[238,288,1],[236,296,1],[230,303,1],[223,309,1],[213,314,1],[203,317,1],[190,319,1],[178,319,1],[165,319,1],[154,319,1],[143,317,1],[137,315,1],[132,313,1],[128,310,1],[125,307,1],[124,304,1],[177,120,2],[181,114,2],[187,114,2],[196,114,2],[204,113,2],[214,112,2],[223,111,2],[232,110,2],[242,110,2],[250,110,2],[257,110,2],[264,110,2],[270,110,2],[274,110,2],[278,110,2],[280,111,2],[282,114,2]]},{\"Name\":\"5\",\"Points\":[[193,131,1],[187,135,1],[186,141,1],[183,148,1],[181,160,1],[178,170,1],[176,182,1],[175,190,1],[175,198,1],[175,206,1],[176,212,1],[179,217,1],[185,221,1],[194,224,1],[203,229,1],[212,233,1],[221,239,1],[228,245,1],[235,251,1],[239,257,1],[242,264,1],[245,273,1],[246,280,1],[246,291,1],[242,299,1],[236,308,1],[227,315,1],[218,320,1],[205,324,1],[193,325,1],[181,325,1],[168,324,1],[159,323,1],[152,320,1],[147,318,1],[143,316,1],[141,313,1],[139,310,1],[202,129,2],[204,130,2],[209,130,2],[218,130,2],[226,130,2],[237,130,2],[248,130,2],[259,130,2],[269,130,2],[278,130,2],[284,130,2],[291,130,2],[296,130,2],[300,130,2],[303,131,2],[306,133,2]]},{\"Name\":\"5\",\"Points\":[[161,115,1],[159,126,1],[159,135,1],[159,144,1],[159,158,1],[158,170,1],[158,181,1],[157,190,1],[157,198,1],[157,205,1],[157,208,1],[157,211,1],[159,212,1],[163,212,1],[171,213,1],[180,215,1],[190,217,1],[200,222,1],[209,227,1],[218,231,1],[226,239,1],[231,246,1],[236,254,1],[239,261,1],[241,269,1],[241,276,1],[241,285,1],[239,292,1],[234,298,1],[226,303,1],[216,306,1],[204,307,1],[192,307,1],[180,307,1],[167,306,1],[157,304,1],[148,302,1],[141,299,1],[137,297,1],[134,293,1],[172,109,2],[174,107,2],[180,109,2],[187,111,2],[197,112,2],[207,112,2],[218,112,2],[227,112,2],[238,112,2],[249,113,2],[260,113,2],[270,114,2],[278,115,2],[286,116,2],[293,118,2]]},{\"Name\":\"6\",\"Points\":[[260,97,1],[251,87,1],[246,90,1],[236,98,1],[226,107,1],[218,118,1],[208,129,1],[200,141,1],[192,155,1],[185,170,1],[179,185,1],[174,200,1],[170,217,1],[168,230,1],[168,244,1],[168,255,1],[171,266,1],[176,274,1],[183,278,1],[192,281,1],[203,282,1],[214,282,1],[225,278,1],[232,273,1],[238,268,1],[241,261,1],[244,254,1],[245,248,1],[245,240,1],[244,232,1],[241,226,1],[235,217,1],[229,212,1],[223,208,1],[218,207,1],[212,206,1],[205,205,1],[199,205,1],[194,207,1],[190,209,1],[186,212,1],[185,214,1],[184,217,1],[185,220,1]]},{\"Name\":\"6\",\"Points\":[[267,92,1],[255,95,1],[247,97,1],[236,107,1],[226,119,1],[217,129,1],[208,142,1],[200,157,1],[193,171,1],[185,186,1],[181,203,1],[176,219,1],[172,235,1],[171,250,1],[171,263,1],[171,275,1],[174,285,1],[181,292,1],[187,297,1],[196,299,1],[208,299,1],[219,297,1],[231,290,1],[241,281,1],[246,274,1],[250,266,1],[252,258,1],[253,251,1],[253,242,1],[253,235,1],[249,228,1],[244,222,1],[239,217,1],[233,214,1],[226,212,1],[218,212,1],[208,212,1],[200,215,1],[193,218,1],[186,222,1],[182,226,1],[181,228,1],[181,231,1],[181,235,1]]},{\"Name\":\"6\",\"Points\":[[245,77,1],[235,75,1],[230,77,1],[223,87,1],[214,97,1],[204,111,1],[195,124,1],[184,142,1],[177,157,1],[168,175,1],[161,190,1],[157,208,1],[153,227,1],[149,244,1],[148,257,1],[148,272,1],[148,283,1],[152,293,1],[158,300,1],[166,304,1],[178,305,1],[190,305,1],[205,300,1],[218,293,1],[226,283,1],[232,275,1],[237,265,1],[240,257,1],[241,249,1],[241,240,1],[237,230,1],[231,222,1],[225,216,1],[217,210,1],[209,208,1],[201,206,1],[192,205,1],[183,205,1],[174,208,1],[166,214,1],[160,220,1],[157,226,1],[155,230,1],[155,235,1],[156,240,1]]},{\"Name\":\"7\",\"Points\":[[146,116,1],[154,110,1],[165,109,1],[180,105,1],[196,101,1],[212,98,1],[226,97,1],[241,95,1],[252,94,1],[261,94,1],[269,96,1],[273,100,1],[275,109,1],[277,119,1],[277,131,1],[274,145,1],[269,160,1],[263,175,1],[255,192,1],[248,208,1],[241,226,1],[234,242,1],[226,258,1],[220,274,1],[214,287,1],[208,300,1],[204,311,1],[200,320,1],[197,329,1],[195,334,1],[194,339,1],[193,342,1],[193,343,1],[194,342,1],[219,214,2],[223,212,2],[228,212,2],[240,212,2],[251,212,2],[264,211,2],[274,211,2],[288,210,2]]},{\"Name\":\"7\",\"Points\":[[146,106,1],[149,106,1],[155,106,1],[162,106,1],[176,106,1],[187,105,1],[200,105,1],[211,103,1],[220,102,1],[227,101,1],[235,101,1],[242,102,1],[246,106,1],[248,112,1],[249,120,1],[249,132,1],[248,145,1],[243,160,1],[237,175,1],[231,189,1],[225,206,1],[218,222,1],[211,237,1],[204,253,1],[199,268,1],[193,281,1],[188,295,1],[184,304,1],[181,315,1],[178,322,1],[176,329,1],[175,333,1],[174,336,1],[173,338,1]]},{\"Name\":\"7\",\"Points\":[[151,107,1],[155,105,1],[162,105,1],[175,105,1],[188,102,1],[204,100,1],[217,97,1],[229,95,1],[241,93,1],[249,92,1],[257,92,1],[264,95,1],[268,99,1],[270,105,1],[272,115,1],[272,126,1],[272,139,1],[269,154,1],[264,169,1],[260,186,1],[255,203,1],[249,220,1],[243,237,1],[236,254,1],[228,273,1],[223,291,1],[215,308,1],[209,323,1],[204,337,1],[201,346,1],[199,355,1],[197,362,1],[196,365,1],[196,367,1],[198,367,1],[236,203,2],[239,203,2],[246,203,2],[251,203,2],[258,204,2],[269,205,2],[277,205,2],[287,205,2]]},{\"Name\":\"8\",\"Points\":[[299,133,1],[291,119,1],[285,113,1],[278,108,1],[270,105,1],[259,105,1],[247,106,1],[234,113,1],[226,119,1],[218,126,1],[211,134,1],[207,142,1],[204,151,1],[204,160,1],[204,169,1],[204,181,1],[210,191,1],[218,203,1],[226,212,1],[235,223,1],[243,233,1],[250,242,1],[257,250,1],[263,259,1],[268,268,1],[271,276,1],[273,284,1],[273,292,1],[273,300,1],[269,306,1],[261,312,1],[251,316,1],[242,317,1],[231,317,1],[220,316,1],[211,312,1],[204,305,1],[198,298,1],[193,290,1],[190,282,1],[190,272,1],[190,260,1],[192,250,1],[198,240,1],[205,229,1],[212,221,1],[223,211,1],[231,203,1],[242,194,1],[252,186,1],[262,178,1],[270,170,1],[277,163,1],[283,155,1],[288,148,1],[291,142,1],[293,137,1],[293,130,1],[293,126,1],[293,121,1],[293,117,1],[288,112,1],[284,109,1],[279,105,1],[275,102,1],[272,100,1],[270,100,1],[270,99,1],[270,103,1]]},{\"Name\":\"8\",\"Points\":[[283,112,1],[274,105,1],[265,104,1],[255,103,1],[243,103,1],[227,110,1],[215,118,1],[204,126,1],[197,136,1],[192,143,1],[189,151,1],[189,160,1],[189,170,1],[193,180,1],[202,191,1],[211,201,1],[223,212,1],[232,222,1],[243,231,1],[251,242,1],[260,253,1],[266,264,1],[270,273,1],[273,284,1],[274,295,1],[274,306,1],[271,317,1],[265,324,1],[256,330,1],[246,333,1],[233,333,1],[223,333,1],[210,332,1],[201,327,1],[192,320,1],[185,310,1],[181,299,1],[180,287,1],[180,275,1],[181,259,1],[188,246,1],[199,232,1],[209,221,1],[225,207,1],[240,194,1],[252,185,1],[264,174,1],[274,165,1],[281,158,1],[286,152,1],[288,147,1],[290,141,1],[290,136,1],[290,130,1],[288,126,1],[287,123,1],[285,119,1],[283,118,1]]},{\"Name\":\"8\",\"Points\":[[269,110,1],[252,102,1],[243,102,1],[234,102,1],[223,105,1],[211,112,1],[200,119,1],[190,129,1],[182,136,1],[178,144,1],[176,151,1],[175,159,1],[175,166,1],[179,176,1],[185,185,1],[195,195,1],[206,206,1],[217,216,1],[227,227,1],[237,236,1],[246,247,1],[253,256,1],[259,266,1],[263,275,1],[265,287,1],[267,296,1],[267,306,1],[265,314,1],[259,321,1],[250,326,1],[240,329,1],[227,330,1],[216,330,1],[204,329,1],[192,326,1],[182,320,1],[174,314,1],[167,305,1],[163,296,1],[161,286,1],[161,273,1],[166,258,1],[176,244,1],[186,230,1],[201,215,1],[212,204,1],[225,192,1],[235,183,1],[243,175,1],[250,169,1],[255,164,1],[259,159,1],[262,155,1],[264,151,1],[264,147,1],[264,142,1],[264,140,1],[264,137,1],[264,133,1],[264,130,1],[264,128,1],[264,126,1],[264,124,1]]},{\"Name\":\"9\",\"Points\":[[255,122,1],[234,115,1],[223,115,1],[208,118,1],[190,127,1],[172,138,1],[161,147,1],[152,159,1],[147,168,1],[143,178,1],[143,186,1],[144,197,1],[151,206,1],[160,214,1],[172,220,1],[185,222,1],[200,223,1],[217,222,1],[231,217,1],[248,205,1],[260,194,1],[269,181,1],[274,168,1],[278,158,1],[279,148,1],[280,141,1],[281,137,1],[281,133,1],[279,130,1],[277,129,1],[274,129,1],[272,129,1],[269,132,1],[267,139,1],[265,147,1],[265,157,1],[265,168,1],[265,180,1],[266,193,1],[269,208,1],[270,222,1],[272,235,1],[273,249,1],[274,261,1],[274,273,1],[274,286,1],[270,297,1],[264,310,1],[258,318,1],[249,325,1],[238,331,1],[226,334,1],[213,336,1],[202,336,1],[190,336,1],[181,335,1],[173,333,1],[167,332,1],[163,329,1],[158,327,1]]},{\"Name\":\"9\",\"Points\":[[275,101,1],[263,92,1],[255,92,1],[248,92,1],[237,93,1],[225,100,1],[215,109,1],[206,119,1],[199,129,1],[195,138,1],[193,147,1],[193,157,1],[195,166,1],[202,175,1],[210,182,1],[223,187,1],[234,189,1],[250,189,1],[266,186,1],[279,177,1],[289,166,1],[296,155,1],[301,144,1],[305,134,1],[306,127,1],[308,121,1],[308,117,1],[308,115,1],[308,114,1],[306,113,1],[305,113,1],[303,113,1],[301,115,1],[300,119,1],[299,124,1],[299,133,1],[299,142,1],[300,154,1],[303,166,1],[306,180,1],[310,192,1],[312,206,1],[314,219,1],[315,232,1],[315,245,1],[315,259,1],[310,273,1],[303,284,1],[293,295,1],[283,301,1],[270,307,1],[258,310,1],[245,311,1],[231,311,1],[219,311,1],[210,310,1],[204,308,1],[199,307,1],[195,305,1]]},{\"Name\":\"9\",\"Points\":[[235,104,1],[221,94,1],[212,92,1],[201,91,1],[186,94,1],[171,102,1],[158,113,1],[145,124,1],[137,134,1],[132,142,1],[129,152,1],[129,161,1],[130,170,1],[136,178,1],[145,184,1],[157,186,1],[174,186,1],[194,182,1],[211,171,1],[226,158,1],[235,146,1],[242,133,1],[248,123,1],[250,115,1],[252,109,1],[253,105,1],[253,104,1],[253,103,1],[251,103,1],[248,106,1],[245,110,1],[243,117,1],[241,124,1],[241,135,1],[241,147,1],[241,161,1],[241,175,1],[241,189,1],[242,203,1],[243,217,1],[243,230,1],[243,243,1],[243,255,1],[243,268,1],[243,281,1],[242,291,1],[241,300,1],[240,305,1],[239,310,1],[239,315,1],[239,316,1]]},{\"Name\":\",\",\"Points\":[[207,270,1],[204,275,1],[203,281,1],[201,287,1],[198,294,1],[195,298,1],[190,304,1],[186,310,1],[181,315,1],[176,320,1],[171,323,1],[166,326,1],[161,327,1],[158,328,1],[153,329,1],[150,329,1],[148,329,1],[146,329,1],[143,329,1]]},{\"Name\":\",\",\"Points\":[[241,265,1],[246,273,1],[246,277,1],[247,282,1],[248,289,1],[248,297,1],[248,302,1],[248,310,1],[246,318,1],[244,324,1],[241,329,1],[239,334,1],[237,338,1],[236,339,1]]},{\"Name\":\",\",\"Points\":[[222,275,1],[222,280,1],[222,285,1],[222,292,1],[221,299,1],[218,306,1],[214,315,1],[209,321,1],[204,329,1],[199,337,1]]},{\"Name\":\"x\",\"Points\":[[146,182,1],[153,189,1],[158,194,1],[165,202,1],[172,210,1],[181,219,1],[187,228,1],[194,236,1],[201,245,1],[208,252,1],[213,259,1],[219,266,1],[224,272,1],[227,277,1],[231,281,1],[235,285,1],[237,287,1],[239,289,1],[241,290,1],[155,267,2],[159,259,2],[161,254,2],[165,250,2],[171,242,2],[176,234,2],[181,227,2],[188,219,2],[194,212,2],[199,207,2],[204,200,2],[207,197,2],[210,194,2],[213,191,2],[216,189,2],[218,189,2],[218,187,2]]},{\"Name\":\"x\",\"Points\":[[171,194,1],[176,201,1],[179,206,1],[182,211,1],[188,218,1],[194,226,1],[201,231,1],[206,239,1],[212,246,1],[218,253,1],[223,259,1],[227,264,1],[231,271,1],[235,275,1],[238,277,1],[241,281,1],[242,282,1],[243,284,1],[243,285,1],[178,275,2],[181,267,2],[182,261,2],[186,255,2],[192,248,2],[199,240,2],[204,232,2],[208,226,2],[213,219,2],[218,213,2],[222,210,2],[225,208,2],[227,206,2],[231,204,2]]},{\"Name\":\"x\",\"Points\":[[184,194,1],[186,198,1],[188,204,1],[192,210,1],[195,217,1],[200,226,1],[204,232,1],[208,241,1],[213,248,1],[217,255,1],[222,263,1],[225,269,1],[228,275,1],[231,279,1],[233,282,1],[235,285,1],[236,287,1],[181,280,2],[183,268,2],[187,263,2],[194,256,2],[201,250,2],[207,241,2],[213,233,2],[219,227,2],[224,221,2],[227,215,2],[231,211,2],[235,209,2],[239,208,2],[242,206,2]]},{\"Name\":\"a\",\"Points\":[[206,231,1],[191,227,1],[185,227,1],[176,229,1],[167,233,1],[159,240,1],[153,246,1],[148,253,1],[144,259,1],[143,265,1],[143,270,1],[143,275,1],[147,282,1],[152,286,1],[157,288,1],[163,290,1],[171,290,1],[179,289,1],[185,284,1],[190,278,1],[196,273,1],[199,265,1],[203,259,1],[204,253,1],[206,248,1],[208,245,1],[208,241,1],[209,240,1],[210,239,1],[210,238,1],[210,240,1],[210,245,1],[210,249,1],[211,254,1],[212,261,1],[213,269,1],[215,276,1],[219,282,1],[224,289,1],[228,293,1],[233,296,1],[242,297,1],[250,297,1],[258,296,1],[269,292,1],[278,287,1],[289,282,1]]},{\"Name\":\"a\",\"Points\":[[199,217,1],[186,214,1],[181,214,1],[176,216,1],[167,222,1],[161,228,1],[157,234,1],[153,241,1],[152,246,1],[151,251,1],[151,256,1],[153,262,1],[158,267,1],[162,270,1],[171,273,1],[178,273,1],[185,272,1],[193,267,1],[198,262,1],[202,255,1],[205,250,1],[208,242,1],[208,235,1],[210,230,1],[211,226,1],[212,222,1],[213,218,1],[213,217,1],[213,219,1],[213,223,1],[213,228,1],[213,234,1],[213,240,1],[214,249,1],[218,254,1],[222,261,1],[226,266,1],[231,271,1],[236,274,1],[245,275,1],[254,275,1],[264,275,1]]},{\"Name\":\"a\",\"Points\":[[213,208,1],[199,200,1],[194,200,1],[190,201,1],[182,207,1],[176,212,1],[169,220,1],[165,227,1],[161,233,1],[161,239,1],[161,246,1],[161,253,1],[164,259,1],[170,265,1],[176,269,1],[181,271,1],[190,271,1],[199,270,1],[204,265,1],[208,259,1],[213,253,1],[215,245,1],[217,235,1],[218,230,1],[218,222,1],[219,217,1],[219,213,1],[219,211,1],[219,210,1],[219,211,1],[219,214,1],[219,219,1],[219,226,1],[219,234,1],[221,242,1],[223,250,1],[226,255,1],[231,262,1],[237,267,1],[245,269,1],[252,270,1],[264,270,1],[273,269,1]]},{\"Name\":\"b\",\"Points\":[[170,133,1],[171,138,1],[171,143,1],[172,153,1],[175,165,1],[176,178,1],[177,192,1],[178,207,1],[178,224,1],[178,240,1],[177,253,1],[176,268,1],[174,278,1],[173,288,1],[173,294,1],[173,296,1],[173,297,1],[173,294,1],[174,287,1],[176,280,1],[180,274,1],[183,268,1],[189,261,1],[194,256,1],[199,253,1],[204,251,1],[209,250,1],[216,249,1],[221,249,1],[226,249,1],[229,251,1],[233,254,1],[236,259,1],[238,264,1],[240,268,1],[241,273,1],[241,278,1],[238,284,1],[233,291,1],[226,297,1],[218,301,1],[211,305,1],[204,307,1],[196,308,1],[189,308,1],[182,308,1],[178,307,1],[176,304,1],[173,300,1],[172,298,1],[172,297,1],[173,295,1],[177,293,1]]},{\"Name\":\"b\",\"Points\":[[209,142,1],[208,148,1],[208,156,1],[209,165,1],[210,175,1],[211,189,1],[212,202,1],[212,217,1],[212,231,1],[212,246,1],[210,259,1],[208,273,1],[206,281,1],[204,289,1],[204,294,1],[204,297,1],[204,295,1],[204,288,1],[206,282,1],[209,275,1],[213,267,1],[218,258,1],[222,252,1],[226,245,1],[230,238,1],[236,233,1],[242,230,1],[248,228,1],[256,227,1],[264,227,1],[270,227,1],[277,228,1],[283,231,1],[288,236,1],[293,242,1],[296,250,1],[299,255,1],[301,262,1],[301,269,1],[301,275,1],[298,282,1],[293,290,1],[287,297,1],[278,301,1],[270,305,1],[261,308,1],[251,310,1],[242,310,1],[234,310,1],[226,309,1],[219,306,1],[215,305,1],[212,303,1],[209,301,1],[208,300,1],[208,298,1]]},{\"Name\":\"b\",\"Points\":[[216,142,1],[211,157,1],[211,165,1],[211,178,1],[211,190,1],[212,204,1],[213,219,1],[213,234,1],[213,250,1],[213,264,1],[211,277,1],[210,292,1],[209,300,1],[208,307,1],[208,312,1],[208,316,1],[208,317,1],[208,315,1],[224,244,2],[226,239,2],[231,239,2],[238,240,2],[246,241,2],[251,244,2],[258,247,2],[263,251,2],[268,254,2],[270,261,2],[273,268,2],[273,274,2],[273,282,2],[273,291,2],[269,298,2],[264,305,2],[256,311,2],[250,315,2],[242,318,2],[233,320,2],[225,320,2],[217,320,2],[211,320,2],[206,320,2],[204,319,2],[202,317,2],[202,316,2],[202,314,2]]},{\"Name\":\"c\",\"Points\":[[236,224,1],[223,214,1],[218,213,1],[212,213,1],[204,216,1],[194,222,1],[184,229,1],[176,237,1],[167,245,1],[161,253,1],[157,262,1],[154,269,1],[153,275,1],[153,284,1],[154,292,1],[159,297,1],[165,300,1],[174,302,1],[182,303,1],[192,303,1],[204,303,1],[212,301,1],[222,299,1],[229,297,1],[236,294,1],[245,290,1],[249,286,1]]},{\"Name\":\"c\",\"Points\":[[261,207,1],[248,203,1],[240,203,1],[229,204,1],[220,208,1],[210,212,1],[202,218,1],[194,226,1],[187,232,1],[183,239,1],[181,246,1],[180,252,1],[180,258,1],[180,264,1],[181,270,1],[186,275,1],[193,278,1],[201,280,1],[210,282,1],[221,282,1],[231,282,1],[241,282,1],[250,281,1],[259,278,1],[267,277,1],[273,276,1],[280,275,1],[287,273,1]]},{\"Name\":\"c\",\"Points\":[[245,208,1],[233,198,1],[228,196,1],[221,196,1],[210,197,1],[200,202,1],[190,207,1],[181,212,1],[173,220,1],[166,227,1],[161,235,1],[159,241,1],[158,248,1],[158,253,1],[158,259,1],[160,264,1],[166,267,1],[173,269,1],[182,271,1],[195,271,1],[206,271,1],[218,270,1],[226,268,1],[234,267,1],[241,265,1],[248,264,1],[251,264,1]]},{\"Name\":\"d\",\"Points\":[[211,240,1],[197,233,1],[189,233,1],[181,233,1],[170,238,1],[161,244,1],[153,251,1],[146,259,1],[142,266,1],[141,272,1],[141,277,1],[142,283,1],[148,289,1],[155,292,1],[164,293,1],[177,293,1],[190,287,1],[204,275,1],[214,262,1],[224,247,1],[231,227,1],[237,212,1],[242,194,1],[246,179,1],[247,165,1],[248,154,1],[248,147,1],[248,141,1],[248,138,1],[247,138,1],[246,138,1],[245,141,1],[244,150,1],[241,162,1],[241,174,1],[240,187,1],[238,203,1],[237,217,1],[237,233,1],[237,248,1],[237,261,1],[237,271,1],[237,279,1],[238,286,1],[239,290,1],[241,292,1],[241,294,1],[242,295,1],[243,295,1],[244,295,1],[245,295,1],[246,294,1]]},{\"Name\":\"d\",\"Points\":[[192,229,1],[176,220,1],[166,218,1],[158,217,1],[149,217,1],[139,222,1],[132,227,1],[126,234,1],[123,240,1],[121,246,1],[121,253,1],[122,259,1],[128,266,1],[136,272,1],[144,275,1],[154,277,1],[166,277,1],[181,273,1],[192,262,1],[203,248,1],[211,231,1],[218,214,1],[223,197,1],[226,182,1],[226,170,1],[227,162,1],[227,156,1],[227,152,1],[227,151,1],[227,150,1],[226,150,1],[226,155,1],[225,163,1],[224,172,1],[223,186,1],[223,198,1],[223,213,1],[223,227,1],[223,240,1],[223,251,1],[223,261,1],[223,270,1],[225,276,1],[228,282,1],[232,285,1],[239,287,1],[248,287,1],[259,285,1],[269,281,1],[278,276,1]]},{\"Name\":\"d\",\"Points\":[[205,222,1],[194,221,1],[190,222,1],[184,226,1],[179,233,1],[176,240,1],[173,247,1],[172,253,1],[172,259,1],[173,264,1],[175,267,1],[179,268,1],[184,268,1],[193,268,1],[203,259,1],[212,249,1],[220,235,1],[226,221,1],[230,205,1],[233,189,1],[236,174,1],[236,162,1],[237,152,1],[237,147,1],[237,143,1],[237,142,1],[236,144,1],[236,153,1],[235,164,1],[234,176,1],[233,190,1],[232,206,1],[231,221,1],[231,236,1],[230,250,1],[229,263,1],[228,271,1],[228,277,1],[228,281,1],[228,283,1],[228,284,1]]},{\"Name\":\"e\",\"Points\":[[148,233,1],[152,235,1],[158,235,1],[166,235,1],[178,234,1],[189,231,1],[198,227,1],[204,222,1],[207,218,1],[209,214,1],[210,211,1],[210,208,1],[209,205,1],[204,203,1],[197,202,1],[189,202,1],[180,203,1],[170,207,1],[161,212,1],[153,220,1],[146,227,1],[140,233,1],[137,240,1],[134,247,1],[134,252,1],[134,258,1],[134,264,1],[136,268,1],[141,272,1],[148,274,1],[158,275,1],[169,275,1],[181,275,1],[191,275,1],[199,273,1],[208,272,1],[217,270,1]]},{\"Name\":\"e\",\"Points\":[[164,254,1],[171,258,1],[179,259,1],[190,259,1],[201,259,1],[212,256,1],[223,251,1],[230,245,1],[235,239,1],[238,235,1],[239,230,1],[239,227,1],[238,222,1],[232,219,1],[226,217,1],[216,216,1],[204,216,1],[193,217,1],[181,222,1],[171,227,1],[161,235,1],[155,243,1],[149,251,1],[146,259,1],[144,266,1],[144,274,1],[145,282,1],[151,289,1],[158,295,1],[167,298,1],[180,300,1],[192,300,1],[204,300,1],[218,300,1],[228,299,1],[241,297,1]]},{\"Name\":\"e\",\"Points\":[[166,269,1],[172,269,1],[180,269,1],[190,267,1],[201,263,1],[213,256,1],[223,250,1],[229,243,1],[234,238,1],[236,233,1],[236,230,1],[236,227,1],[233,226,1],[225,225,1],[214,225,1],[203,227,1],[188,232,1],[176,240,1],[166,247,1],[159,254,1],[153,264,1],[150,271,1],[149,277,1],[149,286,1],[153,292,1],[160,297,1],[171,301,1],[182,303,1],[197,303,1],[214,303,1],[230,300,1],[242,297,1]]},{\"Name\":\"f\",\"Points\":[[137,253,1],[138,244,1],[145,237,1],[158,227,1],[171,211,1],[184,195,1],[195,180,1],[203,165,1],[208,149,1],[211,137,1],[213,124,1],[213,115,1],[213,109,1],[213,105,1],[208,103,1],[200,103,1],[191,108,1],[183,116,1],[177,125,1],[172,137,1],[169,150,1],[166,164,1],[165,180,1],[164,198,1],[164,216,1],[164,235,1],[164,251,1],[163,270,1],[162,284,1],[161,300,1],[159,314,1],[158,324,1],[156,333,1],[155,339,1],[154,343,1],[153,345,1],[153,346,1],[152,346,1],[137,297,2],[144,289,2],[153,286,2],[161,282,2],[172,278,2],[182,275,2],[193,269,2],[204,264,2],[213,259,2]]},{\"Name\":\"f\",\"Points\":[[157,265,1],[159,252,1],[166,243,1],[177,231,1],[188,218,1],[199,204,1],[207,190,1],[214,175,1],[218,164,1],[219,154,1],[220,147,1],[220,141,1],[219,138,1],[216,138,1],[210,139,1],[204,146,1],[200,155,1],[197,165,1],[194,177,1],[193,190,1],[191,208,1],[190,227,1],[189,245,1],[188,262,1],[187,278,1],[186,295,1],[185,308,1],[183,320,1],[181,330,1],[181,337,1],[181,341,1],[180,342,1],[160,300,2],[165,293,2],[172,289,2],[181,283,2],[194,276,2],[203,271,2],[212,264,2],[218,259,2]]},{\"Name\":\"f\",\"Points\":[[134,268,1],[138,260,1],[146,254,1],[158,245,1],[168,233,1],[181,217,1],[191,202,1],[199,189,1],[204,175,1],[206,163,1],[208,153,1],[208,144,1],[208,139,1],[208,136,1],[204,134,1],[199,134,1],[192,140,1],[184,148,1],[176,162,1],[171,174,1],[167,189,1],[164,206,1],[162,224,1],[161,243,1],[161,261,1],[160,279,1],[160,295,1],[160,310,1],[160,323,1],[160,333,1],[160,342,1],[160,348,1],[160,352,1],[160,353,1],[141,309,2],[147,299,2],[154,295,2],[163,289,2],[173,283,2],[184,278,2],[194,272,2]]},{\"Name\":\"g\",\"Points\":[[196,170,1],[179,164,1],[170,164,1],[159,167,1],[148,175,1],[138,186,1],[134,195,1],[130,207,1],[130,215,1],[131,223,1],[136,229,1],[146,232,1],[157,232,1],[172,230,1],[190,220,1],[204,207,1],[213,194,1],[221,181,1],[224,170,1],[226,162,1],[226,157,1],[226,155,1],[226,154,1],[225,154,1],[222,161,1],[219,168,1],[216,179,1],[213,190,1],[213,203,1],[213,216,1],[213,230,1],[214,248,1],[215,261,1],[216,276,1],[217,292,1],[217,305,1],[214,319,1],[210,330,1],[204,341,1],[199,348,1],[192,354,1],[186,357,1],[181,358,1],[175,358,1],[171,357,1],[167,352,1],[166,346,1],[166,337,1],[170,327,1],[178,315,1],[186,305,1],[198,294,1],[208,282,1],[222,269,1],[236,255,1],[252,245,1],[269,232,1]]},{\"Name\":\"g\",\"Points\":[[229,185,1],[213,183,1],[199,182,1],[182,183,1],[167,189,1],[155,198,1],[145,209,1],[139,220,1],[137,229,1],[137,237,1],[138,245,1],[143,250,1],[150,252,1],[159,253,1],[175,252,1],[190,244,1],[208,229,1],[222,212,1],[230,199,1],[236,188,1],[238,180,1],[239,175,1],[240,174,1],[240,180,1],[238,193,1],[234,208,1],[230,224,1],[226,240,1],[220,256,1],[215,273,1],[210,290,1],[204,306,1],[199,321,1],[191,334,1],[185,343,1],[180,351,1],[175,353,1],[171,353,1],[166,352,1],[162,347,1],[161,339,1],[161,329,1],[161,318,1],[171,305,1],[181,297,1],[191,286,1],[203,278,1],[213,272,1],[226,266,1],[239,259,1],[253,253,1],[270,244,1]]},{\"Name\":\"g\",\"Points\":[[237,161,1],[225,147,1],[218,145,1],[209,145,1],[196,147,1],[182,157,1],[170,168,1],[161,179,1],[158,188,1],[156,196,1],[156,205,1],[159,212,1],[166,218,1],[176,222,1],[186,223,1],[202,222,1],[216,215,1],[227,204,1],[236,191,1],[241,183,1],[244,175,1],[245,169,1],[246,165,1],[246,164,1],[246,163,1],[244,163,1],[241,167,1],[238,175,1],[236,183,1],[233,194,1],[231,205,1],[231,217,1],[231,231,1],[231,244,1],[230,256,1],[229,269,1],[226,281,1],[224,294,1],[220,305,1],[215,317,1],[209,325,1],[204,333,1],[199,338,1],[194,339,1],[190,339,1],[187,338,1],[185,333,1],[184,325,1],[184,317,1],[186,307,1],[194,297,1],[204,289,1],[216,280,1],[228,273,1],[242,264,1],[256,256,1],[271,250,1],[284,244,1]]},{\"Name\":\"l\",\"Points\":[[120,272,1],[126,259,1],[133,253,1],[138,245,1],[149,234,1],[158,223,1],[166,209,1],[175,196,1],[181,182,1],[187,168,1],[192,155,1],[195,144,1],[199,133,1],[201,126,1],[203,120,1],[204,116,1],[204,113,1],[204,111,1],[202,111,1],[197,111,1],[191,116,1],[184,123,1],[176,133,1],[168,144,1],[162,157,1],[158,170,1],[155,184,1],[152,199,1],[148,215,1],[144,232,1],[141,250,1],[139,264,1],[138,277,1],[138,289,1],[138,297,1],[141,301,1],[145,304,1],[152,305,1],[162,303,1],[178,297,1],[191,289,1]]},{\"Name\":\"l\",\"Points\":[[174,250,1],[170,244,1],[170,239,1],[171,233,1],[176,226,1],[184,215,1],[193,203,1],[201,189,1],[208,174,1],[214,159,1],[219,144,1],[223,132,1],[224,122,1],[225,115,1],[226,110,1],[226,106,1],[226,105,1],[224,105,1],[218,110,1],[211,119,1],[204,130,1],[199,142,1],[194,157,1],[190,172,1],[187,189,1],[184,208,1],[181,226,1],[180,245,1],[177,261,1],[176,275,1],[176,289,1],[176,297,1],[176,306,1],[179,313,1],[182,316,1],[190,319,1],[199,319,1],[212,315,1],[226,306,1],[236,297,1]]},{\"Name\":\"l\",\"Points\":[[154,266,1],[153,253,1],[159,245,1],[169,233,1],[180,220,1],[191,203,1],[202,186,1],[208,170,1],[215,155,1],[219,142,1],[222,130,1],[223,123,1],[223,118,1],[223,115,1],[223,113,1],[221,112,1],[217,113,1],[211,118,1],[204,125,1],[199,134,1],[191,147,1],[185,160,1],[181,174,1],[178,189,1],[174,203,1],[170,218,1],[167,234,1],[164,250,1],[162,264,1],[161,277,1],[160,291,1],[160,303,1],[160,315,1],[160,323,1],[161,331,1],[164,338,1],[169,342,1],[174,345,1],[181,346,1],[189,346,1],[199,342,1],[207,336,1],[217,329,1],[226,323,1],[233,317,1]]},{\"Name\":\"i\",\"Points\":[[194,201,1],[189,205,1],[188,214,1],[185,225,1],[181,237,1],[177,248,1],[176,256,1],[174,266,1],[174,273,1],[174,277,1],[176,281,1],[181,283,1],[188,283,1],[199,282,1],[211,277,1],[218,272,1],[211,154,2]]},{\"Name\":\"i\",\"Points\":[[225,203,1],[214,211,1],[209,219,1],[204,230,1],[201,242,1],[199,254,1],[199,264,1],[199,274,1],[199,281,1],[204,287,1],[210,289,1],[221,289,1],[235,286,1],[245,275,1],[241,152,2]]},{\"Name\":\"i\",\"Points\":[[204,194,1],[203,197,1],[203,202,1],[202,209,1],[200,219,1],[198,230,1],[195,241,1],[194,250,1],[192,259,1],[192,267,1],[192,273,1],[193,277,1],[195,279,1],[200,281,1],[205,281,1],[211,281,1],[218,280,1],[225,277,1],[232,273,1],[243,264,1],[211,147,2]]},{\"Name\":\"n\",\"Points\":[[136,204,1],[140,196,1],[146,196,1],[153,198,1],[158,202,1],[163,208,1],[166,215,1],[169,224,1],[171,235,1],[171,246,1],[172,256,1],[173,269,1],[173,278,1],[173,288,1],[173,295,1],[173,298,1],[173,301,1],[173,302,1],[173,300,1],[173,294,1],[173,284,1],[173,274,1],[174,261,1],[175,250,1],[178,239,1],[181,230,1],[186,222,1],[192,214,1],[199,208,1],[205,205,1],[212,203,1],[219,203,1],[226,203,1],[231,203,1],[236,208,1],[241,213,1],[244,220,1],[246,229,1],[248,238,1],[249,248,1],[250,258,1],[250,268,1],[250,277,1],[249,287,1],[249,296,1],[248,301,1],[248,305,1],[248,310,1],[248,312,1],[248,313,1],[249,313,1]]},{\"Name\":\"n\",\"Points\":[[131,194,1],[138,190,1],[146,191,1],[154,196,1],[161,203,1],[166,211,1],[172,221,1],[176,231,1],[177,243,1],[178,253,1],[179,262,1],[179,268,1],[179,273,1],[179,276,1],[179,277,1],[179,275,1],[179,267,1],[180,254,1],[184,240,1],[191,227,1],[199,214,1],[206,206,1],[214,198,1],[222,194,1],[226,193,1],[233,193,1],[237,194,1],[241,200,1],[243,208,1],[243,220,1],[243,231,1],[242,244,1],[240,254,1],[238,265,1],[238,273,1],[237,280,1],[237,286,1],[237,290,1],[238,292,1],[241,293,1],[245,293,1],[248,293,1],[253,292,1],[259,291,1],[264,287,1]]},{\"Name\":\"n\",\"Points\":[[103,200,1],[109,191,1],[116,191,1],[125,191,1],[134,191,1],[142,194,1],[149,198,1],[156,204,1],[161,211,1],[165,220,1],[167,230,1],[169,240,1],[170,251,1],[170,261,1],[170,271,1],[170,277,1],[170,281,1],[170,284,1],[170,279,1],[171,273,1],[173,261,1],[177,251,1],[181,240,1],[187,231,1],[194,222,1],[200,215,1],[206,208,1],[213,205,1],[218,203,1],[223,202,1],[228,202,1],[231,204,1],[235,210,1],[236,217,1],[236,227,1],[236,237,1],[236,246,1],[236,255,1],[235,266,1],[234,273,1],[234,281,1],[234,286,1],[234,290,1],[236,292,1],[240,293,1],[247,292,1],[255,289,1],[264,285,1],[274,281,1],[286,277,1]]},{\"Name\":\"o\",\"Points\":[[208,193,1],[201,182,1],[198,179,1],[194,177,1],[190,176,1],[184,176,1],[176,181,1],[170,187,1],[162,194,1],[158,201,1],[153,209,1],[149,217,1],[148,226,1],[147,234,1],[147,242,1],[148,250,1],[153,254,1],[158,259,1],[164,261,1],[171,261,1],[178,261,1],[184,258,1],[190,253,1],[195,245,1],[199,237,1],[201,230,1],[203,222,1],[204,214,1],[204,208,1],[204,202,1],[204,195,1],[204,191,1],[202,187,1],[201,185,1],[199,183,1],[199,182,1],[199,181,1],[201,181,1],[204,181,1],[209,183,1],[217,185,1],[225,185,1],[235,186,1],[248,186,1]]},{\"Name\":\"o\",\"Points\":[[234,199,1],[226,194,1],[219,194,1],[213,194,1],[204,199,1],[194,210,1],[186,222,1],[180,232,1],[176,242,1],[172,251,1],[172,258,1],[172,266,1],[173,271,1],[178,274,1],[183,275,1],[192,275,1],[202,273,1],[211,263,1],[219,253,1],[224,244,1],[227,234,1],[231,227,1],[232,219,1],[234,213,1],[235,208,1],[236,206,1],[237,204,1],[238,203,1],[239,203,1],[241,204,1],[243,206,1],[247,207,1],[253,208,1],[262,208,1],[274,208,1],[288,208,1]]},{\"Name\":\"o\",\"Points\":[[253,215,1],[243,210,1],[231,208,1],[222,205,1],[209,205,1],[194,207,1],[181,212,1],[166,222,1],[156,230,1],[147,239,1],[142,247,1],[138,254,1],[137,261,1],[137,269,1],[138,275,1],[144,280,1],[151,283,1],[159,285,1],[172,285,1],[184,283,1],[199,276,1],[208,267,1],[218,256,1],[226,245,1],[231,233,1],[233,224,1],[235,217,1],[236,212,1],[236,209,1],[236,208,1],[236,208,1],[236,211,1],[237,213,1],[241,218,1],[247,222,1],[255,226,1],[266,229,1],[282,231,1],[299,231,1],[317,231,1]]},{\"Name\":\"s\",\"Points\":[[261,203,1],[250,194,1],[241,193,1],[230,193,1],[214,195,1],[199,203,1],[183,210,1],[171,218,1],[164,224,1],[159,230,1],[158,235,1],[158,242,1],[158,249,1],[164,254,1],[173,259,1],[183,264,1],[194,270,1],[204,275,1],[213,280,1],[219,284,1],[224,290,1],[226,295,1],[227,298,1],[227,303,1],[225,308,1],[218,311,1],[206,315,1],[194,316,1],[181,317,1],[170,317,1],[161,317,1],[154,317,1],[148,316,1],[144,315,1],[141,315,1]]},{\"Name\":\"s\",\"Points\":[[267,186,1],[258,179,1],[252,179,1],[246,179,1],[236,179,1],[226,182,1],[218,186,1],[209,192,1],[204,198,1],[201,202,1],[199,208,1],[199,213,1],[199,219,1],[202,225,1],[208,231,1],[217,238,1],[226,245,1],[233,252,1],[241,259,1],[247,266,1],[251,272,1],[255,277,1],[256,284,1],[257,290,1],[257,297,1],[255,300,1],[250,305,1],[243,309,1],[234,310,1],[224,310,1],[213,310,1],[202,310,1],[193,310,1],[185,306,1],[180,304,1],[176,302,1],[172,300,1],[171,299,1]]},{\"Name\":\"s\",\"Points\":[[140,306,1],[143,303,1],[150,300,1],[160,292,1],[170,283,1],[180,273,1],[189,261,1],[198,249,1],[206,234,1],[214,222,1],[223,208,1],[228,200,1],[235,193,1],[239,188,1],[242,186,1],[245,185,1],[247,185,1],[248,185,1],[248,189,1],[249,195,1],[249,203,1],[249,212,1],[249,222,1],[249,235,1],[249,247,1],[248,259,1],[246,271,1],[244,282,1],[241,294,1],[236,302,1],[232,310,1],[226,317,1],[221,320,1],[214,324,1],[208,325,1],[204,325,1],[198,325,1],[193,325,1],[190,325,1],[189,324,1],[189,323,1],[190,322,1],[194,321,1],[199,320,1],[205,318,1],[212,315,1],[219,312,1],[226,308,1],[231,304,1],[236,300,1],[238,299,1],[241,297,1],[242,297,1],[243,296,1],[242,296,1]]},{\"Name\":\"t\",\"Points\":[[214,138,1],[204,160,1],[199,173,1],[194,189,1],[186,208,1],[180,229,1],[171,247,1],[166,263,1],[163,278,1],[162,292,1],[162,302,1],[164,310,1],[171,315,1],[181,318,1],[194,318,1],[210,315,1],[226,309,1],[241,301,1],[252,292,1],[144,226,2],[148,222,2],[156,222,2],[167,223,2],[181,225,2],[197,225,2],[212,225,2],[225,225,2]]},{\"Name\":\"t\",\"Points\":[[218,120,1],[213,129,1],[212,138,1],[211,150,1],[209,164,1],[208,177,1],[206,191,1],[204,208,1],[202,222,1],[199,239,1],[195,254,1],[194,270,1],[193,282,1],[192,292,1],[192,302,1],[193,310,1],[194,315,1],[199,318,1],[204,319,1],[213,318,1],[225,310,1],[235,303,1],[246,297,1],[255,288,1],[262,281,1],[185,205,2],[192,203,2],[204,203,2],[217,203,2],[231,203,2],[246,203,2],[259,203,2]]},{\"Name\":\"t\",\"Points\":[[125,323,1],[126,317,1],[130,309,1],[139,296,1],[152,277,1],[163,260,1],[174,241,1],[183,222,1],[192,201,1],[202,180,1],[209,159,1],[217,142,1],[223,129,1],[226,120,1],[226,117,1],[227,115,1],[228,115,1],[228,122,1],[223,135,1],[218,148,1],[211,164,1],[204,181,1],[197,201,1],[190,217,1],[185,235,1],[181,253,1],[176,270,1],[175,282,1],[175,296,1],[176,305,1],[181,313,1],[189,318,1],[200,320,1],[214,320,1],[231,320,1],[246,319,1],[262,312,1],[276,302,1],[166,227,2],[169,222,2],[177,222,2],[185,222,2],[199,222,2],[212,222,2],[226,222,2],[238,222,2]]},{\"Name\":\"+\",\"Points\":[[145,233,1],[155,230,1],[163,230,1],[176,230,1],[190,230,1],[208,230,1],[225,230,1],[237,230,1],[250,228,1],[260,227,1],[268,227,1],[273,227,1],[201,197,2],[200,207,2],[200,213,2],[200,222,2],[200,231,2],[200,240,2],[200,250,2],[199,257,2],[199,264,2],[199,270,2],[199,275,2],[201,281,2]]},{\"Name\":\"+\",\"Points\":[[128,222,1],[133,222,1],[138,222,1],[146,222,1],[158,222,1],[171,222,1],[185,222,1],[204,221,1],[217,220,1],[231,217,1],[245,216,1],[257,215,1],[269,214,1],[278,213,1],[285,212,1],[292,212,1],[199,183,2],[197,191,2],[197,198,2],[197,208,2],[197,217,2],[197,227,2],[197,237,2],[197,247,2],[197,254,2],[197,263,2],[198,271,2]]},{\"Name\":\"+\",\"Points\":[[100,208,1],[107,209,1],[115,209,1],[126,209,1],[138,210,1],[153,210,1],[167,210,1],[182,209,1],[198,208,1],[213,208,1],[226,208,1],[239,207,1],[250,206,1],[260,206,1],[270,205,1],[276,204,1],[282,203,1],[286,203,1],[288,203,1],[186,164,2],[183,170,2],[183,178,2],[183,185,2],[182,195,2],[182,205,2],[181,217,2],[181,226,2],[179,235,2],[178,242,2],[178,250,2],[178,254,2]]},{\"Name\":\"-\",\"Points\":[[140,211,1],[142,208,1],[148,208,1],[154,208,1],[163,208,1],[173,208,1],[183,207,1],[194,206,1],[204,205,1],[213,204,1],[223,203,1],[229,202,1],[234,202,1],[239,202,1]]},{\"Name\":\"-\",\"Points\":[[104,215,1],[109,216,1],[115,216,1],[122,216,1],[130,216,1],[140,216,1],[150,216,1],[159,216,1],[172,215,1],[183,214,1],[196,213,1],[206,212,1],[221,212,1],[230,212,1],[241,212,1],[250,211,1],[257,210,1],[264,209,1],[269,209,1],[273,209,1],[276,209,1],[278,208,1]]},{\"Name\":\"-\",\"Points\":[[111,219,1],[120,220,1],[128,220,1],[137,220,1],[150,220,1],[162,220,1],[177,220,1],[190,220,1],[204,219,1],[220,218,1],[233,217,1],[247,217,1],[260,216,1],[273,215,1],[283,214,1],[293,214,1],[300,214,1],[307,213,1],[313,213,1],[317,212,1]]},{\"Name\":\"*\",\"Points\":[[165,162,1],[170,167,1],[175,174,1],[181,182,1],[185,190,1],[191,198,1],[198,207,1],[204,214,1],[210,222,1],[217,231,1],[223,240,1],[226,247,1],[229,254,1],[230,259,1],[229,264,1],[177,261,2],[173,253,2],[173,248,2],[175,238,2],[179,230,2],[184,217,2],[190,205,2],[196,192,2],[201,183,2],[204,174,2],[208,168,2],[210,165,2],[213,163,2],[213,162,2],[214,162,2],[214,164,2],[212,169,2],[207,176,2],[202,185,2],[194,194,2],[187,203,2],[181,211,2],[172,218,2],[166,222,2],[161,224,2],[158,225,2],[154,225,2],[151,225,2],[149,224,2],[149,222,2],[149,221,2],[149,218,2],[153,216,2],[158,212,2],[166,211,2],[175,208,2],[184,208,2],[194,205,2],[204,203,2],[213,202,2],[223,201,2],[229,200,2],[236,199,2],[243,198,2],[250,198,2]]},{\"Name\":\"*\",\"Points\":[[157,288,1],[163,277,1],[172,271,1],[182,262,1],[194,252,1],[205,240,1],[218,227,1],[228,214,1],[237,203,1],[245,195,1],[250,187,1],[255,180,1],[185,186,2],[190,195,2],[194,203,2],[203,214,2],[208,226,2],[215,236,2],[222,249,2],[226,259,2],[229,270,2],[231,280,2],[233,289,2],[234,296,2],[171,254,3],[181,249,3],[193,249,3],[205,248,3],[220,246,3],[233,245,3],[247,244,3],[259,242,3],[269,241,3],[278,240,3]]},{\"Name\":\"*\",\"Points\":[[207,167,1],[207,173,1],[207,182,1],[207,195,1],[207,209,1],[207,225,1],[207,240,1],[207,254,1],[205,268,1],[204,277,1],[203,287,1],[203,294,1],[202,297,1],[202,300,1],[202,298,1],[204,292,1],[204,285,1],[207,276,1],[208,268,1],[210,259,1],[211,253,1],[212,245,1],[212,239,1],[212,232,1],[212,229,1],[211,226,1],[208,222,1],[206,220,1],[203,219,1],[199,218,1],[191,218,1],[183,218,1],[176,218,1],[166,220,1],[158,222,1],[151,225,1],[145,227,1],[142,228,1],[139,229,1],[139,230,1],[144,230,1],[152,230,1],[161,230,1],[176,230,1],[190,230,1],[204,230,1],[217,230,1],[230,230,1],[242,230,1],[250,230,1],[257,230,1],[262,230,1],[265,230,1],[266,230,1],[264,230,1],[260,230,1],[253,226,1],[246,222,1],[236,217,1],[226,212,1],[218,207,1],[208,201,1],[199,194,1],[190,189,1],[185,185,1],[181,183,1],[179,182,1],[177,180,1],[176,180,1],[176,181,1],[176,184,1],[177,189,1],[181,196,1],[184,204,1],[190,212,1],[195,222,1],[202,232,1],[208,242,1],[215,251,1],[223,257,1],[226,263,1],[231,268,1],[236,271,1],[238,273,1],[241,275,1],[244,275,1],[246,276,1],[248,277,1],[248,277,1]]},{\"Name\":\"/\",\"Points\":[[102,344,1],[106,338,1],[115,329,1],[125,319,1],[136,306,1],[148,290,1],[161,274,1],[175,257,1],[190,240,1],[204,222,1],[220,203,1],[234,185,1],[248,169,1],[261,154,1],[270,141,1],[279,129,1],[286,119,1],[293,111,1],[296,105,1],[299,99,1],[302,96,1],[304,92,1],[306,89,1],[309,87,1]]},{\"Name\":\"/\",\"Points\":[[325,77,1],[317,78,1],[313,85,1],[307,93,1],[301,101,1],[295,112,1],[289,121,1],[282,133,1],[275,143,1],[269,154,1],[261,165,1],[254,175,1],[246,187,1],[239,198,1],[231,209,1],[223,221,1],[215,232,1],[206,244,1],[199,253,1],[191,264,1],[185,272,1],[179,279,1],[172,287,1],[166,295,1],[162,300,1],[158,306,1],[153,312,1],[148,317,1],[144,320,1],[141,324,1],[138,327,1],[137,329,1],[135,332,1],[134,333,1],[134,335,1],[133,336,1],[132,337,1],[130,342,1]]},{\"Name\":\"/\",\"Points\":[[319,86,1],[311,89,1],[306,94,1],[299,100,1],[293,110,1],[287,119,1],[281,127,1],[275,138,1],[268,149,1],[261,161,1],[254,171,1],[247,184,1],[241,193,1],[233,205,1],[226,216,1],[219,227,1],[212,238,1],[204,249,1],[194,260,1],[185,270,1],[177,280,1],[168,290,1],[159,299,1],[153,306,1],[144,315,1],[137,321,1],[131,328,1],[125,333,1],[119,340,1],[115,344,1],[111,347,1],[109,350,1],[107,352,1],[106,353,1],[106,354,1]]},{\"Name\":\"(\",\"Points\":[[284,91,1],[272,90,1],[266,91,1],[256,96,1],[248,101,1],[239,108,1],[231,116,1],[225,123,1],[218,133,1],[211,142,1],[205,151,1],[201,162,1],[196,170,1],[193,181,1],[190,192,1],[187,203,1],[185,216,1],[182,228,1],[181,240,1],[181,253,1],[180,266,1],[180,277,1],[180,291,1],[181,301,1],[181,312,1],[184,320,1],[187,329,1],[190,337,1],[194,342,1],[199,348,1],[202,352,1],[204,355,1],[206,357,1],[208,358,1],[208,359,1],[209,360,1],[210,360,1],[211,360,1],[211,362,1]]},{\"Name\":\"(\",\"Points\":[[212,57,1],[201,63,1],[197,68,1],[193,75,1],[190,81,1],[186,87,1],[183,93,1],[181,100,1],[177,107,1],[175,115,1],[172,123,1],[170,131,1],[169,139,1],[167,147,1],[166,155,1],[165,164,1],[165,172,1],[164,181,1],[163,190,1],[163,200,1],[162,209,1],[162,220,1],[162,230,1],[162,240,1],[162,250,1],[162,259,1],[163,267,1],[164,275,1],[166,283,1],[168,292,1],[171,298,1],[173,305,1],[176,313,1],[178,320,1],[181,324,1],[182,330,1],[185,335,1],[188,340,1],[191,343,1],[194,347,1],[197,350,1],[200,352,1],[203,355,1],[204,357,1],[207,358,1],[208,360,1],[210,361,1],[213,362,1],[214,363,1],[215,363,1],[216,364,1],[217,365,1],[218,366,1]]},{\"Name\":\"(\",\"Points\":[[182,68,1],[171,76,1],[166,84,1],[160,92,1],[154,100,1],[148,111,1],[142,120,1],[136,133,1],[129,144,1],[125,157,1],[119,169,1],[115,182,1],[111,196,1],[108,211,1],[106,224,1],[104,237,1],[102,250,1],[102,263,1],[102,274,1],[102,286,1],[103,297,1],[105,307,1],[108,318,1],[111,326,1],[115,334,1],[120,342,1],[125,347,1],[129,353,1],[132,358,1],[135,362,1],[137,364,1],[138,365,1],[139,366,1],[140,367,1],[141,367,1],[142,368,1]]},{\"Name\":\")\",\"Points\":[[190,58,1],[194,57,1],[198,58,1],[204,61,1],[209,64,1],[216,69,1],[223,75,1],[229,82,1],[236,90,1],[242,99,1],[249,111,1],[255,124,1],[260,138,1],[265,151,1],[269,165,1],[270,177,1],[272,191,1],[273,207,1],[273,221,1],[271,237,1],[269,252,1],[264,266,1],[258,278,1],[252,292,1],[246,304,1],[241,313,1],[236,321,1],[231,327,1],[229,332,1],[226,335,1],[224,338,1],[223,338,1],[222,338,1]]},{\"Name\":\")\",\"Points\":[[193,72,1],[201,74,1],[207,77,1],[216,82,1],[224,88,1],[231,94,1],[239,100,1],[246,109,1],[255,119,1],[261,129,1],[268,141,1],[273,153,1],[279,165,1],[283,177,1],[287,189,1],[288,203,1],[290,216,1],[291,230,1],[291,245,1],[291,258,1],[287,273,1],[283,287,1],[277,300,1],[270,313,1],[263,324,1],[256,333,1],[249,342,1],[243,347,1],[239,351,1],[236,352,1],[234,354,1],[233,354,1],[233,353,1],[234,352,1],[240,346,1]]},{\"Name\":\")\",\"Points\":[[185,73,1],[191,73,1],[198,76,1],[205,82,1],[213,91,1],[223,100,1],[229,110,1],[236,121,1],[242,133,1],[247,147,1],[250,161,1],[254,173,1],[255,187,1],[255,201,1],[255,215,1],[255,229,1],[251,245,1],[248,259,1],[245,273,1],[240,282,1],[236,294,1],[231,304,1],[228,314,1],[225,322,1],[223,328,1],[218,334,1],[217,339,1],[214,342,1],[213,343,1],[212,344,1],[212,345,1],[211,345,1],[211,346,1],[210,347,1],[209,347,1],[209,349,1],[208,350,1],[208,351,1]]},{\"Name\":\"|\",\"Points\":[[189,79,1],[185,84,1],[185,90,1],[185,97,1],[185,102,1],[185,110,1],[185,117,1],[185,126,1],[185,136,1],[185,145,1],[185,157,1],[185,167,1],[185,179,1],[185,191,1],[185,201,1],[185,212,1],[185,222,1],[185,232,1],[185,243,1],[185,252,1],[185,261,1],[185,270,1],[185,277,1],[185,285,1],[184,293,1],[184,299,1],[184,305,1],[184,310,1],[184,314,1],[184,318,1],[184,320,1],[184,321,1],[184,323,1]]},{\"Name\":\"|\",\"Points\":[[185,122,1],[185,128,1],[185,135,1],[185,143,1],[185,153,1],[185,163,1],[186,172,1],[188,183,1],[190,194,1],[190,203,1],[191,216,1],[192,229,1],[192,240,1],[192,251,1],[192,262,1],[192,273,1],[191,282,1],[191,289,1],[191,297,1],[190,302,1],[190,307,1],[190,312,1],[190,315,1],[190,316,1],[190,315,1]]},{\"Name\":\"|\",\"Points\":[[192,107,1],[190,111,1],[190,117,1],[191,125,1],[191,135,1],[192,146,1],[192,157,1],[192,170,1],[192,182,1],[192,194,1],[191,208,1],[190,221,1],[189,234,1],[188,248,1],[187,260,1],[185,273,1],[185,282,1],[184,292,1],[184,298,1],[184,304,1],[184,309,1],[184,312,1],[184,313,1],[184,314,1],[185,314,1],[188,313,1]]},{\"Name\":\"sqrt\",\"Points\":[[79,245,1],[88,246,1],[92,250,1],[97,254,1],[102,261,1],[106,269,1],[108,277,1],[109,285,1],[110,293,1],[111,300,1],[111,306,1],[112,311,1],[112,315,1],[113,318,1],[113,319,1],[113,315,1],[113,305,1],[113,292,1],[113,279,1],[113,265,1],[113,252,1],[113,236,1],[113,221,1],[113,203,1],[113,186,1],[112,173,1],[111,158,1],[111,145,1],[111,133,1],[111,122,1],[111,112,1],[111,104,1],[111,97,1],[111,92,1],[111,89,1],[111,87,1],[111,86,1],[111,85,1],[113,85,1],[115,85,1],[120,85,1],[125,85,1],[131,87,1],[139,88,1],[150,90,1],[163,91,1],[178,92,1],[193,92,1],[210,92,1],[226,92,1],[243,92,1],[260,92,1],[274,91,1],[289,91,1],[302,91,1],[312,91,1],[321,91,1],[328,91,1],[332,91,1],[335,91,1],[336,91,1],[337,91,1],[337,91,1],[337,91,1],[336,91,1],[336,93,1],[336,96,1],[336,97,1],[335,100,1],[335,105,1],[335,109,1],[334,112,1],[334,115,1],[334,118,1],[334,119,1],[334,120,1],[334,121,1]]},{\"Name\":\"sqrt\",\"Points\":[[75,234,1],[78,230,1],[85,230,1],[92,231,1],[100,235,1],[107,240,1],[113,248,1],[118,255,1],[122,264,1],[125,274,1],[127,282,1],[129,292,1],[130,299,1],[131,304,1],[132,310,1],[132,312,1],[132,313,1],[132,314,1],[132,311,1],[132,303,1],[132,292,1],[130,277,1],[129,259,1],[128,242,1],[125,226,1],[124,208,1],[122,191,1],[120,177,1],[119,162,1],[118,148,1],[117,137,1],[117,127,1],[116,119,1],[116,114,1],[116,108,1],[116,105,1],[116,103,1],[116,102,1],[117,101,1],[119,101,1],[123,101,1],[127,101,1],[134,101,1],[142,101,1],[151,101,1],[163,101,1],[176,101,1],[190,102,1],[204,103,1],[218,104,1],[233,104,1],[250,104,1],[267,105,1],[281,105,1],[299,105,1],[314,106,1],[329,106,1],[342,106,1],[352,106,1],[360,106,1],[366,106,1],[371,106,1],[376,106,1],[378,106,1],[380,106,1],[381,106,1],[382,105,1],[382,105,1],[383,105,1],[384,104,1],[385,104,1],[385,103,1]]},{\"Name\":\"sqrt\",\"Points\":[[65,227,1],[73,222,1],[81,222,1],[91,224,1],[101,230,1],[111,239,1],[117,250,1],[124,260,1],[128,271,1],[129,282,1],[130,292,1],[130,301,1],[130,309,1],[130,315,1],[129,318,1],[128,320,1],[127,320,1],[125,320,1],[125,313,1],[124,299,1],[124,280,1],[124,262,1],[125,243,1],[125,223,1],[127,203,1],[128,185,1],[129,167,1],[129,151,1],[129,137,1],[129,123,1],[129,114,1],[130,105,1],[130,100,1],[130,97,1],[130,94,1],[131,93,1],[132,92,1],[134,92,1],[136,92,1],[140,92,1],[148,92,1],[157,94,1],[169,95,1],[181,95,1],[197,97,1],[213,97,1],[228,97,1],[247,97,1],[264,97,1],[282,98,1],[296,98,1],[312,99,1],[326,99,1],[337,100,1],[348,100,1],[356,100,1],[362,100,1],[369,100,1],[374,100,1],[378,100,1],[381,100,1],[383,100,1],[385,100,1],[386,100,1],[387,100,1],[385,100,1]]},{\"Name\":\"=\",\"Points\":[[138,198,1],[146,198,1],[154,198,1],[163,198,1],[176,198,1],[186,198,1],[199,198,1],[211,198,1],[221,198,1],[230,198,1],[237,198,1],[245,198,1],[248,199,1],[250,203,1],[147,236,2],[149,235,2],[155,235,2],[162,235,2],[173,235,2],[183,235,2],[196,235,2],[205,235,2],[218,235,2],[226,235,2],[236,235,2],[246,235,2],[255,237,2],[262,238,2]]},{\"Name\":\"=\",\"Points\":[[135,193,1],[143,196,1],[152,197,1],[164,198,1],[177,199,1],[190,199,1],[204,199,1],[218,199,1],[229,198,1],[240,198,1],[250,197,1],[259,197,1],[266,198,1],[270,201,1],[134,242,2],[137,240,2],[144,240,2],[153,240,2],[163,240,2],[176,240,2],[187,240,2],[198,240,2],[208,240,2],[218,240,2],[226,240,2],[233,240,2],[240,241,2],[247,242,2]]},{\"Name\":\"=\",\"Points\":[[141,198,1],[148,198,1],[156,198,1],[166,198,1],[179,198,1],[194,199,1],[208,199,1],[225,199,1],[241,199,1],[256,199,1],[270,199,1],[283,199,1],[293,202,1],[301,203,1],[308,207,1],[310,210,1],[137,255,2],[145,253,2],[154,253,2],[167,253,2],[181,253,2],[197,253,2],[215,253,2],[231,253,2],[249,253,2],[267,253,2],[282,253,2],[297,253,2],[313,253,2]]},{\"Name\":\"x\",\"Points\":[[148,194,1],[151,201,1],[154,207,1],[159,214,1],[164,222,1],[171,230,1],[177,237,1],[183,245,1],[190,252,1],[196,259,1],[203,267,1],[208,275,1],[213,281,1],[218,289,1],[223,296,1],[226,300,1],[230,306,1],[232,310,1],[143,287,2],[143,281,2],[144,276,2],[149,272,2],[155,264,2],[161,255,2],[168,248,2],[177,236,2],[184,228,2],[192,219,2],[199,210,2],[206,203,2],[213,196,2],[219,190,2],[225,186,2],[230,184,2]]},{\"Name\":\"x\",\"Points\":[[153,199,1],[155,203,1],[159,208,1],[165,216,1],[171,224,1],[181,235,1],[189,244,1],[198,253,1],[205,262,1],[214,272,1],[223,278,1],[229,287,1],[236,294,1],[243,300,1],[248,305,1],[254,309,1],[260,312,1],[264,315,1],[269,317,1],[241,216,2],[231,219,2],[226,227,2],[221,236,2],[215,246,2],[208,255,2],[203,265,2],[196,274,2],[189,282,2],[182,292,2],[177,299,2],[172,305,2],[167,312,2],[165,317,2],[164,320,2],[164,321,2]]},{\"Name\":\"x\",\"Points\":[[158,199,1],[159,203,1],[164,208,1],[171,216,1],[181,227,1],[189,235,1],[198,245,1],[205,253,1],[214,263,1],[223,272,1],[230,279,1],[237,288,1],[244,296,1],[250,302,1],[255,307,1],[260,312,1],[262,315,1],[264,318,1],[265,320,1],[145,310,2],[143,297,2],[146,292,2],[153,282,2],[161,273,2],[171,261,2],[181,251,2],[192,240,2],[203,230,2],[213,221,2],[223,212,2],[230,208,2],[238,202,2],[245,198,2],[250,194,2],[255,193,2],[258,190,2]]},{\"Name\":\"y\",\"Points\":[[158,184,1],[157,189,1],[157,197,1],[158,208,1],[159,220,1],[161,231,1],[164,240,1],[167,249,1],[171,253,1],[176,256,1],[181,257,1],[190,257,1],[199,253,1],[207,246,1],[217,235,1],[226,225,1],[233,215,1],[241,207,1],[248,199,1],[253,194,1],[257,189,1],[260,187,1],[261,186,1],[262,186,1],[261,189,1],[257,196,1],[250,205,1],[244,216,1],[238,226,1],[230,238,1],[223,250,1],[215,263,1],[208,275,1],[201,288,1],[194,300,1],[189,310,1],[183,320,1],[179,328,1],[175,334,1],[171,340,1],[169,343,1],[168,347,1],[167,348,1],[167,349,1]]},{\"Name\":\"y\",\"Points\":[[171,188,1],[174,197,1],[176,205,1],[181,216,1],[184,227,1],[188,238,1],[193,250,1],[198,259,1],[204,268,1],[208,276,1],[213,282,1],[220,289,1],[226,294,1],[231,297,1],[279,206,2],[275,207,2],[274,211,2],[270,217,2],[267,226,2],[264,233,2],[259,244,2],[255,253,2],[249,263,2],[243,273,2],[237,284,2],[231,297,2],[226,305,2],[218,317,2],[213,325,2],[207,334,2],[202,343,2],[198,350,2],[194,357,2],[190,362,2],[188,365,2],[186,369,2],[185,371,2],[185,373,2],[185,374,2],[185,375,2]]},{\"Name\":\"y\",\"Points\":[[161,187,1],[161,191,1],[161,198,1],[164,204,1],[169,215,1],[173,225,1],[178,235,1],[182,245,1],[186,254,1],[191,264,1],[195,270,1],[201,276,1],[205,282,1],[210,287,1],[214,290,1],[219,292,1],[258,198,2],[251,194,2],[251,198,2],[250,205,2],[248,212,2],[247,222,2],[245,230,2],[241,241,2],[237,252,2],[233,264,2],[229,275,2],[225,285,2],[220,297,2],[215,305,2],[211,315,2],[207,324,2],[204,332,2],[199,340,2],[196,346,2],[194,352,2],[191,358,2],[190,363,2],[188,366,2],[187,369,2],[187,371,2],[187,373,2],[187,374,2],[187,375,2]]},{\"Name\":\")\",\"Points\":[[154,83,1],[159,81,1],[162,81,1],[166,83,1],[172,84,1],[177,87,1],[181,90,1],[187,93,1],[193,98,1],[198,102,1],[203,107,1],[208,113,1],[212,117,1],[216,125,1],[221,131,1],[223,138,1],[226,146,1],[227,155,1],[229,163,1],[230,173,1],[230,182,1],[230,192,1],[230,202,1],[230,211,1],[230,221,1],[230,228,1],[228,236,1],[226,243,1],[224,250,1],[221,256,1],[217,261,1],[213,266,1],[207,269,1],[203,274,1],[198,278,1],[191,283,1],[182,289,1],[176,292,1],[167,298,1],[160,301,1],[153,304,1],[146,308,1],[140,312,1],[135,313,1],[130,315,1],[126,316,1],[122,317,1],[118,318,1]]},{\"Name\":\")\",\"Points\":[[157,51,1],[162,53,1],[167,57,1],[172,62,1],[179,70,1],[183,79,1],[189,89,1],[196,101,1],[201,112,1],[205,123,1],[211,135,1],[214,147,1],[219,161,1],[221,177,1],[224,189,1],[225,205,1],[225,224,1],[225,241,1],[224,256,1],[221,271,1],[216,286,1],[211,296,1],[206,308,1],[203,314,1],[199,320,1],[197,324,1],[194,326,1],[193,328,1]]},{\"Name\":\")\",\"Points\":[[180,43,1],[183,47,1],[187,51,1],[191,59,1],[197,69,1],[201,79,1],[204,90,1],[207,101,1],[211,113,1],[213,125,1],[215,137,1],[216,151,1],[217,164,1],[218,180,1],[218,195,1],[218,212,1],[217,224,1],[215,238,1],[211,253,1],[208,265,1],[204,276,1],[200,287,1],[194,296,1],[189,307,1],[183,314,1],[179,322,1],[174,330,1],[169,336,1],[164,341,1],[159,347,1],[156,351,1],[151,356,1],[147,358,1],[144,360,1],[140,361,1]]},{\"Name\":\")\",\"Points\":[[160,345,1],[170,338,1],[175,336,1],[180,331,1],[185,326,1],[192,318,1],[197,313,1],[203,306,1],[208,298,1],[214,290,1],[219,281,1],[224,272,1],[228,263,1],[233,252,1],[237,243,1],[242,232,1],[245,221,1],[248,210,1],[249,200,1],[251,189,1],[253,180,1],[253,168,1],[253,158,1],[253,149,1],[253,139,1],[253,130,1],[253,120,1],[253,111,1],[253,102,1],[253,93,1],[251,88,1],[249,80,1],[248,73,1],[245,68,1],[243,63,1],[238,56,1],[235,52,1],[232,47,1],[228,44,1],[226,42,1],[224,38,1],[221,36,1],[219,34,1],[217,32,1],[216,31,1],[214,29,1],[213,28,1],[212,28,1]]},{\"Name\":\")\",\"Points\":[[194,364,1],[196,355,1],[196,349,1],[198,343,1],[200,338,1],[203,331,1],[206,322,1],[210,314,1],[213,303,1],[216,293,1],[219,285,1],[223,274,1],[226,264,1],[229,251,1],[231,240,1],[234,227,1],[236,215,1],[238,202,1],[239,192,1],[239,180,1],[239,168,1],[239,158,1],[239,146,1],[239,135,1],[239,124,1],[239,114,1],[238,103,1],[236,95,1],[234,88,1],[231,79,1],[229,73,1],[226,67,1],[224,62,1],[221,56,1],[218,51,1],[216,47,1],[212,44,1],[211,42,1],[208,38,1],[206,37,1],[204,34,1],[203,33,1],[202,33,1],[201,33,1]]},{\"Name\":\"/\",\"Points\":[[252,64,1],[249,67,1],[248,71,1],[247,79,1],[244,86,1],[241,94,1],[238,103,1],[234,113,1],[230,121,1],[226,131,1],[223,139,1],[219,149,1],[214,158,1],[208,168,1],[203,178,1],[198,186,1],[192,196,1],[186,206,1],[181,216,1],[174,228,1],[169,238,1],[162,247,1],[156,257,1],[150,266,1],[145,275,1],[140,283,1],[136,291,1],[132,297,1],[128,304,1],[125,310,1],[121,316,1],[118,320,1],[117,324,1],[115,328,1],[114,331,1],[114,334,1],[113,336,1],[112,337,1],[112,338,1],[111,339,1],[111,340,1],[110,340,1],[109,340,1]]},{\"Name\":\"/\",\"Points\":[[118,333,1],[121,324,1],[123,319,1],[127,313,1],[133,306,1],[137,297,1],[142,289,1],[148,280,1],[155,269,1],[160,257,1],[168,246,1],[176,233,1],[183,218,1],[193,205,1],[201,191,1],[210,178,1],[219,163,1],[228,150,1],[237,139,1],[246,127,1],[252,118,1],[258,110,1],[265,101,1],[269,94,1],[273,89,1],[276,83,1],[279,79,1],[281,75,1],[283,71,1],[284,69,1],[284,67,1],[284,66,1],[284,65,1]]},{\"Name\":\"+\",\"Points\":[[113,195,1],[123,196,1],[130,196,1],[138,196,1],[151,197,1],[162,198,1],[176,198,1],[190,198,1],[205,198,1],[222,198,1],[235,198,1],[250,197,1],[264,196,1],[277,194,1],[289,192,1],[297,191,1],[304,189,1],[211,143,2],[209,149,2],[209,154,2],[209,163,2],[209,176,2],[209,186,2],[209,201,2],[208,213,2],[206,226,2],[205,238,2],[204,247,2],[204,256,2],[203,261,2],[203,266,2],[203,267,2],[203,268,2],[204,268,2]]},{\"Name\":\"+\",\"Points\":[[119,223,1],[124,224,1],[130,224,1],[138,226,1],[150,228,1],[162,231,1],[176,233,1],[189,235,1],[204,236,1],[219,237,1],[233,237,1],[246,235,1],[258,234,1],[267,233,1],[274,232,1],[280,231,1],[208,178,2],[204,187,2],[204,197,2],[204,210,2],[204,224,2],[204,240,2],[204,255,2],[204,269,2],[204,279,2]]},{\"Name\":\"+\",\"Points\":[[132,231,1],[135,229,1],[141,229,1],[154,229,1],[166,230,1],[181,231,1],[198,232,1],[211,233,1],[227,233,1],[243,233,1],[257,233,1],[270,233,1],[281,231,1],[291,228,1],[217,180,2],[210,183,2],[208,191,2],[207,201,2],[206,215,2],[206,230,2],[206,246,2],[205,264,2],[204,277,2],[204,291,2]]},{\"Name\":\"4\",\"Points\":[[188,98,1],[183,101,1],[182,107,1],[178,116,1],[174,127,1],[167,140,1],[161,153,1],[156,166,1],[148,180,1],[142,194,1],[138,204,1],[137,211,1],[135,217,1],[135,221,1],[135,224,1],[140,225,1],[149,226,1],[159,226,1],[173,226,1],[186,226,1],[201,226,1],[216,225,1],[230,224,1],[247,224,1],[260,223,1],[273,222,1],[284,221,1],[294,220,1],[301,220,1],[307,220,1],[311,219,1],[229,173,2],[226,184,2],[226,197,2],[225,214,2],[223,233,2],[220,251,2],[216,269,2],[215,283,2],[214,294,2]]},{\"Name\":\"4\",\"Points\":[[200,121,1],[194,126,1],[192,135,1],[187,149,1],[182,161,1],[175,178,1],[167,191,1],[160,203,1],[156,214,1],[151,222,1],[149,227,1],[148,231,1],[148,234,1],[150,236,1],[156,237,1],[165,238,1],[178,238,1],[190,238,1],[205,238,1],[221,238,1],[237,238,1],[256,238,1],[271,237,1],[286,236,1],[299,235,1],[309,235,1],[317,235,1],[323,235,1],[327,235,1],[329,235,1],[327,235,1],[234,187,2],[230,191,2],[230,197,2],[230,205,2],[230,219,2],[230,233,2],[230,246,2],[229,260,2],[228,273,2],[227,284,2],[226,293,2],[225,303,2],[222,311,2]]},{\"Name\":\"4\",\"Points\":[[231,108,1],[221,107,1],[216,113,1],[208,125,1],[202,137,1],[191,154,1],[181,171,1],[169,186,1],[159,202,1],[150,213,1],[142,222,1],[139,228,1],[137,231,1],[137,233,1],[137,234,1],[144,234,1],[156,234,1],[169,232,1],[184,229,1],[202,227,1],[219,224,1],[234,224,1],[248,223,1],[263,223,1],[275,223,1],[285,223,1],[294,224,1],[300,224,1],[306,224,1],[311,224,1],[235,180,2],[230,189,2],[227,200,2],[225,212,2],[220,228,2],[216,243,2],[211,259,2],[206,274,2],[204,286,2]]},{\"Name\":\"a\",\"Points\":[[204,145,1],[193,135,1],[188,135,1],[182,137,1],[174,142,1],[166,148,1],[159,155,1],[154,162,1],[150,171,1],[147,179,1],[146,185,1],[146,191,1],[150,198,1],[156,201,1],[160,202,1],[169,202,1],[178,197,1],[185,189,1],[192,179,1],[198,168,1],[201,158,1],[202,150,1],[202,145,1],[202,142,1],[202,140,1],[202,145,1],[202,153,1],[201,162,1],[201,174,1],[201,184,1],[204,194,1],[208,202,1],[213,206,1],[222,209,1],[233,209,1]]},{\"Name\":\"a\",\"Points\":[[207,169,1],[198,159,1],[194,159,1],[188,162,1],[180,169,1],[170,179,1],[163,186,1],[157,196,1],[152,205,1],[150,212,1],[149,221,1],[149,228,1],[153,233,1],[159,237,1],[166,239,1],[176,239,1],[187,238,1],[198,229,1],[206,220,1],[213,210,1],[219,198,1],[222,187,1],[226,175,1],[226,167,1],[226,161,1],[226,158,1],[226,157,1],[226,158,1],[224,164,1],[221,174,1],[220,182,1],[219,194,1],[219,204,1],[219,214,1],[222,224,1],[226,229,1],[230,234,1],[235,237,1],[244,238,1],[257,235,1],[270,225,1],[286,214,1],[297,205,1]]},{\"Name\":\"a\",\"Points\":[[185,192,1],[181,180,1],[181,180,1],[180,179,1],[179,179,1],[174,180,1],[166,185,1],[158,192,1],[147,202,1],[139,212,1],[134,222,1],[129,233,1],[128,242,1],[128,250,1],[128,257,1],[134,261,1],[141,263,1],[151,263,1],[162,257,1],[172,246,1],[181,233,1],[188,219,1],[192,209,1],[195,197,1],[197,191,1],[198,186,1],[198,185,1],[196,192,1],[193,202,1],[191,210,1],[190,220,1],[190,230,1],[195,238,1],[202,244,1],[208,248,1],[218,252,1],[226,253,1],[239,253,1],[254,248,1]]},{\"Name\":\"c\",\"Points\":[[226,150,1],[216,145,1],[211,145,1],[202,149,1],[193,154,1],[183,158,1],[175,164,1],[167,172,1],[161,179,1],[158,183,1],[156,189,1],[156,196,1],[156,201,1],[159,205,1],[165,209,1],[174,211,1],[182,212,1],[191,213,1],[202,214,1],[211,214,1],[220,214,1],[228,214,1],[234,213,1]]},{\"Name\":\"c\",\"Points\":[[233,157,1],[220,149,1],[214,149,1],[204,154,1],[196,158,1],[185,163,1],[174,172,1],[167,178,1],[161,183,1],[158,188,1],[156,194,1],[156,200,1],[158,205,1],[163,209,1],[172,212,1],[181,213,1],[195,214,1],[207,214,1],[221,213,1],[232,211,1],[242,208,1]]},{\"Name\":\"c\",\"Points\":[[228,169,1],[216,156,1],[210,157,1],[204,158,1],[196,161,1],[186,167,1],[177,174,1],[169,180,1],[162,186,1],[158,193,1],[156,200,1],[155,204,1],[155,208,1],[157,213,1],[162,217,1],[172,220,1],[181,222,1],[193,223,1],[204,223,1],[215,221,1],[226,218,1],[236,214,1],[247,210,1]]},{\"Name\":\"c\",\"Points\":[[254,177,1],[248,167,1],[244,166,1],[239,166,1],[232,166,1],[223,168,1],[213,172,1],[202,178,1],[192,182,1],[183,189,1],[176,196,1],[171,205,1],[169,211,1],[168,217,1],[168,224,1],[172,229,1],[179,233,1],[189,237,1],[199,238,1],[212,238,1],[225,238,1],[236,238,1],[247,236,1],[255,235,1]]},{\"Name\":\"g\",\"Points\":[[203,146,1],[192,142,1],[187,143,1],[181,145,1],[175,153,1],[169,159,1],[165,168,1],[164,175,1],[163,181,1],[163,189,1],[167,195,1],[174,198,1],[180,199,1],[190,199,1],[200,196,1],[207,188,1],[215,180,1],[220,168,1],[222,160,1],[224,150,1],[224,143,1],[224,138,1],[224,135,1],[223,134,1],[222,134,1],[221,135,1],[221,139,1],[220,147,1],[220,157,1],[220,169,1],[220,181,1],[219,196,1],[218,209,1],[216,223,1],[212,235,1],[206,249,1],[200,261,1],[194,270,1],[187,277,1],[181,281,1],[176,282,1],[170,282,1],[164,274,1],[163,266,1],[164,255,1],[169,245,1],[178,232,1],[188,222,1],[201,211,1],[216,200,1],[234,188,1],[253,177,1],[271,167,1]]},{\"Name\":\"g\",\"Points\":[[189,149,1],[181,145,1],[173,145,1],[165,145,1],[159,147,1],[151,155,1],[145,167,1],[142,178,1],[141,190,1],[141,202,1],[141,211,1],[146,219,1],[152,224,1],[158,224,1],[167,224,1],[175,217,1],[184,204,1],[192,190,1],[197,176,1],[198,163,1],[199,155,1],[199,149,1],[199,145,1],[199,143,1],[199,147,1],[198,155,1],[196,167,1],[193,182,1],[189,200,1],[186,216,1],[182,235,1],[178,254,1],[173,273,1],[165,293,1],[158,308,1],[151,322,1],[145,331,1],[141,336,1],[137,336,1],[135,336,1],[133,334,1],[133,320,1],[137,301,1],[144,280,1],[155,262,1],[166,245,1],[180,230,1],[194,218,1],[211,205,1],[230,194,1]]},{\"Name\":\"g\",\"Points\":[[206,165,1],[188,163,1],[178,164,1],[165,172,1],[157,181,1],[150,196,1],[146,206,1],[146,217,1],[146,228,1],[151,233,1],[159,235,1],[169,235,1],[182,227,1],[196,211,1],[207,194,1],[216,180,1],[222,165,1],[226,157,1],[226,153,1],[226,151,1],[226,155,1],[226,164,1],[225,179,1],[223,196,1],[221,213,1],[219,231,1],[216,251,1],[212,270,1],[206,289,1],[201,304,1],[195,313,1],[190,321,1],[186,323,1],[181,325,1],[177,323,1],[174,316,1],[172,303,1],[172,289,1],[175,273,1],[181,261,1],[188,249,1],[198,240,1],[211,231,1],[227,221,1],[243,213,1],[259,205,1]]},{\"Name\":\"-\",\"Points\":[[151,182,1],[155,181,1],[159,181,1],[166,181,1],[174,182,1],[184,183,1],[194,184,1],[205,184,1],[214,183,1],[224,181,1],[234,179,1],[244,177,1]]},{\"Name\":\"-\",\"Points\":[[150,206,1],[156,207,1],[161,207,1],[168,208,1],[178,209,1],[187,209,1],[197,209,1],[207,208,1],[217,206,1],[225,204,1]]},{\"Name\":\"-\",\"Points\":[[150,203,1],[157,204,1],[163,204,1],[171,205,1],[181,205,1],[190,206,1],[202,206,1],[211,205,1],[221,205,1],[229,202,1]]},{\"Name\":\"7\",\"Points\":[[150,101,1],[167,99,1],[181,99,1],[194,100,1],[206,102,1],[220,104,1],[231,108,1],[240,112,1],[246,117,1],[249,126,1],[250,136,1],[250,153,1],[246,168,1],[241,183,1],[236,201,1],[232,216,1],[230,232,1],[228,246,1],[228,259,1],[228,270,1],[228,280,1],[229,289,1],[230,294,1],[231,299,1],[191,221,2],[198,219,2],[207,219,2],[222,219,2],[240,219,2],[257,218,2],[273,217,2]]},{\"Name\":\"7\",\"Points\":[[125,108,1],[138,108,1],[148,108,1],[161,108,1],[176,110,1],[188,113,1],[199,118,1],[207,126,1],[211,135,1],[213,148,1],[213,163,1],[209,182,1],[202,203,1],[195,224,1],[191,239,1],[190,256,1],[190,269,1],[190,281,1],[192,291,1],[196,299,1],[199,305,1],[203,309,1],[204,311,1],[160,245,2],[169,244,2],[179,244,2],[195,243,2],[212,240,2],[228,238,2]]},{\"Name\":\"7\",\"Points\":[[150,99,1],[159,98,1],[166,98,1],[176,98,1],[188,97,1],[201,95,1],[213,94,1],[223,93,1],[232,93,1],[241,93,1],[246,95,1],[249,99,1],[250,105,1],[250,113,1],[245,123,1],[236,135,1],[227,148,1],[219,162,1],[210,178,1],[202,192,1],[194,206,1],[189,222,1],[185,236,1],[181,248,1],[181,261,1],[180,271,1],[180,282,1],[180,291,1],[180,297,1],[180,303,1],[180,307,1],[180,309,1],[180,310,1],[179,310,1],[137,246,2],[143,240,2],[153,239,2],[163,238,2],[175,236,2],[185,234,2],[195,233,2],[205,233,2],[213,231,2],[219,230,2],[224,229,2],[226,228,2],[229,228,2],[230,228,2],[232,227,2]]},{\"Name\":\"2\",\"Points\":[[153,149,1],[150,139,1],[152,133,1],[158,125,1],[166,116,1],[178,108,1],[188,103,1],[198,101,1],[207,101,1],[216,104,1],[223,113,1],[226,129,1],[227,146,1],[227,167,1],[225,191,1],[218,214,1],[210,236,1],[203,256,1],[191,274,1],[182,288,1],[174,299,1],[168,305,1],[164,308,1],[161,308,1],[161,306,1],[164,300,1],[171,298,1],[181,297,1],[189,296,1],[198,296,1],[204,300,1],[211,304,1],[217,310,1],[223,313,1],[226,316,1],[232,318,1],[241,318,1],[255,314,1]]},{\"Name\":\"2\",\"Points\":[[162,115,1],[183,108,1],[195,105,1],[205,104,1],[216,104,1],[223,110,1],[225,120,1],[225,134,1],[223,154,1],[213,177,1],[203,199,1],[192,221,1],[181,243,1],[173,261,1],[167,275,1],[165,286,1],[165,294,1],[167,300,1],[178,303,1],[190,303,1],[206,303,1],[224,298,1],[240,293,1],[253,290,1],[264,288,1],[272,286,1],[278,284,1],[285,284,1],[292,282,1],[297,280,1]]},{\"Name\":\"2\",\"Points\":[[155,140,1],[158,131,1],[166,126,1],[177,121,1],[188,118,1],[198,118,1],[208,120,1],[215,126,1],[220,136,1],[223,149,1],[223,166,1],[219,181,1],[213,200,1],[204,219,1],[195,238,1],[187,252,1],[181,269,1],[176,284,1],[173,293,1],[173,301,1],[174,308,1],[181,311,1],[194,313,1],[208,313,1],[226,312,1],[239,310,1],[252,307,1],[263,306,1],[271,304,1],[277,304,1],[282,303,1],[286,303,1],[290,303,1]]},{\"Name\":\"2\",\"Points\":[[150,144,1],[164,129,1],[176,126,1],[187,125,1],[201,128,1],[210,136,1],[217,151,1],[219,168,1],[219,187,1],[213,210,1],[203,230,1],[186,251,1],[167,269,1],[148,284,1],[135,292,1],[126,295,1],[121,295,1],[125,288,1],[137,280,1],[149,274,1],[160,272,1],[173,272,1],[183,277,1],[191,285,1],[199,296,1],[205,305,1],[213,315,1],[221,322,1],[229,330,1],[241,334,1],[253,335,1],[269,334,1],[289,325,1],[310,313,1]]},{\"Name\":\"0\",\"Points\":[[131,77,1],[120,80,1],[118,82,1],[115,85,1],[112,88,1],[109,90,1],[106,93,1],[103,97,1],[101,99,1],[98,101,1],[96,104,1],[94,106,1],[92,110,1],[92,112,1],[90,115,1],[89,116,1],[88,117,1],[88,118,1],[88,119,1],[88,119,1],[87,119,1],[87,119,1],[87,118,1],[86,117,1],[85,117,1],[85,118,1],[85,119,1],[84,119,1],[83,119,1],[83,122,1],[83,124,1],[82,126,1],[81,129,1],[80,132,1],[79,134,1],[78,137,1],[78,139,1],[77,142,1],[76,145,1],[75,149,1],[75,152,1],[73,157,1],[73,162,1],[73,164,1],[73,168,1],[73,172,1],[74,176,1],[75,180,1],[78,185,1],[80,188,1],[83,190,1],[86,194,1],[90,198,1],[93,201,1],[98,205,1],[104,208,1],[111,211,1],[118,213,1],[126,216,1],[134,217,1],[140,217,1],[147,217,1],[153,217,1],[159,215,1],[164,212,1],[168,208,1],[172,205,1],[176,202,1],[179,198,1],[181,194,1],[182,189,1],[184,185,1],[185,180,1],[185,174,1],[185,167,1],[185,162,1],[185,155,1],[185,150,1],[185,142,1],[185,138,1],[184,131,1],[182,126,1],[181,120,1],[180,116,1],[177,111,1],[175,106,1],[172,103,1],[169,99,1],[166,97,1],[163,93,1],[160,90,1],[158,87,1],[154,86,1],[150,84,1],[147,82,1],[143,81,1],[139,79,1],[137,78,1],[134,77,1],[131,77,1],[129,77,1],[126,77,1],[125,77,1],[123,77,1],[122,77,1],[120,77,1]]},{\"Name\":\"1\",\"Points\":[[62,200,1],[68,196,1],[72,191,1],[79,184,1],[90,171,1],[99,159,1],[108,146,1],[115,135,1],[124,123,1],[132,111,1],[138,100,1],[144,92,1],[150,84,1],[153,77,1],[155,75,1],[157,73,1],[158,72,1],[158,71,1],[158,73,1],[158,79,1],[158,86,1],[158,96,1],[157,106,1],[155,119,1],[155,133,1],[154,148,1],[153,168,1],[151,186,1],[149,206,1],[147,227,1],[145,245,1],[144,258,1],[143,268,1],[142,275,1],[142,279,1],[142,282,1],[142,285,1]]},{\"Name\":\"2\",\"Points\":[[99,110,1],[102,97,1],[107,96,1],[117,93,1],[133,89,1],[148,86,1],[159,84,1],[171,84,1],[179,84,1],[185,87,1],[190,92,1],[193,97,1],[194,103,1],[195,112,1],[195,119,1],[192,133,1],[186,142,1],[181,156,1],[171,167,1],[161,178,1],[152,189,1],[140,200,1],[129,211,1],[120,220,1],[112,227,1],[106,231,1],[101,235,1],[98,239,1],[96,240,1],[96,241,1],[96,242,1],[96,243,1],[101,244,1],[109,245,1],[118,245,1],[132,246,1],[147,246,1],[165,246,1],[180,246,1],[194,246,1],[204,245,1],[213,245,1],[218,245,1],[223,245,1],[224,244,1],[225,244,1],[223,245,1]]},{\"Name\":\"3\",\"Points\":[[95,115,1],[97,108,1],[102,106,1],[115,105,1],[131,104,1],[148,103,1],[162,103,1],[176,103,1],[183,105,1],[188,110,1],[190,114,1],[190,119,1],[189,126,1],[184,133,1],[177,140,1],[171,144,1],[165,149,1],[161,153,1],[158,157,1],[157,160,1],[157,162,1],[157,166,1],[161,170,1],[171,176,1],[181,184,1],[189,190,1],[194,195,1],[199,203,1],[201,208,1],[203,213,1],[203,221,1],[201,227,1],[194,235,1],[183,243,1],[171,250,1],[159,255,1],[146,261,1],[134,264,1],[121,267,1],[110,267,1],[100,267,1],[90,266,1],[83,263,1],[78,259,1],[76,257,1],[74,255,1],[74,254,1],[77,254,1]]},{\"Name\":\"4\",\"Points\":[[129,81,1],[129,86,1],[129,91,1],[129,97,1],[129,110,1],[126,120,1],[123,133,1],[119,144,1],[115,155,1],[115,165,1],[112,174,1],[111,184,1],[111,190,1],[111,197,1],[111,201,1],[111,205,1],[113,208,1],[115,209,1],[120,210,1],[128,211,1],[138,213,1],[150,214,1],[164,215,1],[179,216,1],[194,216,1],[264,216,1],[270,216,1],[278,216,1],[277,216,1],[181,155,2],[181,162,2],[181,167,2],[181,175,2],[181,186,2],[181,197,2],[181,209,2],[181,220,2],[181,231,2],[181,243,2],[181,254,2],[181,264,2],[180,273,2],[179,282,2],[178,288,2],[177,293,2],[176,297,2],[176,298,2],[176,299,2],[176,300,2],[176,303,2]]},{\"Name\":\"5\",\"Points\":[[123,95,1],[122,103,1],[122,113,1],[120,120,1],[117,133,1],[114,143,1],[111,152,1],[108,160,1],[106,165,1],[106,168,1],[105,170,1],[105,171,1],[108,170,1],[115,168,1],[123,167,1],[134,166,1],[147,166,1],[163,166,1],[179,170,1],[190,175,1],[199,180,1],[206,185,1],[211,190,1],[215,197,1],[218,205,1],[218,213,1],[218,222,1],[218,230,1],[212,238,1],[204,245,1],[194,253,1],[181,259,1],[168,265,1],[153,268,1],[137,271,1],[124,272,1],[110,272,1],[96,271,1],[86,268,1],[78,265,1],[73,263,1],[70,260,1],[68,258,1],[68,256,1],[68,255,1],[68,254,1],[73,254,1],[102,106,2],[110,108,2],[117,108,2],[129,109,2],[143,110,2],[159,110,2],[175,110,2],[190,110,2],[203,110,2],[211,110,2],[219,110,2],[224,110,2],[227,110,2],[229,110,2],[230,110,2],[228,110,2]]},{\"Name\":\"6\",\"Points\":[[208,87,1],[202,85,1],[197,86,1],[190,91,1],[181,97,1],[171,109,1],[161,122,1],[153,137,1],[140,153,1],[133,167,1],[125,185,1],[121,201,1],[120,217,1],[120,230,1],[120,246,1],[126,258,1],[134,270,1],[147,278,1],[160,284,1],[176,287,1],[191,287,1],[204,282,1],[215,274,1],[223,267,1],[227,256,1],[230,246,1],[231,237,1],[231,227,1],[227,218,1],[218,208,1],[207,201,1],[194,194,1],[183,189,1],[170,186,1],[156,185,1],[139,185,1],[125,189,1],[115,197,1],[104,209,1],[99,226,1]]},{\"Name\":\"7\",\"Points\":[[114,97,1],[120,97,1],[129,97,1],[140,97,1],[158,98,1],[177,99,1],[199,100,1],[217,100,1],[232,100,1],[245,100,1],[254,99,1],[260,98,1],[265,98,1],[267,98,1],[268,98,1],[266,100,1],[260,107,1],[254,115,1],[246,123,1],[235,135,1],[226,146,1],[214,159,1],[204,172,1],[190,189,1],[180,207,1],[171,221,1],[162,235,1],[156,250,1],[149,263,1],[145,272,1],[141,279,1],[138,287,1],[137,291,1],[136,293,1],[136,295,1],[136,296,1],[158,198,2],[162,193,2],[175,193,2],[187,193,2],[199,193,2],[208,193,2],[214,192,2],[219,191,2],[223,190,2],[224,190,2],[225,190,2]]},{\"Name\":\"8\",\"Points\":[[187,92,1],[176,87,1],[166,91,1],[154,97,1],[143,107,1],[137,115,1],[134,120,1],[131,129,1],[131,138,1],[134,147,1],[149,164,1],[169,179,1],[190,192,1],[204,201,1],[218,209,1],[230,217,1],[240,227,1],[248,238,1],[251,249,1],[254,260,1],[254,273,1],[246,285,1],[234,294,1],[219,300,1],[203,303,1],[184,303,1],[166,302,1],[149,297,1],[135,289,1],[125,279,1],[117,268,1],[115,258,1],[115,245,1],[120,230,1],[129,215,1],[142,200,1],[158,187,1],[173,175,1],[187,164,1],[199,154,1],[209,143,1],[215,134,1],[219,126,1],[220,119,1],[220,111,1],[215,105,1],[207,100,1],[199,97,1],[191,95,1],[184,94,1],[171,97,1]]},{\"Name\":\"9\",\"Points\":[[215,96,1],[201,91,1],[194,91,1],[186,96,1],[178,101,1],[168,112,1],[161,122,1],[158,131,1],[156,139,1],[156,147,1],[159,154,1],[172,159,1],[190,160,1],[207,157,1],[226,144,1],[237,130,1],[244,119,1],[247,112,1],[248,105,1],[248,100,1],[248,98,1],[247,97,1],[242,97,1],[237,103,1],[233,111,1],[231,119,1],[229,129,1],[229,141,1],[229,157,1],[231,171,1],[234,186,1],[236,199,1],[239,216,1],[240,229,1],[240,241,1],[236,254,1],[231,264,1],[223,274,1],[213,281,1],[204,287,1],[188,292,1],[176,293,1],[160,293,1],[144,289,1],[133,281,1],[123,273,1],[116,265,1],[113,259,1],[111,255,1],[111,253,1]]},{\"Name\":\",\",\"Points\":[[205,275,1],[202,280,1],[197,287,1],[189,297,1],[179,307,1],[168,316,1],[158,324,1],[148,332,1],[140,338,1],[135,343,1],[131,346,1],[129,350,1]]},{\"Name\":\"a\",\"Points\":[[163,167,1],[153,162,1],[148,162,1],[142,164,1],[137,168,1],[134,172,1],[129,179,1],[126,185,1],[124,190,1],[121,195,1],[120,202,1],[120,208,1],[120,212,1],[120,216,1],[120,219,1],[125,222,1],[130,223,1],[137,223,1],[145,223,1],[152,222,1],[159,218,1],[166,211,1],[171,203,1],[177,194,1],[181,187,1],[183,180,1],[185,175,1],[185,171,1],[185,169,1],[185,168,1],[185,167,1],[182,167,1],[181,169,1],[179,171,1],[177,176,1],[176,182,1],[175,188,1],[175,195,1],[175,204,1],[175,212,1],[176,217,1],[178,222,1],[181,226,1],[182,228,1],[185,229,1],[190,229,1],[195,229,1],[202,227,1],[210,222,1],[218,214,1],[224,207,1],[228,202,1],[230,198,1],[231,197,1],[232,196,1]]},{\"Name\":\"b\",\"Points\":[[121,67,1],[120,76,1],[120,85,1],[119,97,1],[117,113,1],[115,128,1],[113,141,1],[111,155,1],[109,166,1],[109,176,1],[108,186,1],[108,194,1],[108,199,1],[108,203,1],[108,204,1],[109,202,1],[111,197,1],[115,189,1],[122,179,1],[132,170,1],[140,164,1],[151,161,1],[159,160,1],[168,159,1],[176,159,1],[185,163,1],[190,166,1],[196,172,1],[201,179,1],[204,185,1],[204,190,1],[204,197,1],[204,204,1],[200,212,1],[194,217,1],[184,222,1],[173,227,1],[160,229,1],[149,229,1],[138,229,1],[129,228,1],[119,225,1],[113,221,1],[109,217,1],[106,214,1],[105,210,1],[105,208,1],[105,208,1]]},{\"Name\":\"c\",\"Points\":[[210,172,1],[194,168,1],[188,168,1],[180,170,1],[166,177,1],[155,186,1],[143,196,1],[134,206,1],[128,214,1],[123,223,1],[120,230,1],[120,235,1],[120,243,1],[124,250,1],[136,256,1],[150,263,1],[166,267,1],[180,268,1],[194,268,1],[208,267,1],[219,264,1],[226,259,1],[231,254,1],[234,252,1],[236,250,1],[236,249,1]]},{\"Name\":\"d\",\"Points\":[[215,179,1],[201,179,1],[193,181,1],[183,186,1],[176,192,1],[168,199,1],[164,208,1],[161,214,1],[159,223,1],[159,230,1],[159,237,1],[159,243,1],[161,248,1],[167,250,1],[176,250,1],[185,246,1],[195,235,1],[204,225,1],[212,210,1],[218,196,1],[224,180,1],[227,164,1],[231,150,1],[232,140,1],[234,130,1],[235,124,1],[235,120,1],[235,119,1],[234,123,1],[233,131,1],[232,142,1],[231,155,1],[231,168,1],[231,183,1],[231,196,1],[230,209,1],[230,220,1],[230,229,1],[229,234,1],[229,240,1],[228,242,1],[228,243,1],[228,242,1],[228,241,1],[228,240,1]]},{\"Name\":\"e\",\"Points\":[[156,194,1],[160,194,1],[167,194,1],[180,194,1],[197,194,1],[213,190,1],[224,186,1],[232,181,1],[238,176,1],[241,172,1],[241,169,1],[241,164,1],[232,159,1],[217,156,1],[204,154,1],[186,154,1],[173,157,1],[161,164,1],[153,168,1],[144,175,1],[137,184,1],[133,194,1],[131,204,1],[129,214,1],[129,223,1],[130,231,1],[136,240,1],[144,250,1],[158,257,1],[171,263,1],[186,267,1],[200,268,1],[212,268,1],[219,267,1],[225,262,1],[227,259,1],[228,255,1],[229,254,1],[229,253,1]]},{\"Name\":\"f\",\"Points\":[[275,109,1],[267,97,1],[258,97,1],[241,97,1],[225,100,1],[212,109,1],[204,116,1],[198,124,1],[193,133,1],[189,141,1],[185,151,1],[182,166,1],[181,183,1],[181,196,1],[181,211,1],[181,225,1],[181,237,1],[181,250,1],[181,263,1],[181,272,1],[181,282,1],[181,289,1],[181,295,1],[181,298,1],[181,300,1],[181,301,1],[140,179,2],[143,178,2],[156,178,2],[176,178,2],[194,178,2],[207,178,2],[217,177,2],[223,176,2],[225,175,2],[226,175,2],[226,175,2],[226,176,2]]},{\"Name\":\"g\",\"Points\":[[197,122,1],[185,126,1],[178,130,1],[171,139,1],[162,149,1],[157,161,1],[152,170,1],[149,180,1],[149,186,1],[149,191,1],[149,194,1],[153,196,1],[161,196,1],[175,193,1],[186,185,1],[197,173,1],[206,162,1],[212,152,1],[215,144,1],[217,140,1],[218,137,1],[218,135,1],[217,135,1],[213,138,1],[210,145,1],[206,157,1],[205,170,1],[205,185,1],[205,202,1],[207,219,1],[210,237,1],[213,255,1],[213,270,1],[213,284,1],[213,296,1],[209,304,1],[205,310,1],[199,314,1],[191,315,1],[181,315,1],[169,315,1],[158,308,1],[148,301,1],[140,293,1],[134,283,1],[131,274,1],[130,264,1],[130,255,1],[130,250,1],[131,247,1],[134,246,1]]},{\"Name\":\"l\",\"Points\":[[171,64,1],[168,70,1],[168,75,1],[166,86,1],[164,98,1],[161,115,1],[159,130,1],[158,142,1],[154,160,1],[153,172,1],[151,189,1],[151,204,1],[150,220,1],[149,235,1],[148,247,1],[148,256,1],[148,263,1],[148,268,1],[148,270,1],[148,271,1],[148,270,1]]},{\"Name\":\"i\",\"Points\":[[177,176,1],[178,187,1],[178,195,1],[176,208,1],[175,221,1],[172,233,1],[171,242,1],[171,252,1],[171,258,1],[171,262,1],[171,265,1],[176,123,2]]},{\"Name\":\"n\",\"Points\":[[108,160,1],[106,170,1],[106,181,1],[104,193,1],[101,210,1],[97,225,1],[96,237,1],[93,250,1],[92,258,1],[92,264,1],[92,268,1],[92,269,1],[92,265,1],[94,255,1],[97,245,1],[103,231,1],[110,220,1],[117,207,1],[126,196,1],[134,188,1],[142,182,1],[150,179,1],[159,177,1],[166,177,1],[174,180,1],[181,186,1],[186,194,1],[190,204,1],[194,215,1],[196,227,1],[197,237,1],[197,247,1],[197,256,1],[197,264,1],[195,268,1],[194,271,1],[193,273,1],[193,272,1],[193,271,1]]},{\"Name\":\"o\",\"Points\":[[173,168,1],[159,170,1],[154,175,1],[146,186,1],[142,196,1],[138,208,1],[137,217,1],[137,227,1],[137,234,1],[142,242,1],[151,248,1],[163,253,1],[176,254,1],[194,254,1],[207,253,1],[217,249,1],[226,239,1],[231,230,1],[236,221,1],[238,211,1],[238,203,1],[236,194,1],[231,186,1],[223,180,1],[211,176,1],[199,174,1],[184,173,1],[171,173,1],[160,174,1],[152,179,1],[144,186,1],[142,194,1]]},{\"Name\":\"s\",\"Points\":[[243,161,1],[233,153,1],[226,153,1],[218,153,1],[206,155,1],[197,159,1],[190,162,1],[184,165,1],[181,168,1],[180,174,1],[180,181,1],[184,189,1],[195,198,1],[209,208,1],[225,215,1],[237,222,1],[246,228,1],[252,233,1],[256,237,1],[257,241,1],[257,245,1],[255,249,1],[246,252,1],[234,253,1],[221,254,1],[207,254,1],[190,253,1],[179,253,1],[167,250,1],[160,246,1],[156,244,1],[153,242,1],[152,240,1]]},{\"Name\":\"t\",\"Points\":[[190,87,1],[188,100,1],[188,113,1],[187,131,1],[185,149,1],[184,168,1],[181,187,1],[181,206,1],[181,226,1],[181,244,1],[181,259,1],[181,274,1],[181,283,1],[181,291,1],[181,296,1],[181,297,1],[181,297,1],[153,161,2],[164,155,2],[181,155,2],[198,155,2],[209,154,2],[220,152,2],[226,152,2],[231,151,2],[234,150,2],[235,150,2],[233,153,2]]},{\"Name\":\"+\",\"Points\":[[115,196,1],[122,195,1],[136,195,1],[157,196,1],[176,197,1],[194,198,1],[208,198,1],[222,198,1],[230,198,1],[236,198,1],[239,198,1],[240,198,1],[163,154,2],[163,159,2],[163,166,2],[163,179,2],[164,192,2],[164,206,2],[164,216,2],[164,226,2],[164,233,2],[164,239,2],[164,242,2],[164,245,2],[164,247,2]]},{\"Name\":\"-\",\"Points\":[[125,206,1],[125,202,1],[134,202,1],[153,203,1],[174,205,1],[192,206,1],[205,206,1],[217,206,1],[226,206,1],[231,206,1],[235,206,1],[237,207,1],[238,207,1],[238,208,1]]},{\"Name\":\"/\",\"Points\":[[263,95,1],[255,104,1],[247,115,1],[235,132,1],[223,148,1],[208,166,1],[193,186,1],[178,204,1],[164,221,1],[155,231,1],[148,241,1],[145,246,1],[143,249,1],[143,250,1],[144,250,1],[146,250,1]]},{\"Name\":\"(\",\"Points\":[[206,72,1],[199,75,1],[192,79,1],[182,88,1],[175,98,1],[168,111,1],[162,124,1],[159,139,1],[157,153,1],[156,166,1],[156,183,1],[158,197,1],[161,211,1],[168,223,1],[176,235,1],[182,246,1],[190,254,1],[196,263,1],[200,268,1],[204,272,1],[204,273,1],[205,274,1],[206,274,1]]},{\"Name\":\")\",\"Points\":[[185,82,1],[196,85,1],[203,91,1],[211,99,1],[219,111,1],[226,122,1],[232,136,1],[237,149,1],[241,164,1],[244,176,1],[246,191,1],[246,209,1],[246,226,1],[246,241,1],[241,255,1],[238,267,1],[234,277,1],[229,285,1],[226,291,1],[223,295,1],[221,297,1],[218,298,1],[218,297,1]]},{\"Name\":\"|\",\"Points\":[[153,59,1],[153,68,1],[153,77,1],[153,90,1],[152,107,1],[149,122,1],[147,140,1],[144,157,1],[142,176,1],[140,195,1],[138,215,1],[137,231,1],[136,248,1],[134,259,1],[134,269,1],[133,275,1],[132,279,1],[131,282,1],[131,283,1],[131,282,1]]},{\"Name\":\"sqrt\",\"Points\":[[59,198,1],[74,198,1],[90,198,1],[103,198,1],[115,197,1],[123,195,1],[129,194,1],[133,194,1],[135,193,1],[136,192,1],[136,194,1],[134,197,1],[132,201,1],[130,208,1],[129,216,1],[128,226,1],[127,237,1],[127,250,1],[126,262,1],[126,275,1],[126,288,1],[126,298,1],[126,310,1],[126,317,1],[126,321,1],[126,325,1],[126,328,1],[126,327,1],[127,324,1],[129,317,1],[133,307,1],[136,297,1],[138,287,1],[143,275,1],[147,263,1],[151,249,1],[155,234,1],[159,221,1],[161,206,1],[166,194,1],[169,177,1],[172,162,1],[176,145,1],[177,129,1],[179,117,1],[181,105,1],[181,97,1],[181,91,1],[182,86,1],[183,83,1],[183,82,1],[184,81,1],[185,81,1],[185,82,1],[185,83,1],[189,87,1],[193,90,1],[200,93,1],[207,97,1],[218,99,1],[228,102,1],[241,104,1],[254,106,1],[267,108,1],[276,109,1],[288,110,1],[296,110,1],[304,110,1],[311,110,1],[315,110,1],[320,110,1],[325,110,1],[328,109,1],[331,108,1],[334,107,1],[336,105,1],[338,105,1],[340,104,1],[343,103,1],[345,102,1],[347,101,1],[348,100,1],[349,100,1],[350,99,1],[351,98,1],[352,98,1],[352,99,1],[352,100,1],[352,103,1],[352,108,1],[352,113,1],[351,119,1],[349,125,1],[348,133,1],[347,138,1],[346,141,1],[346,143,1],[346,144,1],[346,145,1],[345,147,1]]},{\"Name\":\"x\",\"Points\":[[130,155,1],[143,177,1],[150,190,1],[158,206,1],[169,223,1],[180,239,1],[188,253,1],[196,264,1],[203,273,1],[208,282,1],[211,288,1],[213,292,1],[214,296,1],[215,297,1],[213,297,1],[105,300,2],[108,291,2],[117,281,2],[132,268,2],[149,253,2],[166,236,2],[184,219,2],[200,203,2],[214,186,2],[226,176,2],[234,170,2],[241,165,2],[244,163,2],[245,162,2]]},{\"Name\":\"y\",\"Points\":[[113,154,1],[119,161,1],[126,167,1],[137,177,1],[150,187,1],[162,198,1],[176,209,1],[188,220,1],[198,229,1],[204,235,1],[208,240,1],[211,244,1],[213,245,1],[213,247,1],[214,245,1],[275,164,2],[270,170,2],[263,182,2],[251,195,2],[236,213,2],[219,230,2],[200,245,2],[181,262,2],[161,278,2],[146,295,2],[135,305,2],[129,313,2],[125,319,2],[122,320,2],[121,323,2],[121,324,2],[122,324,2],[123,324,2],[124,324,2]]},{\"Name\":\")\",\"Points\":[[154,83,1],[159,81,1],[162,81,1],[166,83,1],[172,84,1],[177,87,1],[181,90,1],[187,93,1],[193,98,1],[198,102,1],[203,107,1],[208,113,1],[212,117,1],[216,125,1],[221,131,1],[223,138,1],[226,146,1],[227,155,1],[229,163,1],[230,173,1],[230,182,1],[230,192,1],[230,202,1],[230,211,1],[230,221,1],[230,228,1],[228,236,1],[226,243,1],[224,250,1],[221,256,1],[217,261,1],[213,266,1],[207,269,1],[203,274,1],[198,278,1],[191,283,1],[182,289,1],[176,292,1],[167,298,1],[160,301,1],[153,304,1],[146,308,1],[140,312,1],[135,313,1],[130,315,1],[126,316,1],[122,317,1],[118,318,1]]},{\"Name\":\")\",\"Points\":[[157,51,1],[162,53,1],[167,57,1],[172,62,1],[179,70,1],[183,79,1],[189,89,1],[196,101,1],[201,112,1],[205,123,1],[211,135,1],[214,147,1],[219,161,1],[221,177,1],[224,189,1],[225,205,1],[225,224,1],[225,241,1],[224,256,1],[221,271,1],[216,286,1],[211,296,1],[206,308,1],[203,314,1],[199,320,1],[197,324,1],[194,326,1],[193,328,1]]},{\"Name\":\")\",\"Points\":[[180,43,1],[183,47,1],[187,51,1],[191,59,1],[197,69,1],[201,79,1],[204,90,1],[207,101,1],[211,113,1],[213,125,1],[215,137,1],[216,151,1],[217,164,1],[218,180,1],[218,195,1],[218,212,1],[217,224,1],[215,238,1],[211,253,1],[208,265,1],[204,276,1],[200,287,1],[194,296,1],[189,307,1],[183,314,1],[179,322,1],[174,330,1],[169,336,1],[164,341,1],[159,347,1],[156,351,1],[151,356,1],[147,358,1],[144,360,1],[140,361,1]]},{\"Name\":\")\",\"Points\":[[160,345,1],[170,338,1],[175,336,1],[180,331,1],[185,326,1],[192,318,1],[197,313,1],[203,306,1],[208,298,1],[214,290,1],[219,281,1],[224,272,1],[228,263,1],[233,252,1],[237,243,1],[242,232,1],[245,221,1],[248,210,1],[249,200,1],[251,189,1],[253,180,1],[253,168,1],[253,158,1],[253,149,1],[253,139,1],[253,130,1],[253,120,1],[253,111,1],[253,102,1],[253,93,1],[251,88,1],[249,80,1],[248,73,1],[245,68,1],[243,63,1],[238,56,1],[235,52,1],[232,47,1],[228,44,1],[226,42,1],[224,38,1],[221,36,1],[219,34,1],[217,32,1],[216,31,1],[214,29,1],[213,28,1],[212,28,1]]},{\"Name\":\")\",\"Points\":[[194,364,1],[196,355,1],[196,349,1],[198,343,1],[200,338,1],[203,331,1],[206,322,1],[210,314,1],[213,303,1],[216,293,1],[219,285,1],[223,274,1],[226,264,1],[229,251,1],[231,240,1],[234,227,1],[236,215,1],[238,202,1],[239,192,1],[239,180,1],[239,168,1],[239,158,1],[239,146,1],[239,135,1],[239,124,1],[239,114,1],[238,103,1],[236,95,1],[234,88,1],[231,79,1],[229,73,1],[226,67,1],[224,62,1],[221,56,1],[218,51,1],[216,47,1],[212,44,1],[211,42,1],[208,38,1],[206,37,1],[204,34,1],[203,33,1],[202,33,1],[201,33,1]]},{\"Name\":\"/\",\"Points\":[[252,64,1],[249,67,1],[248,71,1],[247,79,1],[244,86,1],[241,94,1],[238,103,1],[234,113,1],[230,121,1],[226,131,1],[223,139,1],[219,149,1],[214,158,1],[208,168,1],[203,178,1],[198,186,1],[192,196,1],[186,206,1],[181,216,1],[174,228,1],[169,238,1],[162,247,1],[156,257,1],[150,266,1],[145,275,1],[140,283,1],[136,291,1],[132,297,1],[128,304,1],[125,310,1],[121,316,1],[118,320,1],[117,324,1],[115,328,1],[114,331,1],[114,334,1],[113,336,1],[112,337,1],[112,338,1],[111,339,1],[111,340,1],[110,340,1],[109,340,1]]},{\"Name\":\"/\",\"Points\":[[118,333,1],[121,324,1],[123,319,1],[127,313,1],[133,306,1],[137,297,1],[142,289,1],[148,280,1],[155,269,1],[160,257,1],[168,246,1],[176,233,1],[183,218,1],[193,205,1],[201,191,1],[210,178,1],[219,163,1],[228,150,1],[237,139,1],[246,127,1],[252,118,1],[258,110,1],[265,101,1],[269,94,1],[273,89,1],[276,83,1],[279,79,1],[281,75,1],[283,71,1],[284,69,1],[284,67,1],[284,66,1],[284,65,1]]},{\"Name\":\"+\",\"Points\":[[113,195,1],[123,196,1],[130,196,1],[138,196,1],[151,197,1],[162,198,1],[176,198,1],[190,198,1],[205,198,1],[222,198,1],[235,198,1],[250,197,1],[264,196,1],[277,194,1],[289,192,1],[297,191,1],[304,189,1],[211,143,2],[209,149,2],[209,154,2],[209,163,2],[209,176,2],[209,186,2],[209,201,2],[208,213,2],[206,226,2],[205,238,2],[204,247,2],[204,256,2],[203,261,2],[203,266,2],[203,267,2],[203,268,2],[204,268,2]]},{\"Name\":\"+\",\"Points\":[[119,223,1],[124,224,1],[130,224,1],[138,226,1],[150,228,1],[162,231,1],[176,233,1],[189,235,1],[204,236,1],[219,237,1],[233,237,1],[246,235,1],[258,234,1],[267,233,1],[274,232,1],[280,231,1],[208,178,2],[204,187,2],[204,197,2],[204,210,2],[204,224,2],[204,240,2],[204,255,2],[204,269,2],[204,279,2]]},{\"Name\":\"+\",\"Points\":[[132,231,1],[135,229,1],[141,229,1],[154,229,1],[166,230,1],[181,231,1],[198,232,1],[211,233,1],[227,233,1],[243,233,1],[257,233,1],[270,233,1],[281,231,1],[291,228,1],[217,180,2],[210,183,2],[208,191,2],[207,201,2],[206,215,2],[206,230,2],[206,246,2],[205,264,2],[204,277,2],[204,291,2]]},{\"Name\":\"4\",\"Points\":[[188,98,1],[183,101,1],[182,107,1],[178,116,1],[174,127,1],[167,140,1],[161,153,1],[156,166,1],[148,180,1],[142,194,1],[138,204,1],[137,211,1],[135,217,1],[135,221,1],[135,224,1],[140,225,1],[149,226,1],[159,226,1],[173,226,1],[186,226,1],[201,226,1],[216,225,1],[230,224,1],[247,224,1],[260,223,1],[273,222,1],[284,221,1],[294,220,1],[301,220,1],[307,220,1],[311,219,1],[229,173,2],[226,184,2],[226,197,2],[225,214,2],[223,233,2],[220,251,2],[216,269,2],[215,283,2],[214,294,2]]},{\"Name\":\"4\",\"Points\":[[200,121,1],[194,126,1],[192,135,1],[187,149,1],[182,161,1],[175,178,1],[167,191,1],[160,203,1],[156,214,1],[151,222,1],[149,227,1],[148,231,1],[148,234,1],[150,236,1],[156,237,1],[165,238,1],[178,238,1],[190,238,1],[205,238,1],[221,238,1],[237,238,1],[256,238,1],[271,237,1],[286,236,1],[299,235,1],[309,235,1],[317,235,1],[323,235,1],[327,235,1],[329,235,1],[327,235,1],[234,187,2],[230,191,2],[230,197,2],[230,205,2],[230,219,2],[230,233,2],[230,246,2],[229,260,2],[228,273,2],[227,284,2],[226,293,2],[225,303,2],[222,311,2]]},{\"Name\":\"4\",\"Points\":[[231,108,1],[221,107,1],[216,113,1],[208,125,1],[202,137,1],[191,154,1],[181,171,1],[169,186,1],[159,202,1],[150,213,1],[142,222,1],[139,228,1],[137,231,1],[137,233,1],[137,234,1],[144,234,1],[156,234,1],[169,232,1],[184,229,1],[202,227,1],[219,224,1],[234,224,1],[248,223,1],[263,223,1],[275,223,1],[285,223,1],[294,224,1],[300,224,1],[306,224,1],[311,224,1],[235,180,2],[230,189,2],[227,200,2],[225,212,2],[220,228,2],[216,243,2],[211,259,2],[206,274,2],[204,286,2]]},{\"Name\":\"a\",\"Points\":[[204,145,1],[193,135,1],[188,135,1],[182,137,1],[174,142,1],[166,148,1],[159,155,1],[154,162,1],[150,171,1],[147,179,1],[146,185,1],[146,191,1],[150,198,1],[156,201,1],[160,202,1],[169,202,1],[178,197,1],[185,189,1],[192,179,1],[198,168,1],[201,158,1],[202,150,1],[202,145,1],[202,142,1],[202,140,1],[202,145,1],[202,153,1],[201,162,1],[201,174,1],[201,184,1],[204,194,1],[208,202,1],[213,206,1],[222,209,1],[233,209,1]]},{\"Name\":\"a\",\"Points\":[[207,169,1],[198,159,1],[194,159,1],[188,162,1],[180,169,1],[170,179,1],[163,186,1],[157,196,1],[152,205,1],[150,212,1],[149,221,1],[149,228,1],[153,233,1],[159,237,1],[166,239,1],[176,239,1],[187,238,1],[198,229,1],[206,220,1],[213,210,1],[219,198,1],[222,187,1],[226,175,1],[226,167,1],[226,161,1],[226,158,1],[226,157,1],[226,158,1],[224,164,1],[221,174,1],[220,182,1],[219,194,1],[219,204,1],[219,214,1],[222,224,1],[226,229,1],[230,234,1],[235,237,1],[244,238,1],[257,235,1],[270,225,1],[286,214,1],[297,205,1]]},{\"Name\":\"a\",\"Points\":[[185,192,1],[181,180,1],[181,180,1],[180,179,1],[179,179,1],[174,180,1],[166,185,1],[158,192,1],[147,202,1],[139,212,1],[134,222,1],[129,233,1],[128,242,1],[128,250,1],[128,257,1],[134,261,1],[141,263,1],[151,263,1],[162,257,1],[172,246,1],[181,233,1],[188,219,1],[192,209,1],[195,197,1],[197,191,1],[198,186,1],[198,185,1],[196,192,1],[193,202,1],[191,210,1],[190,220,1],[190,230,1],[195,238,1],[202,244,1],[208,248,1],[218,252,1],[226,253,1],[239,253,1],[254,248,1]]},{\"Name\":\"c\",\"Points\":[[226,150,1],[216,145,1],[211,145,1],[202,149,1],[193,154,1],[183,158,1],[175,164,1],[167,172,1],[161,179,1],[158,183,1],[156,189,1],[156,196,1],[156,201,1],[159,205,1],[165,209,1],[174,211,1],[182,212,1],[191,213,1],[202,214,1],[211,214,1],[220,214,1],[228,214,1],[234,213,1]]},{\"Name\":\"c\",\"Points\":[[233,157,1],[220,149,1],[214,149,1],[204,154,1],[196,158,1],[185,163,1],[174,172,1],[167,178,1],[161,183,1],[158,188,1],[156,194,1],[156,200,1],[158,205,1],[163,209,1],[172,212,1],[181,213,1],[195,214,1],[207,214,1],[221,213,1],[232,211,1],[242,208,1]]},{\"Name\":\"c\",\"Points\":[[228,169,1],[216,156,1],[210,157,1],[204,158,1],[196,161,1],[186,167,1],[177,174,1],[169,180,1],[162,186,1],[158,193,1],[156,200,1],[155,204,1],[155,208,1],[157,213,1],[162,217,1],[172,220,1],[181,222,1],[193,223,1],[204,223,1],[215,221,1],[226,218,1],[236,214,1],[247,210,1]]},{\"Name\":\"c\",\"Points\":[[254,177,1],[248,167,1],[244,166,1],[239,166,1],[232,166,1],[223,168,1],[213,172,1],[202,178,1],[192,182,1],[183,189,1],[176,196,1],[171,205,1],[169,211,1],[168,217,1],[168,224,1],[172,229,1],[179,233,1],[189,237,1],[199,238,1],[212,238,1],[225,238,1],[236,238,1],[247,236,1],[255,235,1]]},{\"Name\":\"g\",\"Points\":[[203,146,1],[192,142,1],[187,143,1],[181,145,1],[175,153,1],[169,159,1],[165,168,1],[164,175,1],[163,181,1],[163,189,1],[167,195,1],[174,198,1],[180,199,1],[190,199,1],[200,196,1],[207,188,1],[215,180,1],[220,168,1],[222,160,1],[224,150,1],[224,143,1],[224,138,1],[224,135,1],[223,134,1],[222,134,1],[221,135,1],[221,139,1],[220,147,1],[220,157,1],[220,169,1],[220,181,1],[219,196,1],[218,209,1],[216,223,1],[212,235,1],[206,249,1],[200,261,1],[194,270,1],[187,277,1],[181,281,1],[176,282,1],[170,282,1],[164,274,1],[163,266,1],[164,255,1],[169,245,1],[178,232,1],[188,222,1],[201,211,1],[216,200,1],[234,188,1],[253,177,1],[271,167,1]]},{\"Name\":\"g\",\"Points\":[[189,149,1],[181,145,1],[173,145,1],[165,145,1],[159,147,1],[151,155,1],[145,167,1],[142,178,1],[141,190,1],[141,202,1],[141,211,1],[146,219,1],[152,224,1],[158,224,1],[167,224,1],[175,217,1],[184,204,1],[192,190,1],[197,176,1],[198,163,1],[199,155,1],[199,149,1],[199,145,1],[199,143,1],[199,147,1],[198,155,1],[196,167,1],[193,182,1],[189,200,1],[186,216,1],[182,235,1],[178,254,1],[173,273,1],[165,293,1],[158,308,1],[151,322,1],[145,331,1],[141,336,1],[137,336,1],[135,336,1],[133,334,1],[133,320,1],[137,301,1],[144,280,1],[155,262,1],[166,245,1],[180,230,1],[194,218,1],[211,205,1],[230,194,1]]},{\"Name\":\"g\",\"Points\":[[206,165,1],[188,163,1],[178,164,1],[165,172,1],[157,181,1],[150,196,1],[146,206,1],[146,217,1],[146,228,1],[151,233,1],[159,235,1],[169,235,1],[182,227,1],[196,211,1],[207,194,1],[216,180,1],[222,165,1],[226,157,1],[226,153,1],[226,151,1],[226,155,1],[226,164,1],[225,179,1],[223,196,1],[221,213,1],[219,231,1],[216,251,1],[212,270,1],[206,289,1],[201,304,1],[195,313,1],[190,321,1],[186,323,1],[181,325,1],[177,323,1],[174,316,1],[172,303,1],[172,289,1],[175,273,1],[181,261,1],[188,249,1],[198,240,1],[211,231,1],[227,221,1],[243,213,1],[259,205,1]]},{\"Name\":\"-\",\"Points\":[[151,182,1],[155,181,1],[159,181,1],[166,181,1],[174,182,1],[184,183,1],[194,184,1],[205,184,1],[214,183,1],[224,181,1],[234,179,1],[244,177,1]]},{\"Name\":\"-\",\"Points\":[[150,206,1],[156,207,1],[161,207,1],[168,208,1],[178,209,1],[187,209,1],[197,209,1],[207,208,1],[217,206,1],[225,204,1]]},{\"Name\":\"-\",\"Points\":[[150,203,1],[157,204,1],[163,204,1],[171,205,1],[181,205,1],[190,206,1],[202,206,1],[211,205,1],[221,205,1],[229,202,1]]},{\"Name\":\"7\",\"Points\":[[150,101,1],[167,99,1],[181,99,1],[194,100,1],[206,102,1],[220,104,1],[231,108,1],[240,112,1],[246,117,1],[249,126,1],[250,136,1],[250,153,1],[246,168,1],[241,183,1],[236,201,1],[232,216,1],[230,232,1],[228,246,1],[228,259,1],[228,270,1],[228,280,1],[229,289,1],[230,294,1],[231,299,1],[191,221,2],[198,219,2],[207,219,2],[222,219,2],[240,219,2],[257,218,2],[273,217,2]]},{\"Name\":\"7\",\"Points\":[[125,108,1],[138,108,1],[148,108,1],[161,108,1],[176,110,1],[188,113,1],[199,118,1],[207,126,1],[211,135,1],[213,148,1],[213,163,1],[209,182,1],[202,203,1],[195,224,1],[191,239,1],[190,256,1],[190,269,1],[190,281,1],[192,291,1],[196,299,1],[199,305,1],[203,309,1],[204,311,1],[160,245,2],[169,244,2],[179,244,2],[195,243,2],[212,240,2],[228,238,2]]},{\"Name\":\"7\",\"Points\":[[150,99,1],[159,98,1],[166,98,1],[176,98,1],[188,97,1],[201,95,1],[213,94,1],[223,93,1],[232,93,1],[241,93,1],[246,95,1],[249,99,1],[250,105,1],[250,113,1],[245,123,1],[236,135,1],[227,148,1],[219,162,1],[210,178,1],[202,192,1],[194,206,1],[189,222,1],[185,236,1],[181,248,1],[181,261,1],[180,271,1],[180,282,1],[180,291,1],[180,297,1],[180,303,1],[180,307,1],[180,309,1],[180,310,1],[179,310,1],[137,246,2],[143,240,2],[153,239,2],[163,238,2],[175,236,2],[185,234,2],[195,233,2],[205,233,2],[213,231,2],[219,230,2],[224,229,2],[226,228,2],[229,228,2],[230,228,2],[232,227,2]]},{\"Name\":\"2\",\"Points\":[[153,149,1],[150,139,1],[152,133,1],[158,125,1],[166,116,1],[178,108,1],[188,103,1],[198,101,1],[207,101,1],[216,104,1],[223,113,1],[226,129,1],[227,146,1],[227,167,1],[225,191,1],[218,214,1],[210,236,1],[203,256,1],[191,274,1],[182,288,1],[174,299,1],[168,305,1],[164,308,1],[161,308,1],[161,306,1],[164,300,1],[171,298,1],[181,297,1],[189,296,1],[198,296,1],[204,300,1],[211,304,1],[217,310,1],[223,313,1],[226,316,1],[232,318,1],[241,318,1],[255,314,1]]},{\"Name\":\"2\",\"Points\":[[162,115,1],[183,108,1],[195,105,1],[205,104,1],[216,104,1],[223,110,1],[225,120,1],[225,134,1],[223,154,1],[213,177,1],[203,199,1],[192,221,1],[181,243,1],[173,261,1],[167,275,1],[165,286,1],[165,294,1],[167,300,1],[178,303,1],[190,303,1],[206,303,1],[224,298,1],[240,293,1],[253,290,1],[264,288,1],[272,286,1],[278,284,1],[285,284,1],[292,282,1],[297,280,1]]},{\"Name\":\"2\",\"Points\":[[155,140,1],[158,131,1],[166,126,1],[177,121,1],[188,118,1],[198,118,1],[208,120,1],[215,126,1],[220,136,1],[223,149,1],[223,166,1],[219,181,1],[213,200,1],[204,219,1],[195,238,1],[187,252,1],[181,269,1],[176,284,1],[173,293,1],[173,301,1],[174,308,1],[181,311,1],[194,313,1],[208,313,1],[226,312,1],[239,310,1],[252,307,1],[263,306,1],[271,304,1],[277,304,1],[282,303,1],[286,303,1],[290,303,1]]},{\"Name\":\"2\",\"Points\":[[150,144,1],[164,129,1],[176,126,1],[187,125,1],[201,128,1],[210,136,1],[217,151,1],[219,168,1],[219,187,1],[213,210,1],[203,230,1],[186,251,1],[167,269,1],[148,284,1],[135,292,1],[126,295,1],[121,295,1],[125,288,1],[137,280,1],[149,274,1],[160,272,1],[173,272,1],[183,277,1],[191,285,1],[199,296,1],[205,305,1],[213,315,1],[221,322,1],[229,330,1],[241,334,1],[253,335,1],[269,334,1],[289,325,1],[310,313,1]]},{\"Name\":\"0\",\"Points\":[[131,77,1],[120,80,1],[118,82,1],[115,85,1],[112,88,1],[109,90,1],[106,93,1],[103,97,1],[101,99,1],[98,101,1],[96,104,1],[94,106,1],[92,110,1],[92,112,1],[90,115,1],[89,116,1],[88,117,1],[88,118,1],[88,119,1],[88,119,1],[87,119,1],[87,119,1],[87,118,1],[86,117,1],[85,117,1],[85,118,1],[85,119,1],[84,119,1],[83,119,1],[83,122,1],[83,124,1],[82,126,1],[81,129,1],[80,132,1],[79,134,1],[78,137,1],[78,139,1],[77,142,1],[76,145,1],[75,149,1],[75,152,1],[73,157,1],[73,162,1],[73,164,1],[73,168,1],[73,172,1],[74,176,1],[75,180,1],[78,185,1],[80,188,1],[83,190,1],[86,194,1],[90,198,1],[93,201,1],[98,205,1],[104,208,1],[111,211,1],[118,213,1],[126,216,1],[134,217,1],[140,217,1],[147,217,1],[153,217,1],[159,215,1],[164,212,1],[168,208,1],[172,205,1],[176,202,1],[179,198,1],[181,194,1],[182,189,1],[184,185,1],[185,180,1],[185,174,1],[185,167,1],[185,162,1],[185,155,1],[185,150,1],[185,142,1],[185,138,1],[184,131,1],[182,126,1],[181,120,1],[180,116,1],[177,111,1],[175,106,1],[172,103,1],[169,99,1],[166,97,1],[163,93,1],[160,90,1],[158,87,1],[154,86,1],[150,84,1],[147,82,1],[143,81,1],[139,79,1],[137,78,1],[134,77,1],[131,77,1],[129,77,1],[126,77,1],[125,77,1],[123,77,1],[122,77,1],[120,77,1]]},{\"Name\":\"1\",\"Points\":[[62,200,1],[68,196,1],[72,191,1],[79,184,1],[90,171,1],[99,159,1],[108,146,1],[115,135,1],[124,123,1],[132,111,1],[138,100,1],[144,92,1],[150,84,1],[153,77,1],[155,75,1],[157,73,1],[158,72,1],[158,71,1],[158,73,1],[158,79,1],[158,86,1],[158,96,1],[157,106,1],[155,119,1],[155,133,1],[154,148,1],[153,168,1],[151,186,1],[149,206,1],[147,227,1],[145,245,1],[144,258,1],[143,268,1],[142,275,1],[142,279,1],[142,282,1],[142,285,1]]},{\"Name\":\"2\",\"Points\":[[99,110,1],[102,97,1],[107,96,1],[117,93,1],[133,89,1],[148,86,1],[159,84,1],[171,84,1],[179,84,1],[185,87,1],[190,92,1],[193,97,1],[194,103,1],[195,112,1],[195,119,1],[192,133,1],[186,142,1],[181,156,1],[171,167,1],[161,178,1],[152,189,1],[140,200,1],[129,211,1],[120,220,1],[112,227,1],[106,231,1],[101,235,1],[98,239,1],[96,240,1],[96,241,1],[96,242,1],[96,243,1],[101,244,1],[109,245,1],[118,245,1],[132,246,1],[147,246,1],[165,246,1],[180,246,1],[194,246,1],[204,245,1],[213,245,1],[218,245,1],[223,245,1],[224,244,1],[225,244,1],[223,245,1]]},{\"Name\":\"3\",\"Points\":[[95,115,1],[97,108,1],[102,106,1],[115,105,1],[131,104,1],[148,103,1],[162,103,1],[176,103,1],[183,105,1],[188,110,1],[190,114,1],[190,119,1],[189,126,1],[184,133,1],[177,140,1],[171,144,1],[165,149,1],[161,153,1],[158,157,1],[157,160,1],[157,162,1],[157,166,1],[161,170,1],[171,176,1],[181,184,1],[189,190,1],[194,195,1],[199,203,1],[201,208,1],[203,213,1],[203,221,1],[201,227,1],[194,235,1],[183,243,1],[171,250,1],[159,255,1],[146,261,1],[134,264,1],[121,267,1],[110,267,1],[100,267,1],[90,266,1],[83,263,1],[78,259,1],[76,257,1],[74,255,1],[74,254,1],[77,254,1]]},{\"Name\":\"4\",\"Points\":[[129,81,1],[129,86,1],[129,91,1],[129,97,1],[129,110,1],[126,120,1],[123,133,1],[119,144,1],[115,155,1],[115,165,1],[112,174,1],[111,184,1],[111,190,1],[111,197,1],[111,201,1],[111,205,1],[113,208,1],[115,209,1],[120,210,1],[128,211,1],[138,213,1],[150,214,1],[164,215,1],[179,216,1],[194,216,1],[264,216,1],[270,216,1],[278,216,1],[277,216,1],[181,155,2],[181,162,2],[181,167,2],[181,175,2],[181,186,2],[181,197,2],[181,209,2],[181,220,2],[181,231,2],[181,243,2],[181,254,2],[181,264,2],[180,273,2],[179,282,2],[178,288,2],[177,293,2],[176,297,2],[176,298,2],[176,299,2],[176,300,2],[176,303,2]]},{\"Name\":\"5\",\"Points\":[[123,95,1],[122,103,1],[122,113,1],[120,120,1],[117,133,1],[114,143,1],[111,152,1],[108,160,1],[106,165,1],[106,168,1],[105,170,1],[105,171,1],[108,170,1],[115,168,1],[123,167,1],[134,166,1],[147,166,1],[163,166,1],[179,170,1],[190,175,1],[199,180,1],[206,185,1],[211,190,1],[215,197,1],[218,205,1],[218,213,1],[218,222,1],[218,230,1],[212,238,1],[204,245,1],[194,253,1],[181,259,1],[168,265,1],[153,268,1],[137,271,1],[124,272,1],[110,272,1],[96,271,1],[86,268,1],[78,265,1],[73,263,1],[70,260,1],[68,258,1],[68,256,1],[68,255,1],[68,254,1],[73,254,1],[102,106,2],[110,108,2],[117,108,2],[129,109,2],[143,110,2],[159,110,2],[175,110,2],[190,110,2],[203,110,2],[211,110,2],[219,110,2],[224,110,2],[227,110,2],[229,110,2],[230,110,2],[228,110,2]]},{\"Name\":\"6\",\"Points\":[[208,87,1],[202,85,1],[197,86,1],[190,91,1],[181,97,1],[171,109,1],[161,122,1],[153,137,1],[140,153,1],[133,167,1],[125,185,1],[121,201,1],[120,217,1],[120,230,1],[120,246,1],[126,258,1],[134,270,1],[147,278,1],[160,284,1],[176,287,1],[191,287,1],[204,282,1],[215,274,1],[223,267,1],[227,256,1],[230,246,1],[231,237,1],[231,227,1],[227,218,1],[218,208,1],[207,201,1],[194,194,1],[183,189,1],[170,186,1],[156,185,1],[139,185,1],[125,189,1],[115,197,1],[104,209,1],[99,226,1]]},{\"Name\":\"7\",\"Points\":[[114,97,1],[120,97,1],[129,97,1],[140,97,1],[158,98,1],[177,99,1],[199,100,1],[217,100,1],[232,100,1],[245,100,1],[254,99,1],[260,98,1],[265,98,1],[267,98,1],[268,98,1],[266,100,1],[260,107,1],[254,115,1],[246,123,1],[235,135,1],[226,146,1],[214,159,1],[204,172,1],[190,189,1],[180,207,1],[171,221,1],[162,235,1],[156,250,1],[149,263,1],[145,272,1],[141,279,1],[138,287,1],[137,291,1],[136,293,1],[136,295,1],[136,296,1],[158,198,2],[162,193,2],[175,193,2],[187,193,2],[199,193,2],[208,193,2],[214,192,2],[219,191,2],[223,190,2],[224,190,2],[225,190,2]]},{\"Name\":\"8\",\"Points\":[[187,92,1],[176,87,1],[166,91,1],[154,97,1],[143,107,1],[137,115,1],[134,120,1],[131,129,1],[131,138,1],[134,147,1],[149,164,1],[169,179,1],[190,192,1],[204,201,1],[218,209,1],[230,217,1],[240,227,1],[248,238,1],[251,249,1],[254,260,1],[254,273,1],[246,285,1],[234,294,1],[219,300,1],[203,303,1],[184,303,1],[166,302,1],[149,297,1],[135,289,1],[125,279,1],[117,268,1],[115,258,1],[115,245,1],[120,230,1],[129,215,1],[142,200,1],[158,187,1],[173,175,1],[187,164,1],[199,154,1],[209,143,1],[215,134,1],[219,126,1],[220,119,1],[220,111,1],[215,105,1],[207,100,1],[199,97,1],[191,95,1],[184,94,1],[171,97,1]]},{\"Name\":\"9\",\"Points\":[[215,96,1],[201,91,1],[194,91,1],[186,96,1],[178,101,1],[168,112,1],[161,122,1],[158,131,1],[156,139,1],[156,147,1],[159,154,1],[172,159,1],[190,160,1],[207,157,1],[226,144,1],[237,130,1],[244,119,1],[247,112,1],[248,105,1],[248,100,1],[248,98,1],[247,97,1],[242,97,1],[237,103,1],[233,111,1],[231,119,1],[229,129,1],[229,141,1],[229,157,1],[231,171,1],[234,186,1],[236,199,1],[239,216,1],[240,229,1],[240,241,1],[236,254,1],[231,264,1],[223,274,1],[213,281,1],[204,287,1],[188,292,1],[176,293,1],[160,293,1],[144,289,1],[133,281,1],[123,273,1],[116,265,1],[113,259,1],[111,255,1],[111,253,1]]},{\"Name\":\",\",\"Points\":[[205,275,1],[202,280,1],[197,287,1],[189,297,1],[179,307,1],[168,316,1],[158,324,1],[148,332,1],[140,338,1],[135,343,1],[131,346,1],[129,350,1]]},{\"Name\":\"a\",\"Points\":[[163,167,1],[153,162,1],[148,162,1],[142,164,1],[137,168,1],[134,172,1],[129,179,1],[126,185,1],[124,190,1],[121,195,1],[120,202,1],[120,208,1],[120,212,1],[120,216,1],[120,219,1],[125,222,1],[130,223,1],[137,223,1],[145,223,1],[152,222,1],[159,218,1],[166,211,1],[171,203,1],[177,194,1],[181,187,1],[183,180,1],[185,175,1],[185,171,1],[185,169,1],[185,168,1],[185,167,1],[182,167,1],[181,169,1],[179,171,1],[177,176,1],[176,182,1],[175,188,1],[175,195,1],[175,204,1],[175,212,1],[176,217,1],[178,222,1],[181,226,1],[182,228,1],[185,229,1],[190,229,1],[195,229,1],[202,227,1],[210,222,1],[218,214,1],[224,207,1],[228,202,1],[230,198,1],[231,197,1],[232,196,1]]},{\"Name\":\"b\",\"Points\":[[121,67,1],[120,76,1],[120,85,1],[119,97,1],[117,113,1],[115,128,1],[113,141,1],[111,155,1],[109,166,1],[109,176,1],[108,186,1],[108,194,1],[108,199,1],[108,203,1],[108,204,1],[109,202,1],[111,197,1],[115,189,1],[122,179,1],[132,170,1],[140,164,1],[151,161,1],[159,160,1],[168,159,1],[176,159,1],[185,163,1],[190,166,1],[196,172,1],[201,179,1],[204,185,1],[204,190,1],[204,197,1],[204,204,1],[200,212,1],[194,217,1],[184,222,1],[173,227,1],[160,229,1],[149,229,1],[138,229,1],[129,228,1],[119,225,1],[113,221,1],[109,217,1],[106,214,1],[105,210,1],[105,208,1],[105,208,1]]},{\"Name\":\"c\",\"Points\":[[210,172,1],[194,168,1],[188,168,1],[180,170,1],[166,177,1],[155,186,1],[143,196,1],[134,206,1],[128,214,1],[123,223,1],[120,230,1],[120,235,1],[120,243,1],[124,250,1],[136,256,1],[150,263,1],[166,267,1],[180,268,1],[194,268,1],[208,267,1],[219,264,1],[226,259,1],[231,254,1],[234,252,1],[236,250,1],[236,249,1]]},{\"Name\":\"d\",\"Points\":[[215,179,1],[201,179,1],[193,181,1],[183,186,1],[176,192,1],[168,199,1],[164,208,1],[161,214,1],[159,223,1],[159,230,1],[159,237,1],[159,243,1],[161,248,1],[167,250,1],[176,250,1],[185,246,1],[195,235,1],[204,225,1],[212,210,1],[218,196,1],[224,180,1],[227,164,1],[231,150,1],[232,140,1],[234,130,1],[235,124,1],[235,120,1],[235,119,1],[234,123,1],[233,131,1],[232,142,1],[231,155,1],[231,168,1],[231,183,1],[231,196,1],[230,209,1],[230,220,1],[230,229,1],[229,234,1],[229,240,1],[228,242,1],[228,243,1],[228,242,1],[228,241,1],[228,240,1]]},{\"Name\":\"e\",\"Points\":[[156,194,1],[160,194,1],[167,194,1],[180,194,1],[197,194,1],[213,190,1],[224,186,1],[232,181,1],[238,176,1],[241,172,1],[241,169,1],[241,164,1],[232,159,1],[217,156,1],[204,154,1],[186,154,1],[173,157,1],[161,164,1],[153,168,1],[144,175,1],[137,184,1],[133,194,1],[131,204,1],[129,214,1],[129,223,1],[130,231,1],[136,240,1],[144,250,1],[158,257,1],[171,263,1],[186,267,1],[200,268,1],[212,268,1],[219,267,1],[225,262,1],[227,259,1],[228,255,1],[229,254,1],[229,253,1]]},{\"Name\":\"f\",\"Points\":[[275,109,1],[267,97,1],[258,97,1],[241,97,1],[225,100,1],[212,109,1],[204,116,1],[198,124,1],[193,133,1],[189,141,1],[185,151,1],[182,166,1],[181,183,1],[181,196,1],[181,211,1],[181,225,1],[181,237,1],[181,250,1],[181,263,1],[181,272,1],[181,282,1],[181,289,1],[181,295,1],[181,298,1],[181,300,1],[181,301,1],[140,179,2],[143,178,2],[156,178,2],[176,178,2],[194,178,2],[207,178,2],[217,177,2],[223,176,2],[225,175,2],[226,175,2],[226,175,2],[226,176,2]]},{\"Name\":\"g\",\"Points\":[[197,122,1],[185,126,1],[178,130,1],[171,139,1],[162,149,1],[157,161,1],[152,170,1],[149,180,1],[149,186,1],[149,191,1],[149,194,1],[153,196,1],[161,196,1],[175,193,1],[186,185,1],[197,173,1],[206,162,1],[212,152,1],[215,144,1],[217,140,1],[218,137,1],[218,135,1],[217,135,1],[213,138,1],[210,145,1],[206,157,1],[205,170,1],[205,185,1],[205,202,1],[207,219,1],[210,237,1],[213,255,1],[213,270,1],[213,284,1],[213,296,1],[209,304,1],[205,310,1],[199,314,1],[191,315,1],[181,315,1],[169,315,1],[158,308,1],[148,301,1],[140,293,1],[134,283,1],[131,274,1],[130,264,1],[130,255,1],[130,250,1],[131,247,1],[134,246,1]]},{\"Name\":\"l\",\"Points\":[[171,64,1],[168,70,1],[168,75,1],[166,86,1],[164,98,1],[161,115,1],[159,130,1],[158,142,1],[154,160,1],[153,172,1],[151,189,1],[151,204,1],[150,220,1],[149,235,1],[148,247,1],[148,256,1],[148,263,1],[148,268,1],[148,270,1],[148,271,1],[148,270,1]]},{\"Name\":\"i\",\"Points\":[[177,176,1],[178,187,1],[178,195,1],[176,208,1],[175,221,1],[172,233,1],[171,242,1],[171,252,1],[171,258,1],[171,262,1],[171,265,1],[176,123,2]]},{\"Name\":\"n\",\"Points\":[[108,160,1],[106,170,1],[106,181,1],[104,193,1],[101,210,1],[97,225,1],[96,237,1],[93,250,1],[92,258,1],[92,264,1],[92,268,1],[92,269,1],[92,265,1],[94,255,1],[97,245,1],[103,231,1],[110,220,1],[117,207,1],[126,196,1],[134,188,1],[142,182,1],[150,179,1],[159,177,1],[166,177,1],[174,180,1],[181,186,1],[186,194,1],[190,204,1],[194,215,1],[196,227,1],[197,237,1],[197,247,1],[197,256,1],[197,264,1],[195,268,1],[194,271,1],[193,273,1],[193,272,1],[193,271,1]]},{\"Name\":\"o\",\"Points\":[[173,168,1],[159,170,1],[154,175,1],[146,186,1],[142,196,1],[138,208,1],[137,217,1],[137,227,1],[137,234,1],[142,242,1],[151,248,1],[163,253,1],[176,254,1],[194,254,1],[207,253,1],[217,249,1],[226,239,1],[231,230,1],[236,221,1],[238,211,1],[238,203,1],[236,194,1],[231,186,1],[223,180,1],[211,176,1],[199,174,1],[184,173,1],[171,173,1],[160,174,1],[152,179,1],[144,186,1],[142,194,1]]},{\"Name\":\"s\",\"Points\":[[243,161,1],[233,153,1],[226,153,1],[218,153,1],[206,155,1],[197,159,1],[190,162,1],[184,165,1],[181,168,1],[180,174,1],[180,181,1],[184,189,1],[195,198,1],[209,208,1],[225,215,1],[237,222,1],[246,228,1],[252,233,1],[256,237,1],[257,241,1],[257,245,1],[255,249,1],[246,252,1],[234,253,1],[221,254,1],[207,254,1],[190,253,1],[179,253,1],[167,250,1],[160,246,1],[156,244,1],[153,242,1],[152,240,1]]},{\"Name\":\"t\",\"Points\":[[190,87,1],[188,100,1],[188,113,1],[187,131,1],[185,149,1],[184,168,1],[181,187,1],[181,206,1],[181,226,1],[181,244,1],[181,259,1],[181,274,1],[181,283,1],[181,291,1],[181,296,1],[181,297,1],[181,297,1],[153,161,2],[164,155,2],[181,155,2],[198,155,2],[209,154,2],[220,152,2],[226,152,2],[231,151,2],[234,150,2],[235,150,2],[233,153,2]]},{\"Name\":\"+\",\"Points\":[[115,196,1],[122,195,1],[136,195,1],[157,196,1],[176,197,1],[194,198,1],[208,198,1],[222,198,1],[230,198,1],[236,198,1],[239,198,1],[240,198,1],[163,154,2],[163,159,2],[163,166,2],[163,179,2],[164,192,2],[164,206,2],[164,216,2],[164,226,2],[164,233,2],[164,239,2],[164,242,2],[164,245,2],[164,247,2]]},{\"Name\":\"-\",\"Points\":[[125,206,1],[125,202,1],[134,202,1],[153,203,1],[174,205,1],[192,206,1],[205,206,1],[217,206,1],[226,206,1],[231,206,1],[235,206,1],[237,207,1],[238,207,1],[238,208,1]]},{\"Name\":\"/\",\"Points\":[[263,95,1],[255,104,1],[247,115,1],[235,132,1],[223,148,1],[208,166,1],[193,186,1],[178,204,1],[164,221,1],[155,231,1],[148,241,1],[145,246,1],[143,249,1],[143,250,1],[144,250,1],[146,250,1]]},{\"Name\":\"(\",\"Points\":[[206,72,1],[199,75,1],[192,79,1],[182,88,1],[175,98,1],[168,111,1],[162,124,1],[159,139,1],[157,153,1],[156,166,1],[156,183,1],[158,197,1],[161,211,1],[168,223,1],[176,235,1],[182,246,1],[190,254,1],[196,263,1],[200,268,1],[204,272,1],[204,273,1],[205,274,1],[206,274,1]]},{\"Name\":\")\",\"Points\":[[185,82,1],[196,85,1],[203,91,1],[211,99,1],[219,111,1],[226,122,1],[232,136,1],[237,149,1],[241,164,1],[244,176,1],[246,191,1],[246,209,1],[246,226,1],[246,241,1],[241,255,1],[238,267,1],[234,277,1],[229,285,1],[226,291,1],[223,295,1],[221,297,1],[218,298,1],[218,297,1]]},{\"Name\":\"|\",\"Points\":[[153,59,1],[153,68,1],[153,77,1],[153,90,1],[152,107,1],[149,122,1],[147,140,1],[144,157,1],[142,176,1],[140,195,1],[138,215,1],[137,231,1],[136,248,1],[134,259,1],[134,269,1],[133,275,1],[132,279,1],[131,282,1],[131,283,1],[131,282,1]]},{\"Name\":\"sqrt\",\"Points\":[[59,198,1],[74,198,1],[90,198,1],[103,198,1],[115,197,1],[123,195,1],[129,194,1],[133,194,1],[135,193,1],[136,192,1],[136,194,1],[134,197,1],[132,201,1],[130,208,1],[129,216,1],[128,226,1],[127,237,1],[127,250,1],[126,262,1],[126,275,1],[126,288,1],[126,298,1],[126,310,1],[126,317,1],[126,321,1],[126,325,1],[126,328,1],[126,327,1],[127,324,1],[129,317,1],[133,307,1],[136,297,1],[138,287,1],[143,275,1],[147,263,1],[151,249,1],[155,234,1],[159,221,1],[161,206,1],[166,194,1],[169,177,1],[172,162,1],[176,145,1],[177,129,1],[179,117,1],[181,105,1],[181,97,1],[181,91,1],[182,86,1],[183,83,1],[183,82,1],[184,81,1],[185,81,1],[185,82,1],[185,83,1],[189,87,1],[193,90,1],[200,93,1],[207,97,1],[218,99,1],[228,102,1],[241,104,1],[254,106,1],[267,108,1],[276,109,1],[288,110,1],[296,110,1],[304,110,1],[311,110,1],[315,110,1],[320,110,1],[325,110,1],[328,109,1],[331,108,1],[334,107,1],[336,105,1],[338,105,1],[340,104,1],[343,103,1],[345,102,1],[347,101,1],[348,100,1],[349,100,1],[350,99,1],[351,98,1],[352,98,1],[352,99,1],[352,100,1],[352,103,1],[352,108,1],[352,113,1],[351,119,1],[349,125,1],[348,133,1],[347,138,1],[346,141,1],[346,143,1],[346,144,1],[346,145,1],[345,147,1]]},{\"Name\":\"x\",\"Points\":[[130,155,1],[143,177,1],[150,190,1],[158,206,1],[169,223,1],[180,239,1],[188,253,1],[196,264,1],[203,273,1],[208,282,1],[211,288,1],[213,292,1],[214,296,1],[215,297,1],[213,297,1],[105,300,2],[108,291,2],[117,281,2],[132,268,2],[149,253,2],[166,236,2],[184,219,2],[200,203,2],[214,186,2],[226,176,2],[234,170,2],[241,165,2],[244,163,2],[245,162,2]]},{\"Name\":\"y\",\"Points\":[[113,154,1],[119,161,1],[126,167,1],[137,177,1],[150,187,1],[162,198,1],[176,209,1],[188,220,1],[198,229,1],[204,235,1],[208,240,1],[211,244,1],[213,245,1],[213,247,1],[214,245,1],[275,164,2],[270,170,2],[263,182,2],[251,195,2],[236,213,2],[219,230,2],[200,245,2],[181,262,2],[161,278,2],[146,295,2],[135,305,2],[129,313,2],[125,319,2],[122,320,2],[121,323,2],[121,324,2],[122,324,2],[123,324,2],[124,324,2]]},{\"Name\":\"0\",\"Points\":[[237,151,1],[232,127,1],[226,125,1],[215,125,1],[204,126,1],[190,134,1],[176,143,1],[164,157,1],[155,172,1],[148,190,1],[143,210,1],[143,231,1],[143,250,1],[151,267,1],[161,278,1],[175,287,1],[191,292,1],[209,292,1],[229,285,1],[246,274,1],[258,258,1],[267,240,1],[270,222,1],[271,199,1],[269,176,1],[260,159,1],[250,147,1],[239,138,1],[229,131,1],[221,129,1],[213,129,1]]},{\"Name\":\"1\",\"Points\":[[110,260,1],[124,245,1],[137,236,1],[155,223,1],[174,208,1],[192,194,1],[210,175,1],[226,158,1],[238,142,1],[247,133,1],[254,126,1],[259,121,1],[263,119,1],[265,119,1],[266,124,1],[266,136,1],[262,165,1],[260,184,1],[257,202,1],[252,281,1],[252,285,1],[252,289,1],[254,292,1]]},{\"Name\":\"2\",\"Points\":[[158,170,1],[175,160,1],[186,158,1],[201,158,1],[215,161,1],[224,165,1],[231,172,1],[234,180,1],[234,191,1],[162,276,1],[160,284,1],[160,289,1],[213,296,1],[226,297,1],[239,297,1],[247,297,1],[253,297,1],[257,296,1],[259,296,1],[260,296,1],[261,296,1],[262,297,1]]},{\"Name\":\"3\",\"Points\":[[146,164,1],[153,155,1],[162,153,1],[178,152,1],[196,152,1],[213,153,1],[226,157,1],[233,160,1],[237,163,1],[239,166,1],[239,173,1],[234,180,1],[227,187,1],[226,192,1],[226,198,1],[226,203,1],[232,209,1],[246,217,1],[258,224,1],[270,234,1],[276,242,1],[279,250,1],[280,254,1],[275,260,1],[264,264,1],[246,268,1],[226,269,1],[205,269,1],[185,268,1],[166,264,1],[151,257,1],[141,253,1],[133,251,1]]},{\"Name\":\"4\",\"Points\":[[157,122,1],[159,127,1],[159,136,1],[159,148,1],[158,163,1],[153,178,1],[146,193,1],[139,208,1],[134,223,1],[129,233,1],[126,244,1],[125,251,1],[125,255,1],[127,259,1],[134,261,1],[144,261,1],[157,261,1],[171,260,1],[185,259,1],[199,257,1],[211,255,1],[222,254,1],[229,253,1],[235,253,1],[239,252,1],[241,251,1],[198,201,2],[198,208,2],[198,217,2],[198,232,2],[197,250,2],[197,266,2],[196,278,2],[196,288,2],[196,294,2],[196,299,2],[196,304,2],[196,306,2],[197,307,2],[198,309,2],[199,311,2]]},{\"Name\":\"5\",\"Points\":[[166,124,1],[163,130,1],[162,141,1],[159,158,1],[157,171,1],[154,184,1],[154,192,1],[154,199,1],[159,204,1],[171,205,1],[187,208,1],[204,212,1],[223,218,1],[239,223,1],[253,229,1],[266,236,1],[275,246,1],[279,253,1],[280,261,1],[277,269,1],[268,274,1],[251,277,1],[237,278,1],[218,278,1],[200,277,1],[183,275,1],[171,272,1],[159,267,1],[153,264,1],[145,257,1],[141,253,1],[151,122,2],[153,123,2],[161,124,2],[178,125,2],[198,126,2],[221,126,2],[245,126,2],[266,126,2],[286,125,2],[302,125,2]]},{\"Name\":\"6\",\"Points\":[[257,147,1],[248,130,1],[241,126,1],[231,125,1],[218,125,1],[201,131,1],[181,145,1],[163,163,1],[151,183,1],[139,206,1],[133,235,1],[130,264,1],[130,285,1],[134,302,1],[143,313,1],[157,319,1],[172,319,1],[188,315,1],[204,301,1],[218,285,1],[226,272,1],[228,258,1],[228,246,1],[221,235,1],[205,230,1],[188,229,1],[172,229,1],[158,236,1],[144,247,1],[135,261,1],[131,276,1],[131,291,1]]},{\"Name\":\"7\",\"Points\":[[107,137,1],[119,131,1],[132,131,1],[150,131,1],[171,131,1],[191,130,1],[209,129,1],[223,127,1],[231,126,1],[236,125,1],[238,125,1],[238,130,1],[231,143,1],[223,164,1],[211,186,1],[203,211,1],[194,237,1],[190,260,1],[187,275,1],[186,286,1],[186,293,1],[187,297,1],[189,299,1],[194,301,1],[198,302,1],[200,303,1],[203,303,1],[154,238,2],[160,233,2],[171,232,2],[188,232,2],[205,230,2],[224,230,2],[243,229,2],[260,229,2],[277,230,2]]},{\"Name\":\"8\",\"Points\":[[231,122,1],[218,119,1],[205,122,1],[193,130,1],[182,141,1],[178,151,1],[178,163,1],[183,176,1],[199,190,1],[221,204,1],[246,222,1],[269,239,1],[284,255,1],[293,266,1],[296,274,1],[296,279,1],[291,287,1],[276,292,1],[262,293,1],[248,293,1],[233,288,1],[226,277,1],[225,260,1],[226,238,1],[235,214,1],[244,192,1],[250,175,1],[254,158,1],[255,147,1],[255,139,1],[250,132,1],[244,128,1],[233,127,1],[222,127,1],[209,134,1]]},{\"Name\":\"9\",\"Points\":[[266,143,1],[258,130,1],[250,125,1],[236,125,1],[220,125,1],[204,130,1],[192,139,1],[183,148,1],[181,158,1],[181,168,1],[182,176,1],[194,182,1],[207,183,1],[226,181,1],[242,173,1],[255,163,1],[263,153,1],[266,145,1],[268,141,1],[269,139,1],[269,138,1],[267,146,1],[266,158,1],[266,171,1],[269,187,1],[276,204,1],[287,224,1],[295,241,1],[301,255,1],[303,265,1],[304,273,1],[302,279,1],[293,286,1],[277,292,1],[257,294,1],[236,294,1],[214,294,1],[193,288,1],[176,279,1],[163,270,1],[153,258,1],[148,251,1],[148,246,1]]},{\"Name\":\",\",\"Points\":[[215,215,1],[218,223,1],[218,233,1],[217,246,1],[209,263,1],[197,278,1],[181,293,1],[163,303,1],[145,313,1]]},{\"Name\":\"a\",\"Points\":[[235,219,1],[233,204,1],[232,199,1],[230,193,1],[225,187,1],[218,182,1],[209,180,1],[198,178,1],[183,178,1],[171,186,1],[161,196,1],[154,211,1],[150,228,1],[148,244,1],[148,257,1],[151,269,1],[159,275,1],[170,278,1],[182,278,1],[199,274,1],[213,263,1],[225,250,1],[235,231,1],[242,217,1],[246,204,1],[248,192,1],[248,186,1],[248,181,1],[248,179,1],[246,182,1],[245,189,1],[244,195,1],[243,208,1],[243,220,1],[243,234,1],[243,246,1],[244,259,1],[245,267,1],[246,274,1],[248,278,1],[248,282,1],[249,283,1],[250,283,1]]},{\"Name\":\"b\",\"Points\":[[179,131,1],[176,136,1],[176,144,1],[175,157,1],[175,170,1],[175,184,1],[175,194,1],[175,202,1],[175,208,1],[175,210,1],[175,211,1],[178,210,1],[185,206,1],[195,201,1],[207,198,1],[220,196,1],[231,195,1],[245,195,1],[257,200,1],[267,204,1],[273,208,1],[278,214,1],[281,219,1],[281,225,1],[280,232,1],[273,238,1],[263,244,1],[251,246,1],[240,247,1],[226,247,1],[211,243,1],[199,237,1],[189,232,1],[180,228,1],[174,223,1],[170,220,1],[167,217,1],[167,214,1]]},{\"Name\":\"c\",\"Points\":[[283,204,1],[275,186,1],[269,182,1],[260,178,1],[248,176,1],[231,176,1],[213,177,1],[193,187,1],[174,200,1],[159,217,1],[149,234,1],[143,251,1],[140,264,1],[140,275,1],[145,284,1],[156,289,1],[170,291,1],[189,290,1],[206,283,1],[223,275,1],[235,270,1],[243,265,1],[248,261,1],[250,259,1],[251,257,1],[252,256,1]]},{\"Name\":\"d\",\"Points\":[[234,252,1],[231,232,1],[226,225,1],[219,218,1],[210,214,1],[199,213,1],[185,215,1],[175,224,1],[166,237,1],[159,253,1],[158,269,1],[158,280,1],[159,290,1],[166,296,1],[176,297,1],[191,297,1],[208,283,1],[222,269,1],[232,251,1],[241,230,1],[247,208,1],[250,191,1],[253,173,1],[255,160,1],[255,150,1],[255,145,1],[255,143,1],[252,143,1],[248,152,1],[246,166,1],[243,184,1],[242,202,1],[242,222,1],[242,242,1],[242,260,1],[242,274,1],[242,287,1],[242,296,1],[242,300,1],[242,303,1],[242,304,1],[242,303,1],[242,302,1],[242,301,1],[242,300,1],[243,299,1]]},{\"Name\":\"e\",\"Points\":[[158,253,1],[159,251,1],[166,251,1],[178,253,1],[191,253,1],[205,253,1],[222,251,1],[236,247,1],[248,241,1],[255,235,1],[260,230,1],[263,225,1],[263,218,1],[259,210,1],[246,205,1],[233,203,1],[214,203,1],[196,205,1],[176,214,1],[159,224,1],[146,235,1],[137,245,1],[131,254,1],[129,263,1],[129,273,1],[138,281,1],[153,287,1],[170,290,1],[188,291,1],[204,291,1],[218,291,1],[227,290,1],[234,289,1],[238,288,1],[240,287,1],[241,286,1],[241,285,1]]},{\"Name\":\"f\",\"Points\":[[270,184,1],[269,165,1],[269,156,1],[263,147,1],[256,139,1],[249,132,1],[243,128,1],[237,127,1],[231,127,1],[225,134,1],[218,149,1],[213,171,1],[212,192,1],[212,221,1],[212,241,1],[213,264,1],[214,283,1],[218,300,1],[221,313,1],[223,324,1],[226,331,1],[226,337,1],[227,339,1],[228,339,1],[152,265,2],[158,259,2],[172,259,2],[190,259,2],[211,259,2],[231,259,2],[252,259,2],[270,259,2],[282,259,2],[291,257,2],[296,256,2],[301,255,2],[305,255,2]]},{\"Name\":\"g\",\"Points\":[[278,231,1],[272,218,1],[269,212,1],[260,208,1],[248,208,1],[233,208,1],[221,215,1],[212,225,1],[207,232,1],[205,241,1],[205,249,1],[211,255,1],[223,258,1],[236,258,1],[253,255,1],[268,248,1],[280,238,1],[289,228,1],[293,222,1],[296,215,1],[296,211,1],[296,208,1],[293,212,1],[292,219,1],[290,228,1],[290,240,1],[291,252,1],[294,267,1],[300,281,1],[307,297,1],[314,311,1],[317,320,1],[320,331,1],[322,339,1],[322,344,1],[320,349,1],[311,353,1],[297,353,1],[278,353,1],[260,350,1],[243,345,1],[228,340,1],[218,336,1],[212,333,1],[208,331,1],[208,329,1]]},{\"Name\":\"l\",\"Points\":[[231,121,1],[228,134,1],[226,144,1],[223,160,1],[219,176,1],[214,195,1],[211,216,1],[208,236,1],[206,254,1],[206,271,1],[206,287,1],[208,297,1],[210,305,1],[213,309,1],[218,311,1],[225,311,1],[232,307,1],[242,302,1],[252,297,1],[264,295,1],[278,294,1],[291,294,1]]},{\"Name\":\"i\",\"Points\":[[230,191,1],[231,199,1],[231,210,1],[231,226,1],[231,244,1],[232,257,1],[232,270,1],[232,278,1],[233,284,1],[233,288,1],[234,292,1],[235,294,1],[236,294,1],[236,293,1],[233,149,2],[231,143,2],[232,149,2]]},{\"Name\":\"n\",\"Points\":[[196,218,1],[195,221,1],[195,227,1],[197,239,1],[199,253,1],[201,267,1],[203,280,1],[204,289,1],[205,296,1],[206,298,1],[207,301,1],[208,301,1],[212,297,1],[216,284,1],[220,273,1],[226,258,1],[230,249,1],[236,240,1],[246,232,1],[255,228,1],[263,226,1],[273,226,1],[282,228,1],[289,235,1],[294,243,1],[298,250,1],[301,257,1],[304,268,1],[306,275,1],[306,284,1],[307,293,1],[308,299,1],[309,304,1],[310,308,1],[311,311,1],[312,311,1],[315,311,1]]},{\"Name\":\"o\",\"Points\":[[256,230,1],[252,215,1],[251,209,1],[248,205,1],[245,203,1],[237,202,1],[226,204,1],[216,212,1],[207,223,1],[200,237,1],[196,255,1],[195,273,1],[195,289,1],[200,301,1],[209,311,1],[223,317,1],[239,317,1],[255,313,1],[272,300,1],[282,288,1],[289,273,1],[291,258,1],[291,246,1],[288,235,1],[280,228,1],[271,222,1],[263,218,1],[255,218,1],[248,218,1],[241,219,1]]},{\"Name\":\"s\",\"Points\":[[282,226,1],[269,208,1],[263,206,1],[252,206,1],[241,207,1],[230,212,1],[223,218,1],[218,224,1],[218,232,1],[221,241,1],[233,252,1],[252,261,1],[270,270,1],[284,275,1],[297,281,1],[306,285,1],[310,288,1],[311,289,1],[311,290,1],[299,290,1],[284,290,1],[264,290,1],[244,290,1],[226,289,1],[209,286,1],[198,283,1],[188,279,1],[182,277,1],[180,275,1],[180,275,1]]},{\"Name\":\"t\",\"Points\":[[239,136,1],[238,149,1],[238,167,1],[237,189,1],[233,216,1],[231,236,1],[228,256,1],[227,270,1],[227,285,1],[227,297,1],[231,306,1],[236,312,1],[242,316,1],[250,316,1],[260,316,1],[271,314,1],[279,311,1],[287,309,1],[292,306,1],[190,230,2],[203,229,2],[216,229,2],[231,229,2],[252,230,2],[271,230,2],[291,230,2],[307,230,2]]},{\"Name\":\"+\",\"Points\":[[227,214,1],[230,219,1],[231,230,1],[231,245,1],[232,263,1],[233,277,1],[235,290,1],[236,297,1],[237,302,1],[238,306,1],[239,310,1],[239,312,1],[196,269,2],[204,269,2],[212,270,2],[225,271,2],[238,272,2],[251,272,2],[264,272,2],[272,271,2],[279,270,2],[284,269,2],[289,269,2],[291,269,2],[292,270,2]]},{\"Name\":\"-\",\"Points\":[[155,270,1],[168,268,1],[182,268,1],[203,268,1],[222,268,1],[241,268,1],[258,268,1],[270,267,1],[281,266,1],[289,265,1],[295,265,1],[301,265,1],[306,265,1]]},{\"Name\":\"/\",\"Points\":[[302,142,1],[297,151,1],[292,163,1],[284,179,1],[273,199,1],[264,221,1],[251,242,1],[240,262,1],[229,281,1],[218,299,1],[209,316,1],[203,328,1],[197,338,1],[194,343,1],[191,346,1],[190,348,1],[195,348,1],[204,348,1]]},{\"Name\":\"(\",\"Points\":[[257,130,1],[248,140,1],[239,153,1],[226,171,1],[213,190,1],[204,210,1],[199,228,1],[196,247,1],[197,265,1],[203,283,1],[211,297,1],[221,309,1],[229,317,1],[236,321,1],[242,325,1],[247,326,1],[249,326,1],[251,326,1],[253,326,1],[255,326,1]]},{\"Name\":\")\",\"Points\":[[266,114,1],[278,120,1],[291,136,1],[301,154,1],[311,174,1],[318,195,1],[322,211,1],[324,226,1],[325,240,1],[323,252,1],[315,265,1],[306,275,1],[295,286,1],[285,296,1],[278,300,1],[273,303,1],[270,305,1],[269,305,1],[276,305,1]]},{\"Name\":\"|\",\"Points\":[[248,106,1],[250,108,1],[250,119,1],[250,136,1],[252,154,1],[255,174,1],[257,195,1],[260,218,1],[261,237,1],[263,252,1],[264,266,1],[265,278,1],[266,287,1],[267,293,1],[268,297,1],[269,301,1],[269,302,1],[269,305,1],[269,306,1],[269,307,1]]},{\"Name\":\"sqrt\",\"Points\":[[94,234,1],[97,240,1],[107,251,1],[119,267,1],[132,283,1],[143,297,1],[153,308,1],[161,318,1],[169,323,1],[176,328,1],[179,330,1],[181,331,1],[181,327,1],[177,318,1],[171,303,1],[165,288,1],[159,270,1],[153,249,1],[147,228,1],[143,206,1],[140,186,1],[138,166,1],[137,150,1],[135,136,1],[134,125,1],[134,117,1],[134,113,1],[138,110,1],[149,110,1],[162,110,1],[181,110,1],[200,110,1],[219,108,1],[237,105,1],[254,100,1],[267,97,1],[275,96,1],[282,95,1],[284,95,1],[286,95,1],[286,101,1],[282,113,1],[278,129,1],[275,145,1],[274,165,1],[274,186,1],[275,204,1],[276,214,1],[278,223,1],[279,228,1],[280,231,1],[283,234,1]]},{\"Name\":\"x\",\"Points\":[[283,208,1],[279,215,1],[270,226,1],[260,237,1],[245,251,1],[231,265,1],[219,275,1],[208,285,1],[199,293,1],[194,298,1],[190,301,1],[189,303,1],[222,217,2],[230,223,2],[236,230,2],[246,241,2],[254,252,2],[263,261,2],[270,269,2],[278,275,2],[285,279,2],[291,283,2],[295,286,2],[298,288,2],[301,289,2]]},{\"Name\":\"y\",\"Points\":[[192,194,1],[197,199,1],[204,209,1],[212,223,1],[221,238,1],[227,249,1],[234,256,1],[239,262,1],[245,268,1],[249,272,1],[250,274,1],[251,275,1],[279,210,2],[278,212,2],[278,220,2],[277,235,2],[270,251,2],[260,272,2],[248,290,2],[238,303,2],[230,317,2],[225,326,2],[220,338,2],[217,343,2],[216,349,2],[215,352,2],[215,353,2],[216,353,2],[220,353,2]]}]');
+
+ if (pointCloudsRaw !== null) {
+
+ this.pointCloudsRaw = this.pointCloudsRaw.concat(pointCloudsRaw);
+ for (i = 0; i < pointCloudsRaw.length; ++i) {
+ this.recognizerP.AddGesture(
+ pointCloudsRaw[i].Name,
+ this.convertPoints(pointCloudsRaw[i].Points, 'p')
+ );
+
+ le = pointCloudsRaw[i].Points.length;
+ if (pointCloudsRaw[i].Points[le - 1][2] === 1) { // unistroke gesture
+ this.recognizerN.AddGesture(
+ pointCloudsRaw[i].Name,
+ true,
+ [this.convertPoints(pointCloudsRaw[i].Points)]
+ );
+ }
+ }
+ }
+
+ for (i = 0; i < this.recognizerP.PointClouds.length; ++i) {
+ le = this.recognizerP.PointClouds[i].Points.length;
+ this.recognizerP.PointClouds[i].NrStrokes = this.recognizerP.PointClouds[i].Points[le - 1].ID;
+ }
+};
diff --git a/Sketchometry.activity/3dparty/hwr/ndollar.js b/Sketchometry.activity/3dparty/hwr/ndollar.js
new file mode 100644
index 0000000..e5a0396
--- /dev/null
+++ b/Sketchometry.activity/3dparty/hwr/ndollar.js
@@ -0,0 +1,499 @@
+/**
+ * The $N Multistroke Recognizer (JavaScript version)
+ *
+ * Lisa Anthony, Ph.D.
+ * UMBC
+ * Information Systems Department
+ * 1000 Hilltop Circle
+ * Baltimore, MD 21250
+ * lanthony@umbc.edu
+ *
+ * Jacob O. Wobbrock, Ph.D.
+ * The Information School
+ * University of Washington
+ * Seattle, WA 98195-2840
+ * wobbrock@uw.edu
+ *
+ * The academic publications for the $N recognizer, and what should be
+ * used to cite it, are:
+ *
+ * Anthony, L. and Wobbrock, J.O. (2010). A lightweight multistroke
+ * recognizer for user interface prototypes. Proceedings of Graphics
+ * Interface (GI '10). Ottawa, Ontario (May 31-June 2, 2010). Toronto,
+ * Ontario: Canadian Information Processing Society, pp. 245-252.
+ *
+ * Anthony, L. and Wobbrock, J.O. (2012). $N-Protractor: A fast and
+ * accurate multistroke recognizer. Proceedings of Graphics Interface
+ * (GI '12). Toronto, Ontario (May 28-30, 2012). Toronto, Ontario:
+ * Canadian Information Processing Society, pp. 117-120.
+ *
+ * The Protractor enhancement was separately published by Yang Li and programmed
+ * here by Jacob O. Wobbrock and Lisa Anthony:
+ *
+ * Li, Y. (2010). Protractor: A fast and accurate gesture
+ * recognizer. Proceedings of the ACM Conference on Human
+ * Factors in Computing Systems (CHI '10). Atlanta, Georgia
+ * (April 10-15, 2010). New York: ACM Press, pp. 2169-2172.
+ *
+ * This software is distributed under the "New BSD License" agreement:
+ *
+ * Copyright (C) 2007-2011, Jacob O. Wobbrock and Lisa Anthony.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the names of UMBC nor the University of Washington,
+ * nor the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Lisa Anthony OR Jacob O. Wobbrock
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+**/
+//
+// NDollarRecognizer class
+//
+JXGHWR_NDollarRecognizer = function(useBoundedRotationInvariance) // constructor
+{
+ //
+ // one predefined multistroke for each multistroke type
+ //
+ this.Multistrokes = []; //new Array(NumMultistrokes);
+
+ //
+ // Point class
+ //
+ var Point = function (x, y) // constructor
+ {
+ this.X = x;
+ this.Y = y;
+ };
+
+ //
+ // Rectangle class
+ //
+ var Rectangle = function (x, y, width, height) // constructor
+ {
+ this.X = x;
+ this.Y = y;
+ this.Width = width;
+ this.Height = height;
+ };
+
+ //
+ // Result class
+ //
+ this.Result = function (name, score) // constructor
+ {
+ this.Name = name;
+ this.Score = score;
+ };
+
+ //
+ // Private helper functions from this point down
+ //
+ var Round = function (n,d) { d = Math.pow(10,d); return Math.round(n*d)/d; }; // round 'n' to 'd' decimals
+
+ var Deg2Rad = function (d) { return (d * Math.PI / 180.0); };
+
+ //
+ // NDollarRecognizer class constants
+ //
+ var NumMultistrokes = 16;
+ var NumPoints = 96;
+ var SquareSize = 250.0;
+ var OneDThreshold = 0.25; // customize to desired gesture set (usually 0.20 - 0.35)
+ var Origin = new Point(0,0);
+ var Diagonal = Math.sqrt(SquareSize * SquareSize + SquareSize * SquareSize);
+ var HalfDiagonal = 0.5 * Diagonal;
+ var AngleRange = Deg2Rad(15.0); // 45
+ var AnglePrecision = Deg2Rad(2.0);
+ var Phi = 0.5 * (-1.0 + Math.sqrt(5.0)); // Golden Ratio
+ var StartAngleIndex = (NumPoints / 8); // eighth of gesture length
+ var AngleSimilarityThreshold = Deg2Rad(30.0);
+
+ var HeapPermute = function (n, order, /*out*/ orders)
+ {
+ if (n == 1)
+ {
+ orders[orders.length] = order.slice(); // append copy
+ }
+ else
+ {
+ for (var i = 0; i < n; i++)
+ {
+ HeapPermute(n - 1, order, orders);
+ if (n % 2 == 1) // swap 0, n-1
+ {
+ var tmp = order[0];
+ order[0] = order[n - 1];
+ order[n - 1] = tmp;
+ }
+ else // swap i, n-1
+ {
+ var tmp = order[i];
+ order[i] = order[n - 1];
+ order[n - 1] = tmp;
+ }
+ }
+ }
+ };
+
+ var MakeUnistrokes = function (strokes, orders)
+ {
+ var unistrokes = new Array(); // array of point arrays
+ for (var r = 0; r < orders.length; r++)
+ {
+ for (var b = 0; b < Math.pow(2, orders[r].length); b++) // use b's bits for directions
+ {
+ var unistroke = new Array(); // array of points
+ for (var i = 0; i < orders[r].length; i++)
+ {
+ var pts;
+ if (((b >> i) & 1) == 1) { // is b's bit at index i on?
+ pts = strokes[orders[r][i]].slice().reverse(); // copy and reverse
+ } else {
+ pts = strokes[orders[r][i]].slice(); // copy
+ }
+ for (var p = 0; p < pts.length; p++) {
+ unistroke[unistroke.length] = pts[p]; // append points
+ }
+ }
+ unistrokes[unistrokes.length] = unistroke; // add one unistroke to set
+ }
+ }
+ return unistrokes;
+ };
+
+ var CombineStrokes = function (strokes)
+ {
+ var points = new Array();
+ for (var s = 0; s < strokes.length; s++) {
+ for (var p = 0; p < strokes[s].length; p++) {
+ points[points.length] = new Point(strokes[s][p].X, strokes[s][p].Y);
+ }
+ }
+ return points;
+ };
+
+ var Resample = function (points, n)
+ {
+ var I = PathLength(points) / (n - 1); // interval length
+ var D = 0.0;
+ var newpoints = new Array(points[0]);
+ for (var i = 1; i < points.length; i++)
+ {
+ var d = Distance(points[i - 1], points[i]);
+ if ((D + d) >= I)
+ {
+ var qx = points[i - 1].X + ((I - D) / d) * (points[i].X - points[i - 1].X);
+ var qy = points[i - 1].Y + ((I - D) / d) * (points[i].Y - points[i - 1].Y);
+ var q = new Point(qx, qy);
+ newpoints[newpoints.length] = q; // append new point 'q'
+ points.splice(i, 0, q); // insert 'q' at position i in points s.t. 'q' will be the next i
+ D = 0.0;
+ }
+ else D += d;
+ }
+ if (newpoints.length == n - 1) // somtimes we fall a rounding-error short of adding the last point, so add it if so
+ newpoints[newpoints.length] = new Point(points[points.length - 1].X, points[points.length - 1].Y);
+ return newpoints;
+ };
+
+ var IndicativeAngle = function (points)
+ {
+ var c = Centroid(points);
+ return Math.atan2(c.Y - points[0].Y, c.X - points[0].X);
+ };
+
+ var RotateBy = function (points, radians) // rotates points around centroid
+ {
+ var c = Centroid(points);
+ var cos = Math.cos(radians);
+ var sin = Math.sin(radians);
+ var newpoints = new Array();
+ for (var i = 0; i < points.length; i++) {
+ var qx = (points[i].X - c.X) * cos - (points[i].Y - c.Y) * sin + c.X;
+ var qy = (points[i].X - c.X) * sin + (points[i].Y - c.Y) * cos + c.Y;
+ newpoints[newpoints.length] = new Point(qx, qy);
+ }
+ return newpoints;
+ };
+
+ var ScaleDimTo = function (points, size, ratio1D) // scales bbox uniformly for 1D, non-uniformly for 2D
+ {
+ var B = BoundingBox(points);
+ var uniformly = Math.min(B.Width / B.Height, B.Height / B.Width) <= ratio1D; // 1D or 2D gesture test
+ var newpoints = new Array();
+ for (var i = 0; i < points.length; i++) {
+ var qx = uniformly ? points[i].X * (size / Math.max(B.Width, B.Height)) : points[i].X * (size / B.Width);
+ var qy = uniformly ? points[i].Y * (size / Math.max(B.Width, B.Height)) : points[i].Y * (size / B.Height);
+ newpoints[newpoints.length] = new Point(qx, qy);
+ }
+ return newpoints;
+ };
+
+ var TranslateTo = function (points, pt) // translates points' centroid
+ {
+ var c = Centroid(points);
+ var newpoints = new Array();
+ for (var i = 0; i < points.length; i++) {
+ var qx = points[i].X + pt.X - c.X;
+ var qy = points[i].Y + pt.Y - c.Y;
+ newpoints[newpoints.length] = new Point(qx, qy);
+ }
+ return newpoints;
+ };
+
+ var Vectorize = function (points, useBoundedRotationInvariance) // for Protractor
+ {
+ var cos = 1.0;
+ var sin = 0.0;
+ if (useBoundedRotationInvariance) {
+ var iAngle = Math.atan2(points[0].Y, points[0].X);
+ var baseOrientation = (Math.PI / 4.0) * Math.floor((iAngle + Math.PI / 8.0) / (Math.PI / 4.0));
+ cos = Math.cos(baseOrientation - iAngle);
+ sin = Math.sin(baseOrientation - iAngle);
+ }
+ var sum = 0.0;
+ var vector = new Array();
+ for (var i = 0; i < points.length; i++) {
+ var newX = points[i].X * cos - points[i].Y * sin;
+ var newY = points[i].Y * cos + points[i].X * sin;
+ vector[vector.length] = newX;
+ vector[vector.length] = newY;
+ sum += newX * newX + newY * newY;
+ }
+ var magnitude = Math.sqrt(sum);
+ for (var i = 0; i < vector.length; i++)
+ vector[i] /= magnitude;
+ return vector;
+ };
+
+ var OptimalCosineDistance = function (v1, v2) // for Protractor
+ {
+ var a = 0.0;
+ var b = 0.0;
+ for (var i = 0; i < v1.length; i += 2) {
+ a += v1[i] * v2[i] + v1[i + 1] * v2[i + 1];
+ b += v1[i] * v2[i + 1] - v1[i + 1] * v2[i];
+ }
+ var angle = Math.atan(b / a);
+ return Math.acos(a * Math.cos(angle) + b * Math.sin(angle));
+ };
+
+ var DistanceAtBestAngle = function (points, T, a, b, threshold)
+ {
+ var x1 = Phi * a + (1.0 - Phi) * b;
+ var f1 = DistanceAtAngle(points, T, x1);
+ var x2 = (1.0 - Phi) * a + Phi * b;
+ var f2 = DistanceAtAngle(points, T, x2);
+ while (Math.abs(b - a) > threshold)
+ {
+ if (f1 < f2) {
+ b = x2;
+ x2 = x1;
+ f2 = f1;
+ x1 = Phi * a + (1.0 - Phi) * b;
+ f1 = DistanceAtAngle(points, T, x1);
+ } else {
+ a = x1;
+ x1 = x2;
+ f1 = f2;
+ x2 = (1.0 - Phi) * a + Phi * b;
+ f2 = DistanceAtAngle(points, T, x2);
+ }
+ }
+ return Math.min(f1, f2);
+ };
+
+ var DistanceAtAngle = function (points, T, radians)
+ {
+ var newpoints = RotateBy(points, radians);
+ return PathDistance(newpoints, T.Points);
+ };
+
+ var Centroid = function (points)
+ {
+ var x = 0.0, y = 0.0;
+ for (var i = 0; i < points.length; i++) {
+ x += points[i].X;
+ y += points[i].Y;
+ }
+ x /= points.length;
+ y /= points.length;
+ return new Point(x, y);
+ };
+
+ var BoundingBox = function (points)
+ {
+ var minX = +Infinity, maxX = -Infinity, minY = +Infinity, maxY = -Infinity;
+ for (var i = 0; i < points.length; i++) {
+ minX = Math.min(minX, points[i].X);
+ minY = Math.min(minY, points[i].Y);
+ maxX = Math.max(maxX, points[i].X);
+ maxY = Math.max(maxY, points[i].Y);
+ }
+ return new Rectangle(minX, minY, maxX - minX, maxY - minY);
+ };
+
+ var PathDistance = function (pts1, pts2) // average distance between corresponding points in two paths
+ {
+ var d = 0.0;
+ for (var i = 0; i < pts1.length; i++) // assumes pts1.length == pts2.length
+ d += Distance(pts1[i], pts2[i]);
+ return d / pts1.length;
+ };
+
+ var PathLength = function (points) // length traversed by a point path
+ {
+ var d = 0.0;
+ for (var i = 1; i < points.length; i++)
+ d += Distance(points[i - 1], points[i]);
+ return d;
+ };
+
+ var Distance = function (p1, p2) // distance between two points
+ {
+ var dx = p2.X - p1.X;
+ var dy = p2.Y - p1.Y;
+ return Math.sqrt(dx * dx + dy * dy);
+ };
+
+ var CalcStartUnitVector = function (points, index) // start angle from points[0] to points[index] normalized as a unit vector
+ {
+ var v = new Point(points[index].X - points[0].X, points[index].Y - points[0].Y);
+ var len = Math.sqrt(v.X * v.X + v.Y * v.Y);
+ return new Point(v.X / len, v.Y / len);
+ };
+
+ var AngleBetweenUnitVectors = function (v1, v2) // gives acute angle between unit vectors from (0,0) to v1, and (0,0) to v2
+ {
+ var n = (v1.X * v2.X + v1.Y * v2.Y);
+ if (n < -1.0 || n > +1.0)
+ n = Round(n, 5); // fix: JavaScript rounding bug that can occur so that -1 <= n <= +1
+ return Math.acos(n); // arc cosine of the vector dot product
+ };
+
+
+ //
+ // Unistroke class: a unistroke template
+ //
+ var Unistroke = function (name, useBoundedRotationInvariance, points) // constructor
+ {
+ this.Name = name;
+ this.Points = Resample(points, NumPoints);
+ var radians = IndicativeAngle(this.Points);
+ this.Points = RotateBy(this.Points, -radians);
+ this.Points = ScaleDimTo(this.Points, SquareSize, OneDThreshold);
+ if (useBoundedRotationInvariance)
+ this.Points = RotateBy(this.Points, +radians); // restore
+ this.Points = TranslateTo(this.Points, Origin);
+ this.StartUnitVector = CalcStartUnitVector(this.Points, StartAngleIndex);
+ this.Vector = Vectorize(this.Points, useBoundedRotationInvariance); // for Protractor
+ };
+
+ //
+ // Multistroke class: a container for unistrokes
+ //
+ this.Multistroke = function (name, useBoundedRotationInvariance, strokes) // constructor
+ {
+ this.Name = name;
+ this.NumStrokes = strokes.length; // number of individual strokes
+
+ var order = new Array(strokes.length); // array of integer indices
+ for (var i = 0; i < strokes.length; i++)
+ order[i] = i; // initialize
+ var orders = new Array(); // array of integer arrays
+ HeapPermute(strokes.length, order, /*out*/ orders);
+
+ var unistrokes = MakeUnistrokes(strokes, orders); // returns array of point arrays
+ this.Unistrokes = new Array(unistrokes.length); // unistrokes for this multistroke
+ for (var j = 0; j < unistrokes.length; j++)
+ this.Unistrokes[j] = new Unistroke(name, useBoundedRotationInvariance, unistrokes[j]);
+ };
+
+ //
+ // The $N Gesture Recognizer API begins here -- 3 methods: Recognize(), AddGesture(), and DeleteUserGestures()
+ //
+ this.Recognize = function(strokes, useBoundedRotationInvariance, requireSameNoOfStrokes, useProtractor, goodList)
+ {
+ var points = CombineStrokes(strokes); // make one connected unistroke from the given strokes
+ points = Resample(points, NumPoints);
+ var radians = IndicativeAngle(points);
+ points = RotateBy(points, -radians);
+ points = ScaleDimTo(points, SquareSize, OneDThreshold);
+ if (useBoundedRotationInvariance)
+ points = RotateBy(points, +radians); // restore
+ points = TranslateTo(points, Origin);
+ var startv = CalcStartUnitVector(points, StartAngleIndex);
+ var vector = Vectorize(points, useBoundedRotationInvariance); // for Protractor
+
+ var b = +Infinity;
+ var u = -1;
+ for (var i = 0; i < this.Multistrokes.length; i++) // for each multistroke
+ {
+ if (typeof goodList !== 'undefined') {
+ var skip = true;
+ for (var k = 0; k < goodList.length; k++) {
+ if (this.Multistrokes[i].Name === goodList[k]) {
+ skip = false;
+ break;
+ }
+ }
+ if (skip) {
+ continue;
+ }
+ }
+
+ if (!requireSameNoOfStrokes || strokes.length == this.Multistrokes[i].NumStrokes) // optional -- only attempt match when same # of component strokes
+ {
+ for (var j = 0; j < this.Multistrokes[i].Unistrokes.length; j++) // each unistroke within this multistroke
+ {
+ if (AngleBetweenUnitVectors(startv, this.Multistrokes[i].Unistrokes[j].StartUnitVector) <= AngleSimilarityThreshold) // strokes start in the same direction
+ {
+ var d;
+ if (useProtractor) // for Protractor
+ d = OptimalCosineDistance(this.Multistrokes[i].Unistrokes[j].Vector, vector);
+ else // Golden Section Search (original $N)
+ d = DistanceAtBestAngle(points, this.Multistrokes[i].Unistrokes[j], -AngleRange, +AngleRange, AnglePrecision);
+ if (d < b) {
+ b = d; // best (least) distance
+ u = i; // multistroke owner of unistroke
+ }
+ }
+ }
+ }
+ }
+ return (u == -1) ? new this.Result("No match.", 0.0) : new this.Result(this.Multistrokes[u].Name, useProtractor ? 1.0 / b : 1.0 - b / HalfDiagonal);
+ };
+ this.AddGesture = function(name, useBoundedRotationInvariance, strokes)
+ {
+ this.Multistrokes[this.Multistrokes.length] = new this.Multistroke(name, useBoundedRotationInvariance, strokes);
+ var num = 0;
+ for (var i = 0; i < this.Multistrokes.length; i++) {
+ if (this.Multistrokes[i].Name == name)
+ num++;
+ }
+ return num;
+ };
+ this.DeleteUserGestures = function()
+ {
+ this.Multistrokes.length = NumMultistrokes; // clear any beyond the original set
+ return NumMultistrokes;
+ }
+};
diff --git a/Sketchometry.activity/3dparty/hwr/pdollar.js b/Sketchometry.activity/3dparty/hwr/pdollar.js
new file mode 100644
index 0000000..78324d2
--- /dev/null
+++ b/Sketchometry.activity/3dparty/hwr/pdollar.js
@@ -0,0 +1,312 @@
+/**
+ * The $P Point-Cloud Recognizer (JavaScript version)
+ *
+ * Radu-Daniel Vatavu, Ph.D.
+ * University Stefan cel Mare of Suceava
+ * Suceava 720229, Romania
+ * vatavu@eed.usv.ro
+ *
+ * Lisa Anthony, Ph.D.
+ * UMBC
+ * Information Systems Department
+ * 1000 Hilltop Circle
+ * Baltimore, MD 21250
+ * lanthony@umbc.edu
+ *
+ * Jacob O. Wobbrock, Ph.D.
+ * The Information School
+ * University of Washington
+ * Seattle, WA 98195-2840
+ * wobbrock@uw.edu
+ *
+ * The academic publication for the $P recognizer, and what should be
+ * used to cite it, is:
+ *
+ * Vatavu, R.-D., Anthony, L. and Wobbrock, J.O. (2012).
+ * Gestures as point clouds: A $P recognizer for user interface
+ * prototypes. Proceedings of the ACM Int'l Conference on
+ * Multimodal Interfaces (ICMI '12). Santa Monica, California
+ * (October 22-26, 2012). New York: ACM Press, pp. 273-280.
+ *
+ * This software is distributed under the "New BSD License" agreement:
+ *
+ * Copyright (c) 2012, Radu-Daniel Vatavu, Lisa Anthony, and
+ * Jacob O. Wobbrock. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the names of the University Stefan cel Mare of Suceava,
+ * University of Washington, nor UMBC, nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Radu-Daniel Vatavu OR Lisa Anthony
+ * OR Jacob O. Wobbrock BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+**/
+
+//
+// PDollarRecognizer class
+//
+JXGHWR_PDollarRecognizer = function () // constructor
+{
+
+ //
+ // Point class
+ //
+ var Point = function (x, y, id) // constructor
+ {
+ this.X = x;
+ this.Y = y;
+ this.ID = id; // stroke ID to which this point belongs (1,2,...)
+ };
+
+ //
+ // Private helper functions from this point down
+ //
+ var Distance = function (p1, p2) // Euclidean distance between two points
+ {
+ var dx = p2.X - p1.X;
+ var dy = p2.Y - p1.Y;
+ return Math.sqrt(dx * dx + dy * dy);
+ };
+
+ var CloudDistance = function (pts1, pts2, start)
+ {
+ var matched = new Array(pts1.length); // pts1.length == pts2.length
+ for (var k = 0; k < pts1.length; k++)
+ matched[k] = false;
+ var sum = 0;
+ var i = start;
+ do
+ {
+ var index = -1;
+ var min = +Infinity;
+ for (var j = 0; j < matched.length; j++)
+ {
+ if (!matched[j]) {
+ var d = Distance(pts1[i], pts2[j]);
+ if (d < min) {
+ min = d;
+ index = j;
+ }
+ }
+ }
+ matched[index] = true;
+ var weight = 1 - ((i - start + pts1.length) % pts1.length) / pts1.length;
+ sum += weight * min;
+ i = (i + 1) % pts1.length;
+ } while (i != start);
+ return sum;
+ };
+
+ var Centroid = function (points)
+ {
+ var x = 0.0, y = 0.0;
+ for (var i = 0; i < points.length; i++) {
+ x += points[i].X;
+ y += points[i].Y;
+ }
+ x /= points.length;
+ y /= points.length;
+ return new Point(x, y, 0);
+ };
+
+ var PathDistance = function (pts1, pts2) // average distance between corresponding points in two paths
+ {
+ var d = 0.0;
+ for (var i = 0; i < pts1.length; i++) // assumes pts1.length == pts2.length
+ d += Distance(pts1[i], pts2[i]);
+ return d / pts1.length;
+ };
+
+ var PathLength = function (points) // length traversed by a point path
+ {
+ var d = 0.0;
+ for (var i = 1; i < points.length; i++)
+ {
+ if (points[i].ID == points[i-1].ID)
+ d += Distance(points[i - 1], points[i]);
+ }
+ return d;
+ };
+
+ var GreedyCloudMatch = function (points, P)
+ {
+ var e = 0.50;
+ var step = Math.floor(Math.pow(points.length, 1 - e));
+ var min = +Infinity;
+ for (var i = 0; i < points.length; i += step) {
+ var d1 = CloudDistance(points, P.Points, i);
+ var d2 = CloudDistance(P.Points, points, i);
+ min = Math.min(min, Math.min(d1, d2)); // min3
+ }
+ return min;
+ };
+
+
+ var Resample = function (points, n)
+ {
+ var I = PathLength(points) / (n - 1); // interval length
+ var D = 0.0;
+ var newpoints = new Array(points[0]);
+ for (var i = 1; i < points.length; i++)
+ {
+ if (points[i].ID == points[i-1].ID)
+ {
+ var d = Distance(points[i - 1], points[i]);
+ if ((D + d) >= I)
+ {
+ var qx = points[i - 1].X + ((I - D) / d) * (points[i].X - points[i - 1].X);
+ var qy = points[i - 1].Y + ((I - D) / d) * (points[i].Y - points[i - 1].Y);
+ var q = new Point(qx, qy, points[i].ID);
+
+ newpoints[newpoints.length] = q; // append new point 'q'
+ points.splice(i, 0, q); // insert 'q' at position i in points s.t. 'q' will be the next i
+ D = 0.0;
+ }
+ else D += d;
+ }
+ }
+ if (newpoints.length == n - 1) // sometimes we fall a rounding-error short of adding the last point, so add it if so
+ newpoints[newpoints.length] = new Point(points[points.length - 1].X, points[points.length - 1].Y, points[points.length - 1].ID);
+ return newpoints;
+ };
+
+ var Scale = function (points)
+ {
+ var minX = +Infinity, maxX = -Infinity, minY = +Infinity, maxY = -Infinity;
+ for (var i = 0; i < points.length; i++) {
+ minX = Math.min(minX, points[i].X);
+ minY = Math.min(minY, points[i].Y);
+ maxX = Math.max(maxX, points[i].X);
+ maxY = Math.max(maxY, points[i].Y);
+ }
+ var size = Math.max(maxX - minX, maxY - minY);
+ var newpoints = new Array();
+ for (var i = 0; i < points.length; i++) {
+ var qx = (points[i].X - minX) / size;
+ var qy = (points[i].Y - minY) / size;
+ newpoints[newpoints.length] = new Point(qx, qy, points[i].ID);
+ }
+ return newpoints;
+ };
+
+ var TranslateTo = function (points, pt) // translates points' centroid
+ {
+ var c = Centroid(points);
+ var newpoints = new Array();
+ for (var i = 0; i < points.length; i++) {
+ var qx = points[i].X + pt.X - c.X;
+ var qy = points[i].Y + pt.Y - c.Y;
+ newpoints[newpoints.length] = new Point(qx, qy, points[i].ID);
+ }
+ return newpoints;
+ };
+
+ //
+ // PointCloud class: a point-cloud template
+ //
+ this.PointCloud = function (name, points) // constructor
+ {
+ this.Name = name;
+ this.Points = Resample(points, NumPoints);
+ this.Points = Scale(this.Points);
+ this.Points = TranslateTo(this.Points, Origin);
+ };
+
+ //
+ // Result class
+ //
+ this.Result = function (name, score) // constructor
+ {
+ this.Name = name;
+ this.Score = score;
+ };
+
+ //
+ // PDollarRecognizer class constants
+ //
+ var NumPointClouds = 16;
+ var NumPoints = 32;
+ var Origin = new Point(0,0,0);
+
+ //
+ // one predefined point-cloud for each gesture
+ //
+ this.PointClouds = []; //new Array(NumPointClouds);
+
+ //
+ // The $P Point-Cloud Recognizer API begins here -- 3 methods: Recognize(), AddGesture(), DeleteUserGestures()
+ //
+ this.Recognize = function(points, goodList)
+ {
+ var nrStrokes = points.NrStrokes;
+
+ points = Resample(points, NumPoints);
+ points = Scale(points);
+ points = TranslateTo(points, Origin);
+
+ var b = +Infinity;
+ var u = -1;
+ for (var i = 0; i < this.PointClouds.length; i++) // for each point-cloud template
+ {
+ // Require same number of strokes
+ if (nrStrokes !== this.PointClouds[i].NrStrokes) {
+ continue;
+ }
+ if (typeof goodList !== 'undefined') {
+ var skip = true;
+ for (var k = 0; k < goodList.length; k++) {
+ if (this.PointClouds[i].Name === goodList[k]) {
+ skip = false;
+ break;
+ }
+ }
+ if (skip) {
+ continue;
+ }
+ }
+
+ var d = GreedyCloudMatch(points, this.PointClouds[i]);
+ if (d < b) {
+ b = d; // best (least) distance
+ u = i; // point-cloud
+ }
+ }
+ return (u == -1) ? new Result("No match.", 0.0) : new this.Result(this.PointClouds[u].Name, Math.max((b - 2.0) / -2.0, 0.0));
+ };
+
+ this.AddGesture = function(name, points)
+ {
+ this.PointClouds[this.PointClouds.length] = new this.PointCloud(name, points);
+ var num = 0;
+ for (var i = 0; i < this.PointClouds.length; i++) {
+ if (this.PointClouds[i].Name == name)
+ num++;
+ }
+ return num;
+ };
+
+ this.DeleteUserGestures = function()
+ {
+ this.PointClouds.length = NumPointClouds; // clear any beyond the original set
+ return NumPointClouds;
+ };
+
+};
+
+
diff --git a/Sketchometry.activity/3dparty/jQuery/jquery-1.7.1.min.js b/Sketchometry.activity/3dparty/jQuery/jquery-1.7.1.min.js
new file mode 100644
index 0000000..198b3ff
--- /dev/null
+++ b/Sketchometry.activity/3dparty/jQuery/jquery-1.7.1.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file
diff --git a/Sketchometry.activity/3dparty/jQuery/jquery.jsonp.js b/Sketchometry.activity/3dparty/jQuery/jquery.jsonp.js
new file mode 100644
index 0000000..2abeef7
--- /dev/null
+++ b/Sketchometry.activity/3dparty/jQuery/jquery.jsonp.js
@@ -0,0 +1,285 @@
+/*
+ * jQuery JSONP Core Plugin 2.4.0 (2012-08-21)
+ *
+ * https://github.com/jaubourg/jquery-jsonp
+ *
+ * Copyright (c) 2012 Julian Aubourg
+ *
+ * This document is licensed as free software under the terms of the
+ * MIT License: http://www.opensource.org/licenses/mit-license.php
+ */
+( function( $ ) {
+
+ // ###################### UTILITIES ##
+
+ // Noop
+ function noop() {
+ }
+
+ // Generic callback
+ function genericCallback( data ) {
+ lastValue = [ data ];
+ }
+
+ // Call if defined
+ function callIfDefined( method , object , parameters ) {
+ return method && method.apply( object.context || object , parameters );
+ }
+
+ // Give joining character given url
+ function qMarkOrAmp( url ) {
+ return /\?/ .test( url ) ? "&" : "?";
+ }
+
+ var // String constants (for better minification)
+ STR_ASYNC = "async",
+ STR_CHARSET = "charset",
+ STR_EMPTY = "",
+ STR_ERROR = "error",
+ STR_INSERT_BEFORE = "insertBefore",
+ STR_JQUERY_JSONP = "_jqjsp",
+ STR_ON = "on",
+ STR_ON_CLICK = STR_ON + "click",
+ STR_ON_ERROR = STR_ON + STR_ERROR,
+ STR_ON_LOAD = STR_ON + "load",
+ STR_ON_READY_STATE_CHANGE = STR_ON + "readystatechange",
+ STR_READY_STATE = "readyState",
+ STR_REMOVE_CHILD = "removeChild",
+ STR_SCRIPT_TAG = "<script>",
+ STR_SUCCESS = "success",
+ STR_TIMEOUT = "timeout",
+
+ // Window
+ win = window,
+ // Deferred
+ Deferred = $.Deferred,
+ // Head element
+ head = $( "head" )[ 0 ] || document.documentElement,
+ // Page cache
+ pageCache = {},
+ // Counter
+ count = 0,
+ // Last returned value
+ lastValue,
+
+ // ###################### DEFAULT OPTIONS ##
+ xOptionsDefaults = {
+ //beforeSend: undefined,
+ //cache: false,
+ callback: STR_JQUERY_JSONP,
+ //callbackParameter: undefined,
+ //charset: undefined,
+ //complete: undefined,
+ //context: undefined,
+ //data: "",
+ //dataFilter: undefined,
+ //error: undefined,
+ //pageCache: false,
+ //success: undefined,
+ //timeout: 0,
+ //traditional: false,
+ url: location.href
+ },
+
+ // opera demands sniffing :/
+ opera = win.opera,
+
+ // IE < 10
+ oldIE = !!$( "<div>" ).html( "<!--[if IE]><i><![endif]-->" ).find("i").length;
+
+ // ###################### MAIN FUNCTION ##
+ function jsonp( xOptions ) {
+
+ // Build data with default
+ xOptions = $.extend( {} , xOptionsDefaults , xOptions );
+
+ // References to xOptions members (for better minification)
+ var successCallback = xOptions.success,
+ errorCallback = xOptions.error,
+ completeCallback = xOptions.complete,
+ dataFilter = xOptions.dataFilter,
+ callbackParameter = xOptions.callbackParameter,
+ successCallbackName = xOptions.callback,
+ cacheFlag = xOptions.cache,
+ pageCacheFlag = xOptions.pageCache,
+ charset = xOptions.charset,
+ url = xOptions.url,
+ data = xOptions.data,
+ timeout = xOptions.timeout,
+ pageCached,
+
+ // Abort/done flag
+ done = 0,
+
+ // Life-cycle functions
+ cleanUp = noop,
+
+ // Support vars
+ supportOnload,
+ supportOnreadystatechange,
+
+ // Request execution vars
+ firstChild,
+ script,
+ scriptAfter,
+ timeoutTimer;
+
+ // If we have Deferreds:
+ // - substitute callbacks
+ // - promote xOptions to a promise
+ Deferred && Deferred(function( defer ) {
+ defer.done( successCallback ).fail( errorCallback );
+ successCallback = defer.resolve;
+ errorCallback = defer.reject;
+ }).promise( xOptions );
+
+ // Create the abort method
+ xOptions.abort = function() {
+ !( done++ ) && cleanUp();
+ };
+
+ // Call beforeSend if provided (early abort if false returned)
+ if ( callIfDefined( xOptions.beforeSend , xOptions , [ xOptions ] ) === !1 || done ) {
+ return xOptions;
+ }
+
+ // Control entries
+ url = url || STR_EMPTY;
+ data = data ? ( (typeof data) == "string" ? data : $.param( data , xOptions.traditional ) ) : STR_EMPTY;
+
+ // Build final url
+ url += data ? ( qMarkOrAmp( url ) + data ) : STR_EMPTY;
+
+ // Add callback parameter if provided as option
+ callbackParameter && ( url += qMarkOrAmp( url ) + encodeURIComponent( callbackParameter ) + "=?" );
+
+ // Add anticache parameter if needed
+ !cacheFlag && !pageCacheFlag && ( url += qMarkOrAmp( url ) + "_" + ( new Date() ).getTime() + "=" );
+
+ // Replace last ? by callback parameter
+ url = url.replace( /=\?(&|$)/ , "=" + successCallbackName + "$1" );
+
+ // Success notifier
+ function notifySuccess( json ) {
+
+ if ( !( done++ ) ) {
+
+ cleanUp();
+ // Pagecache if needed
+ pageCacheFlag && ( pageCache [ url ] = { s: [ json ] } );
+ // Apply the data filter if provided
+ dataFilter && ( json = dataFilter.apply( xOptions , [ json ] ) );
+ // Call success then complete
+ callIfDefined( successCallback , xOptions , [ json , STR_SUCCESS, xOptions ] );
+ callIfDefined( completeCallback , xOptions , [ xOptions , STR_SUCCESS ] );
+
+ }
+ }
+
+ // Error notifier
+ function notifyError( type ) {
+
+ if ( !( done++ ) ) {
+
+ // Clean up
+ cleanUp();
+ // If pure error (not timeout), cache if needed
+ pageCacheFlag && type != STR_TIMEOUT && ( pageCache[ url ] = type );
+ // Call error then complete
+ callIfDefined( errorCallback , xOptions , [ xOptions , type ] );
+ callIfDefined( completeCallback , xOptions , [ xOptions , type ] );
+
+ }
+ }
+
+ // Check page cache
+ if ( pageCacheFlag && ( pageCached = pageCache[ url ] ) ) {
+
+ pageCached.s ? notifySuccess( pageCached.s[ 0 ] ) : notifyError( pageCached );
+
+ } else {
+
+ // Install the generic callback
+ // (BEWARE: global namespace pollution ahoy)
+ win[ successCallbackName ] = genericCallback;
+
+ // Create the script tag
+ script = $( STR_SCRIPT_TAG )[ 0 ];
+ script.id = STR_JQUERY_JSONP + count++;
+
+ // Set charset if provided
+ if ( charset ) {
+ script[ STR_CHARSET ] = charset;
+ }
+
+ opera && opera.version() < 11.60 ?
+ // onerror is not supported: do not set as async and assume in-order execution.
+ // Add a trailing script to emulate the event
+ ( ( scriptAfter = $( STR_SCRIPT_TAG )[ 0 ] ).text = "document.getElementById('" + script.id + "')." + STR_ON_ERROR + "()" )
+ :
+ // onerror is supported: set the script as async to avoid requests blocking each others
+ ( script[ STR_ASYNC ] = STR_ASYNC )
+
+ ;
+
+ // Internet Explorer: event/htmlFor trick
+ if ( oldIE ) {
+ script.htmlFor = script.id;
+ script.event = STR_ON_CLICK;
+ }
+
+ // Attached event handlers
+ script[ STR_ON_LOAD ] = script[ STR_ON_ERROR ] = script[ STR_ON_READY_STATE_CHANGE ] = function ( result ) {
+
+ // Test readyState if it exists
+ if ( !script[ STR_READY_STATE ] || !/i/.test( script[ STR_READY_STATE ] ) ) {
+
+ try {
+
+ script[ STR_ON_CLICK ] && script[ STR_ON_CLICK ]();
+
+ } catch( _ ) {}
+
+ result = lastValue;
+ lastValue = 0;
+ result ? notifySuccess( result[ 0 ] ) : notifyError( STR_ERROR );
+
+ }
+ };
+
+ // Set source
+ script.src = url;
+
+ // Re-declare cleanUp function
+ cleanUp = function( i ) {
+ timeoutTimer && clearTimeout( timeoutTimer );
+ script[ STR_ON_READY_STATE_CHANGE ] = script[ STR_ON_LOAD ] = script[ STR_ON_ERROR ] = null;
+ head[ STR_REMOVE_CHILD ]( script );
+ scriptAfter && head[ STR_REMOVE_CHILD ]( scriptAfter );
+ };
+
+ // Append main script
+ head[ STR_INSERT_BEFORE ]( script , ( firstChild = head.firstChild ) );
+
+ // Append trailing script if needed
+ scriptAfter && head[ STR_INSERT_BEFORE ]( scriptAfter , firstChild );
+
+ // If a timeout is needed, install it
+ timeoutTimer = timeout > 0 && setTimeout( function() {
+ notifyError( STR_TIMEOUT );
+ } , timeout );
+
+ }
+
+ return xOptions;
+ }
+
+ // ###################### SETUP FUNCTION ##
+ jsonp.setup = function( xOptions ) {
+ $.extend( xOptionsDefaults , xOptions );
+ };
+
+ // ###################### INSTALL in jQuery ##
+ $.jsonp = jsonp;
+
+} )( jQuery );
diff --git a/Sketchometry.activity/3dparty/jszip/jszip-deflate.min.js b/Sketchometry.activity/3dparty/jszip/jszip-deflate.min.js
new file mode 100644
index 0000000..4584163
--- /dev/null
+++ b/Sketchometry.activity/3dparty/jszip/jszip-deflate.min.js
@@ -0,0 +1 @@
+if(!JSZip){throw"JSZip not defined"}(function(){var ak=32768;var aT=0;var e=1;var bo=2;var bf=6;var N=true;var a5=32768;var bd=64;var bt=1024*8;var aX=2*ak;var X=3;var bs=258;var B=16;var U=8192;var g=13;if(U>a5){alert("error: zip_INBUFSIZ is too small")}if((ak<<1)>(1<<B)){alert("error: zip_WSIZE is too large")}if(g>B-1){alert("error: zip_HASH_BITS is too large")}if(g<8||bs!=258){alert("error: Code too clever")}var a1=U;var au=1<<g;var a6=au-1;var aS=ak-1;var S=0;var V=4096;var bq=bs+X+1;var z=ak-bq;var p=1;var by=15;var aL=7;var aA=29;var K=256;var P=256;var al=K+1+aA;var bn=30;var s=19;var bg=16;var aR=17;var bu=18;var bm=2*al+1;var aD=parseInt((g+X-1)/X);var aq;var bx,i;var L;var aZ=null;var a4,a3;var d;var bl;var c;var an;var y;var aj;var ap;var a7;var ai;var q;var Z;var aa;var aF;var bh;var O;var r;var x;var Y;var I;var aC;var k;var n;var F;var aU;var D;var l;var at;var af;var E;var j;var C;var bb;var f;var m;var aI;var bk;var W;var bp;var br;var az;var M;var a;var aw;var aW;var G;var w;var ad;var aQ;var be;var b;var bA=function(){this.fc=0;this.dl=0};var o=function(){this.dyn_tree=null;this.static_tree=null;this.extra_bits=null;this.extra_base=0;this.elems=0;this.max_length=0;this.max_code=0};var R=function(bF,bE,bH,bG){this.good_length=bF;this.max_lazy=bE;this.nice_length=bH;this.max_chain=bG};var bi=function(){this.next=null;this.len=0;this.ptr=new Array(bt);this.off=0};var aE=new Array(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);var u=new Array(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);var J=new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7);var aG=new Array(16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15);var aP=new Array(new R(0,0,0,0),new R(4,4,8,4),new R(4,5,16,8),new R(4,6,32,32),new R(4,4,16,16),new R(8,16,32,32),new R(8,16,128,128),new R(8,32,128,256),new R(32,128,258,1024),new R(32,258,258,4096));var ab=function(bF){var bE;if(!bF){bF=bf}else{if(bF<1){bF=1}else{if(bF>9){bF=9}}}k=bF;L=false;x=false;if(aZ!=null){return}aq=bx=i=null;aZ=new Array(bt);bl=new Array(aX);c=new Array(a1);an=new Array(a5+bd);y=new Array(1<<B);aU=new Array(bm);for(bE=0;bE<bm;bE++){aU[bE]=new bA()}D=new Array(2*bn+1);for(bE=0;bE<2*bn+1;bE++){D[bE]=new bA()}l=new Array(al+2);for(bE=0;bE<al+2;bE++){l[bE]=new bA()}at=new Array(bn);for(bE=0;bE<bn;bE++){at[bE]=new bA()}af=new Array(2*s+1);for(bE=0;bE<2*s+1;bE++){af[bE]=new bA()}E=new o();j=new o();C=new o();bb=new Array(by+1);f=new Array(2*al+1);bk=new Array(2*al+1);W=new Array(bs-X+1);bp=new Array(512);br=new Array(aA);az=new Array(bn);M=new Array(parseInt(U/8))};var ay=function(){aq=bx=i=null;aZ=null;bl=null;c=null;an=null;y=null;aU=null;D=null;l=null;at=null;af=null;E=null;j=null;C=null;bb=null;f=null;bk=null;W=null;bp=null;br=null;az=null;M=null};var av=function(bE){bE.next=aq;aq=bE};var T=function(){var bE;if(aq!=null){bE=aq;aq=aq.next}else{bE=new bi()}bE.next=null;bE.len=bE.off=0;return bE};var ah=function(bE){return y[ak+bE]};var ag=function(bE,bF){return y[ak+bE]=bF};var Q=function(bE){aZ[a3+a4++]=bE;if(a3+a4==bt){h()}};var aN=function(bE){bE&=65535;if(a3+a4<bt-2){aZ[a3+a4++]=(bE&255);aZ[a3+a4++]=(bE>>>8)}else{Q(bE&255);Q(bE>>>8)}};var aB=function(){ai=((ai<<aD)^(bl[O+X-1]&255))&a6;q=ah(ai);y[O&aS]=q;ag(ai,O)};var bc=function(bF,bE){bv(bE[bF].fc,bE[bF].dl)};var aK=function(bE){return(bE<256?bp[bE]:bp[256+(bE>>7)])&255};var ae=function(bF,bG,bE){return bF[bG].fc<bF[bE].fc||(bF[bG].fc==bF[bE].fc&&bk[bG]<=bk[bE])};var ba=function(bH,bF,bG){var bE;for(bE=0;bE<bG&&b<be.length;bE++){bH[bF+bE]=be.charCodeAt(b++)&255}return bE};var bz=function(){var bE;for(bE=0;bE<au;bE++){y[ak+bE]=0}aC=aP[k].max_lazy;n=aP[k].good_length;if(!N){F=aP[k].nice_length}I=aP[k].max_chain;O=0;a7=0;Y=ba(bl,0,2*ak);if(Y<=0){x=true;Y=0;return}x=false;while(Y<bq&&!x){ac()}ai=0;for(bE=0;bE<X-1;bE++){ai=((ai<<aD)^(bl[bE]&255))&a6}};var a9=function(bJ){var bL=I;var bG=O;var bH;var bK;var bF=bh;var bI=(O>z?O-z:S);var bE=O+bs;var bN=bl[bG+bF-1];var bM=bl[bG+bF];if(bh>=n){bL>>=2}do{bH=bJ;if(bl[bH+bF]!=bM||bl[bH+bF-1]!=bN||bl[bH]!=bl[bG]||bl[++bH]!=bl[bG+1]){continue}bG+=2;bH++;do{}while(bl[++bG]==bl[++bH]&&bl[++bG]==bl[++bH]&&bl[++bG]==bl[++bH]&&bl[++bG]==bl[++bH]&&bl[++bG]==bl[++bH]&&bl[++bG]==bl[++bH]&&bl[++bG]==bl[++bH]&&bl[++bG]==bl[++bH]&&bG<bE);bK=bs-(bE-bG);bG=bE-bs;if(bK>bF){r=bJ;bF=bK;if(N){if(bK>=bs){break}}else{if(bK>=F){break}}bN=bl[bG+bF-1];bM=bl[bG+bF]}}while((bJ=y[bJ&aS])>bI&&--bL!=0);return bF};var ac=function(){var bG,bE;var bF=aX-Y-O;if(bF==-1){bF--}else{if(O>=ak+z){for(bG=0;bG<ak;bG++){bl[bG]=bl[bG+ak]}r-=ak;O-=ak;a7-=ak;for(bG=0;bG<au;bG++){bE=ah(bG);ag(bG,bE>=ak?bE-ak:S)}for(bG=0;bG<ak;bG++){bE=y[bG];y[bG]=(bE>=ak?bE-ak:S)}bF+=ak}}if(!x){bG=ba(bl,O+Y,bF);if(bG<=0){x=true}else{Y+=bG}}};var bw=function(){while(Y!=0&&bx==null){var bE;aB();if(q!=S&&O-q<=z){aF=a9(q);if(aF>Y){aF=Y}}if(aF>=X){bE=bj(O-r,aF-X);Y-=aF;if(aF<=aC){aF--;do{O++;aB()}while(--aF!=0);O++}else{O+=aF;aF=0;ai=bl[O]&255;ai=((ai<<aD)^(bl[O+1]&255))&a6}}else{bE=bj(0,bl[O]&255);Y--;O++}if(bE){t(0);a7=O}while(Y<bq&&!x){ac()}}};var aV=function(){while(Y!=0&&bx==null){aB();bh=aF;Z=r;aF=X-1;if(q!=S&&bh<aC&&O-q<=z){aF=a9(q);if(aF>Y){aF=Y}if(aF==X&&O-r>V){aF--}}if(bh>=X&&aF<=bh){var bE;bE=bj(O-1-Z,bh-X);Y-=bh-1;bh-=2;do{O++;aB()}while(--bh!=0);aa=0;aF=X-1;O++;if(bE){t(0);a7=O}}else{if(aa!=0){if(bj(0,bl[O-1]&255)){t(0);a7=O}O++;Y--}else{aa=1;O++;Y--}}while(Y<bq&&!x){ac()}}};var aJ=function(){if(x){return}aj=0;ap=0;aY();bz();bx=null;a4=0;a3=0;if(k<=3){bh=X-1;aF=0}else{aF=X-1;aa=0}d=false};var v=function(bH,bF,bE){var bG;if(!L){aJ();L=true;if(Y==0){d=true;return 0}}if((bG=bB(bH,bF,bE))==bE){return bE}if(d){return bG}if(k<=3){bw()}else{aV()}if(Y==0){if(aa!=0){bj(0,bl[O-1]&255)}t(1);d=true}return bG+bB(bH,bG+bF,bE-bG)};var bB=function(bK,bI,bF){var bJ,bG,bE;bJ=0;while(bx!=null&&bJ<bF){bG=bF-bJ;if(bG>bx.len){bG=bx.len}for(bE=0;bE<bG;bE++){bK[bI+bJ+bE]=bx.ptr[bx.off+bE]}bx.off+=bG;bx.len-=bG;bJ+=bG;if(bx.len==0){var bH;bH=bx;bx=bx.next;av(bH)}}if(bJ==bF){return bJ}if(a3<a4){bG=bF-bJ;if(bG>a4-a3){bG=a4-a3}for(bE=0;bE<bG;bE++){bK[bI+bJ+bE]=aZ[a3+bE]}a3+=bG;bJ+=bG;if(a4==a3){a4=a3=0}}return bJ};var aY=function(){var bI;var bG;var bF;var bE;var bH;if(at[0].dl!=0){return}E.dyn_tree=aU;E.static_tree=l;E.extra_bits=aE;E.extra_base=K+1;E.elems=al;E.max_length=by;E.max_code=0;j.dyn_tree=D;j.static_tree=at;j.extra_bits=u;j.extra_base=0;j.elems=bn;j.max_length=by;j.max_code=0;C.dyn_tree=af;C.static_tree=null;C.extra_bits=J;C.extra_base=0;C.elems=s;C.max_length=aL;C.max_code=0;bF=0;for(bE=0;bE<aA-1;bE++){br[bE]=bF;for(bI=0;bI<(1<<aE[bE]);bI++){W[bF++]=bE}}W[bF-1]=bE;bH=0;for(bE=0;bE<16;bE++){az[bE]=bH;for(bI=0;bI<(1<<u[bE]);bI++){bp[bH++]=bE}}bH>>=7;for(;bE<bn;bE++){az[bE]=bH<<7;for(bI=0;bI<(1<<(u[bE]-7));bI++){bp[256+bH++]=bE}}for(bG=0;bG<=by;bG++){bb[bG]=0}bI=0;while(bI<=143){l[bI++].dl=8;bb[8]++}while(bI<=255){l[bI++].dl=9;bb[9]++}while(bI<=279){l[bI++].dl=7;bb[7]++}while(bI<=287){l[bI++].dl=8;bb[8]++}a2(l,al+1);for(bI=0;bI<bn;bI++){at[bI].dl=5;at[bI].fc=ao(bI,5)}ar()};var ar=function(){var bE;for(bE=0;bE<al;bE++){aU[bE].fc=0}for(bE=0;bE<bn;bE++){D[bE].fc=0}for(bE=0;bE<s;bE++){af[bE].fc=0}aU[P].fc=1;ad=aQ=0;a=aw=aW=0;G=0;w=1};var H=function(bE,bG){var bF=f[bG];var bH=bG<<1;while(bH<=m){if(bH<m&&ae(bE,f[bH+1],f[bH])){bH++}if(ae(bE,bF,f[bH])){break}f[bG]=f[bH];bG=bH;bH<<=1}f[bG]=bF};var am=function(bM){var bR=bM.dyn_tree;var bH=bM.extra_bits;var bE=bM.extra_base;var bN=bM.max_code;var bP=bM.max_length;var bQ=bM.static_tree;var bK;var bF,bG;var bO;var bJ;var bL;var bI=0;for(bO=0;bO<=by;bO++){bb[bO]=0}bR[f[aI]].dl=0;for(bK=aI+1;bK<bm;bK++){bF=f[bK];bO=bR[bR[bF].dl].dl+1;if(bO>bP){bO=bP;bI++}bR[bF].dl=bO;if(bF>bN){continue}bb[bO]++;bJ=0;if(bF>=bE){bJ=bH[bF-bE]}bL=bR[bF].fc;ad+=bL*(bO+bJ);if(bQ!=null){aQ+=bL*(bQ[bF].dl+bJ)}}if(bI==0){return}do{bO=bP-1;while(bb[bO]==0){bO--}bb[bO]--;bb[bO+1]+=2;bb[bP]--;bI-=2}while(bI>0);for(bO=bP;bO!=0;bO--){bF=bb[bO];while(bF!=0){bG=f[--bK];if(bG>bN){continue}if(bR[bG].dl!=bO){ad+=(bO-bR[bG].dl)*bR[bG].fc;bR[bG].fc=bO}bF--}}};var a2=function(bF,bK){var bH=new Array(by+1);var bG=0;var bI;var bJ;for(bI=1;bI<=by;bI++){bG=((bG+bb[bI-1])<<1);bH[bI]=bG}for(bJ=0;bJ<=bK;bJ++){var bE=bF[bJ].dl;if(bE==0){continue}bF[bJ].fc=ao(bH[bE]++,bE)}};var a8=function(bJ){var bM=bJ.dyn_tree;var bL=bJ.static_tree;var bE=bJ.elems;var bF,bH;var bK=-1;var bG=bE;m=0;aI=bm;for(bF=0;bF<bE;bF++){if(bM[bF].fc!=0){f[++m]=bK=bF;bk[bF]=0}else{bM[bF].dl=0}}while(m<2){var bI=f[++m]=(bK<2?++bK:0);bM[bI].fc=1;bk[bI]=0;ad--;if(bL!=null){aQ-=bL[bI].dl}}bJ.max_code=bK;for(bF=m>>1;bF>=1;bF--){H(bM,bF)}do{bF=f[p];f[p]=f[m--];H(bM,p);bH=f[p];f[--aI]=bF;f[--aI]=bH;bM[bG].fc=bM[bF].fc+bM[bH].fc;if(bk[bF]>bk[bH]+1){bk[bG]=bk[bF]}else{bk[bG]=bk[bH]+1}bM[bF].dl=bM[bH].dl=bG;f[p]=bG++;H(bM,p)}while(m>=2);f[--aI]=f[p];am(bJ);a2(bM,bK)};var ax=function(bM,bL){var bF;var bJ=-1;var bE;var bH=bM[0].dl;var bI=0;var bG=7;var bK=4;if(bH==0){bG=138;bK=3}bM[bL+1].dl=65535;for(bF=0;bF<=bL;bF++){bE=bH;bH=bM[bF+1].dl;if(++bI<bG&&bE==bH){continue}else{if(bI<bK){af[bE].fc+=bI}else{if(bE!=0){if(bE!=bJ){af[bE].fc++}af[bg].fc++}else{if(bI<=10){af[aR].fc++}else{af[bu].fc++}}}}bI=0;bJ=bE;if(bH==0){bG=138;bK=3}else{if(bE==bH){bG=6;bK=3}else{bG=7;bK=4}}}};var aH=function(bM,bL){var bF;var bJ=-1;var bE;var bH=bM[0].dl;var bI=0;var bG=7;var bK=4;if(bH==0){bG=138;bK=3}for(bF=0;bF<=bL;bF++){bE=bH;bH=bM[bF+1].dl;if(++bI<bG&&bE==bH){continue}else{if(bI<bK){do{bc(bE,af)}while(--bI!=0)}else{if(bE!=0){if(bE!=bJ){bc(bE,af);bI--}bc(bg,af);bv(bI-3,2)}else{if(bI<=10){bc(aR,af);bv(bI-3,3)}else{bc(bu,af);bv(bI-11,7)}}}}bI=0;bJ=bE;if(bH==0){bG=138;bK=3}else{if(bE==bH){bG=6;bK=3}else{bG=7;bK=4}}}};var A=function(){var bE;ax(aU,E.max_code);ax(D,j.max_code);a8(C);for(bE=s-1;bE>=3;bE--){if(af[aG[bE]].dl!=0){break}}ad+=3*(bE+1)+5+5+4;return bE};var bD=function(bF,bE,bG){var bH;bv(bF-257,5);bv(bE-1,5);bv(bG-4,4);for(bH=0;bH<bG;bH++){bv(af[aG[bH]].dl,3)}aH(aU,bF-1);aH(D,bE-1)};var t=function(bE){var bG,bF;var bI;var bJ;bJ=O-a7;M[aW]=G;a8(E);a8(j);bI=A();bG=(ad+3+7)>>3;bF=(aQ+3+7)>>3;if(bF<=bG){bG=bF}if(bJ+4<=bG&&a7>=0){var bH;bv((aT<<1)+bE,3);bC();aN(bJ);aN(~bJ);for(bH=0;bH<bJ;bH++){Q(bl[a7+bH])}}else{if(bF==bG){bv((e<<1)+bE,3);aM(l,at)}else{bv((bo<<1)+bE,3);bD(E.max_code+1,j.max_code+1,bI+1);aM(aU,D)}}ar();if(bE!=0){bC()}};var bj=function(bI,bG){an[a++]=bG;if(bI==0){aU[bG].fc++}else{bI--;aU[W[bG]+K+1].fc++;D[aK(bI)].fc++;c[aw++]=bI;G|=w}w<<=1;if((a&7)==0){M[aW++]=G;G=0;w=1}if(k>2&&(a&4095)==0){var bE=a*8;var bH=O-a7;var bF;for(bF=0;bF<bn;bF++){bE+=D[bF].fc*(5+u[bF])}bE>>=3;if(aw<parseInt(a/2)&&bE<parseInt(bH/2)){return true}}return(a==U-1||aw==a1)};var aM=function(bK,bI){var bM;var bF;var bG=0;var bN=0;var bJ=0;var bL=0;var bE;var bH;if(a!=0){do{if((bG&7)==0){bL=M[bJ++]}bF=an[bG++]&255;if((bL&1)==0){bc(bF,bK)}else{bE=W[bF];bc(bE+K+1,bK);bH=aE[bE];if(bH!=0){bF-=br[bE];bv(bF,bH)}bM=c[bN++];bE=aK(bM);bc(bE,bI);bH=u[bE];if(bH!=0){bM-=az[bE];bv(bM,bH)}}bL>>=1}while(bG<a)}bc(P,bK)};var a0=16;var bv=function(bF,bE){if(ap>a0-bE){aj|=(bF<<ap);aN(aj);aj=(bF>>(a0-ap));ap+=bE-a0}else{aj|=bF<<ap;ap+=bE}};var ao=function(bG,bE){var bF=0;do{bF|=bG&1;bG>>=1;bF<<=1}while(--bE>0);return bF>>1};var bC=function(){if(ap>8){aN(aj)}else{if(ap>0){Q(aj)}}aj=0;ap=0};var h=function(){if(a4!=0){var bF,bE;bF=T();if(bx==null){bx=i=bF}else{i=i.next=bF}bF.len=a4-a3;for(bE=0;bE<bF.len;bE++){bF.ptr[bE]=aZ[a3+bE]}a4=a3=0}};var aO=function(bI,bK){var bG,bF;be=bI;b=0;if(typeof bK=="undefined"){bK=bf}ab(bK);var bJ=new Array(1024);var bH=[];while((bG=v(bJ,0,bJ.length))>0){var bE=new Array(bG);for(bF=0;bF<bG;bF++){bE[bF]=String.fromCharCode(bJ[bF])}bH[bH.length]=bE.join("")}be=null;return bH.join("")};JSZip.compressions.DEFLATE={magic:"\x08\x00",compress:function(bE){return aO(bE)}}})(); \ No newline at end of file
diff --git a/Sketchometry.activity/3dparty/jszip/jszip.min.js b/Sketchometry.activity/3dparty/jszip/jszip.min.js
new file mode 100644
index 0000000..b84beac
--- /dev/null
+++ b/Sketchometry.activity/3dparty/jszip/jszip.min.js
@@ -0,0 +1 @@
+function JSZip(a){this.compression=(a||"STORE").toUpperCase();this.files=[];this.root="";this.d={base64:false,binary:false,dir:false,date:null};if(!JSZip.compressions[this.compression]){throw a+" is not a valid compression method !"}}JSZip.prototype.add=function(a,e,d){d=d||{};a=this.root+a;if(d.base64===true&&d.binary==null){d.binary=true}for(var b in this.d){d[b]=d[b]||this.d[b]}d.date=d.date||new Date();var g,h;g=d.date.getHours();g=g<<6;g=g|d.date.getMinutes();g=g<<5;g=g|d.date.getSeconds()/2;h=d.date.getFullYear()-1980;h=h<<4;h=h|(d.date.getMonth()+1);h=h<<5;h=h|d.date.getDate();if(d.base64===true){e=JSZipBase64.decode(e)}if(d.binary===false){e=this.utf8encode(e)}var i=JSZip.compressions[this.compression];var c=i.compress(e);var f="";f+="\x0A\x00";f+="\x00\x00";f+=i.magic;f+=this.decToHex(g,2);f+=this.decToHex(h,2);f+=this.decToHex(this.crc32(e),4);f+=this.decToHex(c.length,4);f+=this.decToHex(e.length,4);f+=this.decToHex(a.length,2);f+="\x00\x00";this.files[a]={header:f,data:c,dir:d.dir};return this};JSZip.prototype.folder=function(b){if(b.substr(-1)!="/"){b+="/"}if(typeof this.files[b]==="undefined"){this.add(b,"",{dir:true})}var a=this.clone();a.root=this.root+b;return a};JSZip.prototype.find=function(e){var a=[],d;if(typeof e==="string"){d=new RegExp("^"+e+"$")}else{d=e}for(var b in this.files){if(d.test(b)){var c=this.files[b];a.push({name:b,data:c.data,dir:!!c.dir})}}return a};JSZip.prototype.remove=function(b){var d=this.files[b];if(!d){if(b.substr(-1)!="/"){b+="/"}d=this.files[b]}if(d){if(b.match("/")===null){delete this.files[b]}else{var a=this.find(new RegExp("^"+b));for(var c=0;c<a.length;c++){if(a[c].name==b){delete this.files[b]}else{this.remove(a[c].name)}}}}return this};JSZip.prototype.generate=function(i){i=i||false;var h=[],a=[],e=0;for(var b in this.files){if(!this.files.hasOwnProperty(b)){continue}var g="",k="";g="\x50\x4b\x03\x04"+this.files[b].header+b+this.files[b].data;k="\x50\x4b\x01\x02\x14\x00"+this.files[b].header+"\x00\x00\x00\x00\x00\x00"+(this.files[b].dir===true?"\x10\x00\x00\x00":"\x00\x00\x00\x00")+this.decToHex(e,4)+b;e+=g.length;a.push(g);h.push(k)}var j=a.join("");var f=h.join("");var d="";d="\x50\x4b\x05\x06\x00\x00\x00\x00"+this.decToHex(a.length,2)+this.decToHex(a.length,2)+this.decToHex(f.length,4)+this.decToHex(j.length,4)+"\x00\x00";var c=j+f+d;return(i)?c:JSZipBase64.encode(c)};JSZip.compressions={STORE:{magic:"\x00\x00",compress:function(a){return a}}};JSZip.prototype.decToHex=function(d,a){var c="";for(var b=0;b<a;b++){c+=String.fromCharCode(d&255);d=d>>>8}return c};JSZip.prototype.crc32=function(f,d){if(f===""){return"\x00\x00\x00\x00"}var c="00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F 63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC 51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E 7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D 806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA 11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F 30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D";if(typeof(d)=="undefined"){d=0}var a=0;var g=0;d=d^(-1);for(var b=0,e=f.length;b<e;b++){g=(d^f.charCodeAt(b))&255;a="0x"+c.substr(g*9,8);d=(d>>>8)^a}return d^(-1)};JSZip.prototype.clone=function(){var a=new JSZip();for(var b in this){if(typeof this[b]!=="function"){a[b]=this[b]}}return a};JSZip.prototype.utf8encode=function(a){a=encodeURIComponent(a);a=a.replace(/%.{2,2}/g,function(b){var c=b.substring(1);return String.fromCharCode(parseInt(c,16))});return a};var JSZipBase64=function(){var a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";return{encode:function(e,d){var b="";var m,k,h,l,j,g,f;var c=0;while(c<e.length){m=e.charCodeAt(c++);k=e.charCodeAt(c++);h=e.charCodeAt(c++);l=m>>2;j=((m&3)<<4)|(k>>4);g=((k&15)<<2)|(h>>6);f=h&63;if(isNaN(k)){g=f=64}else{if(isNaN(h)){f=64}}b=b+a.charAt(l)+a.charAt(j)+a.charAt(g)+a.charAt(f)}return b},decode:function(e,d){var b="";var m,k,h;var l,j,g,f;var c=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(c<e.length){l=a.indexOf(e.charAt(c++));j=a.indexOf(e.charAt(c++));g=a.indexOf(e.charAt(c++));f=a.indexOf(e.charAt(c++));m=(l<<2)|(j>>4);k=((j&15)<<4)|(g>>2);h=((g&3)<<6)|f;b=b+String.fromCharCode(m);if(g!=64){b=b+String.fromCharCode(k)}if(f!=64){b=b+String.fromCharCode(h)}}return b}}}(); \ No newline at end of file
diff --git a/Sketchometry.activity/MANIFEST b/Sketchometry.activity/MANIFEST
new file mode 100644
index 0000000..071a5a1
--- /dev/null
+++ b/Sketchometry.activity/MANIFEST
@@ -0,0 +1,56 @@
+cache.manifest
+SketchometryActivity.py
+index.html
+setup.py
+Sketchometry.png
+js/url.js
+js/audio.js
+js/ext_ecma.js
+js/sketch.js
+js/jsxgraph.js
+js/ext_jquery.js
+js/sk.js
+js/GeonextReader.js
+js/SketchReader.js
+js/gui.js
+js/cache.js
+3dparty/jQuery/jquery.jsonp.js
+3dparty/jQuery/jquery-1.7.1.min.js
+3dparty/jszip/jszip-deflate.min.js
+3dparty/jszip/jszip.min.js
+3dparty/hwr/handwriting.js
+3dparty/hwr/hwrstrokes.js
+3dparty/hwr/ndollar.js
+3dparty/hwr/pdollar.js
+css/gallery-general.css
+css/gui-icons-hd.css
+css/gui-icons.css
+css/gallery-ip3.css
+css/gallery-small.css
+css/gui.css
+audio/plastic.ogg
+audio/bubble.mp3
+audio/click.mp3
+audio/plastic.mp3
+audio/bubble.ogg
+audio/click.ogg
+pics/sui-exo-icon-map-black-40.png
+pics/sui-exo-icon-map-white-96.png
+pics/wait-animation-big.gif
+pics/sui-exo-icon-map-white-40.png
+pics/sui-exo-icon-map-black-32.png
+pics/sui-exo-icon-map-black-64.png
+pics/sui-exo-icon-map-white-48.png
+pics/sui-exo-icon-map-white-32.png
+pics/wait-animation.gif
+pics/sui-exo-icon-map-white-80.png
+pics/icon-logo.png
+pics/icon-close.png
+pics/sui-exo-icon-map-black-48.png
+pics/sui-exo-icon-map-black-96.png
+pics/sui-exo-icon-map-white-64.png
+pics/sui-exo-icon-map-black-80.png
+pics/sketchometry.png
+pics/cloud-logos.png
+activity/activity.info
+activity/Sketchometry.svg
diff --git a/Sketchometry.activity/Sketchometry.png b/Sketchometry.activity/Sketchometry.png
new file mode 100644
index 0000000..94b6967
--- /dev/null
+++ b/Sketchometry.activity/Sketchometry.png
Binary files differ
diff --git a/Sketchometry.activity/SketchometryActivity.py b/Sketchometry.activity/SketchometryActivity.py
new file mode 100755
index 0000000..a2eb51f
--- /dev/null
+++ b/Sketchometry.activity/SketchometryActivity.py
@@ -0,0 +1,67 @@
+#!/usr/bin/python
+#-*- coding: UTF-8 -*-
+
+import webkit
+import sys
+import os
+import gobject
+import pygtk
+import gtk
+from sugar.activity import activity
+from sugar.graphics import style
+
+class SketchometryActivity(activity.Activity):
+ def __init__(self,handle):
+ activity.Activity.__init__(self,handle)
+
+ # Standard-Toolbar
+ toolbox = activity.ActivityToolbox(self)
+ activity_toolbar = toolbox.get_activity_toolbar()
+ activity_toolbar.keep.props.visible = False
+ activity_toolbar.share.props.visible = False
+ self.set_toolbox(toolbox)
+ toolbox.show()
+
+ #Assign self._top_canvas_box to be the top level widget on the canvas
+ self._top_canvas_box = gtk.VBox()
+
+
+ self.startv = Sketchometry()
+ self.startv.hauptbox.show()
+
+ #Zuweisen der Hauptbox auf der Canvas (vergleichbar mit toplevel-Window
+ self._top_canvas_box = self.startv.hauptbox
+
+ #Setzen der Canvas (Hauptbildschirm der Activity)
+ self.set_canvas(self._top_canvas_box)
+
+ def refreshmain(box):
+ self._top_canvas_box = box
+ #Setzen der Canvas (Hauptbildschirm der Activity)
+ self.set_canvas(self._top_canvas_box)
+
+class Sketchometry(object):
+ hauptbox = gtk.VBox(True, 1)
+ def __init__(self):
+ web = webkit.WebView()
+ pfad = os.path.join(os.getcwd(), "index.html")
+ web.open(pfad)
+ self.hauptbox.pack_start(web)
+ self.hauptbox.show()
+ web.show()
+
+
+ def event_delete(self, widget, event, data=None):
+ return False
+
+ def destroy(self, data=None):
+ gtk.main_quit()
+
+ def main(self):
+ gtk.main()
+
+
+if __name__ == "__main__":
+ start = Sketchometry()
+ start.main()
+
diff --git a/Sketchometry.activity/activity/Sketchometry.svg b/Sketchometry.activity/activity/Sketchometry.svg
new file mode 100644
index 0000000..4719d66
--- /dev/null
+++ b/Sketchometry.activity/activity/Sketchometry.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY stroke_color "#000000">
+ <!ENTITY fill_color "#FFFFFF">
+ ]>
+
+<svg
+ xmlns="http://www.w3.org/2000/svg"
+ x="0px"
+ y="0px"
+ width="55"
+ height="55"
+ >
+
+<path
+ d="m 11.265531,19.751004 v -4.034602 c 0,-4.48289 1.216784,-7.662967 3.650352,-9.5421521 2.219353,-1.6650738 5.229294,-2.5186373 9.029824,-2.5616516 0.51233,0 1.590038,0 3.234086,0 1.643192,0 4.055628,0.1710968 7.236772,0.5123307 3.17997,0.3421937 5.731589,0.7904829 7.652828,1.344867 v 7.044543 c -4.86714,-0.426303 -8.74153,-0.640414 -11.623389,-0.640414 -2.881857,0 -4.429842,0 -4.642993,0 -1.921239,0 -3.330147,0.256165 -4.226832,0.768495 -0.896471,0.512331 -1.344867,1.772237 -1.344867,3.778438 v 2.305486 c 0,1.793156 0.362261,2.988914 1.088702,3.586313 0.725481,0.598358 2.027227,0.896577 3.90652,0.896577 h 7.428789 c 4.867138,0 8.133137,1.943332 9.798318,5.827758 0.853564,1.96436 1.280826,4.162684 1.280826,6.59636 v 3.138024 c 0,5.721555 -1.900319,9.457084 -5.699676,11.207225 -1.964252,0.938526 -4.376796,1.408802 -7.236666,1.408802 -7.72797,0 -13.768877,-0.640413 -18.123685,-1.92124 v -7.044541 c 4.696041,0.470277 8.794577,0.704455 12.295928,0.704455 3.500177,0 5.539465,-0.04195 6.115943,-0.127977 0.576265,-0.08507 1.162776,-0.256166 1.761135,-0.512437 1.280827,-0.554278 1.921239,-1.6861 1.921239,-3.394081 v -2.497611 c 0,-2.219457 -0.704561,-3.586313 -2.113362,-4.098644 -0.555345,-0.213043 -1.259906,-0.320205 -2.11347,-0.320205 H 23.369334 C 15.300133,32.175014 11.265531,28.034318 11.265531,19.751004 z"
+ style="fill:&fill_color;stroke:&stroke_color;stroke-width:3.5; "/>
+</svg>
diff --git a/Sketchometry.activity/activity/activity.info b/Sketchometry.activity/activity/activity.info
new file mode 100644
index 0000000..86f4c9f
--- /dev/null
+++ b/Sketchometry.activity/activity/activity.info
@@ -0,0 +1,11 @@
+[Activity]
+name = Sketchometry
+service_name = de.gym-tir.de.SketchometryActivity
+bundle_id = de.gym-tir.de.SketchometryActivity
+icon = Sketchometry
+exec = sugar-activity SketchometryActivity.SketchometryActivity
+show_launcher = yes
+activity_version = 3
+mime_types = text/plain
+license = GPLv3+
+summmary = Draw dynamic geometric sketches
diff --git a/Sketchometry.activity/audio/bubble.mp3 b/Sketchometry.activity/audio/bubble.mp3
new file mode 100644
index 0000000..a333af3
--- /dev/null
+++ b/Sketchometry.activity/audio/bubble.mp3
Binary files differ
diff --git a/Sketchometry.activity/audio/bubble.ogg b/Sketchometry.activity/audio/bubble.ogg
new file mode 100644
index 0000000..d8db7fa
--- /dev/null
+++ b/Sketchometry.activity/audio/bubble.ogg
Binary files differ
diff --git a/Sketchometry.activity/audio/click.mp3 b/Sketchometry.activity/audio/click.mp3
new file mode 100644
index 0000000..9a7002d
--- /dev/null
+++ b/Sketchometry.activity/audio/click.mp3
Binary files differ
diff --git a/Sketchometry.activity/audio/click.ogg b/Sketchometry.activity/audio/click.ogg
new file mode 100644
index 0000000..f4e2247
--- /dev/null
+++ b/Sketchometry.activity/audio/click.ogg
Binary files differ
diff --git a/Sketchometry.activity/audio/plastic.mp3 b/Sketchometry.activity/audio/plastic.mp3
new file mode 100644
index 0000000..90af180
--- /dev/null
+++ b/Sketchometry.activity/audio/plastic.mp3
Binary files differ
diff --git a/Sketchometry.activity/audio/plastic.ogg b/Sketchometry.activity/audio/plastic.ogg
new file mode 100644
index 0000000..7fc7978
--- /dev/null
+++ b/Sketchometry.activity/audio/plastic.ogg
Binary files differ
diff --git a/Sketchometry.activity/cache.manifest b/Sketchometry.activity/cache.manifest
new file mode 100644
index 0000000..d4e45bd
--- /dev/null
+++ b/Sketchometry.activity/cache.manifest
@@ -0,0 +1,57 @@
+CACHE MANIFEST
+# Timestamp: 1373974703
+
+CACHE:
+3dparty/jszip/jszip-deflate.min.js
+3dparty/jszip/jszip.min.js
+3dparty/jQuery/jquery-1.7.1.min.js
+3dparty/jQuery/jquery.jsonp.js
+3dparty/hwr/handwriting.js
+3dparty/hwr/hwrstrokes.js
+3dparty/hwr/ndollar.js
+3dparty/hwr/pdollar.js
+pics/icon-logo.png
+pics/icon-close.png
+pics/sketchometry.png
+pics/cloud-logos.png
+pics/wait-animation.gif
+pics/wait-animation-big.gif
+pics/sui-exo-icon-map-black-48.png
+pics/sui-exo-icon-map-black-32.png
+pics/sui-exo-icon-map-black-64.png
+pics/sui-exo-icon-map-black-96.png
+pics/sui-exo-icon-map-white-32.png
+pics/sui-exo-icon-map-white-48.png
+pics/sui-exo-icon-map-white-64.png
+pics/sui-exo-icon-map-white-96.png
+pics/sui-exo-icon-map-white-40.png
+pics/sui-exo-icon-map-white-80.png
+pics/sui-exo-icon-map-black-40.png
+pics/sui-exo-icon-map-black-80.png
+js/ext_ecma.js
+js/ext_jquery.js
+js/jsxgraph.js
+js/GeonextReader.js
+js/SketchReader.js
+js/sk.js
+js/sketch.js
+js/audio.js
+js/gui.js
+js/url.js
+js/cache.js
+css/gui.css
+css/gui-icons.css
+css/gui-icons-hd.css
+css/gallery-general.css
+css/gallery-small.css
+css/gallery-ip3.css
+audio/click.mp3
+audio/click.ogg
+audio/bubble.mp3
+audio/bubble.ogg
+audio/plastic.mp3
+audio/plastic.ogg
+index.html
+
+NETWORK:
+* \ No newline at end of file
diff --git a/Sketchometry.activity/css/gallery-general.css b/Sketchometry.activity/css/gallery-general.css
new file mode 100644
index 0000000..46b4208
--- /dev/null
+++ b/Sketchometry.activity/css/gallery-general.css
@@ -0,0 +1,119 @@
+/* THIS FILE IS AUTOMATICALLY GENERATED. DO NOT CHANGE. */
+.scrollbar{width:6px;background-color:white;border-radius:4px px;z-index:1003;position:absolute;}
+.gallery-footnote{position:absolute;bottom:25px;font-size:10pt;color:#444;}.gallery-footnote a{text-decoration:none;font-size:10pt !important;margin:0 !important;padding:0 !important;color:#345 !important;}
+.footnote-button{width:38px;height:38px;float:left;margin:4px;padding:0;}
+.nofloat{float:none;}
+#gallery-footnote-group-left{left:25px;}
+#gallery-footnote-group-right{right:25px;}
+#gallery-footnote-settings{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-349px -61px;background-size:960px 605px;}
+#gallery-footnote-help{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-221px -61px;background-size:960px 605px;cursor:default;}
+#gallery-footnote-copy{text-align:center;right:8px;display:block;width:100%;}
+#gallery-tooltip-start{position:absolute;top:0;left:50%;margin-left:-80px;}
+#gallery-css-indicator{width:100px;}
+body{padding:0;margin:0;overflow-x:hidden;overflow-y:hidden;}
+#gallery{width:100%;height:100%;margin:0;padding:0;display:none;overflow:hidden;}
+#gallerycontent{width:100%;height:100%;padding:0;background:#89A;overflow:hidden;}
+#gallery-container{overflow:hidden;width:100%;height:100%;}
+#gallery-header{height:50%;width:100%;padding:0;margin:0;font-size:52pt;font-weight:bolder;text-align:center;vertical-align:middle;}
+#gallery-header-watermark{height:70%;vertical-align:middle;border:0;}
+#carousel{overflow:hidden;width:100%;padding:0;margin:0;float:left;}
+#flow-container{overflow:hidden;padding:8px 0 8px 0;width:100%;}
+.carousel-eventcapture{z-index:99;margin-top:-342px;height:56px;background-color:pink;opacity:0;}
+#carousel-eventcapture{margin-top:-286px;left:0;width:100%;height:294px;float:left;}
+#carousel-eventcapture-left{float:left;width:0;left:0;background-color:blue;}
+#carousel-eventcapture-right{float:right;width:50%;margin-left:376px;background-color:green;}
+.gallery-wait-animation-big{margin-left:130px;margin-top:85px;}
+.itemlist{padding:0;margin:0;}
+.itemheight{height:342px;}
+.itemwidth{width:360px;}
+.padding{padding:8px;}
+.item{margin-left:8px;float:left;height:326px;}
+.item-button-group{float:left;width:32px;height:32px;padding-left:12px;padding-right:12px;}
+.item-button{height:32px;width:32px;opacity:0.1;}
+.item-caption{opacity:0.1;text-align:center;}
+.item-button-selected{opacity:1;}
+.item-caption-selected{opacity:1;}
+.item-export{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-160px -64px;background-size:960px 605px;}
+.item-clone{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-416px -64px;background-size:960px 605px;}
+.item-delete{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-288px -64px;background-size:960px 605px;}
+.item-edit{height:48px;margin:0;color:#777;padding:0;float:left;width:176px;font-size:20px;border:0;opacity:0.5;}
+.item-edit-selected{color:white;opacity:1;}
+.item-preview{height:270px;margin:8px 0 0 0;background:white;float:left;}
+.carousel-marker{padding:0;margin:0;float:left;}
+#toolbar-container{text-align:center;margin:32px 0 0 0;padding:8px 0 8px 0;width:100%;height:64px;z-index:10;}
+#toolbar-spacer{float:left;height:48px;width:50%;margin-right:-76px;}
+.toolbar-group{padding:4px;float:left;margin-left:8px;margin-top:-20px;}
+.toolbar-button{width:48px;height:48px;float:left;margin:4px;padding:0;}
+#toolbar-button-open{background:url("../pics/sui-exo-icon-map-white-80.png") no-repeat;background-position:-996px -76px;background-size:1200px 756px;}
+#toolbar-button-new{background:url("../pics/sui-exo-icon-map-white-80.png") no-repeat;background-position:-36px -76px;background-size:1200px 756px;}
+#toolbar-button-import{background:url("../pics/sui-exo-icon-map-white-80.png") no-repeat;background-position:-116px -76px;background-size:1200px 756px;}
+#gallery-disabled-layer{position:absolute;display:none;top:0;left:0;height:100%;width:100%;z-index:900;opacity:0.9;}
+.gallery-modal-bg{display:none;position:absolute;top:0;left:0;z-index:999;width:100%;height:100%;}
+.gallery-modal-container{z-index:1001;position:absolute;top:50%;left:50%;height:392px;width:660px;margin:-196px 0 0 -330px;}
+.gallery-modal{margin:0;padding:0;z-index:1002;background:white;overflow-x:hidden;overflow-y:auto;height:346px;width:658px;}
+.gallery-modal-button{float:left;width:38px;height:38px;}
+.gallery-modal-toolbar-group{height:38px;padding:0;margin-bottom:8px;}
+.gallery-modal-list{list-style:none;margin:0;padding:0;z-index:1002;}
+#gallery-options-button-close{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-477px -189px;background-size:960px 605px;float:right;}
+#gallery-options li{padding:16px;font-size:20px;border-bottom:1px solid #999;cursor:default;height:32px;}
+.gallery-options-action{float:right;width:32px;height:32px;cursor:pointer;}
+.gallery-options-action-bool-true{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-416px -192px;background-size:960px 605px;}
+.gallery-options-action-bool-false{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-480px -192px;background-size:960px 605px;}
+.gallery-options-action-action{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-864px -128px;background-size:960px 605px;}
+.gallery-options-action-list{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-608px -192px;background-size:960px 605px;}
+.gallery-options-list-emph-bold{font-weight:bold;}
+#gallery-options-list-item-back{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-544px -192px;background-size:960px 605px;float:left;width:32px;height:32px;margin-top:-5px;margin-left:-8px;}
+.gallery-options-action-volume{width:96px !important;}
+.gallery-options-action-volume-0{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-544px -64px;background-size:960px 605px;}
+.gallery-options-action-volume-1{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-608px -64px;background-size:960px 605px;}
+.gallery-options-action-volume-2{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-672px -64px;background-size:960px 605px;}
+.gallery-options-action-volume-3{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-736px -64px;background-size:960px 605px;}
+.gallery-options-volume-down{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-352px -192px;background-size:960px 605px;}
+.gallery-options-volume-up{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-288px -192px;background-size:960px 605px;}
+.gallery-options-volume-status{width:32px;height:32px;float:right;}
+.gallery-options-label{float:left;width:496px;}
+#gallery-options-icon{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-349px -61px;background-size:960px 605px;float:left;}
+.gallery-options-button-group{margin:125px 92px;}
+.gallery-options-button-group-left{float:left;}
+#gallery-browser-current-folder{height:32px;overflow:hidden;width:100%;color:black;font-size:20px;padding:4px;text-shadow:0 0;border-bottom:2px solid #999;}
+#gallery-browser li{padding:16px;font-size:20px;border-bottom:1px solid #999;cursor:default;}
+.gallery-browser-icon{width:32px;height:32px;float:left;margin-right:16px;}
+.gallery-browser-folder .gallery-browser-icon{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-32px -448px;background-size:960px 605px;}
+.gallery-browser-file .gallery-browser-icon{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-224px -448px;background-size:960px 605px;}
+.gallery-export-connect-status{margin:10px;}
+#gallery-export-button-newfolder{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-93px -445px;background-size:960px 605px;float:left;display:none;}
+#gallery-export-button-upload{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-413px -189px;background-size:960px 605px;display:none;float:right;}
+#gallery-export-button-format{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-29px -189px;background-size:960px 605px;display:none;float:right;}
+#gallery-export-formats{top:50%;left:50%;z-index:1001;display:none;margin:-50px 0 0 -390px;position:absolute;padding:8px;height:114px;width:52px;}
+#gallery-export-format-label{float:right;top:0px;left:0px;width:114px;height:8px;margin-right:-8px;margin-top:49px !important;-moz-transform:rotate(-90deg);-webkit-transform:rotate(-90deg);-ms-transform:matrix(0, -1, 1, 0, 0, 0);}
+#gallery-export-format-buttons{float:right;width:38px;margin-top:-65px;}
+#gallery-export-format-sketch{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-221px -445px;background-size:960px 605px;}
+#gallery-export-format-jc{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-477px -445px;background-size:960px 605px;}
+#gallery-export-format-html{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-349px -445px;background-size:960px 605px;}
+#gallery-export-button-close{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-477px -189px;background-size:960px 605px;float:right;}
+#gallery-export-icon{float:left;}
+.gallery-export-icon-export{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-157px -61px;background-size:960px 605px;}
+.gallery-export-icon-import{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-93px -61px;background-size:960px 605px;}
+#gallery-export-icon-anim{display:none;margin-left:4px;margin-top:4px;}
+#gallery-export-edit{float:left;background-color:white;border:0;padding:0;margin-top:4px;height:32px;width:476px;z-index:1005;display:none;}
+.gallery-modal-storage-select{padding:16px;font-size:16px;}
+.gallery-modal-storage-select-item{height:54px;}
+#gallery-modal-storage-select-icloud{display:none;}
+.gallery-storage-select-spacer-right{float:left;margin-right:16px;margin-left:0;}
+.gallery-storage-select-spacer-top{margin-top:16px;}
+.gallery-modal-storage-logo{background:url(../pics/cloud-logos.png) no-repeat;width:38px;height:38px;cursor:pointer;float:left;}
+#gallery-modal-storage-logo-dropbox{background-position:-29px -29px;}
+#gallery-modal-storage-logo-googledrive{background-position:-29px -93px;}
+#gallery-modal-storage-logo-skydrive{background-position:-29px -157px;}
+#gallery-modal-storage-logo-ubuntuone{background-position:-29px -221px;}
+#gallery-modal-storage-logo-icloud{background-position:-29px -285px;}
+#gallery-modal-storage-logo-webdav{background-position:-29px -63px;}
+.gallery-export-status{width:503px;height:38px;overflow:hidden;vertical-align:middle;display:table-cell;padding-left:8px;}
+#gallery-auth-password-login{margin-left:auto;margin-right:auto;width:200px;margin-top:16px;}
+#debug-bar{position:absolute;right:12.5px;top:12.5px;border:1px solid black;background-color:red;opacity:1;display:none;}
+.bg-selected{background-color:#aa3333 !important;}
+.xyzBackgroundColorM{background-color:#334455;}
+.xyzBackgroundColorL{background-color:#222;}
+.xyzRoundedBorderM{border-radius:8px;}
+.xyzInnerShadowS{box-shadow:inset 1px 1px 2px #000000;}
+.xyzBackgroundColorS{background-color:#336699;}
diff --git a/Sketchometry.activity/css/gallery-ip3.css b/Sketchometry.activity/css/gallery-ip3.css
new file mode 100644
index 0000000..46b4208
--- /dev/null
+++ b/Sketchometry.activity/css/gallery-ip3.css
@@ -0,0 +1,119 @@
+/* THIS FILE IS AUTOMATICALLY GENERATED. DO NOT CHANGE. */
+.scrollbar{width:6px;background-color:white;border-radius:4px px;z-index:1003;position:absolute;}
+.gallery-footnote{position:absolute;bottom:25px;font-size:10pt;color:#444;}.gallery-footnote a{text-decoration:none;font-size:10pt !important;margin:0 !important;padding:0 !important;color:#345 !important;}
+.footnote-button{width:38px;height:38px;float:left;margin:4px;padding:0;}
+.nofloat{float:none;}
+#gallery-footnote-group-left{left:25px;}
+#gallery-footnote-group-right{right:25px;}
+#gallery-footnote-settings{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-349px -61px;background-size:960px 605px;}
+#gallery-footnote-help{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-221px -61px;background-size:960px 605px;cursor:default;}
+#gallery-footnote-copy{text-align:center;right:8px;display:block;width:100%;}
+#gallery-tooltip-start{position:absolute;top:0;left:50%;margin-left:-80px;}
+#gallery-css-indicator{width:100px;}
+body{padding:0;margin:0;overflow-x:hidden;overflow-y:hidden;}
+#gallery{width:100%;height:100%;margin:0;padding:0;display:none;overflow:hidden;}
+#gallerycontent{width:100%;height:100%;padding:0;background:#89A;overflow:hidden;}
+#gallery-container{overflow:hidden;width:100%;height:100%;}
+#gallery-header{height:50%;width:100%;padding:0;margin:0;font-size:52pt;font-weight:bolder;text-align:center;vertical-align:middle;}
+#gallery-header-watermark{height:70%;vertical-align:middle;border:0;}
+#carousel{overflow:hidden;width:100%;padding:0;margin:0;float:left;}
+#flow-container{overflow:hidden;padding:8px 0 8px 0;width:100%;}
+.carousel-eventcapture{z-index:99;margin-top:-342px;height:56px;background-color:pink;opacity:0;}
+#carousel-eventcapture{margin-top:-286px;left:0;width:100%;height:294px;float:left;}
+#carousel-eventcapture-left{float:left;width:0;left:0;background-color:blue;}
+#carousel-eventcapture-right{float:right;width:50%;margin-left:376px;background-color:green;}
+.gallery-wait-animation-big{margin-left:130px;margin-top:85px;}
+.itemlist{padding:0;margin:0;}
+.itemheight{height:342px;}
+.itemwidth{width:360px;}
+.padding{padding:8px;}
+.item{margin-left:8px;float:left;height:326px;}
+.item-button-group{float:left;width:32px;height:32px;padding-left:12px;padding-right:12px;}
+.item-button{height:32px;width:32px;opacity:0.1;}
+.item-caption{opacity:0.1;text-align:center;}
+.item-button-selected{opacity:1;}
+.item-caption-selected{opacity:1;}
+.item-export{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-160px -64px;background-size:960px 605px;}
+.item-clone{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-416px -64px;background-size:960px 605px;}
+.item-delete{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-288px -64px;background-size:960px 605px;}
+.item-edit{height:48px;margin:0;color:#777;padding:0;float:left;width:176px;font-size:20px;border:0;opacity:0.5;}
+.item-edit-selected{color:white;opacity:1;}
+.item-preview{height:270px;margin:8px 0 0 0;background:white;float:left;}
+.carousel-marker{padding:0;margin:0;float:left;}
+#toolbar-container{text-align:center;margin:32px 0 0 0;padding:8px 0 8px 0;width:100%;height:64px;z-index:10;}
+#toolbar-spacer{float:left;height:48px;width:50%;margin-right:-76px;}
+.toolbar-group{padding:4px;float:left;margin-left:8px;margin-top:-20px;}
+.toolbar-button{width:48px;height:48px;float:left;margin:4px;padding:0;}
+#toolbar-button-open{background:url("../pics/sui-exo-icon-map-white-80.png") no-repeat;background-position:-996px -76px;background-size:1200px 756px;}
+#toolbar-button-new{background:url("../pics/sui-exo-icon-map-white-80.png") no-repeat;background-position:-36px -76px;background-size:1200px 756px;}
+#toolbar-button-import{background:url("../pics/sui-exo-icon-map-white-80.png") no-repeat;background-position:-116px -76px;background-size:1200px 756px;}
+#gallery-disabled-layer{position:absolute;display:none;top:0;left:0;height:100%;width:100%;z-index:900;opacity:0.9;}
+.gallery-modal-bg{display:none;position:absolute;top:0;left:0;z-index:999;width:100%;height:100%;}
+.gallery-modal-container{z-index:1001;position:absolute;top:50%;left:50%;height:392px;width:660px;margin:-196px 0 0 -330px;}
+.gallery-modal{margin:0;padding:0;z-index:1002;background:white;overflow-x:hidden;overflow-y:auto;height:346px;width:658px;}
+.gallery-modal-button{float:left;width:38px;height:38px;}
+.gallery-modal-toolbar-group{height:38px;padding:0;margin-bottom:8px;}
+.gallery-modal-list{list-style:none;margin:0;padding:0;z-index:1002;}
+#gallery-options-button-close{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-477px -189px;background-size:960px 605px;float:right;}
+#gallery-options li{padding:16px;font-size:20px;border-bottom:1px solid #999;cursor:default;height:32px;}
+.gallery-options-action{float:right;width:32px;height:32px;cursor:pointer;}
+.gallery-options-action-bool-true{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-416px -192px;background-size:960px 605px;}
+.gallery-options-action-bool-false{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-480px -192px;background-size:960px 605px;}
+.gallery-options-action-action{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-864px -128px;background-size:960px 605px;}
+.gallery-options-action-list{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-608px -192px;background-size:960px 605px;}
+.gallery-options-list-emph-bold{font-weight:bold;}
+#gallery-options-list-item-back{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-544px -192px;background-size:960px 605px;float:left;width:32px;height:32px;margin-top:-5px;margin-left:-8px;}
+.gallery-options-action-volume{width:96px !important;}
+.gallery-options-action-volume-0{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-544px -64px;background-size:960px 605px;}
+.gallery-options-action-volume-1{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-608px -64px;background-size:960px 605px;}
+.gallery-options-action-volume-2{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-672px -64px;background-size:960px 605px;}
+.gallery-options-action-volume-3{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-736px -64px;background-size:960px 605px;}
+.gallery-options-volume-down{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-352px -192px;background-size:960px 605px;}
+.gallery-options-volume-up{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-288px -192px;background-size:960px 605px;}
+.gallery-options-volume-status{width:32px;height:32px;float:right;}
+.gallery-options-label{float:left;width:496px;}
+#gallery-options-icon{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-349px -61px;background-size:960px 605px;float:left;}
+.gallery-options-button-group{margin:125px 92px;}
+.gallery-options-button-group-left{float:left;}
+#gallery-browser-current-folder{height:32px;overflow:hidden;width:100%;color:black;font-size:20px;padding:4px;text-shadow:0 0;border-bottom:2px solid #999;}
+#gallery-browser li{padding:16px;font-size:20px;border-bottom:1px solid #999;cursor:default;}
+.gallery-browser-icon{width:32px;height:32px;float:left;margin-right:16px;}
+.gallery-browser-folder .gallery-browser-icon{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-32px -448px;background-size:960px 605px;}
+.gallery-browser-file .gallery-browser-icon{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-224px -448px;background-size:960px 605px;}
+.gallery-export-connect-status{margin:10px;}
+#gallery-export-button-newfolder{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-93px -445px;background-size:960px 605px;float:left;display:none;}
+#gallery-export-button-upload{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-413px -189px;background-size:960px 605px;display:none;float:right;}
+#gallery-export-button-format{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-29px -189px;background-size:960px 605px;display:none;float:right;}
+#gallery-export-formats{top:50%;left:50%;z-index:1001;display:none;margin:-50px 0 0 -390px;position:absolute;padding:8px;height:114px;width:52px;}
+#gallery-export-format-label{float:right;top:0px;left:0px;width:114px;height:8px;margin-right:-8px;margin-top:49px !important;-moz-transform:rotate(-90deg);-webkit-transform:rotate(-90deg);-ms-transform:matrix(0, -1, 1, 0, 0, 0);}
+#gallery-export-format-buttons{float:right;width:38px;margin-top:-65px;}
+#gallery-export-format-sketch{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-221px -445px;background-size:960px 605px;}
+#gallery-export-format-jc{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-477px -445px;background-size:960px 605px;}
+#gallery-export-format-html{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-349px -445px;background-size:960px 605px;}
+#gallery-export-button-close{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-477px -189px;background-size:960px 605px;float:right;}
+#gallery-export-icon{float:left;}
+.gallery-export-icon-export{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-157px -61px;background-size:960px 605px;}
+.gallery-export-icon-import{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-93px -61px;background-size:960px 605px;}
+#gallery-export-icon-anim{display:none;margin-left:4px;margin-top:4px;}
+#gallery-export-edit{float:left;background-color:white;border:0;padding:0;margin-top:4px;height:32px;width:476px;z-index:1005;display:none;}
+.gallery-modal-storage-select{padding:16px;font-size:16px;}
+.gallery-modal-storage-select-item{height:54px;}
+#gallery-modal-storage-select-icloud{display:none;}
+.gallery-storage-select-spacer-right{float:left;margin-right:16px;margin-left:0;}
+.gallery-storage-select-spacer-top{margin-top:16px;}
+.gallery-modal-storage-logo{background:url(../pics/cloud-logos.png) no-repeat;width:38px;height:38px;cursor:pointer;float:left;}
+#gallery-modal-storage-logo-dropbox{background-position:-29px -29px;}
+#gallery-modal-storage-logo-googledrive{background-position:-29px -93px;}
+#gallery-modal-storage-logo-skydrive{background-position:-29px -157px;}
+#gallery-modal-storage-logo-ubuntuone{background-position:-29px -221px;}
+#gallery-modal-storage-logo-icloud{background-position:-29px -285px;}
+#gallery-modal-storage-logo-webdav{background-position:-29px -63px;}
+.gallery-export-status{width:503px;height:38px;overflow:hidden;vertical-align:middle;display:table-cell;padding-left:8px;}
+#gallery-auth-password-login{margin-left:auto;margin-right:auto;width:200px;margin-top:16px;}
+#debug-bar{position:absolute;right:12.5px;top:12.5px;border:1px solid black;background-color:red;opacity:1;display:none;}
+.bg-selected{background-color:#aa3333 !important;}
+.xyzBackgroundColorM{background-color:#334455;}
+.xyzBackgroundColorL{background-color:#222;}
+.xyzRoundedBorderM{border-radius:8px;}
+.xyzInnerShadowS{box-shadow:inset 1px 1px 2px #000000;}
+.xyzBackgroundColorS{background-color:#336699;}
diff --git a/Sketchometry.activity/css/gallery-small.css b/Sketchometry.activity/css/gallery-small.css
new file mode 100644
index 0000000..ddaa07e
--- /dev/null
+++ b/Sketchometry.activity/css/gallery-small.css
@@ -0,0 +1,119 @@
+/* THIS FILE IS AUTOMATICALLY GENERATED. DO NOT CHANGE. */
+.scrollbar{width:6px;background-color:white;border-radius:2px px;z-index:1003;position:absolute;}
+.gallery-footnote{position:absolute;bottom:15px;font-size:10pt;color:#444;}.gallery-footnote a{text-decoration:none;font-size:10pt !important;margin:0 !important;padding:0 !important;color:#345 !important;}
+.footnote-button{width:38px;height:38px;float:left;margin:2px;padding:0;}
+.nofloat{float:none;}
+#gallery-footnote-group-left{left:15px;}
+#gallery-footnote-group-right{right:15px;}
+#gallery-footnote-settings{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-349px -61px;background-size:960px 605px;}
+#gallery-footnote-help{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-221px -61px;background-size:960px 605px;cursor:default;}
+#gallery-footnote-copy{text-align:center;right:4px;display:block;width:100%;}
+#gallery-tooltip-start{position:absolute;top:0;left:50%;margin-left:-164px;}
+#gallery-css-indicator{width:50px;}
+body{padding:0;margin:0;overflow-x:hidden;overflow-y:hidden;}
+#gallery{width:100%;height:100%;margin:0;padding:0;display:none;overflow:hidden;}
+#gallerycontent{width:100%;height:100%;padding:0;background:#89A;overflow:hidden;}
+#gallery-container{overflow:hidden;width:100%;height:100%;}
+#gallery-header{height:50%;width:100%;padding:0;margin:0;font-size:52pt;font-weight:bolder;text-align:center;vertical-align:middle;}
+#gallery-header-watermark{height:70%;vertical-align:middle;border:0;}
+#carousel{overflow:hidden;width:100%;padding:0;margin:0;float:left;}
+#flow-container{overflow:hidden;padding:4px 0 4px 0;width:100%;}
+.carousel-eventcapture{z-index:99;margin-top:-214px;height:44px;background-color:pink;opacity:0;}
+#carousel-eventcapture{margin-top:-170px;left:0;width:100%;height:174px;float:left;}
+#carousel-eventcapture-left{float:left;width:0;left:0;background-color:blue;}
+#carousel-eventcapture-right{float:right;width:50%;margin-left:224px;background-color:green;}
+.gallery-wait-animation-big{margin-left:58px;margin-top:31px;}
+.itemlist{padding:0;margin:0;}
+.itemheight{height:214px;}
+.itemwidth{width:216px;}
+.padding{padding:4px;}
+.item{margin-left:4px;float:left;height:206px;}
+.item-button-group{float:left;width:32px;height:32px;padding-left:6px;padding-right:6px;}
+.item-button{height:32px;width:32px;opacity:0.1;}
+.item-caption{opacity:0.1;text-align:center;}
+.item-button-selected{opacity:1;}
+.item-caption-selected{opacity:1;}
+.item-export{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-160px -64px;background-size:960px 605px;}
+.item-clone{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-416px -64px;background-size:960px 605px;}
+.item-delete{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-288px -64px;background-size:960px 605px;}
+.item-edit{height:40px;margin:0;color:#777;padding:0;float:left;width:76px;font-size:20px;border:0;opacity:0.5;}
+.item-edit-selected{color:white;opacity:1;}
+.item-preview{height:162px;margin:4px 0 0 0;background:white;float:left;}
+.carousel-marker{padding:0;margin:0;float:left;}
+#toolbar-container{text-align:center;margin:32px 0 0 0;padding:4px 0 4px 0;width:100%;height:48px;z-index:10;}
+#toolbar-spacer{float:left;height:40px;width:50%;margin-right:-54px;}
+.toolbar-group{padding:2px;float:left;margin-left:4px;margin-top:-20px;}
+.toolbar-button{width:40px;height:40px;float:left;margin:2px;padding:0;}
+#toolbar-button-open{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-796px -60px;background-size:960px 605px;}
+#toolbar-button-new{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-28px -60px;background-size:960px 605px;}
+#toolbar-button-import{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-92px -60px;background-size:960px 605px;}
+#gallery-disabled-layer{position:absolute;display:none;top:0;left:0;height:100%;width:100%;z-index:900;opacity:0.9;}
+.gallery-modal-bg{display:none;position:absolute;top:0;left:0;z-index:999;width:100%;height:100%;}
+.gallery-modal-container{z-index:1001;position:absolute;top:50%;left:50%;height:392px;width:660px;margin:-196px 0 0 -330px;}
+.gallery-modal{margin:0;padding:0;z-index:1002;background:white;overflow-x:hidden;overflow-y:auto;height:356px;width:654px;}
+.gallery-modal-button{float:left;width:32px;height:32px;}
+.gallery-modal-toolbar-group{height:32px;padding:0;margin-bottom:4px;}
+.gallery-modal-list{list-style:none;margin:0;padding:0;z-index:1002;}
+#gallery-options-button-close{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-480px -192px;background-size:960px 605px;float:right;}
+#gallery-options li{padding:8px;font-size:20px;border-bottom:1px solid #999;cursor:default;height:32px;}
+.gallery-options-action{float:right;width:32px;height:32px;cursor:pointer;}
+.gallery-options-action-bool-true{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-416px -192px;background-size:960px 605px;}
+.gallery-options-action-bool-false{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-480px -192px;background-size:960px 605px;}
+.gallery-options-action-action{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-864px -128px;background-size:960px 605px;}
+.gallery-options-action-list{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-608px -192px;background-size:960px 605px;}
+.gallery-options-list-emph-bold{font-weight:bold;}
+#gallery-options-list-item-back{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-544px -192px;background-size:960px 605px;float:left;width:32px;height:32px;margin-top:-8px;margin-left:-8px;}
+.gallery-options-action-volume{width:96px !important;}
+.gallery-options-action-volume-0{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-544px -64px;background-size:960px 605px;}
+.gallery-options-action-volume-1{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-608px -64px;background-size:960px 605px;}
+.gallery-options-action-volume-2{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-672px -64px;background-size:960px 605px;}
+.gallery-options-action-volume-3{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-736px -64px;background-size:960px 605px;}
+.gallery-options-volume-down{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-352px -192px;background-size:960px 605px;}
+.gallery-options-volume-up{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-288px -192px;background-size:960px 605px;}
+.gallery-options-volume-status{width:32px;height:32px;float:right;}
+.gallery-options-label{float:left;width:528px;}
+#gallery-options-icon{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-352px -64px;background-size:960px 605px;float:left;}
+.gallery-options-button-group{margin:130px 92px;}
+.gallery-options-button-group-left{float:left;}
+#gallery-browser-current-folder{height:32px;overflow:hidden;width:100%;color:black;font-size:20px;padding:2px;text-shadow:0 0;border-bottom:2px solid #999;}
+#gallery-browser li{padding:8px;font-size:20px;border-bottom:1px solid #999;cursor:default;}
+.gallery-browser-icon{width:32px;height:32px;float:left;margin-right:16px;}
+.gallery-browser-folder .gallery-browser-icon{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-32px -448px;background-size:960px 605px;}
+.gallery-browser-file .gallery-browser-icon{background:url("../pics/sui-exo-icon-map-black-64.png") no-repeat;background-position:-224px -448px;background-size:960px 605px;}
+.gallery-export-connect-status{margin:10px;}
+#gallery-export-button-newfolder{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-96px -448px;background-size:960px 605px;float:left;display:none;}
+#gallery-export-button-upload{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-416px -192px;background-size:960px 605px;display:none;float:right;}
+#gallery-export-button-format{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-32px -192px;background-size:960px 605px;display:none;float:right;}
+#gallery-export-formats{top:50%;left:50%;z-index:1001;display:none;margin:-84px 0 0 -380px;position:absolute;padding:4px;height:96px;width:46px;}
+#gallery-export-format-label{float:right;top:0px;left:0px;width:96px;height:8px;margin-right:-4px;margin-top:44px !important;-moz-transform:rotate(-90deg);-webkit-transform:rotate(-90deg);-ms-transform:matrix(0, -1, 1, 0, 0, 0);}
+#gallery-export-format-buttons{float:right;width:32px;margin-top:-52px;}
+#gallery-export-format-sketch{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-224px -448px;background-size:960px 605px;}
+#gallery-export-format-jc{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-480px -448px;background-size:960px 605px;}
+#gallery-export-format-html{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-352px -448px;background-size:960px 605px;}
+#gallery-export-button-close{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-480px -192px;background-size:960px 605px;float:right;}
+#gallery-export-icon{float:left;}
+.gallery-export-icon-export{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-160px -64px;background-size:960px 605px;}
+.gallery-export-icon-import{background:url("../pics/sui-exo-icon-map-white-64.png") no-repeat;background-position:-96px -64px;background-size:960px 605px;}
+#gallery-export-icon-anim{display:none;margin-left:2px;margin-top:2px;}
+#gallery-export-edit{float:left;background-color:white;border:0;padding:0;margin-top:2px;height:32px;width:500px;z-index:1005;display:none;}
+.gallery-modal-storage-select{padding:8px;font-size:16px;}
+.gallery-modal-storage-select-item{height:46px;}
+#gallery-modal-storage-select-icloud{display:none;}
+.gallery-storage-select-spacer-right{float:left;margin-right:8px;margin-left:0;}
+.gallery-storage-select-spacer-top{margin-top:8px;}
+.gallery-modal-storage-logo{background:url(../pics/cloud-logos.png) no-repeat;width:38px;height:38px;cursor:pointer;float:left;}
+#gallery-modal-storage-logo-dropbox{background-position:-29px -29px;}
+#gallery-modal-storage-logo-googledrive{background-position:-29px -93px;}
+#gallery-modal-storage-logo-skydrive{background-position:-29px -157px;}
+#gallery-modal-storage-logo-ubuntuone{background-position:-29px -221px;}
+#gallery-modal-storage-logo-icloud{background-position:-29px -285px;}
+#gallery-modal-storage-logo-webdav{background-position:-29px -63px;}
+.gallery-export-status{width:503px;height:38px;overflow:hidden;vertical-align:middle;display:table-cell;padding-left:4px;}
+#gallery-auth-password-login{margin-left:auto;margin-right:auto;width:200px;margin-top:8px;}
+#debug-bar{position:absolute;right:7.5px;top:7.5px;border:1px solid black;background-color:red;opacity:1;display:none;}
+.bg-selected{background-color:#aa3333 !important;}
+.xyzBackgroundColorM{background-color:#334455;}
+.xyzBackgroundColorL{background-color:#222;}
+.xyzRoundedBorderM{border-radius:8px;}
+.xyzInnerShadowS{box-shadow:inset 1px 1px 2px #000000;}
+.xyzBackgroundColorS{background-color:#336699;}
diff --git a/Sketchometry.activity/css/gui-icons-hd.css b/Sketchometry.activity/css/gui-icons-hd.css
new file mode 100644
index 0000000..3cd80b0
--- /dev/null
+++ b/Sketchometry.activity/css/gui-icons-hd.css
@@ -0,0 +1,314 @@
+#dlg-header-left {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#dlg-header-right {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#control-undo {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#control-redo {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#control-drag {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#control-construct {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#control-tools {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#control-actions {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#tools-ruler {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#tools-slider {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#control-actions-function {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#tools-regpolygon {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#tools-anglesector {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#tools-circlesector {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#tools-text {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#control-actions-hide {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#control-actions-measure {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#control-actions-del {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#control-boardprop {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#control-gallery {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#grid-visible {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#grid-snap-to-grid {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#grid-snap-to-point {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#label-visible {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#color-tab-stroke {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#color-tab-fill {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#color-tab-label {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#status-trace {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#status-fix {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#image-size-label,
+#point-size-label {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#point-size-minus,
+#image-size-minus,
+#color-field-minus {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#point-size-plus,
+#image-size-plus,
+#color-field-plus {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#color-palette-none {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#color-field-label {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#point-style-button-circle {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#point-style-button-square {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#point-style-button-cross {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#point-style-button-plus {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#line-button-arrow-first {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#line-button-arrow-last {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#line-button-first {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#line-button-last {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#line-related-midpoint {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#line-related-measure, .line-related-measure {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#sector-related-measure, .sector-related-measure {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#angle-related-measure, .angle-related-measure {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#angle-button-rightangle {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#board-clear-all {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#board-clear-traces {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#board-axis-visible {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#board-navzoom {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#nav-up {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#nav-down {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#nav-left {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#nav-right {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#nav-center {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#nav-zoom-in {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#nav-zoom-out {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#nav-zoom-100 {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#key-curve {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#key-slide {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+}
+
+#key-hwr {
+ background-size: 1200px 756px;
+ background-image: url(../pics/sui-exo-icon-map-white-64.png);
+} \ No newline at end of file
diff --git a/Sketchometry.activity/css/gui-icons.css b/Sketchometry.activity/css/gui-icons.css
new file mode 100644
index 0000000..06e47a4
--- /dev/null
+++ b/Sketchometry.activity/css/gui-icons.css
@@ -0,0 +1,408 @@
+#dlg-header-left {
+ width: 45px;
+ height: 30px;
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -600px -85px;
+}
+
+#dlg-header-right {
+ padding-top: 5px;
+ margin-right: 8px;
+ width: 28px;
+ height: 28px;
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -600px -246px;
+}
+
+#control-undo {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -39px -165px;
+ margin: 0px auto;
+}
+
+#control-redo {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -119px -165px;
+ margin: 0px auto;
+}
+
+#control-drag {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -199px -165px;
+ margin: 0px auto;
+}
+
+#control-construct {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -279px -165px;
+ margin: 0px auto;
+}
+
+#control-tools {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-position: -359px -165px;
+ background-repeat: no-repeat;
+ margin: 0px auto;
+}
+
+#control-actions {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-position: -342px -165px;
+ background-repeat: no-repeat;
+ margin: 0px auto;
+}
+
+#tools-ruler {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -918px -481px;
+ margin: 0px auto;
+}
+
+#tools-slider {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -1000px -481px;
+ margin: 0px auto;
+}
+
+#control-actions-function {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -439px -162px;
+ margin: 0px auto;
+}
+
+#tools-regpolygon {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -519px -165px;
+ margin: 0px auto;
+}
+
+#tools-anglesector {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -599px -165px;
+ margin: 0px auto;
+}
+
+#tools-circlesector {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -679px -165px;
+ margin: 0px auto;
+}
+
+#tools-text {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -759px -165px;
+ margin: 0px auto;
+}
+
+#control-actions-hide {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -838px -167px;
+ margin: 0px auto;
+}
+
+#control-actions-measure {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -280px -165px;
+ margin: 0px auto;
+}
+
+#control-actions-del {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-position: -360px -87px;
+ background-repeat: no-repeat;
+ margin: 0px auto;
+}
+
+#control-boardprop {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -918px -165px;
+ margin: 0px auto;
+}
+
+#control-gallery {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -998px -167px;
+ margin: 0px auto;
+}
+
+#grid-visible {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -41px -324px;
+ margin: 0px auto;
+}
+
+#grid-snap-to-grid {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -120px -324px;
+ margin: 0px auto;
+}
+
+#grid-snap-to-point {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -200px -324px;
+ margin: 0px auto;
+}
+
+#label-visible {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -686px -326px;
+}
+
+#color-tab-stroke {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -200px -400px;
+}
+
+#color-tab-fill {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -120px -400px;
+}
+
+#color-tab-label {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -40px -400px;
+}
+
+#status-trace {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -600px -400px;
+}
+
+#status-fix {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -520px -400px;
+}
+
+#image-size-label,
+#point-size-label {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -680px -400px;
+}
+
+#point-size-minus,
+#image-size-minus,
+#color-field-minus {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -447px -246px;
+}
+
+#point-size-plus,
+#image-size-plus,
+#color-field-plus {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -367px -246px;
+}
+
+#color-palette-none {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -600px -244px;
+}
+
+#color-field-label {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ /* The background-position is dynamically set in context.js */
+}
+
+#point-style-button-circle {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -762px -402px;
+}
+
+#point-style-button-square {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -842px -402px;
+}
+
+#point-style-button-cross {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -602px -242px;
+}
+
+#point-style-button-plus {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -362px -242px;
+}
+
+#line-button-arrow-first {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -120px -243px;
+}
+
+#line-button-arrow-last {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -40px -243px;
+}
+
+#line-button-first {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -198px -482px;
+}
+
+#line-button-last {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -122px -482px;
+}
+
+#line-related-midpoint {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -1138px -398px;
+}
+
+#line-related-measure, .line-related-measure {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -913px -400px;
+}
+
+#sector-related-measure, .sector-related-measure {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -1074px -400px;
+}
+
+#angle-related-measure, .angle-related-measure {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -993px -400px;
+}
+
+#angle-button-rightangle {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -42px -481px;
+}
+
+#board-clear-all {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -361px -85px;
+ margin: 0px auto;
+}
+
+#board-clear-traces {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -360px -324px;
+ margin: 0px auto;
+}
+
+#board-axis-visible {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -280px -324px;
+ margin: 0px auto;
+}
+
+#board-navzoom {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -759px -561px;
+ margin: 0px auto;
+}
+
+#nav-up {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -200px -243px;
+}
+
+#nav-down {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -280px -243px;
+}
+
+#nav-left {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -120px -243px;
+}
+
+#nav-right {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -40px -243px;
+}
+
+#nav-center {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -360px -243px;
+}
+
+#nav-zoom-in {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -440px -322px;
+}
+
+#nav-zoom-out {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -520px -322px;
+}
+
+#nav-zoom-100 {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -600px -322px;
+}
+
+#key-curve {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -916px -563px;
+}
+
+#key-slide {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -996px -563px;
+}
+
+#key-hwr {
+ background-image: url(../pics/sui-exo-icon-map-white-40.png);
+ background-repeat: no-repeat;
+ background-position: -1076px -563px;
+}
+
diff --git a/Sketchometry.activity/css/gui.css b/Sketchometry.activity/css/gui.css
new file mode 100644
index 0000000..1984a65
--- /dev/null
+++ b/Sketchometry.activity/css/gui.css
@@ -0,0 +1,1115 @@
+/**********************************************************/
+
+::-webkit-scrollbar { /* NO scrollbars on WebKit Browsers */
+ width: 0px;
+ height: 0px;
+}
+
+/**********************************************************/
+
+a, .link {
+ color: #ff4400;
+ cursor: pointer;
+ text-decoration: underline;
+}
+
+a.highlight {
+ padding: 10px;
+ margin: 0px 15px;
+ color: black;
+ font-weight: bold;
+}
+
+a.highlight:active, a.highlight:hover {
+ background-color: #cdaadc;
+ border-radius: 10px;
+}
+
+a.proplight, a.proplight:active, a.proplight:hover {
+ padding: 5px;
+ margin: 0px 15px;
+ color: white;
+ font-size: 19px;
+ text-decoration: none;
+}
+
+.proplight_active {
+ background-color: #cdaadc;
+ border-radius: 8px;
+}
+
+/****************************************/
+
+body {
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ font-family: Helvetica, Arial, sans-serif;
+}
+
+button {
+ -webkit-border-radius: 12px;
+ -moz-border-radius: 12px;
+ border-radius: 12px;
+ color: #fff;
+ border: 1px solid #CCC;
+ padding: 5px 15px;
+}
+
+button {
+ font-size: 18px;
+}
+
+button.hwr {
+ color: #000;
+}
+
+label {
+ color: white;
+}
+
+pre {
+ white-space: pre-wrap;
+}
+
+table, th, tr {
+ border-width: 0px;
+}
+
+/****************************************/
+
+.block {
+ display: block;
+}
+
+.inline {
+ display: inline;
+}
+
+/****************************************/
+
+.center {
+ text-align: center;
+}
+
+.bottom {
+ vertical-align: bottom;
+}
+
+.middle {
+ vertical-align: middle;
+}
+
+.top {
+ vertical-align: top;
+}
+
+.centered {
+ margin: 0px auto;
+}
+
+.fleft {
+ float: left;
+}
+
+.fright {
+ float: right;
+}
+
+.vcenter {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+/****************************************/
+
+.clear {
+ clear: both;
+}
+
+.nobr {
+ text-wrap: none;
+}
+
+/****************************************/
+
+.height {
+ height: 100%;
+}
+
+.width {
+ width: 100%;
+}
+
+/****************************************/
+
+.padding {
+ padding: 8px;
+}
+
+/****************************************/
+
+.hidden {
+ visibility: hidden !important;
+}
+
+.not-displayed {
+ display: none !important;
+}
+
+/****************************************/
+
+.border-l {
+ border-radius: 16px;
+}
+
+.border-s {
+ border-radius: 8px;
+}
+
+.border-t {
+ border-radius: 4px;
+}
+
+/****************************************/
+
+.border-dashed {
+ border: 1px dashed white !important;
+}
+
+.border-solid {
+ border: 1px solid white !important;
+}
+
+/****************************************/
+
+.shadow-l {
+ box-shadow: 2px 2px 8px #667788;
+}
+
+.shadow-s {
+ box-shadow: inset 1px 1px 2px #000000;
+}
+
+/****************************************/
+
+.hspacer-xs {
+ float: left;
+ height: 1px;
+ width: 2px;
+}
+
+.hspacer-s {
+ float: left;
+ height: 1px;
+ width: 4px;
+}
+
+.hspacer-small {
+ float: left;
+ height: 5px;
+ width: 8px;
+}
+
+.hspacer-medium {
+ float: left;
+ height: 1px;
+ width: 16px;
+}
+
+.hspacer-long {
+ float: left;
+ height: 1px;
+ width: 64px;
+}
+
+.hspacer {
+ float: left;
+ height: 1px;
+ width: 46px;
+}
+
+.tspacer {
+ min-width: 1px;
+ min-height: 1px;
+ margin-top: 8px;
+}
+
+.bspacer-s {
+ min-width: 1px;
+ min-height: 1px;
+}
+
+.bspacer-m {
+ min-width: 1px;
+ min-height: 3px;
+}
+
+.bspacer {
+ min-width: 1px;
+ min-height: 6px;
+}
+
+/****************************************/
+
+.hmirrored {
+ transform: scaleX(-1);
+ filter: FlipH;
+ -moz-transform: scaleX(-1);
+ -o-transform: scaleX(-1);
+ -webkit-transform: scaleX(-1);
+ -ms-filter: "FlipH";
+}
+
+.vmirrored {
+ transform: scaleY(-1);
+ filter: FlipV;
+ -moz-transform: scaleY(-1);
+ -o-transform: scaleY(-1);
+ -webkit-transform: scaleY(-1);
+ -ms-filter: "FlipV";
+}
+
+/****************************************/
+
+.boardText {
+ padding: 5px;
+ border-radius: 5px;
+ background-color: rgba(85%, 95%, 0%, 0.75);
+}
+
+.cell-container {
+ padding-top: 2px;
+ margin-top: 1px;
+ border-spacing: 8px 4px;
+ padding-bottom: 2px;
+ margin-bottom: 1px;
+}
+
+.dialog {
+ opacity: 0.85;
+ padding: 3px;
+ position: absolute;
+ left: 75px;
+ top: 80px;
+ z-index: 20;
+ background-color: #000000;
+ border-radius: 10px;
+ border: 3px solid black;
+ font-family: Arial,sans-serif;
+}
+
+.gradient {
+ background: -moz-radial-gradient(circle, #8899aa, white);
+ background: -webkit-gradient(radial, center center, 0, center center, 200, from(#8899aa), to(white));
+ background: -webkit-radial-gradient(circle, #8899aa, white);
+}
+
+.info {
+ position: absolute;
+ width: auto;
+ height: auto;
+ opacity: 0.85;
+ padding: 10px;
+ margin: 5px;
+ z-index: 20;
+ color: #ffff00;
+ border: 2px solid #aaaaaa;
+ -moz-border-radius: 15px;
+ -webkit-border-radius: 15px;
+}
+
+.JXGtext, .JXGinfobox {
+ text-shadow: none;
+ font-weight: normal;
+}
+
+.scroll-left {
+ border-top: 2px solid white;
+ border-left: 2px solid white;
+}
+
+.scroll-right {
+ border-top: 2px solid white;
+ border-right: 2px solid white;
+}
+
+.tbHeight-small {
+ height: 60px;
+}
+
+.tbHeight-big {
+ height: 76px;
+}
+
+.tools {
+ background-color: #009900 !important;
+ /* background-color: #007700; */
+ /* nothing for heiko or alfred */
+}
+
+.triangle-left {
+ float: left;
+ height: 0;
+ width: 0;
+ line-height: 0;
+ font-size: 0;
+ border-top: 8px solid transparent;
+ border-bottom: 8px solid transparent;
+ border-right: 8px solid #fff;
+}
+
+.triangle-right {
+ float: left;
+ height: 0;
+ width: 0;
+ line-height: 0;
+ font-size: 0;
+ border-top: 8px solid transparent;
+ border-bottom: 8px solid transparent;
+ border-left: 8px solid #fff;
+}
+
+/****************************************/
+
+.button {
+ height: 36px;
+ overflow: hidden;
+ width: 40px;
+}
+
+.button-selected {
+ background-color: #aa3333 !important;
+}
+
+.button-emphasized {
+ background-color: #8899aa;
+ box-shadow: 1px 1px 2px #000000 !important;
+}
+
+.button-disabled {
+ background-color: #8899aa;
+ opacity: 0.3;
+}
+
+.button-color {
+ background-color: #556677;
+}
+
+.button-color-box {
+ background-color: #667788;
+}
+
+.buttonLabel {
+ font-family: Arial, Helvetica, sans-serif;
+ font-size: 8pt;
+ text-align: center;
+ font-weight: normal;
+ line-height: 1.0;
+ padding-top: 2px;
+ padding-bottom: 7px;
+ clear: both;
+ text-shadow: none;
+ color: #ffffff;
+ /* max-height:2.5ex; The prop labels for grid look badly bad with this setting! */
+}
+
+.sui-button-box {
+ background-color: #556677;
+ border: none;
+ border-radius: 8px;
+ overflow: hidden;
+ padding-top: 8px;
+ width: 54px;
+}
+
+.sui-button-box-narrow {
+ background-color: #556677;
+ border: none;
+ border-radius: 8px;
+ overflow: hidden;
+ margin: 3px;
+ padding: 4px;
+ width: 38px;
+}
+
+.sui-button-box-wide {
+ background-color: #556677;
+ border: none;
+ border-radius: 8px;
+ overflow: hidden;
+ margin: 3px;
+ padding: 4px;
+ width: 84px;
+}
+
+.sui-button-box-xl {
+ background-color: #556677;
+ border: none;
+ border-radius: 8px;
+ overflow: hidden;
+ margin: 3px;
+ padding: 4px;
+ width: 148px;
+}
+
+.sui-button-box-xxl {
+ background-color: #556677;
+ border: none;
+ border-radius: 8px;
+ overflow: hidden;
+ margin: 3px;
+ padding: 4px;
+ width: 162px;
+}
+
+.sui-button-xs {
+ height: 28px;
+ width: 27px;
+}
+
+.sui-button {
+ border: none;
+ border-radius: 8px;
+ height: 38px;
+ overflow: hidden;
+ width: 50px;
+}
+
+.sui-button-wide {
+ border: none;
+ border-radius: 8px;
+ height: 38px;
+ overflow: hidden;
+ width: 84px;
+}
+
+.sui-dialog {
+ border-radius: 16px;
+ position: relative;
+ width: 200px;
+ text-align: center;
+ line-height: 100px;
+ border: 8px solid #666;
+ box-shadow: 2px 2px 4px #888;
+ float: none;
+}
+
+/****************************************/
+
+#dlg-content {
+ overflow-y: auto;
+ padding: 15px;
+ clear: both;
+ border-radius: 10px;
+ border: 2px solid black;
+ background-color: #ffffff;
+ font-family: Helvetica,sans-serif;
+ font-size: 18px;
+}
+
+#dlg-header-middle {
+ margin-top: 6px;
+ margin-bottom: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ min-height: 22px;
+ width: auto;
+ font-size: 20px;
+ border-radius: 15px;
+ color: white;
+}
+
+#toolbar {
+ position: absolute;
+ width: 100%;
+ -ms-touch-action: none;
+}
+
+#menu {
+ padding-top: 6px;
+ width: 100%;
+}
+
+#toolbar-overflow {
+ overflow-x: scroll;
+ overflow-y: hidden;
+}
+
+#tool-stage {
+ width: 78%;
+ height: 100%;
+ color: white;
+}
+
+#tool-exe {
+ border-radius: 8px;
+ border: 1px solid black;
+ height: 100%;
+ width: 100%;
+ background-image: url(../pics/icon-close.png);
+ background-repeat: no-repeat;
+ background-position: 9px 9px;
+}
+
+#color-box {
+ box-shadow: none !important;
+ height: 188px;
+ margin: -8px;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 8px;
+ width: 176px;
+}
+
+#ctxPanel {
+ position: absolute;
+ min-width: 208px;
+ padding-top: 0px;
+ padding-bottom: 8px;
+ overflow-y: auto;
+ z-index: 10;
+ box-shadow: 2px 2px 10px #000000;
+ border-radius: 16px !important;
+ color: white;
+}
+
+#ctxBoard {
+ text-align: center;
+}
+
+#ctxProps {
+ margin-top: 8px;
+}
+
+#ctxObjects {
+ margin-top: 22px;
+ margin-bottom: 12px;
+}
+
+#content {
+ position: absolute;
+ padding: 0px;
+}
+
+#jxgbox {
+ background-color: #ffffff;
+ cursor: default;
+ overflow: hidden;
+ -ms-touch-action: none;
+}
+
+#textboxInput {
+ margin-top: 9px;
+ width: 480px;
+ max-width: 480px;
+ height: 70px;
+ font-size: 24px;
+}
+
+#magnifier {
+ width: 100px;
+ height: 100px;
+ position: absolute;
+ top: 80px;
+ right: 10px;
+ background-color: white;
+ border: 1px solid black;
+}
+
+#confirm {
+ z-index: 1011;
+}
+
+#modalWindow {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color:#336699;
+ opacity: 0.75;
+ z-index: 1010;
+}
+
+#mainWindow {
+ z-index: 20;
+}
+
+#inputWindow {
+ overflow: hidden;
+ width: 0px;
+ height: 0px;
+}
+
+#status-box {
+ position: absolute;
+ z-index: 20;
+}
+
+#status {
+ width: 242px;
+ height: 38px;
+ opacity: 0.85;
+ padding: 10px;
+ padding-left: 15px;
+ padding-right: 15px;
+ font-size: 18px;
+ color: #ffec92;
+ line-height: 1.2;
+ display:table-cell;
+ vertical-align:middle;
+}
+
+#fx-input {
+ padding: 2px;
+ border-radius: 4px;
+}
+
+#plot-fx-label {
+ margin-top: 7px;
+ margin-left: 14px;
+ margin-right: 7px;
+}
+
+#keyboardPanel {
+ position: absolute;
+ padding-top: 8px;
+ padding-left: 8px;
+ padding-right: 8px;
+ padding-bottom: 6px;
+ background-color: #334455;
+ box-shadow: 2px 2px 10px #000000;
+ border-radius: 16px !important;
+ line-height: 1.4;
+ font-size: 16px;
+ font-family: Helvetica, Arial, sans-serif;
+ font-weight: bold;
+ z-index: 20;
+ width: 654px;
+
+}
+
+#kb-textbox {
+ margin-top: 6px;
+ margin-bottom: 6px;
+ width: 560px;
+ max-width: 560px;
+ height: 70px;
+ color: red;
+ font-size: 18px;
+}
+
+#kb-jc-func-panel {
+ width: 440px;
+}
+
+#hwrCanvas {
+ background-color: #eeeeee;
+ width: 548px;
+ height: 180px;
+ border-radius: 8px;
+}
+
+/****************************************/
+
+div.file-input {
+ position: relative;
+}
+
+div.fakefile {
+ position: absolute;
+ top: 10px;
+ left: 0px;
+ z-index: 1;
+ width: 100%;
+}
+
+input.file {
+ position: relative;
+ text-align: right;
+ -moz-opacity:0 ;
+ filter:alpha(opacity: 0);
+ opacity: 0;
+ z-index: 2;
+}
+
+#files {
+ height: 38px;
+}
+
+/****************************************/
+
+#axis-scale-group {
+ margin-top: 12px;
+}
+
+#object-label-group,
+#color-group,
+#status-group {
+ margin: 0px auto;
+ padding-top: 0px;
+ padding-bottom: 0px;
+}
+
+#status-group {
+ margin-top: 8px;
+}
+
+#navigation-group {
+ height: 130px;
+}
+
+#color-tab-none {
+ background-image: none;
+}
+
+#color-field-group,
+#point-style-group,
+#point-style,
+#point-coord {
+ width: 176px;
+}
+
+#point-size-control {
+ height: 36px;
+ width: 176px;
+}
+
+.color-l, .color-item {
+ background-color: #8899aa;
+}
+
+.color-l:hover {
+ background-color: #444444;
+}
+
+.color-m {
+ background-color: #bbbbcc;
+}
+
+.color-s {
+ background-color: #336699;
+}
+
+.color-toolbar {
+ background-color: #8899aa;
+}
+
+.color-control {
+ background-color: #999900;
+}
+
+.color-group {
+ background-color: #334455;
+}
+
+.color-text-field {
+ background-color: #ffffff;
+}
+
+.color-palette-c00 {
+}
+
+.color-palette-c01 {
+ background-color: #ffffff;
+}
+
+.color-palette-c02 {
+ background-color: #999999;
+}
+
+.color-palette-c03 {
+ background-color: #000000;
+}
+
+.color-palette-c04 {
+ background-color: #ff0000;
+}
+
+.color-palette-c05 {
+ background-color: #00ff00;
+}
+
+.color-palette-c06 {
+ background-color: #0000ff;
+}
+
+.color-palette-c07 {
+ background-color: #ff00ff;
+}
+
+.color-palette-c08 {
+ background-color: #c00;
+}
+
+.color-palette-c09 {
+ background-color: #ffff00;
+}
+
+.color-palette-c10 {
+ background-color: #00ffff;
+}
+
+.color-palette-c11 {
+ background-color: #ff99ff;
+}
+
+/* -------------------------------------------------------------------------------------------------------------- */
+
+.radio-button-group {
+ margin-top: 8px !important;
+ height: 16px !important;
+ border: solid 2px #DDDDFF !important;
+ background-color: #DDDDFF;
+}
+
+.radio-button {
+ margin: -2px !important;
+ margin-top: -10px !important;
+ margin-right: 8px !important;
+ background-color: #DDDDFF !important;
+ width: 32px !important;
+ height: 32px !important;
+ padding: 2px !important;
+ border: none !important;
+}
+
+/* --- sui ------------------------------------------------------------------------------------------------------ */
+
+.sui-toolbar {
+ margin: 0px;
+ padding: 0px;
+}
+
+.sui-group,
+.sui-group-top,
+.sui-group-bottom {
+ border: solid 0px #000000;
+ border-radius: 8px;
+ padding: 8px;
+ padding-bottom: 0px;
+ width: 192px;
+ overflow: hidden;
+}
+
+.sui-group-top {
+ padding-top: 0px;
+}
+
+.sui-item,
+.sui-item-double,
+.sui-item-top {
+ border: solid 0px #000000;
+ border-top: none;
+ border-bottom: none;
+ padding-left: 8px;
+ padding-right: 8px;
+ padding-top: 4px;
+ padding-bottom: 2px;
+ width: 176px;
+ overflow: hidden;
+}
+
+.sui-item-double {
+ height: 84px;
+}
+
+.sui-item-top {
+ border-top: solid 0px #000000;
+ border-top-left-radius: 8px;
+ border-top-right-radius: 8px;
+}
+
+.sui-item-bottom {
+ border-bottom-left-radius: 8px;
+ border-bottom-right-radius: 8px;
+ padding-left: 8px;
+ padding-right: 8px;
+ padding-top: 2px;
+ padding-bottom: 4px;
+ width: 176px;
+ overflow: hidden;
+}
+
+.sui-label,
+.sui-label-xs,
+.sui-label-small,
+.sui-label-medium {
+ float: left;
+ height: 38px;
+ width: 38px;
+}
+
+.sui-label-xs {
+ width: 15px;
+}
+
+.sui-label-small {
+ width: 20px;
+}
+
+.sui-label-medium {
+ width: 30px;
+}
+
+.sui-button-wide-square,
+.sui-button-quattro,
+.sui-tab {
+ border: none;
+ border-radius: 8px;
+ /*float: left;*/ /* interferes with centered buttons + labels */
+ height: 38px;
+ overflow: hidden;
+ width: 50px;
+}
+
+.sui-radio-button {
+ background: none;
+ border-radius: 8px;
+ height: 38px;
+ width: 38px;
+ margin-bottom: -5px;
+}
+
+.sui-button-narrow {
+ border: none;
+ border-radius: 8px;
+ width: 38px;
+}
+
+.sui-button-small {
+ margin-bottom: 1px;
+ margin-top: 7px;
+ height: 28px;
+ width: 27px;
+}
+
+.sui-button-wide-square {
+ width: 84px;
+}
+
+.sui-button-quattro {
+ width: 176px;
+}
+
+.sui-button-wide-square {
+ height: 84px;
+}
+
+
+.sui-button-tab {
+ border-bottom-left-radius: 0px;
+ border-bottom-right-radius: 0px;
+ padding-bottom: 5px;
+}
+
+.sui-text-field,
+.sui-text-field-medium,
+.sui-text-field-large {
+ border: solid 1px #334455;
+ border-radius: 8px;
+ font-size: 18px;
+ height: 28px !important;
+ margin: 0px;
+ margin-bottom: 0px;
+ margin-top: 4px;
+ overflow: hidden;
+ padding: 2px;
+ text-align: right;
+ width: 48px;
+}
+
+.sui-text-field-medium {
+ width: 104px;
+}
+
+.sui-text-field-large {
+ width: 134px;
+}
+
+.sui-radio-group {
+ border-radius: 8px;
+ float: left;
+ height: 28px;
+ margin-top: 5px;
+ padding: 0px;
+}
+
+.sui-radio-button {
+ box-shadow: none;
+ margin-top: -5px;
+}
+
+.sui-spacer {
+ margin-right: 8px;
+}
+
+.sui-spacer-medium {
+ margin-right: 7px;
+}
+
+.sui-spacer-small {
+ margin-right: 4px;
+}
+
+.sui-bottom-spacer {
+ margin-bottom: 8px;
+}
+
+.sui-bottom-spacer-small {
+ margin-bottom: 4px;
+}
+
+.sui-top-spacer {
+ margin-top: 8px;
+}
+
+.sui-no-background {
+ background: none;
+ box-shadow: none;
+}
+
+.sui-arrow-down {
+ border-left: 20px solid transparent;
+ border-right: 20px solid transparent;
+ border-top: 20px solid #222220;
+ font-size: 0px;
+ line-height: 0%;
+ width: 0px;
+}
+
+.sui-arrow-up {
+ border-left: 20px solid transparent;
+ border-right: 20px solid transparent;
+ border-bottom: 22px solid #334455;
+ font-size: 0px;
+ line-height: 0%;
+ width: 0px;
+}
+
+.sui-arrow-left {
+ border-bottom: 20px solid transparent;
+ border-right: 20px solid #222220;
+ border-top: 20px solid transparent;
+ font-size: 0px;
+ line-height: 0%;
+ width: 0px;
+}
+
+.sui-arrow-right {
+ border-bottom: 20px solid transparent;
+ border-left: 20px solid #222220;
+ border-top: 20px solid transparent;
+ font-size: 0px;
+ line-height: 0%;
+ width: 0px;
+}
+
+.sui-keyboard-text {
+ color: white;
+ font-family: sans-serif;
+ font-size: 18px !important;
+ height: 32px;
+ text-align: center;
+} \ No newline at end of file
diff --git a/Sketchometry.activity/index.html b/Sketchometry.activity/index.html
new file mode 100644
index 0000000..ba00260
--- /dev/null
+++ b/Sketchometry.activity/index.html
@@ -0,0 +1,1234 @@
+<!DOCTYPE html>
+<html manifest="cache.manifest"> <!-- debug="true" enables Firebug Lite Live View -->
+<!--<html manifest="cache.manifest">-->
+<head>
+<title>Sketchometry :: Home</title>
+
+<link rel="apple-touch-icon" href="pics/icon-logo.png">
+
+<meta name="apple-mobile-web-app-capable" content="yes"/>
+<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+
+<style type="text/css">
+ #splash {
+ background: #89A;
+ width: 100%;
+ height: 100%;
+ }
+
+ #splash-hint {
+ overflow: hidden;
+ position: absolute;
+ width: 100%;
+ text-align: center;
+ top: 50%;
+ height: 150px;
+ margin-top: -150px;
+ padding: 20px;
+ background-color: #89A;
+ color: white;
+ }
+</style>
+
+<link type="text/css" rel="stylesheet" href="css/gui.css"/>
+<link type="text/css" rel="stylesheet" href="css/gui-icons.css" />
+<link type="text/css" rel="stylesheet" href="css/gallery-general.css" />
+<!--
+<link rel="stylesheet/less" type="text/css" href="gallery/gallery.less" />
+-->
+<!-- High pixel density displays -->
+<link rel="stylesheet" href="css/gui-icons-hd.css" media="only screen and (-moz-min-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2)" />
+<link rel="stylesheet" href="css/gallery-ip3.css" media="only screen and (-moz-min-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2)" />
+<!--
+<link type="text/css" rel="stylesheet" media="screen and (min-height: 900px)" href="gallery/gallery-big.css" />
+-->
+<link rel="stylesheet" href="css/gallery-small.css" media="screen and (max-height: 600px)" />
+
+<!--
+<script src="3dparty/less/less-1.3.0.js" type="text/javascript"></script>
+-->
+<script type="text/javascript" src="js/ext_ecma.js"></script>
+<script type="text/javascript" src="3dparty/jQuery/jquery-1.7.1.min.js"></script>
+<script type="text/javascript" src="3dparty/jQuery/jquery.jsonp.js"></script>
+<script type="text/javascript" src="js/ext_jquery.js"></script>
+
+<!-- App-Caching -->
+<script type="text/javascript" src="js/cache.js"></script>
+
+<script type="text/javascript" src="3dparty/jszip/jszip.min.js"></script>
+<script type="text/javascript" src="3dparty/jszip/jszip-deflate.min.js"></script>
+
+<script type="text/javascript" src="js/sk.js"></script>
+
+<script type="text/javascript" src="3dparty/hwr/ndollar.js"></script>
+<script type="text/javascript" src="3dparty/hwr/pdollar.js"></script>
+<script type="text/javascript" src="3dparty/hwr/handwriting.js"></script>
+<script type="text/javascript" src="3dparty/hwr/hwrstrokes.js"></script>
+
+<script type="text/javascript" src="js/jsxgraph.js"></script>
+<script type="text/javascript" src="js/gui.js"></script>
+
+<script type="text/javascript" src="js/GeonextReader.js"></script>
+<script type="text/javascript" src="js/SketchReader.js"></script>
+
+<!--
+<script type="text/javascript" src="http://JSXGraph.uni-bayreuth.de/distrib/jsxgraphcore.js"></script>
+-->
+
+<script type="text/javascript" src="js/sketch.js"></script>
+
+<script type="text/javascript">
+
+ var l, hasLangDev;
+
+ hasLangDev = document.location && document.location.href.indexOf('?') > -1;
+
+ if (hasLangDev) {
+ l = document.location.href.split('?')[1];
+ l = l.split('=');
+
+ // is the first parameter's id equal to 'dev'?
+ if (l[0] === 'dev')
+ document.write('<script type="text/javascript" src="http://jsxgraph.uni-bayreuth.de/skm-localisation/lang-dev.js"><\/script>');
+ }
+
+</script>
+
+<!-- Debugging -->
+<!--
+<script type="text/javascript" src="https://getfirebug.com/firebug-lite.js"></script>
+-->
+
+<!-- Animation -->
+<!--
+<script type="text/javascript" src="animate/jquery.simulate.js"></script>
+<script type="text/javascript" src="animate/sketchodrone.js"></script>
+-->
+
+<!-- Some Templates -->
+<script type="text/html-template" id="gallery-item-template">
+ <div id="item-%id%" class="xyzBackgroundColorL xyzRoundedBorderM item itemwidth padding">
+ <input type="text" id="item-edit-name-%id%" class="xyzBackgroundColorL item-edit padding" value="%name%" disabled="disabled"/>
+ <div id="item-export-%id%-group" class="item-button-group">
+ <div id="item-export-%id%" class="item-export item-button"></div>
+ <div id="item-export-%id%-caption" class="item-export-caption item-caption buttonLabel"></div>
+ </div>
+ <div id="item-clone-%id%-group" class="item-button-group">
+ <div id="item-clone-%id%" class="item-clone item-button"></div>
+ <div id="item-clone-%id%-caption" class="item-clone-caption item-caption buttonLabel"></div>
+ </div>
+ <div id="item-delete-%id%-group" class="item-button-group nofloat">
+ <div id="item-delete-%id%" class="item-delete item-button"></div>
+ <div id="item-delete-%id%-caption" class="item-delete-caption item-caption buttonLabel"></div>
+ </div>
+
+ <div id="item-preview-%id%" class="xyzRoundedBorderM item-preview itemwidth"></div>
+ </div>
+</script>
+
+
+<script type="text/html-template" id="gallery-list-item-template">
+ <li id="gallery-list-item-%i%" data-fid="%id%">
+ <div class="gallery-list-item">
+ %name%
+ <div class="gallery-list-date">%date%</div>
+ </div>
+ </li>
+</script>
+
+<script type="text/html-template" id="gallery-list-header-template">
+ <li class="gallery-list-header">%last%</li>
+</script>
+
+<script type="text/html-template" id="gallery-auth-status-template">
+ %L-loggedinas% %name% <button id="gallery-export-logout-%what%" class="button-selected">%L-logout%</button>
+</script>
+
+<!-- Authentication process templates -->
+<script type="text/html-template" id="gallery-auth-provider-template">
+ <div id="gallery-modal-storage-select-%provider%" class="gallery-modal-storage-select-item">
+ <div id="gallery-modal-storage-logo-%provider%" class="gallery-modal-storage-logo" title="Save to %display%"></div>
+ <div id="gallery-status-%provider%" class="gallery-export-status">%L-connecting%...</div>
+ </div>
+</script>
+
+<script type="text/html-template" id="gallery-auth-choose-provider-template">
+ <div id="gallery-modal-storage-select" class="gallery-modal-storage-select"></div>
+</script>
+
+<script type="text/html-template" id="gallery-auth-connect-template">
+ <div class="gallery-export-connect-status">%L-connecting%...</div>
+</script>
+
+<script type="text/html-template" id="gallery-auth-login-template">
+ <div class="gallery-export-connect-status"><a href="" id="gallery-auth-login-link" target="_blank">%L-login%</a></div>
+</script>
+
+<script type="text/html-template" id="gallery-auth-finish-template">
+ <div class="gallery-export-connect-status"><button id="gallery-auth-continue-link" class="button-selected">%L-finishauth%</button></div>
+</script>
+
+<script type="text/html=template" id="gallery-auth-password-login-form">
+ <div id="gallery-auth-password-login">
+ Hostname:<br />
+ <input type="text" id="gallery-auth-password-login-host" /><br />
+ Username:<br />
+ <input type="text" id="gallery-auth-password-login-name" /><br />
+ Password:<br />
+ <input type="password" id="gallery-auth-password-login-pass" /><br />
+ <button id="gallery-auth-password-login-continue" class="button-selected fright">%L-continue%</button>
+ </div>
+</script>
+
+<script type="text/html-template" id="gallery-auth-error-template">
+ An error has occurred. The server returned: <strong>%message%</strong>.<br/><button id="gallery-auth-error-restart" class="button-selected">(re-)start the authentication process</button>.
+</script>
+
+<!-- Gallery file browser for import & export -->
+<script type="text/html-template" id="gallery-browser-breadcrumbs-item-template">
+ <span id="gallery-browser-breadcrumbs-item-%id%" class="link">%name%</span>
+</script>
+
+<script type="text/html-template" id="gallery-browser-folder-template">
+ <li id="gallery-browser-folder-%id%" class="gallery-browser-folder">
+ <div class="gallery-browser-icon"></div>
+ %name%
+ </li>
+</script>
+
+<script type="text/html-template" id="gallery-browser-file-template">
+ <li id="gallery-browser-file-%id%" class="gallery-browser-file">
+ <div class="gallery-browser-icon"></div>
+ %name%
+ </li>
+</script>
+
+<script type="text/html-template" id="gallery-browser-empty-template">
+ <li class="gallery-browser-folder"><em>%L-emptyfolder%</em></li>
+</script>
+
+<script type="text/html-template" id="gallery-browser-template">
+ <div id="gallery-browser">
+ <div id="gallery-browser-current-folder"><span id="gallery-browser-current-folder-status"></span></div>
+ <ul id="gallery-browser-listview" class="gallery-modal-list xyzRoundedBorderM"></ul>
+ </div>
+</script>
+
+<!-- Settings dialog -->
+<script type="text/html-template" id="gallery-settings-item">
+ <li id="gallery-options-item-%id%" class="">
+ <div class="gallery-options-label">%label%</div>
+ %action%
+ </li>
+</script>
+
+<script type="text/html-template" id="gallery-settings-action-bool">
+ <div id="gallery-options-%id%-action" class="gallery-options-action gallery-options-action-bool-%status%"></div>
+</script>
+
+<script type="text/html-template" id="gallery-settings-list-item">
+ <li id="gallery-settings-list-item-%id%" class="">
+ <span class="gallery-options-list-emph-%emph%">%label%</span>
+ </li>
+</script>
+
+<script type="text/html-template" id="gallery-settings-action-list">
+ %value% <div id="gallery-options-%id%-action" class="gallery-options-action gallery-options-action-list"></div>
+</script>
+
+<script type="text/html-template" id="gallery-settings-action-action">
+ <div id="gallery-options-%id%-action" class="gallery-options-action gallery-options-action-action"></div>
+</script>
+
+<script type="text/html-template" id="gallery-settings-action-volume">
+ <div id="gallery-options-%id%-action" class="gallery-options-action gallery-options-action-volume">
+ <div id="gallery-options-%id%-up" class="gallery-options-action gallery-options-volume-up"></div>
+ <div id="gallery-options-%id%-status" class="gallery-options-volume-status gallery-options-action-volume-%value%"></div>
+ <div id="gallery-options-%id%-down" class="gallery-options-action gallery-options-volume-down"></div>
+ </div>
+</script>
+<!-- end of templates -->
+</head>
+
+<body id="gui">
+
+<!-- Splash screen -->
+<div id="splash">
+ <div id="splash-hint">
+ <img src="pics/sketchometry.png" style="width: 500px;"/>
+ <h3>Loading...</h3>
+ </div>
+</div>
+
+<!-- Gallery -->
+<div id="gallery">
+ <div data-role="content" id="gallerycontent">
+ <div id="gallery-container">
+ <div id="debug-bar">
+ <div id="toolbar-button-close" class="toolbar-button xyzRoundedBorderM xyzButtonFlat">Close Debug Toolbar</div>
+ </div>
+
+ <div id="gallery-header">
+ <a href="http://www.sketchometry.com/">
+ <img src="pics/sketchometry.png" id="gallery-header-watermark" alt="Sketchometry"/>
+ </a>
+ </div>
+
+ <div id="flow-container" class="yzBackgroundColorM itemheight">
+
+ <div id="carousel" class="yzBackgroundColorM itemheight">
+ <div class="itemlist yzBackgroundColorM">
+ <!-- filled by the onReady listener below -->
+ </div>
+ </div>
+ <div id="carousel-eventcapture-left" class="carousel-eventcapture"></div>
+ <div id="carousel-eventcapture-right" class="carousel-eventcapture"></div>
+ <div id="carousel-eventcapture" class="carousel-eventcapture"></div>
+ </div>
+
+ <div id="toolbar-container">
+ <div id="toolbar-spacer"></div>
+
+ <!-- bg-selected class -->
+ <div id="toolbar-group-import" class="toolbar-group xyzBackgroundColorM xyzRoundedBorderM">
+ <div id="toolbar-button-import" class="toolbar-button xyzRoundedBorderM xyzButtonFlat"></div>
+ <div id="toolbar-button-import-caption" class="toolbar-button-caption buttonLabel"></div>
+ </div>
+
+ <!-- bg-selected class -->
+ <div id="toolbar-group-new" class="toolbar-group xyzBackgroundColorM xyzRoundedBorderM">
+ <div id="toolbar-button-new" class="toolbar-button xyzRoundedBorderM xyzButtonFlat"></div>
+ <div id="toolbar-button-new-caption" class="toolbar-button-caption buttonLabel"></div>
+ </div>
+ </div>
+
+ <div id="gallery-disabled-layer" class="xyzBackgroundColorS">
+ <div id="gallery-css-indicator"></div>
+ </div>
+
+ <div id="gallery-list-bg" class="gallery-modal-bg">
+ <div id="gallery-list-container"
+ class="gallery-modal-container padding xyzRoundedBorderM xyzBackgroundColorL">
+ <div id="gallery-list-toolbar"
+ class="gallery-modal-toolbar-group xyzBackgroundColorL xyzRoundedBorderM">
+ <div id="gallery-list-icon" class="gallery-modal-button sui-spacer"></div>
+ <div id="gallery-list-button-sort-name"
+ class="gallery-modal-button sui-spacer sui-button button-color"></div>
+ <div id="gallery-list-button-sort-date"
+ class="gallery-modal-button sui-spacer sui-button button-color"></div>
+ <input type="text" id="gallery-list-edit-search" class="xyzRoundedBorderM sui-spacer" value=""/>
+
+ <div id="gallery-list-button-close" class="gallery-modal-button sui-button button-color"></div>
+ </div>
+
+ <div id="gallery-list" class="gallery-modal xyzRoundedBorderM">
+ <ul class="gallery-modal-list xyzRoundedBorderM"></ul>
+ </div>
+ </div>
+ </div>
+
+ <div id="gallery-export-bg" class="gallery-modal-bg">
+ <div id="gallery-export-container"
+ class="gallery-modal-container padding xyzRoundedBorderM xyzBackgroundColorL">
+ <div id="gallery-export-toolbar"
+ class="gallery-modal-toolbar-group xyzBackgroundColorL xyzRoundedBorderM">
+ <div id="gallery-export-icon" class="gallery-modal-button sui-spacer"><img id="gallery-export-icon-anim" src="pics/wait-animation.gif" alt="Animation"/></div>
+ <div id="gallery-export-button-newfolder" class="gallery-modal-button sui-spacer sui-button button-color"></div>
+ <input type="text" id="gallery-export-edit" class="xyzRoundedBorderM sui-spacer" value=""/>
+
+ <div id="gallery-export-button-close" class="gallery-modal-button sui-button button-color"></div>
+ <div id="gallery-export-button-upload" class="gallery-modal-button sui-button button-color sui-spacer"></div>
+ <!--div id="gallery-export-button-format" class="gallery-modal-button sui-button color-button sui-spacer"></div-->
+ </div>
+ <div id="gallery-export" class="gallery-modal xyzRoundedBorderM">
+ </div>
+ </div>
+ </div>
+
+ <div id="gallery-export-formats" class="xyzBackgroundColorL xyzRoundedBorderM">
+ <div id="gallery-export-format-label" class="buttonLabel">File formats</div>
+ <div id="gallery-export-format-buttons">
+ <div id="gallery-export-format-sketch" class="gallery-modal-button sui-button button-color button-selected"></div>
+ <div id="gallery-export-format-jc" class="gallery-modal-button sui-button button-color"></div>
+ <div id="gallery-export-format-html" class="gallery-modal-button sui-button button-color"></div>
+ </div>
+ </div>
+
+ <div id="gallery-options-bg" class="gallery-modal-bg">
+ <div id="gallery-options-container" class="gallery-modal-container padding xyzRoundedBorderM xyzBackgroundColorL">
+ <div id="gallery-options-toolbar" class="gallery-modal-toolbar-group xyzBackgroundColorL xyzRoundedBorderM">
+ <div id="gallery-options-icon" class="gallery-modal-button sui-spacer"></div>
+ <div id="gallery-options-button-close" class="gallery-modal-button sui-button button-color"></div>
+ </div>
+
+ <div id="gallery-options" class="gallery-modal xyzRoundedBorderM">
+ <ul id="gallery-options-list" class="gallery-modal-list xyzRoundedBorderM">
+ </ul>
+
+ </div>
+
+ </div>
+ </div>
+
+ <div id="gallery-footnote-copy" class="gallery-footnote">
+ <span id="gallery-copyright" style="">&copy; 2012 All rights reserved</span>
+ <a href="http://www.sketchometry.com/" target="_blank">Sketchometry Dev-Team</a>&nbsp;&dash;&nbsp;
+ <span id="gallery-version"></span>
+ </div>
+
+ <div id="gallery-footnote-group-left" class="xyzBackgroundColorM xyzRoundedBorderM gallery-footnote">
+ <div id="gallery-footnote-settings" class="footnote-button xyzRoundedBorderM xyzBackgroundColorM xyzButtonFlat"></div>
+ <div id="gallery-footnote-settings-caption" class="buttonLabel"></div>
+ </div>
+ <div id="gallery-footnote-group-right" class="xyzBackgroundColorM xyzRoundedBorderM gallery-footnote">
+ <a href="http://www.sketchometry.com/help/" target="_blank">
+ <div id="gallery-footnote-help" class="footnote-button xyzRoundedBorderM xyzBackgroundColorM xyzButtonFlat"></div>
+ <div id="gallery-footnote-help-caption" class="buttonLabel"></div>
+ </a>
+ </div>
+ </div>
+ </div>
+</div>
+
+<!-- mainWindow -->
+<div id="mainWindow" class="hidden">
+
+<div id="toolbar" class="tbHeight-big centered sui-toolbar color-toolbar">
+
+ <div id="menu">
+ <div id="control-unredo-group" class="fleft">
+ <div class="hspacer-small"></div>
+ <div class="fleft center sui-button-box" id="control-undo-box">
+ <div class="button button-color" id="control-undo"></div>
+ <div class="buttonLabel" id="control-undo-label"></div>
+ </div>
+ <div class="hspacer-small"></div>
+ <div class="fleft center sui-button-box" id="control-redo-box">
+ <div class="button button-color" id="control-redo"></div>
+ <div class="buttonLabel" id="control-redo-label"></div>
+ </div>
+
+ <div class="hspacer-small"></div>
+ <div class="hspacer-small triangle-left"></div>
+ <div class="hspacer-small"></div>
+
+ </div>
+
+ <!-- Start of "Toolbar Overflow Area" -->
+
+ <div id="toolbar-overflow" class="fleft">
+ <div id="toolbar-panel">
+ <div id="control-mode">
+ <div class="fleft center sui-button-box" id="control-drag-box">
+ <div class="button button-color" id="control-drag"></div>
+ <div class="buttonLabel" id="control-drag-label"></div>
+ </div>
+ <div class="hspacer-small"></div>
+ <div class="fleft center sui-button-box" id="control-construct-box">
+ <div class="button button-color" id="control-construct"></div>
+ <div class="buttonLabel" id="control-construct-label"></div>
+ </div>
+
+ <div class="hspacer-small"></div>
+ <div class="hspacer-small"></div>
+ </div>
+
+ <div id="control-toolactions">
+ <div class="fleft center sui-button-box tools" id="control-actions-function-box">
+ <div class="button button-color tools" id="control-actions-function"></div>
+ <div class="buttonLabel" id="control-actions-function-label"></div>
+ </div>
+ <div class="hspacer-small"></div>
+ <div class="fleft center sui-button-box tools" id="control-tools-box">
+ <div class="button button-color tools" id="control-tools"></div>
+ <div class="buttonLabel" id="control-tools-label"></div>
+ </div>
+ </div>
+
+ <div class="not-displayed" id="caption-tools">
+ <div class="hspacer-small"></div>
+ <div class="fleft center sui-button-box tools" id="tools-anglesector-box">
+ <div class="button button-color sui-spacer tools" id="tools-anglesector"></div>
+ <div class="buttonLabel" id="tools-anglesector-label"></div>
+ </div>
+ <div class="hspacer-small"></div>
+ <div class="fleft center sui-button-box tools" id="tools-circlesector-box">
+ <div class="button button-color sui-spacer tools" id="tools-circlesector"></div>
+ <div class="buttonLabel" id="tools-circlesector-label"></div>
+ </div>
+ <div class="hspacer-small"></div>
+ <div class="fleft center sui-button-box tools" id="tools-regpolygon-box">
+ <div class="button button-color sui-spacer tools" id="tools-regpolygon"></div>
+ <div class="buttonLabel" id="tools-regpolygon-label"></div>
+ </div>
+ <div class="hspacer-small"></div>
+ <div class="fleft center sui-button-box tools" id="tools-ruler-box">
+ <div class="button button-color sui-spacer tools" id="tools-ruler"></div>
+ <div class="buttonLabel" id="tools-ruler-label"></div>
+ </div>
+ <div class="hspacer-small"></div>
+ <div class="fleft center sui-button-box tools" id="tools-slider-box">
+ <div class="button button-color sui-spacer tools" id="tools-slider"></div>
+ <div class="buttonLabel" id="tools-slider-label"></div>
+ </div>
+ <div class="hspacer-small"></div>
+ <div class="fleft center sui-button-box tools" id="tools-text-box">
+ <div class="button button-color tools" id="tools-text"></div>
+ <div class="buttonLabel" id="tools-text-label"></div>
+ </div>
+ </div>
+
+ <div id="control-actions-group" class="fright">
+
+ <div class="hspacer-small"></div>
+ <div class="hspacer-small"></div>
+
+ <div id="control-subgroup" class="fleft">
+ <div class="fleft center sui-button-box" id="control-actions-hide-box">
+ <div class="button button-color" id="control-actions-hide"></div>
+ <div class="buttonLabel" id="control-actions-hide-label"></div>
+ </div>
+
+ <div class="hspacer-small"></div>
+ <div class="fleft center sui-button-box" id="control-actions-measure-box">
+ <div class="button button-color" id="control-actions-measure"></div>
+ <div class="buttonLabel" id="control-actions-measure-label"></div>
+ </div>
+
+ <div class="hspacer-small"></div>
+ <div class="fleft center sui-button-box" id="control-actions-del-box">
+ <div class="button button-color" id="control-actions-del"></div>
+ <div class="buttonLabel" id="control-actions-del-label"></div>
+ </div>
+ <div class="hspacer-small"></div>
+ <div class="fleft center sui-button-box" id="control-boardprop-box">
+ <div class="button button-color" id="control-boardprop"></div>
+ <div class="buttonLabel" id="control-boardprop-label"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <!-- End of "Toolbar Overflow Area" -->
+
+ <div id="control-gallery-group" class="fright">
+
+ <div class="hspacer-small"></div>
+ <div class="hspacer-small triangle-right"></div>
+ <div class="hspacer-small"></div>
+
+ <div class="fleft center sui-button-box" id="control-gallery-box">
+ <div class="button button-color" id="control-gallery"></div>
+ <div class="buttonLabel" id="control-gallery-label"></div>
+ </div>
+ <div class="hspacer-small"></div>
+ </div>
+ </div>
+
+ <table id="tool-stage" class="centered not-displayed">
+ <tr class="middle">
+ <td id="tool-exe" class="button-color center"></td>
+ </tr>
+ </table>
+
+</div>
+
+<div id="status-box" class="not-displayed">
+ <div id="status" class="sui-button-box buttonLabel">
+ <div id="recognition_line" class="not-displayed"></div>
+ <div id="recognition_segment" class="not-displayed"></div>
+ <div id="recognition_ray" class="not-displayed"></div>
+ <div id="recognition_quadrilateral" class="not-displayed"></div>
+ <div id="recognition_midpoint" class="not-displayed"></div>
+ <div id="recognition_circle" class="not-displayed"></div>
+ <div id="recognition_circle2points" class="not-displayed"></div>
+ <div id="recognition_triangle" class="not-displayed"></div>
+ <div id="recognition_normal" class="not-displayed"></div>
+ <div id="recognition_reflection" class="not-displayed"></div>
+ <div id="recognition_bisector" class="not-displayed"></div>
+ <div id="recognition_perpendicularBisector" class="not-displayed"></div>
+ <div id="recognition_tangent" class="not-displayed"></div>
+ <div id="recognition_parallel" class="not-displayed"></div>
+ <div id="recognition_polygon" class="not-displayed"></div>
+ <div id="recognition_sector" class="not-displayed"></div>
+ </div>
+</div>
+
+<div data-role="content" id="content">
+ <div id="jxgbox"></div>
+</div>
+
+<div id="ctxPanel" class="color-group center">
+
+<div id="ctxBoard">
+
+ <div id="property-board">
+
+ <div id="property-navigation">
+ <div class="center centered">
+ <table class="centered">
+ <tr>
+ <td><div class="fleft button border-s button-color" id="nav-zoom-out"></div></td>
+ <td><div class="hspacer-small"></div></td>
+ <td><div class="fleft button border-s button-color" id="nav-zoom-100"></div></td>
+ <td><div class="hspacer-small"></div></td>
+ <td><div class="button border-s button-color" id="nav-zoom-in"></div></td>
+ </tr>
+ </table>
+ </div>
+
+ <hr size="1" width="75%">
+
+ <div class="center" id="navigation-group">
+ <div class="bspacer"></div>
+ <div class="centered button border-s button-color" id="nav-up"></div>
+ <div class="bspacer"></div>
+ <table class="centered">
+ <tr>
+ <td><div class="button border-s button-color" id="nav-left"></div></td>
+ <td><div class="hspacer-s"></div></td>
+ <td><div class="button border-s button-color" id="nav-center"></div></td>
+ <td><div class="hspacer-s"></div></td>
+ <td><div class="button border-s button-color" id="nav-right"></div></td>
+ </tr>
+ </table>
+ <div class="bspacer"></div>
+ <div class="centered button border-s button-color" id="nav-down"></div>
+ </div>
+ </div>
+ </div>
+
+ <div class="sui-group color-board" id="property-axis-grid">
+ <div class="sui-item sui-item-top sui-item-bottom color-item" id="grid-group">
+ <!-- Grid -->
+ <table class="centered">
+ <tr>
+ <td>
+ <div id="grid-visible-box" class="fleft center sui-button-box-narrow">
+ <div class="button button-color" id="grid-visible"></div>
+ <div class="buttonLabel" id="grid-visible-label"></div>
+ </div>
+ </td>
+ <td colspan="2">
+ <div class="fleft center">
+ <div id="grid-scale-group">
+ <input id="grid-scale-x" data-role="none" type="text" size="2" maxlength="10" value="" class="fleft sui-text-field color-text-field sui-spacer-small" disabled />
+ <input id="grid-scale-y" data-role="none" type="text" size="2" maxlength="10" value="" class="fleft sui-text-field color-text-field" disabled />
+ </div>
+ <div class="buttonLabel" id="grid-scale-group-label"></div>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+ <table class="centered">
+ <tr>
+ <td>
+ <div id="grid-snap-to-grid-box" class="fleft center sui-button-box-narrow">
+ <div class="button button-color" id="grid-snap-to-grid"></div>
+ <div class="buttonLabel" id="grid-snap-to-grid-label"></div>
+ </div>
+ </td>
+ <td>
+ <div id="grid-snap-to-point-box" class="fleft center sui-button-box-narrow">
+ <div class="button button-color" id="grid-snap-to-point"></div>
+ <div class="buttonLabel" id="grid-snap-to-point-label"></div>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+ <!-- Axes -->
+ <table class="centered">
+ <tr>
+ <td>
+ <div id="board-axis-visible-box" class="fleft center sui-button-box-narrow">
+ <div class="button button-color" id="board-axis-visible"></div>
+ <div class="buttonLabel" id="board-axis-visible-label"></div>
+ </div>
+ </td>
+ <td colspan="2">
+ <div class="fleft center">
+ <div id="axis-scale-group">
+ <input id="axis-scale-x" data-role="none" type="text" size="2" maxlength="10" value="" class="fleft sui-text-field color-text-field sui-spacer-small" disabled />
+ <input id="axis-scale-y" data-role="none" type="text" size="2" maxlength="10" value="" class="fleft sui-text-field color-text-field" disabled />
+ </div>
+ <div class="buttonLabel" id="axis-scale-group-label"></div>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </div>
+
+ <div class="sui-group color-board" id="property-clean">
+ <div class="center sui-item sui-item-top sui-item-bottom color-item">
+ <table class="centered">
+ <tr>
+ <td>
+ <div id="board-clear-all-box" class="fleft center sui-button-box-narrow">
+ <div class="button button-color" id="board-clear-all"></div>
+ <div class="buttonLabel" id="board-clear-all-label"></div>
+ </div>
+ </td>
+ <td>
+ <div id="board-clear-traces-box" class="fright center sui-button-box-narrow">
+ <div class="button button-color" id="board-clear-traces"></div>
+ <div class="buttonLabel" id="board-clear-traces-label"></div>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ <!--
+ <div class="sui-group color-board center" id="property-background">
+ <div class="sui-item-top sui-item-bottom color-item">
+ <table class="centered">
+ <tr>
+ <td align="center">
+ <div id="board-bgnd-box" class="center sui-button-box-wide">
+ <div class="sui-button-wide border-s button-color file-input" id="board-bgnd">
+ <input class="file" type="file" id="files" name="files[]" />
+ <div class="fakefile buttonLabel" id="board-bgnd-label">BGND</div>
+ </div>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ -->
+ <div class="sui-group color-board center">
+ <div class="sui-item-top sui-item-bottom color-item">
+ <table class="centered">
+ <tr>
+ <td>
+ <div id="board-navzoom-box" class="center sui-button-box-wide">
+ <div class="button button-color" id="board-navzoom"></div>
+ <div class="buttonLabel" id="board-navzoom-label"></div>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </div>
+
+</div>
+
+<div id="ctxProps" class="center">
+
+<input id="id" type="hidden" value="">
+
+<div id="object-label-group" class="sui-item-top center middle color-item">
+ <div class="hspacer-s"></div>
+ <div class="fleft">
+ <input type="text" id="textInput" data-role="none" class="fleft sui-text-field-large color-text-field" value="" readonly="readonly">
+ <div class="buttonLabel" id="textInput-label"></div>
+ </div>
+ <div class="hspacer-s"></div>
+ <div class="fleft">
+ <div id="label-visible" class="border-s sui-button-small button-color"></div>
+ </div>
+
+ <div id="label-sticky-box" class="centered">
+ <label class="buttonLabel" id="label-sticky-label" for="label-sticky"></label>
+ <input type="checkbox" id="label-sticky" name="label-sticky" class="color-text-field top" checked="checked" disabled="disabled">
+ </div>
+
+ <div class="tspacer"></div>
+
+</div>
+
+<div id="color-group" class="sui-item-bottom color-item">
+ <div class="hspacer-s"></div>
+ <div class="fleft center">
+ <div id="color-tab-stroke" class="centered border-s button button-color sui-button-tab button-selected"></div>
+ </div>
+ <div id="fillObjects">
+ <div class="hspacer-s"></div>
+ <div class="fleft center">
+ <div id="color-tab-fill" class="centered border-s button button-color sui-button-tab button-disabled"></div>
+ </div>
+ </div>
+ <div id="labeledObjects">
+ <div class="hspacer-s"></div>
+ <div class="fleft center">
+ <div id="color-tab-label" class="centered border-s button button-color sui-button-tab button-disabled"></div>
+ </div>
+ </div>
+
+ <div id="color-box" class="center border-s fleft button button-color">
+ <div class="bspacer"></div>
+ <div class="hspacer-s"></div>
+ <div class="fleft border-s button color-palette-c03 button-color"></div>
+ <div class="hspacer-s"></div>
+ <div class="fleft border-s button color-palette-c02 button-color"></div>
+ <div class="hspacer-s"></div>
+ <div class="fleft border-s button color-palette-c01 button-color"></div>
+ <div class="hspacer-s"></div>
+ <div class="fleft border-s button color-palette-c00 button-color" id="color-palette-none"></div>
+ <div class="clear"></div>
+ <div class="bspacer"></div>
+ <div class="hspacer-s"></div>
+ <div class="fleft border-s button color-palette-c04 button-color"></div>
+ <div class="hspacer-s"></div>
+ <div class="fleft border-s button color-palette-c05 button-color"></div>
+ <div class="hspacer-s"></div>
+ <div class="fleft border-s button color-palette-c06 button-color"></div>
+ <div class="hspacer-s"></div>
+ <div class="fleft border-s button color-palette-c07 button-color"></div>
+ <div class="clear"></div>
+ <div class="bspacer"></div>
+ <div class="hspacer-s"></div>
+ <div class="fleft border-s button color-palette-c08 button-color"></div>
+ <div class="hspacer-s"></div>
+ <div class="fleft border-s button color-palette-c09 button-color"></div>
+ <div class="hspacer-s"></div>
+ <div class="fleft border-s button color-palette-c10 button-color"></div>
+ <div class="hspacer-s"></div>
+ <div class="fleft border-s button color-palette-c11 button-color"></div>
+ <div class="clear"></div>
+ <div class="bspacer"></div>
+
+ <div id="color-field-group" class="centered">
+ <table>
+ <tr>
+ <td class="bottom" ><div id="color-field-label" class="sui-label color-label"></div></td>
+ <td class="bottom">
+ <table>
+ <tr>
+ <td class="middle"><div id="color-field-minus" class="sui-button-xs button-color"></div></td>
+ <td class="middle"><input type="number" data-role="none" size="3" maxlength="3" value="50" id="color-field" class="fleft sui-text-field color-text-field"></td>
+ <td class="middle"><div id="color-field-plus" class="sui-button-xs button-color"></div></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </div>
+</div>
+
+<div id="status-group" class="sui-item-bottom sui-item-top color-item">
+
+ <div class="hspacer-s"></div>
+ <div id="status-fix-box" class="fleft sui-button-box-narrow">
+ <div id="status-fix" class="border-s button button-color"></div>
+ <div class="buttonLabel" id="status-fix-label"></div>
+ </div>
+
+ <div class="hspacer-s"></div>
+ <div id="status-trace-box" class="fleft sui-button-box-narrow">
+ <div id="status-trace" class="border-s button button-color"></div>
+ <div class="buttonLabel" id="status-trace-label"></div>
+ </div>
+</div>
+
+<div id="property-image" class="sui-group center">
+ <table>
+ <tr>
+ <td class="bottom" ><div id="image-size-label" class="sui-label color-label"></div></td>
+ <td class="bottom">
+ <table>
+ <tr>
+ <td class="middle"><div id="image-size-minus" class="border-s sui-button-xs button-color"></div></td>
+ <td class="middle"><input type="number" pattern="[0-9]*" data-role="none" size="3" maxlength="3" value="50" id="image-size-field" class="fleft sui-text-field color-text-field"></td>
+ <td class="middle"><div id="image-size-plus" class="border-s sui-button-xs button-color"></div></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td colspan="2"><div class="buttonLabel" id="image-size-field-label"></div></td></tr>
+ </table>
+</div>
+
+<div id="property-point">
+ <div id="point-specific" class="sui-group color-specific">
+ <div id="point-size" class="sui-item-top color-item">
+ <table>
+ <tr>
+ <td class="bottom" ><div id="point-size-label" class="sui-label color-label"></div></td>
+ <td class="bottom">
+ <table>
+ <tr>
+ <td class="middle"><div id="point-size-minus" class="border-s sui-button-xs button-color"></div></td>
+ <td class="middle"><input type="number" pattern="[0-9]*" data-role="none" size="3" maxlength="3" value="50" id="point-size-field" class="fleft sui-text-field color-text-field"></td>
+ <td class="middle"><div id="point-size-plus" class="border-s sui-button-xs button-color"></div></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td colspan="2"><div class="buttonLabel" id="point-size-field-label"></div></td></tr>
+ </table>
+ </div>
+
+ <div id="point-style" class="center sui-item-bottom color-item">
+ <table class="centered border-s color-group">
+ <tr>
+ <td><div id="point-style-button-circle" class="sui-radio-button button-color"></div></td>
+ <td><div id="point-style-button-square" class="sui-radio-button button-color"></div></td>
+ <td><div id="point-style-button-cross" class="sui-radio-button button-color"></div></td>
+ <td><div id="point-style-button-plus" class="sui-radio-button button-color"></div></td>
+ </tr>
+ </table>
+ <div class="buttonLabel" id="point-style-label"></div>
+ </div>
+
+ <div class="tspacer"></div>
+
+ <div id="point-coord" class="sui-item-top sui-item-bottom color-item">
+
+ <table class="centered">
+ <tr>
+ <td class="bottom"><div id="point-coord-x-label" class="sui-keyboard-text color-label">x</div></td>
+ <td class="middle"><input type="text" data-role="none" size="3" maxlength="100" value="50" id="point-coord-x-field" class="fleft sui-text-field color-text-field" readonly="readonly"></td>
+ <td>&nbsp;</td>
+ <td class="bottom"><div id="point-coord-y-label" class="sui-keyboard-text color-label">y</div></td>
+ <td class="middle"><input type="text" data-role="none" size="3" maxlength="100" value="50" id="point-coord-y-field" class="fleft sui-text-field color-text-field" readonly="readonly"></td>
+ </tr>
+ </table>
+ </div>
+
+ <div id="property-slider" class="border-s">
+
+ <div class="sui-item-bottom color-item border-s">
+ <table class="centered">
+ <tr>
+ <td class="bottom"><div id="slider-interval-a-label" class="sui-keyboard-text color-label">a</div></td>
+ <td class="middle"><input type="text" data-role="none" size="3" maxlength="100" value="50" id="slider-interval-a-field" class="fleft sui-text-field color-text-field"></td>
+ <td>&nbsp;</td>
+ <td class="bottom"><div id="slider-interval-b-label" class="sui-keyboard-text color-label">b</div></td>
+ <td class="middle"><input type="text" data-role="none" size="3" maxlength="100" value="50" id="slider-interval-b-field" class="fleft sui-text-field color-text-field"></td>
+ </tr>
+ </table>
+ <div class="buttonLabel" id="slider-interval-label"></div>
+
+ </div>
+
+ <div class="tspacer"></div>
+
+ <div id="sliderpoints-coord" class="sui-item-bottom color-item border-s">
+ <table class="centered">
+ <tr>
+ <td class="bottom"><div id="sliderpoint1-coord-x-label" class="sui-keyboard-text color-label">x<sub>1</sub></div></td>
+ <td class="middle"><input type="text" data-role="none" size="3" maxlength="100" value="50" id="sliderpoint1-coord-x-field" class="fleft sui-text-field color-text-field"></td>
+ <td>&nbsp;</td>
+ <td class="bottom"><div id="sliderpoint1-coord-y-label" class="sui-keyboard-text color-label">y<sub>1</sub></div></td>
+ <td class="middle"><input type="text" data-role="none" size="3" maxlength="100" value="50" id="sliderpoint1-coord-y-field" class="fleft sui-text-field color-text-field"></td>
+ </tr>
+ </table>
+ <table class="centered">
+ <tr>
+ <td class="bottom"><div id="sliderpoint2-coord-x-label" class="sui-keyboard-text color-label">x<sub>2</sub></div></td>
+ <td class="middle"><input type="text" data-role="none" size="3" maxlength="100" value="50" id="sliderpoint2-coord-x-field" class="fleft sui-text-field color-text-field"></td>
+ <td>&nbsp;</td>
+ <td class="bottom"><div id="sliderpoint2-coord-y-label" class="sui-keyboard-text color-label">y<sub>2</sub></div></td>
+ <td class="middle"><input type="text" data-role="none" size="3" maxlength="100" value="50" id="sliderpoint2-coord-y-field" class="fleft sui-text-field color-text-field"></td>
+ </tr>
+ </table>
+ <div class="buttonLabel" id="sliderpoints-label"></div>
+ </div>
+ </div>
+
+ </div>
+</div>
+
+<div id="property-line">
+
+ <div id="line-specific" class="center sui-group color-specific">
+
+ <div id="line-decoration" class="center sui-item-top sui-item-bottom color-item">
+ <div class="tspacer"></div>
+
+ <div class="fleft">
+ <div id="line-button-first" class="fleft border-s button button-color"></div>
+ <div id="line-button-last" class="fleft border-s button button-color"></div>
+ <div class="buttonLabel" id="line-button-label"></div>
+ </div>
+ <div class="hspacer-small"></div>
+ <div class="fleft">
+ <div id="line-button-arrow-first" class="fleft border-s button button-color"></div>
+ <div id="line-button-arrow-last" class="fleft border-s button button-color"></div>
+ <div class="buttonLabel" id="line-button-arrow-label"></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div id="property-circle">
+ <div id="circle-specific" class="sui-group color-specific">
+ <div id="circle-radius" class="sui-item-top sui-item-bottom color-item">
+ <div class="tspacer"></div>
+
+ <div class="fleft center">
+ <div id="circle-radius-group" class="fleft">
+ <input id="circle-radius-field" data-role="none" type="text" size="5" maxlength="10" value="2" class="fleft sui-text-field color-text-field" readonly="readonly" />
+ </div>
+ <div class="buttonLabel" id="circle-radius-field-label"></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div id="property-angle">
+ <div id="angle-specific" class="sui-group color-specific">
+
+ <div id="angle-radius" class="sui-item-top sui-item-bottom color-item">
+ <div class="tspacer"></div>
+
+ <div id="angle-button-rightangle-box" class="fleft sui-button-box-narrow">
+ <div id="angle-button-rightangle" class="sui-button button-color"></div>
+ <div class="buttonLabel" id="angle-button-rightangle-label"></div>
+ </div>
+ <div class="hspacer-small"></div>
+ <div class="fleft center">
+ <div id="angle-radius-group" class="fleft">
+ <input id="angle-radius-field" data-role="none" type="text" size="5" maxlength="10" value="2" class="fleft sui-text-field color-text-field sui-spacer" readonly="readonly" />
+ </div>
+ <div class="buttonLabel" id="angle-radius-field-label"></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div id="measure-specific" class="sui-group color-related">
+ <div class="sui-item-top sui-item-bottom color-item">
+ <div id="measure-box" class="sui-button-box-xxl">
+ <div class="line-related-measure fleft sui-button button-color"></div>
+ <div class="angle-related-measure fleft sui-button button-color"></div>
+ <div class="sector-related-measure fleft sui-button button-color"></div>
+ <div class="buttonLabel" id="measure-label"></div>
+ </div>
+ <div id="angle-related-measure-box" class="fleft sui-button-box">
+ <div id="angle-related-measure" class="sui-button button-color sui-spacer"></div>
+ <div class="buttonLabel" id="angle-related-measure-label"></div>
+ </div>
+ <div id="sector-related-measure-box" class="fleft sui-button-box">
+ <div id="sector-related-measure" class="sui-button button-color"></div>
+ <div class="buttonLabel" id="sector-related-measure-label"></div>
+ </div>
+ <div id="line-related-measure-box" class="fleft sui-button-box">
+ <div id="line-related-measure" class="sui-button button-color"></div>
+ <div class="buttonLabel" id="line-related-measure-label"></div>
+ </div>
+ </div>
+</div>
+
+<div id="plot-specific" class="centered middle sui-group color-specific">
+ <div id="plot-fx-label" class="fleft sui-keyboard-text">f(x) = </div><input type="text" id="plot-fx-input" size="19" data-role="none" class="fleft sui-text-field-medium color-text-field" value="" readonly="readonly">
+</div>
+
+</div>
+
+<div id="ctxObjects" class=""></div>
+<div id="ctxObjectsExtra" class=""></div>
+
+</div>
+
+<div id="keyboardPanel" class="not-displayed center">
+
+ <div id="kb-top-panel" class="color-board centered">
+
+ <table class="centered">
+ <tr>
+ <td>
+ <div class="cell-container">
+ <div id="key-left" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">&larr;</div>
+ <div id="key-hwr" class="sui-button button-color sui-spacer sui-keyboard-text vcenter"></div>
+ <div id="key-right" class="sui-button button-color sui-keyboard-text vcenter">&rarr;</div>
+ </div>
+ </td>
+ <td>
+ <div id="kb-key-panel" class="color-item border-s cell-container fright">
+ <div id="key-go" class="sui-button button-color sui-keyboard-text vcenter">&#x2714;</div>
+ <div id="key-backspace" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">&#x232b;</div>
+ <div id="key-clear" class="sui-button button-color sui-keyboard-text vcenter">&#x2327;</div>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+ <textarea id="kb-textbox" class="clear" readonly="readonly"></textarea>
+
+ </div>
+
+ <div id="kb-hwr-panel" class="not-displayed">
+ <canvas id="hwrCanvas"></canvas>
+ <br>
+ <button class="color-item hwr" id="btn-hwr-clear"></button>
+ <button class="color-item hwr" id="btn-hwr-recognize"></button>
+ <br>
+ </div>
+
+ <div id="kb-btns">
+ <table class="clear centered">
+ <tr>
+ <td class="top" colspan="3">
+ <div id="kb-num-panel" class="color-item border-s cell-container fleft">
+ <div id="key-0" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">0</div>
+ <div id="key-1" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">1</div>
+ <div id="key-2" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">2</div>
+ <div id="key-3" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">3</div>
+ <div id="key-4" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">4</div>
+ <div id="key-5" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">5</div>
+ <div id="key-6" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">6</div>
+ <div id="key-7" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">7</div>
+ <div id="key-8" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">8</div>
+ <div id="key-9" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">9</div>
+
+ <div id="key-inf" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">&#8734;</div>
+ <div id="key-eu" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">e</div>
+ <div id="key-pi" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">&pi;</div>
+ </div>
+ </td>
+ </tr>
+
+ <tr align="center">
+ <td colspan="3">
+ <div id="kb-operator-panel" class="color-item border-s cell-container">
+ <div id="key-div" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">/</div>
+ <div id="key-mult" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">*</div>
+ <div id="key-plus" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">+</div>
+ <div id="key-minus" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">-</div>
+
+ <div id="key-percent" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">%</div>
+ <div id="key-circ" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">^</div>
+ <div id="key-left-bracket" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">(</div>
+ <div id="key-right-bracket" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">)</div>
+ </div>
+ </td>
+ </tr>
+
+ <tr>
+ <td class="top" colspan="3">
+ <div id="kb-function-panel" class="color-item border-s cell-container fleft">
+ <div id="key-argx" class="sui-button-box-xxl button-color sui-spacer sui-keyboard-text vcenter">x</div>
+ <div id="key-exp" class="sui-button-box-xxl button-color sui-spacer sui-keyboard-text vcenter">exp(x)</div>
+ <div id="key-log" class="sui-button-box-xxl button-color sui-spacer sui-keyboard-text vcenter">log(x)</div>
+ <div id="key-sin" class="sui-button-box-xxl button-color sui-spacer sui-keyboard-text vcenter">sin(x)</div>
+ <div id="key-cos" class="sui-button-box-xxl button-color sui-spacer sui-keyboard-text vcenter">cos(x)</div>
+ <div id="key-tan" class="sui-button-box-xxl button-color sui-spacer sui-keyboard-text vcenter">tan(x)</div>
+ <div id="key-sqrt" class="sui-button-box-xxl button-color sui-spacer sui-keyboard-text vcenter">sqrt(x)</div>
+ <!-- <div id="key-pow" class="sui-button-box-xxl button-color sui-spacer sui-keyboard-text vcenter">pow(x)</div>-->
+ <div id="key-abs" class="sui-button-box-xxl button-color sui-spacer sui-keyboard-text vcenter">abs(x)</div>
+ </div>
+ </td>
+ </tr>
+
+ <tr align="center">
+ <td class="top">
+ <div class="kb-jc-panel color-item border-s cell-container">
+ <div id="key-curve" class="sui-button button-color sui-keyboard-text vcenter"></div>
+ </div>
+ </td>
+
+ <td class="centered top">
+ <div id="kb-jc-func-panel" class="kb-jc-panel color-item border-s cell-container">
+ <div id="key-X" class="sui-button-wide button-color sui-spacer sui-keyboard-text vcenter">X( )</div>
+ <div id="key-Y" class="sui-button-wide button-color sui-spacer sui-keyboard-text vcenter">Y( )</div>
+ <div id="key-int" class="sui-button-wide button-color sui-spacer sui-keyboard-text vcenter">int( )</div>
+ <div id="key-diff" class="sui-button-wide button-color sui-spacer sui-keyboard-text vcenter">diff( )</div>
+ <div id="key-dist" class="sui-button-wide button-color sui-spacer sui-keyboard-text vcenter">dist( )</div>
+ </div>
+
+ </td>
+
+ <td class="top" >
+ <div class="kb-jc-panel color-item border-s cell-container">
+ <div id="key-slide" class="sui-button button-color sui-keyboard-text vcenter"></div>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+ <table class="clear centered">
+ <tr>
+ <td>
+ <div id="kb-char-panel" class="color-item border-s cell-container fleft">
+ <div id="keyc-a" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">a</div>
+ <div id="keyc-b" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">b</div>
+ <div id="keyc-c" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">c</div>
+ <div id="keyc-d" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">d</div>
+ <div id="keyc-e" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">e</div>
+ <div id="keyc-f" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">f</div>
+ <div id="keyc-g" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">g</div>
+ <div id="keyc-h" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">h</div>
+ <div id="keyc-i" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">i</div>
+ <div id="keyc-j" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">j</div>
+ <div id="keyc-k" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">k</div>
+
+ <div class="bspacer-s clear"></div>
+
+ <div id="keyc-l" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">l</div>
+ <div id="keyc-m" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">m</div>
+ <div id="keyc-n" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">n</div>
+ <div id="keyc-o" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">o</div>
+ <div id="keyc-p" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">p</div>
+ <div id="keyc-q" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">q</div>
+ <div id="keyc-r" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">r</div>
+ <div id="keyc-s" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">s</div>
+ <div id="keyc-t" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">t</div>
+ <div id="keyc-u" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">u</div>
+ <div id="keyc-v" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">v</div>
+
+ <div class="bspacer-s clear"></div>
+
+ <div class="fleft">
+ <div id="keyc-w" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">w</div>
+ <div id="keyc-x" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">x</div>
+ <div id="keyc-y" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">y</div>
+ <div id="keyc-z" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">z</div>
+ <div id="key-dot" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">.</div>
+ <div id="key-comma" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">,</div>
+ <div id="key-squote" class="sui-button button-color sui-spacer sui-keyboard-text vcenter">'</div>
+ </div>
+
+ <div class="fright">
+ <div id="key-space" class="sui-button-box-xl button-color sui-keyboard-text vcenter"></div>
+ <div id="key-shift" class="sui-button-box button-color sui-keyboard-text vcenter">&#8679;</div>
+ </div>
+ </div>
+
+ <div id="kb-dyn-panel" class="border-solid border-s cell-container fleft not-displayed padding">
+ </div>
+
+ </td>
+ </tr>
+ </table>
+ </div>
+</div>
+
+<canvas id="magnifier" class="not-displayed"></canvas>
+
+</div>
+
+<!-- modalWindow -->
+<div id="modalWindow" class="center centered not-displayed"></div>
+
+<div id="inputWindow">
+ <input type="text" id="hiddenInput" value="" x-webkit-speech />
+</div>
+
+<!-- Handling of Back-Button Actions / URL-Changes -->
+<script type="text/javascript" src="js/url.js"></script>
+
+<audio id="audio-dummy"></audio>
+<audio id="audio-click"></audio>
+<audio id="audio-bubble"></audio>
+<audio id="audio-plastic"></audio>
+
+<!-- Initializing Audio -->
+<script type="text/javascript" src="js/audio.js"></script>
+
+<!-- page tracking -->
+<!--script type="text/javascript" src="http://fibonacci.uni-bayreuth.de/stats/piwik.js"></script>
+<noscript><p><img src="http://fibonacci.uni-bayreuth.de/stats/piwik.php?idsite=2"/></p></noscript-->
+
+</body>
+</html>
diff --git a/Sketchometry.activity/js/GeonextReader.js b/Sketchometry.activity/js/GeonextReader.js
new file mode 100644
index 0000000..a706845
--- /dev/null
+++ b/Sketchometry.activity/js/GeonextReader.js
@@ -0,0 +1,1285 @@
+/*
+ Copyright 2008-2013
+ Matthias Ehmann,
+ Michael Gerhaeuser,
+ Carsten Miller,
+ Bianca Valentin,
+ Alfred Wassermann,
+ Peter Wilfahrt
+
+ This file is part of JSXGraph.
+
+ JSXGraph is free software dual licensed under the GNU LGPL or MIT License.
+
+ You can redistribute it and/or modify it under the terms of the
+
+ * GNU Lesser General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version
+ OR
+ * MIT License: https://github.com/jsxgraph/jsxgraph/blob/master/LICENSE.MIT
+
+ JSXGraph is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License and
+ the MIT License along with JSXGraph. If not, see <http://www.gnu.org/licenses/>
+ and <http://opensource.org/licenses/MIT/>.
+ */
+
+/*global JXG: true, XMLSerializer: true, Image: true*/
+/*jslint nomen: true, plusplus: true*/
+
+/* depends:
+ jxg
+ base/constants
+ base/group
+ parser/geonext
+ utils/type
+ utils/color
+ utils/zip
+ utils/base64
+ utils/xml
+ elements:
+ image
+ transform
+ point
+ line
+ circle
+ glider
+ intersection
+ arrowparallel
+ bisector
+ circumcircle
+ circumcenter
+ midpoint
+ reflection
+ mirrorpoint
+ perpendicularsegment
+ parallelpoint
+ perpendicularpoint
+ sector
+ segment
+ polygon
+ curve
+ arrow
+ arc
+ angle
+ text
+ tracecurve
+ grid
+ axis
+ */
+
+(function () {
+
+ "use strict";
+
+ JXG.GeonextReader = function (board, str) {
+ var content;
+
+ this.board = board;
+ content = this.prepareString(str);
+ this.tree = JXG.XML.parse(content);
+ };
+
+ JXG.extend(JXG.GeonextReader.prototype, /** @lends JXG.GeonextReader.prototype */ {
+ changeOriginIds: function (board, id) {
+ if ((id === 'gOOe0') || (id === 'gXOe0') || (id === 'gYOe0') || (id === 'gXLe0') || (id === 'gYLe0')) {
+ return board.id + id;
+ }
+
+ return id;
+ },
+
+ /**
+ * Retrieves data by TagName from an XML node.
+ * @param {Object} node The Node that contains the data we want to get.
+ * @param {String} tag The Name of the tag we are looking for.
+ * @param {Number} [idx=0] getElementsByTagName returns an array; This parameter decides which element to use.
+ * @param {Boolean} [fc=true] If True, the result will be the <tt>data</tt> of <tt>firstChild</tt> instead of the result node.
+ * @returns {Object|Array|String} The gathered data
+ */
+ gEBTN: function (node, tag, idx, fc) {
+ var tmp;
+
+ if (!JXG.exists(node || !node.getElementsByTagName)) {
+ return node;
+ }
+
+ // Default values for optional parameters idx and fc
+ if (!JXG.exists(fc)) {
+ fc = true;
+ }
+
+ idx = idx || 0;
+ tmp = node.getElementsByTagName(tag);
+ if (tmp.length > 0) {
+ tmp = tmp[idx];
+ if (fc && tmp.firstChild) {
+ tmp = tmp.firstChild.data;
+ }
+ }
+
+ return tmp;
+ },
+
+ /**
+ * Set color properties of a geonext element.
+ * Set stroke, fill, lighting, label and draft color attributes.
+ * @param {Object} gxtEl element of which attributes are to set
+ * @param {Object} Data
+ * @returns {Object} Returns gxtEl
+ */
+ colorProperties: function (gxtEl, Data) {
+ var rgbo,
+ color = this.gEBTN(Data, 'color', 0, false);
+
+ //gxtEl.strokewidth = Data.getElementsByTagName('strokewidth')[0].firstChild.data;
+ // colorStroke = strokeColor etc. is here for downwards compatibility:
+ // once upon a time we used to create elements in here using the "new JXG.Element" constructor mechanism
+ // then we changed to board.create + setProperty afterwords
+ // now i want to use the board.create method with an appropriate attributes object to avoid setProperty calls
+ // and as gxtEl happens to be somewhat like an attributes object it's just slightly different so we adjust it
+ // for downwards compatibility during the transformation of this reader we use both properties
+
+ rgbo = JXG.rgba2rgbo(this.gEBTN(color, 'stroke'));
+ gxtEl.strokeColor = rgbo[0];
+ gxtEl.strokeOpacity = rgbo[1];
+
+ rgbo = JXG.rgba2rgbo(this.gEBTN(color, 'lighting'));
+ gxtEl.highlightStrokeColor = rgbo[0];
+ gxtEl.highlightStrokeOpacity = rgbo[1];
+
+ rgbo = JXG.rgba2rgbo(this.gEBTN(color, 'fill'));
+ gxtEl.fillColor = rgbo[0];
+ gxtEl.fillOpacity = rgbo[1];
+
+ gxtEl.highlightFillColor = gxtEl.fillColor;
+ gxtEl.highlightFillOpacity = gxtEl.fillOpacity;
+
+ rgbo = JXG.rgba2rgbo(this.gEBTN(color, 'label'));
+ gxtEl.labelColor = rgbo[0];
+ gxtEl.withLabel = rgbo[1] > 0;
+ gxtEl.labelOpacity = rgbo[1];
+ gxtEl.colorDraft = JXG.rgba2rgbo(this.gEBTN(color, 'draft'))[0];
+
+ // backwards compatibility
+ gxtEl.colorStroke = gxtEl.strokeColor;
+ gxtEl.colorFill = gxtEl.fillColor;
+ gxtEl.colorLabel = gxtEl.labelColor;
+
+ return gxtEl;
+ },
+
+ firstLevelProperties: function (gxtEl, Data) {
+ var n, key, arr;
+
+ if (!JXG.exists(Data) || !JXG.exists(Data.childNodes)) {
+ return gxtEl;
+ }
+
+ arr = Data.childNodes;
+
+ for (n = 0; n < arr.length; n++) {
+ if (JXG.exists(arr[n].firstChild) && arr[n].nodeName !== 'data' && arr[n].nodeName !== 'straight') {
+ key = arr[n].nodeName;
+
+ if (key === 'width') {
+ key = 'strokewidth';
+ }
+ gxtEl[key] = arr[n].firstChild.data;
+ }
+ }
+
+ return gxtEl;
+ },
+
+ /**
+ * Set the defining properties of a geonext element.
+ * Writing the nodeName to ident; setting the name attribute and defining the element id.
+ * @param {Object} gxtEl element of which attributes are to set
+ * @param {Object} Data
+ */
+ defProperties: function (gxtEl, Data) {
+ // 3==TEXT_NODE, 8==COMMENT_NODE
+ if (Data.nodeType === 3 || Data.nodeType === 8) {
+ return null;
+ }
+
+ gxtEl.ident = Data.nodeName;
+
+ if (gxtEl.ident === "text" || gxtEl.ident === "intersection" || gxtEl.ident === "composition") {
+ gxtEl.name = '';
+ } else {
+ gxtEl.name = this.gEBTN(Data, 'name');
+ }
+
+ gxtEl.id = this.gEBTN(Data, 'id');
+
+ return gxtEl;
+ },
+
+ visualProperties: function (gxtEl, Data) {
+ gxtEl.visible = JXG.str2Bool(this.gEBTN(Data, 'visible'));
+ gxtEl.trace = JXG.str2Bool(this.gEBTN(Data, 'trace'));
+
+ return gxtEl;
+ },
+
+ /**
+ * Transforms the Geonext properties to jsxgraph properties
+ * @param {Object} gxtEl
+ * @param {String} [type]
+ * @return {Object} gxtEl
+ */
+ transformProperties: function (gxtEl, type) {
+ var i,
+ facemap = [
+ // 0-2
+ 'cross', 'cross', 'cross',
+ // 3-6
+ 'circle', 'circle', 'circle', 'circle',
+ // 7-9
+ 'square', 'square', 'square',
+ // 10-12
+ 'plus', 'plus', 'plus'
+ ],
+ sizemap = [
+ // 0-2
+ 2, 3, 4,
+ // 3-6
+ 1, 2, 3, 4,
+ // 7-9
+ 2, 3, 4,
+ // 10-12
+ 2, 3, 4
+ ],
+ remove = [
+ 'color', 'dash', 'style', 'style', 'ident', 'colordraft', 'colorstroke', 'colorfill',
+ 'colorlabel', 'active', 'area', 'showinfo', 'showcoord', 'fix'
+ ];
+
+ gxtEl.strokeWidth = gxtEl.strokewidth;
+ gxtEl.face = facemap[parseInt(gxtEl.style, 10)] || 'cross';
+ gxtEl.size = sizemap[parseInt(gxtEl.style, 10)] || 3;
+
+ gxtEl.straightFirst = JXG.str2Bool(gxtEl.straightFirst);
+ gxtEl.straightLast = JXG.str2Bool(gxtEl.straightLast);
+
+ gxtEl.visible = JXG.str2Bool(gxtEl.visible);
+ //gxtEl.withLabel = gxtEl.visible; // withLabel is set in colorProperties()
+ gxtEl.draft = JXG.str2Bool(gxtEl.draft);
+ gxtEl.trace = JXG.str2Bool(gxtEl.trace);
+
+ if (type === 'point') {
+ // Fill properties are ignored by GEONExT
+ gxtEl.fillColor = gxtEl.strokeColor;
+ gxtEl.highlightFillColor = gxtEl.highlightStrokeColor;
+ gxtEl.fillOpacity = gxtEl.strokeOpacity;
+ gxtEl.highlightFillOpacity = gxtEl.highlightStrokeOpacity;
+ }
+
+ if (typeof gxtEl.label === 'string') {
+ delete gxtEl.label;
+ }
+ gxtEl.label = gxtEl.label || {
+ opacity: gxtEl.labelOpacity
+ };
+
+ // clean up
+ for (i = 0; i < remove.length; i++) {
+ delete gxtEl[remove[i]];
+ }
+
+ return gxtEl;
+ },
+
+ readNodes: function (gxtEl, Data, nodeType, prefix) {
+ var key, n,
+ arr = this.gEBTN(Data, nodeType, 0, false).childNodes;
+
+ for (n = 0; n < arr.length; n++) {
+ if (JXG.exists(arr[n].firstChild)) {
+ if (JXG.exists(prefix)) {
+ key = prefix + JXG.capitalize(arr[n].nodeName);
+ } else {
+ key = arr[n].nodeName;
+ }
+ gxtEl[key] = arr[n].firstChild.data;
+ }
+ }
+ return gxtEl;
+ },
+
+ subtreeToString: function (root) {
+ try {
+ // firefox
+ return (new XMLSerializer()).serializeToString(root);
+ } catch (e) {
+ // IE
+ return root.xml;
+ }
+ },
+
+ readImage: function (node) {
+ var pic = '',
+ nod = node;
+
+ if (JXG.exists(nod)) {
+ pic = nod.data;
+ while (JXG.exists(nod.nextSibling)) {
+ nod = nod.nextSibling;
+ pic += nod.data;
+ }
+ }
+ return pic;
+ },
+
+ parseImage: function (board, fileNode, level, x, y, w, h, el) {
+ var tag, id, picStr, tmpImg,
+ im = null;
+
+ if (fileNode === null) {
+ return im;
+ }
+
+ // Background image
+ if (JXG.exists(fileNode.getElementsByTagName('src')[0])) {
+ tag = 'src';
+ } else if (JXG.exists(fileNode.getElementsByTagName('image')[0]) &&
+ JXG.exists(this.gEBTN(fileNode, 'image'))) {
+ tag = 'image';
+ } else {
+ return im;
+ }
+
+ picStr = this.readImage(this.gEBTN(fileNode, tag, 0, false).firstChild);
+ if (picStr !== '') {
+ picStr = 'data:image/png;base64,' + picStr;
+
+ // Background image
+ if (tag === 'src') {
+ x = this.gEBTN(fileNode, 'x');
+ y = this.gEBTN(fileNode, 'y');
+ w = this.gEBTN(fileNode, 'width');
+ h = this.gEBTN(fileNode, 'height');
+ im = board.create('image', [picStr, [x, y], [w, h]], {
+ anchor: el,
+ layer: level
+ });
+
+ return im;
+ }
+ // Image bound to an element
+ // Read the original dimensions, i.e. the ratio h/w with the help of a temporary image.
+ // We have to wait until the image is loaded, therefore
+ // we need "onload".
+ tmpImg = new Image();
+ tmpImg.src = picStr;
+ id = el.id + '_image';
+ tmpImg.onload = function () {
+ // Now, we can read the original dimensions of the image.
+ var xf, yf, wf, hf, im, tRot,
+ wOrg = this.width,
+ hOrg = this.height;
+
+ if (el.elementClass === JXG.OBJECT_CLASS_LINE) {
+ // A line containing an image, runs through the horizontal middle
+ // of the image.
+ xf = function () {
+ return el.point1.X();
+ };
+ wf = function () {
+ return el.point1.Dist(el.point2);
+ };
+ hf = function () {
+ return wf() * hOrg / wOrg;
+ };
+ yf = function () {
+ return el.point1.Y() - hf() * 0.5;
+ };
+
+ im = board.create('image', [picStr, [xf, yf], [wf, hf]], {
+ layer: level,
+ id: id,
+ anchor: el
+ });
+
+ tRot = board.create('transform', [
+ function () {
+ return Math.atan2(el.point2.Y() - el.point1.Y(), el.point2.X() - el.point1.X());
+ },
+ el.point1
+ ], {type: 'rotate'});
+
+ tRot.bindTo(im);
+ el.image = im;
+ } else if (el.elementClass === JXG.OBJECT_CLASS_POINT) {
+ wf = function () {
+ return wOrg / board.unitX;
+ };
+ hf = function () {
+ return hOrg / board.unitY;
+ };
+ xf = function () {
+ return el.X() - wf() * 0.5;
+ };
+ yf = function () {
+ return el.Y() - hf() * 0.5;
+ };
+
+ im = board.create('image', [picStr, [xf, yf], [wf, hf]], {
+ layer: level,
+ id: id,
+ anchor: el
+ });
+ board.renderer.hide(el.label);
+ el.image = im;
+ } else if (el.elementClass === JXG.OBJECT_CLASS_CIRCLE) {
+ // A circle containing an image
+ wf = function () {
+ return 2.0 * el.Radius();
+ };
+ hf = function () {
+ return wf() * hOrg / wOrg;
+ };
+ xf = function () {
+ return el.center.X() - wf() * 0.5;
+ };
+ yf = function () {
+ return el.center.Y() - hf() * 0.5;
+ };
+
+ im = board.create('image', [picStr, [xf, yf], [wf, hf]], {
+ layer: level,
+ id: id,
+ anchor: el
+ });
+ el.image = im;
+ } else {
+ im = board.create('image', [picStr, [x, y], [w, h]], {
+ layer: level,
+ id: id,
+ anchor: el
+ });
+ el.image = im;
+ }
+ };
+
+ return im;
+ }
+ },
+
+ readConditions: function (node) {
+ var i, s, ob,
+ conditions = '';
+
+ if (JXG.exists(node)) {
+ for (i = 0; i < node.getElementsByTagName('data').length; i++) {
+ ob = node.getElementsByTagName('data')[i];
+ s = this.subtreeToString(ob);
+ conditions += s;
+ }
+ }
+
+ return conditions;
+ },
+
+ readViewPort: function (node) {
+ var no,
+ arr = [];
+
+ no = this.gEBTN(node, 'viewport', 0, false);
+
+ if (no) {
+ arr[0] = parseFloat(this.gEBTN(no, 'left'));
+ arr[1] = parseFloat(this.gEBTN(no, 'top'));
+ arr[2] = parseFloat(this.gEBTN(no, 'right'));
+ arr[3] = parseFloat(this.gEBTN(no, 'bottom'));
+ return arr;
+ }
+
+ return [];
+ },
+
+ printDebugMessage: function (outputEl, gxtEl, nodetyp, success) {
+ JXG.debug("* " + success + ": " + nodetyp + " " + gxtEl.name + " " + gxtEl.id);
+ },
+
+ readNode: function (elChildNodes, s, board) {
+ var dataVertex, i, l, x, c, numberDefEls, el, p, inter, rgbo, tmp, v, Data, xmlNode,
+ gxtEl = {};
+
+ Data = elChildNodes[s];
+ gxtEl = this.defProperties(gxtEl, Data);
+
+ // Skip text nodes
+ if (!JXG.exists(gxtEl)) {
+ return;
+ }
+
+ this.printDebugMessage('debug', gxtEl, Data.nodeName.toLowerCase, 'READ:');
+ switch (Data.nodeName.toLowerCase()) {
+ case "point":
+ gxtEl.strokewidth = 1; // Old file format
+ gxtEl = this.colorProperties(gxtEl, Data);
+ gxtEl = this.visualProperties(gxtEl, Data);
+ gxtEl = this.firstLevelProperties(gxtEl, Data);
+ gxtEl = this.readNodes(gxtEl, Data, 'data');
+ gxtEl.fixed = JXG.str2Bool(this.gEBTN(Data, 'fix'));
+ gxtEl = this.transformProperties(gxtEl, 'point');
+
+ //try {
+ p = board.create('point', [parseFloat(gxtEl.x), parseFloat(gxtEl.y)], gxtEl);
+
+ v = function () {
+ return p.visProp.visible;
+ };
+ el = this.parseImage(board, Data, board.options.layer.image, 0, 0, 0, 0, p);
+ this.printDebugMessage('debug', gxtEl, Data.nodeName, 'OK');
+ break;
+ case "line":
+ gxtEl = this.colorProperties(gxtEl, Data);
+ gxtEl = this.visualProperties(gxtEl, Data);
+ gxtEl = this.firstLevelProperties(gxtEl, Data);
+ gxtEl = this.readNodes(gxtEl, Data, 'data');
+ gxtEl = this.readNodes(gxtEl, Data, 'straight', 'straight');
+ gxtEl = this.transformProperties(gxtEl);
+
+ gxtEl.first = this.changeOriginIds(board, gxtEl.first);
+ gxtEl.last = this.changeOriginIds(board, gxtEl.last);
+
+ l = board.create('line', [gxtEl.first, gxtEl.last], gxtEl);
+
+ this.parseImage(board, Data, board.options.layer.image, 0, 0, 0, 0, l);
+ this.printDebugMessage('debug', gxtEl, Data.nodeName, 'OK');
+ break;
+ case "circle":
+ gxtEl = this.colorProperties(gxtEl, Data);
+ gxtEl = this.visualProperties(gxtEl, Data);
+ gxtEl = this.firstLevelProperties(gxtEl, Data);
+
+ tmp = this.gEBTN(Data, 'data', 0, false);
+ gxtEl.center = this.changeOriginIds(board, this.gEBTN(tmp, 'midpoint'));
+
+ if (tmp.getElementsByTagName('radius').length > 0) {
+ gxtEl.radius = this.changeOriginIds(board, this.gEBTN(tmp, 'radius'));
+ } else if (tmp.getElementsByTagName('radiusvalue').length > 0) {
+ gxtEl.radius = this.gEBTN(tmp, 'radiusvalue');
+ }
+ gxtEl = this.transformProperties(gxtEl);
+ c = board.create('circle', [gxtEl.center, gxtEl.radius], gxtEl);
+
+ this.parseImage(board, Data, board.options.layer.image, 0, 0, 0, 0, c);
+ this.printDebugMessage('debug', gxtEl, Data.nodeName, 'OK');
+ break;
+ case "slider":
+ gxtEl.strokewidth = 1; // Old file format
+ gxtEl = this.colorProperties(gxtEl, Data);
+ gxtEl = this.visualProperties(gxtEl, Data);
+ gxtEl = this.firstLevelProperties(gxtEl, Data);
+
+ gxtEl = this.readNodes(gxtEl, Data, 'data');
+ gxtEl.fixed = JXG.str2Bool(this.gEBTN(Data, 'fix'));
+ gxtEl = this.readNodes(gxtEl, Data, 'animate', 'animate');
+ gxtEl = this.transformProperties(gxtEl, 'point');
+ try {
+ gxtEl.parent = this.changeOriginIds(board, gxtEl.parent);
+
+ p = board.create('glider', [parseFloat(gxtEl.x), parseFloat(gxtEl.y), gxtEl.parent], gxtEl);
+ p.onPolygon = JXG.exists(gxtEl.onpolygon) && JXG.str2Bool(gxtEl.onpolygon);
+
+ this.parseImage(board, Data, board.options.layer.point, 0, 0, 0, 0, p);
+
+ this.printDebugMessage('debug', gxtEl, Data.nodeName, 'OK');
+ } catch (e) {
+ JXG.debug("* Err: Slider " + gxtEl.name + " " + gxtEl.id + ': ' + gxtEl.parent);
+ }
+ break;
+ case "cas":
+ gxtEl = this.colorProperties(gxtEl, Data);
+ gxtEl = this.visualProperties(gxtEl, Data);
+ gxtEl = this.firstLevelProperties(gxtEl, Data);
+ gxtEl.fixed = JXG.str2Bool(Data.getElementsByTagName('fix')[0].firstChild.data);
+ gxtEl = this.readNodes(gxtEl, Data, 'data');
+ gxtEl = this.transformProperties(gxtEl, 'point');
+
+ p = board.create('point', [gxtEl.x, gxtEl.y], gxtEl);
+ this.parseImage(board, Data, board.options.layer.point, 0, 0, 0, 0, p);
+ this.printDebugMessage('debug', gxtEl, Data.nodeName, 'OK');
+ break;
+ case "intersection":
+ gxtEl.strokewidth = 1; // Old file format
+ gxtEl = this.readNodes(gxtEl, Data, 'data');
+ xmlNode = Data.getElementsByTagName('first')[1];
+
+ gxtEl.outFirst = {};
+ gxtEl.outFirst = this.colorProperties(gxtEl.outFirst, xmlNode);
+ gxtEl.outFirst = this.visualProperties(gxtEl.outFirst, xmlNode);
+ gxtEl.outFirst = this.firstLevelProperties(gxtEl.outFirst, xmlNode);
+ gxtEl.outFirst.fixed = JXG.str2Bool(xmlNode.getElementsByTagName('fix')[0].firstChild.data);
+ gxtEl.outFirst = this.transformProperties(gxtEl.outFirst, 'point');
+ gxtEl.first = this.changeOriginIds(board, gxtEl.first);
+ gxtEl.last = this.changeOriginIds(board, gxtEl.last);
+
+ if ((board.select(gxtEl.first).elementClass === JXG.OBJECT_CLASS_LINE) &&
+ (board.select(gxtEl.last).elementClass === JXG.OBJECT_CLASS_LINE)) {
+ inter = board.create('intersection', [board.objects[gxtEl.first], board.objects[gxtEl.last], 0], gxtEl.outFirst);
+ /* for some reason this if is required */
+ if (gxtEl.outFirst.visible === "false") {
+ inter.hideElement();
+ }
+ } else {
+ xmlNode = Data.getElementsByTagName('last')[1];
+ if (JXG.exists(xmlNode)) {
+ gxtEl.outLast = {};
+ gxtEl.outLast = this.colorProperties(gxtEl.outLast, xmlNode);
+ gxtEl.outLast = this.visualProperties(gxtEl.outLast, xmlNode);
+ gxtEl.outLast = this.firstLevelProperties(gxtEl.outLast, xmlNode);
+ gxtEl.outLast.fixed = JXG.str2Bool(xmlNode.getElementsByTagName('fix')[0].firstChild.data);
+ gxtEl.outLast = this.transformProperties(gxtEl.outLast, 'point');
+
+ inter = board.create('intersection', [board.objects[gxtEl.first], board.objects[gxtEl.last], 0], gxtEl.outFirst);
+ inter = board.create('intersection', [board.objects[gxtEl.first], board.objects[gxtEl.last], 1], gxtEl.outLast);
+ }
+ }
+ this.printDebugMessage('debug', gxtEl, Data.nodeName, 'OK');
+ break;
+ case "composition":
+ gxtEl = this.readNodes(gxtEl, Data, 'data');
+ gxtEl = this.firstLevelProperties(gxtEl, Data);
+ gxtEl.defEl = [];
+ numberDefEls = 0;
+ xmlNode = Data.getElementsByTagName('data')[0].getElementsByTagName('input');
+ for (i = 0; i < xmlNode.length; i++) {
+ gxtEl.defEl[i] = xmlNode[i].firstChild.data;
+ numberDefEls = i + 1;
+ }
+
+ // every composition produces at least one element and the data for this element is stored
+ // in gxtEl.out. if additional elements are created their data is read in the according case.
+ xmlNode = Data.getElementsByTagName('output')[0];
+ gxtEl.out = {};
+ gxtEl.out = this.colorProperties(gxtEl.out, xmlNode);
+ gxtEl.out = this.visualProperties(gxtEl.out, xmlNode);
+ gxtEl.out = this.firstLevelProperties(gxtEl.out, xmlNode);
+ gxtEl.out = this.transformProperties(gxtEl.out);
+
+ gxtEl.defEl[0] = this.changeOriginIds(board, gxtEl.defEl[0]);
+ gxtEl.defEl[1] = this.changeOriginIds(board, gxtEl.defEl[1]);
+ gxtEl.defEl[2] = this.changeOriginIds(board, gxtEl.defEl[2]);
+
+ switch (gxtEl.type) {
+ // ARROW_PARALLEL
+ case "210070":
+ gxtEl.out.fixed = this.gEBTN(xmlNode, 'fix');
+
+ xmlNode = Data.getElementsByTagName('output')[1];
+ gxtEl.outPoint = {};
+ gxtEl.outPoint = this.defProperties(gxtEl.outPoint, xmlNode);
+ gxtEl.outPoint = this.colorProperties(gxtEl.outPoint, xmlNode);
+ gxtEl.outPoint = this.visualProperties(gxtEl.outPoint, xmlNode);
+ gxtEl.outPoint = this.firstLevelProperties(gxtEl.outPoint, xmlNode);
+ gxtEl.outPoint = this.transformProperties(gxtEl.outPoint);
+ gxtEl.out.point = gxtEl.outPoint;
+
+ board.create('arrowparallel', [gxtEl.defEl[1], gxtEl.defEl[0]], gxtEl.out);
+ break;
+
+ // BISECTOR
+ case "210080":
+ gxtEl.out.straightFirst = false;
+ board.create('bisector', [gxtEl.defEl[0], gxtEl.defEl[1], gxtEl.defEl[2]], gxtEl.out);
+ break;
+
+ // CIRCUMCIRCLE
+ case "210090":
+ xmlNode = Data.getElementsByTagName('output')[1];
+ gxtEl.outCircle = {};
+ gxtEl.outCircle = this.defProperties(gxtEl.outCircle, xmlNode);
+ gxtEl.outCircle = this.colorProperties(gxtEl.outCircle, xmlNode);
+ gxtEl.outCircle = this.visualProperties(gxtEl.outCircle, xmlNode);
+ gxtEl.outCircle = this.firstLevelProperties(gxtEl.outCircle, xmlNode);
+ gxtEl.outCircle = this.transformProperties(gxtEl.outCircle);
+ gxtEl.outCircle.point = gxtEl.out;
+ board.create('circumcircle', [gxtEl.defEl[0], gxtEl.defEl[1], gxtEl.defEl[2]], gxtEl.outCircle);
+ break;
+
+ // CIRCUMCIRCLE_CENTER
+ case "210100":
+ board.create('circumcenter', [gxtEl.defEl[0], gxtEl.defEl[1], gxtEl.defEl[2]], gxtEl.out);
+ break;
+
+ // MIDPOINT
+ case "210110":
+ board.create('midpoint', gxtEl.defEl.slice(0, numberDefEls), gxtEl.out);
+ break;
+
+ // MIRRORLINE
+ case "210120":
+ board.create('reflection', [gxtEl.defEl[1], gxtEl.defEl[0]], gxtEl.out);
+ break;
+
+ // MIRROR_POINT
+ case "210125":
+ board.create('mirrorpoint', [gxtEl.defEl[0], gxtEl.defEl[1]], gxtEl.out);
+ break;
+
+ // NORMAL
+ case "210130":
+ //board.create('normal', [gxtEl.defEl[1], gxtEl.defEl[0]], gxtEl.out);
+ board.create('perpendicularsegment', [gxtEl.defEl[0], gxtEl.defEl[1]], gxtEl.out);
+ break;
+
+ // PARALLEL
+ case "210140":
+ p = board.create('parallelpoint', [gxtEl.defEl[1], gxtEl.defEl[0]], {
+ withLabel: false,
+ visible: false,
+ name: '',
+ fixed: true
+ });
+
+ // GEONExT uses its own parallel construction to make the order
+ // of intersection points compatible.
+ // el = board.create('parallel', [gxtEl.defEl[1], gxtEl.defEl[0]], gxtEl.out);
+ el = board.create('line', [gxtEl.defEl[0], p], gxtEl.out);
+ el.parallelpoint = p;
+ break;
+
+ // PARALLELOGRAM_POINT
+ case "210150":
+ board.create('parallelpoint', gxtEl.defEl.slice(0, numberDefEls), gxtEl.out);
+ break;
+
+ // PERPENDICULAR
+ case "210160":
+ // output[0] was already read and is stored in gxtEl.out
+ gxtEl.out.fixed = this.gEBTN(xmlNode, 'fix');
+
+ xmlNode = Data.getElementsByTagName('output')[1];
+ gxtEl.outLine = {};
+ gxtEl.outLine = this.defProperties(gxtEl.outLine, xmlNode);
+ gxtEl.outLine = this.colorProperties(gxtEl.outLine, xmlNode);
+ gxtEl.outLine = this.visualProperties(gxtEl.outLine, xmlNode);
+ gxtEl.outLine = this.firstLevelProperties(gxtEl.outLine, xmlNode);
+ gxtEl.outLine = this.readNodes(gxtEl.outLine, xmlNode, 'straight', 'straight');
+ gxtEl.outLine = this.transformProperties(gxtEl.outLine);
+ gxtEl.outLine.point = gxtEl.out;
+
+ board.create('perpendicularsegment', [gxtEl.defEl[1], gxtEl.defEl[0]], gxtEl.outLine);
+ break;
+
+ // PERPENDICULAR_POINT
+ case "210170":
+ board.create('perpendicularpoint', [gxtEl.defEl[1], gxtEl.defEl[0]], gxtEl.out);
+ break;
+
+ // ROTATION
+ case "210180":
+ throw new Error('JSXGraph: Element ROTATION not yet implemented.');
+
+ // SECTOR
+ case "210190":
+ // sectors usually provide more than one output element but JSXGraph is not fully compatible
+ // to GEONExT sector elements. GEONExT sectors consist of two lines, a point, and a sector,
+ // JSXGraph uses a curve to display the sector incl. the borders, and
+ // a point and two lines.
+ // Gliders on sectors also run through the borders.
+ gxtEl.out = this.defProperties(gxtEl.out, xmlNode);
+ gxtEl.out.firstArrow = JXG.str2Bool(this.gEBTN(xmlNode, 'firstarrow'));
+ gxtEl.out.lastArrow = JXG.str2Bool(this.gEBTN(xmlNode, 'lastarrow'));
+
+ xmlNode = [];
+ c = [];
+
+ for (i = 0; i < 4; i++) {
+ xmlNode[i] = Data.getElementsByTagName('output')[i];
+ gxtEl.out = {};
+ gxtEl.out = this.defProperties(gxtEl.out, xmlNode[i]);
+ gxtEl.out = this.colorProperties(gxtEl.out, xmlNode[i]);
+ gxtEl.out = this.visualProperties(gxtEl.out, xmlNode[i]);
+ gxtEl.out = this.firstLevelProperties(gxtEl.out, xmlNode[i]);
+ gxtEl.out = this.transformProperties(gxtEl.out);
+ c[i] = gxtEl.out;
+ }
+
+ // i === 0
+ el = board.create('sector', gxtEl.defEl, c[0]);
+
+ // i === 1
+ p = board.create('point', [
+ function () {
+ var p1 = board.select(gxtEl.defEl[1]),
+ p2 = board.select(gxtEl.defEl[2]);
+
+ return p1.X() + (p2.X() - p1.X()) * el.Radius / p1.Dist(p2);
+ },
+ function () {
+ var p1 = board.select(gxtEl.defEl[1]),
+ p2 = board.select(gxtEl.defEl[2]);
+
+ return p1.Y() + (p2.Y() - p1.Y()) * el.Radius / p1.Dist(p2);
+ }
+ ], c[1]);
+
+ // i === 2
+ el = board.create('segment', [gxtEl.defEl[0], gxtEl.defEl[1]], c[2]);
+
+ // i === 3
+ el = board.create('segment', [gxtEl.defEl[1], p], c[3]);
+ break;
+ default:
+ throw new Error('JSXGraph: GEONExT -- element ' + gxtEl.type + ' not implemented.');
+ }
+ this.printDebugMessage('debug', gxtEl, Data.nodeName, 'OK');
+ break;
+ case "polygon":
+ gxtEl = this.colorProperties(gxtEl, Data);
+ gxtEl = this.firstLevelProperties(gxtEl, Data);
+ dataVertex = [];
+
+ // In Geonext file format the first vertex is equal to the last vertex:
+ for (i = 0; i < Data.getElementsByTagName('data')[0].getElementsByTagName('vertex').length - 1; i++) {
+ dataVertex[i] = Data.getElementsByTagName('data')[0].getElementsByTagName('vertex')[i].firstChild.data;
+ dataVertex[i] = this.changeOriginIds(board, dataVertex[i]);
+ }
+ gxtEl.border = [];
+ gxtEl.borders = {
+ ids: []
+ };
+ for (i = 0; i < Data.getElementsByTagName('border').length; i++) {
+ gxtEl.border[i] = {};
+ xmlNode = Data.getElementsByTagName('border')[i];
+ gxtEl.border[i].id = xmlNode.getElementsByTagName('id')[0].firstChild.data;
+ gxtEl.borders.ids.push(gxtEl.border[i].id);
+ gxtEl.border[i].name = xmlNode.getElementsByTagName('name')[0].firstChild.data;
+ gxtEl.border[i].straightFirst = JXG.str2Bool(xmlNode.getElementsByTagName('straight')[0].getElementsByTagName('first')[0].firstChild.data);
+ gxtEl.border[i].straightLast = JXG.str2Bool(xmlNode.getElementsByTagName('straight')[0].getElementsByTagName('last')[0].firstChild.data);
+ try {
+ gxtEl.border[i].strokeWidth = xmlNode.getElementsByTagName('strokewidth')[0].firstChild.data;
+ } catch (ex) {
+ gxtEl.border[i].strokeWidth = xmlNode.getElementsByTagName('width')[0].firstChild.data;
+ }
+ try {
+ gxtEl.border[i].dash = JXG.str2Bool(xmlNode.getElementsByTagName('dash')[0].firstChild.data);
+ } catch (exc) {}
+
+ gxtEl.border[i].visible = JXG.str2Bool(xmlNode.getElementsByTagName('visible')[0].firstChild.data);
+ gxtEl.border[i].draft = JXG.str2Bool(xmlNode.getElementsByTagName('draft')[0].firstChild.data);
+ gxtEl.border[i].trace = JXG.str2Bool(xmlNode.getElementsByTagName('trace')[0].firstChild.data);
+
+ xmlNode = Data.getElementsByTagName('border')[i].getElementsByTagName('color')[0];
+ rgbo = JXG.rgba2rgbo(xmlNode.getElementsByTagName('stroke')[0].firstChild.data);
+ gxtEl.border[i].strokeColor = rgbo[0];
+ gxtEl.border[i].strokeOpacity = rgbo[1];
+
+ rgbo = JXG.rgba2rgbo(xmlNode.getElementsByTagName('lighting')[0].firstChild.data);
+ gxtEl.border[i].highlightStrokeColor = rgbo[0];
+ gxtEl.border[i].highlightStrokeOpacity = rgbo[1];
+
+ rgbo = JXG.rgba2rgbo(xmlNode.getElementsByTagName('fill')[0].firstChild.data);
+ gxtEl.border[i].fillColor = rgbo[0];
+ gxtEl.border[i].fillOpacity = rgbo[1];
+
+ gxtEl.border[i].highlightFillColor = gxtEl.border[i].fillColor;
+ gxtEl.border[i].highlightFillOpacity = gxtEl.border[i].fillOpacity;
+
+ gxtEl.border[i].labelColor = xmlNode.getElementsByTagName('label')[0].firstChild.data;
+ gxtEl.border[i].colorDraft = xmlNode.getElementsByTagName('draft')[0].firstChild.data;
+ }
+ gxtEl = this.transformProperties(gxtEl);
+ p = board.create('polygon', dataVertex, gxtEl);
+
+ // to emulate the geonext behaviour on invisible polygons
+ // A.W.: Why do we need this?
+ /*
+ if (!gxtEl.visible) {
+ p.setProperty({
+ fillColor: 'none',
+ highlightFillColor: 'none'
+ });
+ }
+ */
+ for (i = 0; i < p.borders.length; i++) {
+ p.borders[i].setProperty(gxtEl.border[i]);
+ }
+
+ this.printDebugMessage('debug', gxtEl, Data.nodeName, 'OK');
+ break;
+ case "graph":
+ gxtEl = this.colorProperties(gxtEl, Data);
+ gxtEl = this.firstLevelProperties(gxtEl, Data);
+ gxtEl.funct = Data.getElementsByTagName('data')[0].getElementsByTagName('function')[0].firstChild.data;
+ gxtEl.funct = board.jc.snippet(gxtEl.funct, true, 'x', true);
+
+ c = board.create('plot', [gxtEl.funct], {
+ id: gxtEl.id,
+ name: gxtEl.name,
+ strokeColor: gxtEl.strokeColor,
+ strokeWidth: gxtEl.strokeWidth,
+ fillColor: 'none',
+ highlightFillColor: 'none',
+ highlightStrokeColor: gxtEl.highlightStrokeColor,
+ visible: JXG.str2Bool(gxtEl.visible)
+ });
+
+ this.printDebugMessage('debug', gxtEl, Data.nodeName, 'OK');
+ break;
+ case "arrow":
+ gxtEl = this.colorProperties(gxtEl, Data);
+ gxtEl = this.visualProperties(gxtEl, Data);
+ gxtEl = this.firstLevelProperties(gxtEl, Data);
+ gxtEl = this.readNodes(gxtEl, Data, 'data');
+ gxtEl = this.readNodes(gxtEl, Data, 'straight', 'straight');
+
+ gxtEl = this.transformProperties(gxtEl);
+ gxtEl.first = this.changeOriginIds(board, gxtEl.first);
+ gxtEl.last = this.changeOriginIds(board, gxtEl.last);
+
+ l = board.create('arrow', [gxtEl.first, gxtEl.last], gxtEl);
+
+ this.printDebugMessage('debug', l, Data.nodeName, 'OK');
+ break;
+ case "arc":
+ gxtEl = this.colorProperties(gxtEl, Data);
+ gxtEl = this.visualProperties(gxtEl, Data);
+ gxtEl = this.firstLevelProperties(gxtEl, Data);
+ gxtEl = this.readNodes(gxtEl, Data, 'data');
+
+ // It seems that JSXGraph and GEONExT use opposite directions.
+ gxtEl.firstArrow = JXG.str2Bool(Data.getElementsByTagName('lastarrow')[0].firstChild.data);
+ gxtEl.lastArrow = JXG.str2Bool(Data.getElementsByTagName('firstarrow')[0].firstChild.data);
+
+ gxtEl = this.transformProperties(gxtEl);
+
+ gxtEl.center = this.changeOriginIds(board, gxtEl.midpoint);
+ gxtEl.angle = this.changeOriginIds(board, gxtEl.angle);
+ gxtEl.radius = this.changeOriginIds(board, gxtEl.radius);
+
+ c = board.create('arc', [gxtEl.center, gxtEl.radius, gxtEl.angle], gxtEl);
+
+ this.printDebugMessage('debug', c, Data.nodeName, 'OK');
+ break;
+ case "angle":
+ gxtEl = this.colorProperties(gxtEl, Data);
+ gxtEl = this.visualProperties(gxtEl, Data);
+ gxtEl = this.firstLevelProperties(gxtEl, Data);
+ gxtEl = this.readNodes(gxtEl, Data, 'data');
+ gxtEl = this.transformProperties(gxtEl);
+
+ c = board.create('angle', [gxtEl.first, gxtEl.middle, gxtEl.last], gxtEl);
+ this.printDebugMessage('debug', gxtEl, Data.nodeName, 'OK');
+ break;
+ case "text":
+ if (gxtEl.id.match(/oldVersion/)) {
+ break;
+ }
+ gxtEl = this.colorProperties(gxtEl, Data);
+ gxtEl = this.visualProperties(gxtEl, Data);
+ gxtEl = this.firstLevelProperties(gxtEl, Data);
+
+ gxtEl = this.readNodes(gxtEl, Data, 'data');
+ try {
+ gxtEl.mpStr = this.subtreeToString(Data.getElementsByTagName('data')[0].getElementsByTagName('mp')[0]);
+ gxtEl.mpStr = gxtEl.mpStr.replace(/<\/?mp>/g, '');
+ } catch (ex1) {
+ gxtEl.mpStr = this.subtreeToString(Data.getElementsByTagName('data')[0].getElementsByTagName('content')[0]);
+ gxtEl.mpStr = gxtEl.mpStr.replace(/<\/?content>/g, '');
+ }
+ gxtEl.fixed = false;
+ try {
+ if (Data.getElementsByTagName('data')[0].getElementsByTagName('parent')[0].firstChild) {
+ gxtEl.parent = Data.getElementsByTagName('data')[0].getElementsByTagName('parent')[0].firstChild.data;
+ gxtEl.fixed = true;
+ }
+ } catch (ex2) {}
+
+ try {
+ gxtEl.condition = Data.getElementsByTagName('condition')[0].firstChild.data;
+ } catch (ex3) {
+ gxtEl.condition = "";
+ }
+ gxtEl.content = Data.getElementsByTagName('content')[0].firstChild.data;
+ try {
+ gxtEl.fixed = Data.getElementsByTagName('fix')[0].firstChild.data;
+ } catch (ex4) {
+ gxtEl.fixed = false;
+ }
+ // not used: gxtEl.digits = Data.getElementsByTagName('cs')[0].firstChild.data;
+ try {
+ gxtEl.autodigits = Data.getElementsByTagName('digits')[0].firstChild.data;
+ } catch (ex5) {
+ gxtEl.autodigits = 2;
+ }
+ gxtEl.parent = this.changeOriginIds(board, gxtEl.parent);
+
+ c = board.create('text', [gxtEl.x, gxtEl.y, gxtEl.mpStr], {
+ anchor: gxtEl.parent,
+ id: gxtEl.id,
+ name: gxtEl.name,
+ digits: gxtEl.autodigits,
+ isLabel: false,
+ strokeColor: gxtEl.colorLabel,
+ fixed: gxtEl.fixed,
+ visible: JXG.str2Bool(gxtEl.visible)
+ });
+ break;
+ case 'parametercurve':
+ gxtEl = this.colorProperties(gxtEl, Data);
+ gxtEl = this.visualProperties(gxtEl, Data);
+ gxtEl = this.firstLevelProperties(gxtEl, Data);
+ gxtEl = this.transformProperties(gxtEl);
+ gxtEl.functionx = Data.getElementsByTagName('functionx')[0].firstChild.data;
+ gxtEl.functiony = Data.getElementsByTagName('functiony')[0].firstChild.data;
+ gxtEl.min = Data.getElementsByTagName('min')[0].firstChild.data;
+ gxtEl.max = Data.getElementsByTagName('max')[0].firstChild.data;
+ gxtEl.fillColor = 'none';
+ gxtEl.highlightFillColor = 'none';
+
+ // intentional
+ /*jslint evil:true*/
+ board.create('curve', [
+ board.jc.snippet(gxtEl.functionx, true, 't', true),
+ board.jc.snippet(gxtEl.functiony, true, 't', true),
+ board.jc.snippet(gxtEl.min, true, '', true),
+ board.jc.snippet(gxtEl.max, true, '', true)
+ ], gxtEl);
+ /*jslint evil:false*/
+ this.printDebugMessage('debug', gxtEl, Data.nodeName, 'OK');
+ break;
+ case 'tracecurve':
+ gxtEl.tracepoint = Data.getElementsByTagName('tracepoint')[0].firstChild.data;
+ gxtEl.traceslider = Data.getElementsByTagName('traceslider')[0].firstChild.data;
+ board.create('tracecurve', [gxtEl.traceslider, gxtEl.tracepoint], gxtEl);
+ this.printDebugMessage('debug', gxtEl, Data.nodeName, 'OK');
+ break;
+ case 'group':
+ gxtEl = this.colorProperties(gxtEl, Data);
+ gxtEl = this.firstLevelProperties(gxtEl, Data);
+ gxtEl.members = [];
+
+ for (i = 0; i < Data.getElementsByTagName('data')[0].getElementsByTagName('member').length; i++) {
+ gxtEl.members[i] = Data.getElementsByTagName('data')[0].getElementsByTagName('member')[i].firstChild.data;
+ gxtEl.members[i] = this.changeOriginIds(board, gxtEl.members[i]);
+ }
+
+ c = new JXG.Group(board, gxtEl.id, gxtEl.name, gxtEl.members);
+ this.printDebugMessage('debug', gxtEl, Data.nodeName, 'OK');
+ break;
+ default:
+ JXG.debug("* Err: " + Data.nodeName + " not yet implemented");
+ }
+ },
+
+ /**
+ * Reading the elements of a geonext file
+ */
+ read: function () {
+ var xmlNode, elChildNodes, s, boardData, conditions, tmp,
+ tree = this.tree,
+ board = this.board,
+ strTrue = 'true';
+
+ // maybe this is not necessary as we already provide layer options for sectors and circles via JXG.Options but
+ // maybe these have to be the same for geonext.
+ board.options.layer.sector = board.options.layer.angle;
+ board.options.layer.circle = board.options.layer.angle;
+
+ board.options.line.label.position = 'top';
+
+ boardData = this.gEBTN(tree, 'board', 0, false);
+ conditions = this.readConditions(boardData.getElementsByTagName('conditions')[0]);
+
+ // set the board background color
+ s = this.gEBTN(boardData, 'background', 0, false);
+ s = this.gEBTN(s, 'color', 0, true);
+ tmp = JXG.rgba2rgbo(s);
+ s = JXG.rgbParser(tmp[0]);
+ board.containerObj.style.backgroundColor = 'rgba(' + s[0] + ', ' + s[1] + ', ' + s[2] + ', ' + tmp[1] + ')';
+
+ // resize board
+ if (board.attr.takeSizeFromFile) {
+ board.resizeContainer(this.gEBTN(boardData, 'width'), this.gEBTN(boardData, 'height'));
+ }
+
+ xmlNode = this.gEBTN(boardData, 'coordinates', 0, false);
+
+ tmp = this.readViewPort(xmlNode);
+ if (tmp.length === 4) {
+ board.setBoundingBox(tmp, true);
+ } else {
+ // zoom level
+ tmp = this.gEBTN(xmlNode, 'zoom', 0, false);
+ board.zoomX = parseFloat(this.gEBTN(tmp, 'x'));
+ board.zoomY = parseFloat(this.gEBTN(tmp, 'y'));
+
+ // set the origin
+ tmp = this.gEBTN(xmlNode, 'origin', 0, false);
+ board.origin = {
+ usrCoords: [1, 0, 0],
+ scrCoords: [1, parseFloat(this.gEBTN(tmp, 'x')) * board.zoomX, parseFloat(this.gEBTN(tmp, 'y')) * board.zoomY]
+ };
+
+ // screen to user coordinates conversion
+ tmp = this.gEBTN(xmlNode, 'unit', 0, false);
+ board.unitX = parseFloat(this.gEBTN(tmp, 'x')) * board.zoomX;
+ board.unitY = parseFloat(this.gEBTN(tmp, 'y')) * board.zoomY;
+ }
+
+ if (board.attr.takeSizeFromFile) {
+ board.resizeContainer(this.gEBTN(boardData, 'width'), this.gEBTN(boardData, 'height'));
+ }
+
+ // check and set fontSize
+ if (parseFloat(board.options.text.fontSize) < 0) {
+ board.options.text.fontSize = 12;
+ }
+
+ board.geonextCompatibilityMode = true;
+
+ // jsxgraph chooses an id for the board but we don't want to use it, we want to use
+ // the id stored in the geonext file. if you know why this is required, please note it here.
+ delete JXG.boards[board.id];
+
+ board.id = this.gEBTN(boardData, 'id');
+
+ JXG.boards[board.id] = board;
+
+ // this creates some basic elements present in every geonext construction but not explicitly present in the file
+ board.initGeonextBoard();
+
+ // Update of properties during update() is not necessary in GEONExT files
+ // But it maybe necessary if we construct with JavaScript afterwards
+ board.renderer.enhancedRendering = true;
+
+ // Read background image
+ this.parseImage(board, this.gEBTN(boardData, 'file', 0, false), board.options.layer.image);
+
+ board.options.point.snapToGrid = (this.gEBTN(this.gEBTN(boardData, 'coordinates', 0, false), 'snap') === strTrue);
+
+ // If snapToGrid and snapToPoint are both true, point snapping is enabled
+ if (board.options.point.snapToGrid && this.gEBTN(this.gEBTN(boardData, 'grid', 1, false), 'pointsnap') === strTrue) {
+ board.options.point.snapToGrid = false;
+ board.options.point.snapToPoints = true;
+ board.options.point.attractorDistance = 0.5;
+ }
+
+ xmlNode = this.gEBTN(boardData, 'grid', 1, false);
+ tmp = this.gEBTN(xmlNode, 'x');
+ if (tmp) {
+ board.options.grid.gridX = 1 / parseFloat(tmp);
+ board.options.point.snapSizeX = 1 / parseFloat(tmp);
+ }
+ tmp = this.gEBTN(xmlNode, 'y');
+ if (tmp) {
+ board.options.grid.gridY = 1 / parseFloat(tmp);
+ board.options.point.snapSizeY = 1 / parseFloat(tmp);
+ }
+
+ board.options.grid.gridDash = JXG.str2Bool(this.gEBTN(xmlNode, 'dash'));
+
+ tmp = JXG.rgba2rgbo(this.gEBTN(xmlNode, 'color'));
+ board.options.grid.gridColor = tmp[0];
+ board.options.grid.gridOpacity = tmp[1];
+
+ xmlNode = this.gEBTN(boardData, 'coordinates', 0, false);
+ if (this.gEBTN(xmlNode, 'grid') === strTrue) {
+ board.create('grid', []);
+ }
+
+ if (this.gEBTN(xmlNode, 'coord') === strTrue) {
+ // Hard coded default option
+ board.options.axis.ticks.majorHeight = 10;
+
+ // Hard coded default option
+ board.options.axis.ticks.minorHeight = 4;
+ board.create('axis', [[0, 0], [1, 0]]);
+ board.create('axis', [[0, 0], [0, 1]]);
+ }
+
+ tmp = this.gEBTN(this.gEBTN(boardData, 'background', 0, false), 'color');
+ if (tmp.length === 8) {
+ tmp = '#' + tmp;
+ }
+ board.containerObj.style.backgroundColor = JXG.rgba2rgbo(tmp)[0];
+
+ elChildNodes = tree.getElementsByTagName("elements")[0].childNodes;
+ for (s = 0; s < elChildNodes.length; s++) {
+ this.readNode(elChildNodes, s, board);
+ }
+ board.addConditions(conditions);
+ },
+
+ decodeString: function (str) {
+ var unz;
+
+ if (str.indexOf("<GEONEXT>") < 0) {
+ unz = (new JXG.Util.Unzip(JXG.Util.Base64.decodeAsArray(str))).unzip();
+ if (unz === "") {
+ return str;
+ }
+
+ return unz;
+ }
+
+ return str;
+ },
+
+ prepareString: function (fileStr) {
+ try {
+ if (fileStr.indexOf('GEONEXT') < 0) {
+ // Base64 decoding
+ fileStr = (this.decodeString(fileStr))[0][0];
+ }
+ // Hacks to enable not well formed XML. Will be redone in geonext2JS and Board.addConditions
+ fileStr = this.fixXML(fileStr);
+ } catch (exc2) {
+ fileStr = '';
+ }
+ return fileStr;
+ },
+
+ fixXML: function (str) {
+ var arr = ["active", "angle", "animate", "animated", "arc", "area", "arrow", "author", "autodigits", "axis",
+ "back", "background", "board", "border", "bottom", "buttonsize", "cas", "circle", "color",
+ "comment", "composition", "condition", "conditions", "content", "continuous", "control", "coord",
+ "coordinates", "cross", "cs", "dash", "data", "description", "digits", "direction", "draft",
+ "editable", "elements", "event", "file", "fill", "first", "firstarrow", "fix", "fontsize", "free",
+ "full", "function", "functionx", "functiony", "GEONEXT", "graph", "grid", "group", "height", "id",
+ "image", "info", "information", "input", "intersection", "item", "jsf", "label", "last",
+ "lastarrow", "left", "lefttoolbar", "lighting", "line", "loop", "max", "maximized", "member",
+ "middle", "midpoint", "min", "modifier", "modus", "mp", "mpx", "multi", "name", "onpolygon",
+ "order", "origin", "output", "overline", "parametercurve", "parent", "point", "pointsnap",
+ "polygon", "position", "radius", "radiusnum", "radiusvalue", "right", "section",
+ "selectedlefttoolbar", "showconstruction", "showcoord", "showinfo", "showunit", "showx", "showy",
+ "size", "slider", "snap", "speed", "src", "start", "stop", "straight", "stroke", "strokewidth",
+ "style", "term", "text", "top", "trace", "tracecurve", "tracepoint", "traceslider", "type", "unit",
+ "value", "VERSION", "vertex", "viewport", "visible", "width", "wot", "x", "xooy", "xval", "y",
+ "yval", "zoom"],
+
+ list = arr.join('|'),
+ regex = '&lt;(/?(' + list + '))&gt;',
+ expr = new RegExp(regex, 'g');
+
+ // First, we convert all < to &lt; and > to &gt;
+ str = JXG.escapeHTML(str);
+ // Second, we convert all GEONExT tags of the form &lt;tag&gt; back to <tag>
+ str = str.replace(expr, '<$1>');
+
+ // intentional
+ /*jslint regexp:true*/
+ str = str.replace(/(<content>.*)<arc>(.*<\/content>)/g, '$1&lt;arc&gt;$2');
+ str = str.replace(/(<mp>.*)<arc>(.*<\/mpx>)/g, '$1&lt;arc&gt;$2');
+ str = str.replace(/(<mpx>.*)<arc>(.*<\/mpx>)/g, '$1&lt;arc&gt;$2');
+ /*jslint regexp:false*/
+
+ return str;
+ }
+ });
+
+ JXG.registerReader(JXG.GeonextReader, ['gxt', 'geonext']);
+}());
diff --git a/Sketchometry.activity/js/SketchReader.js b/Sketchometry.activity/js/SketchReader.js
new file mode 100644
index 0000000..cd87ff6
--- /dev/null
+++ b/Sketchometry.activity/js/SketchReader.js
@@ -0,0 +1,1135 @@
+/*
+ Copyright 2008-2013
+ Matthias Ehmann,
+ Michael Gerhaeuser,
+ Carsten Miller,
+ Bianca Valentin,
+ Heiko Vogel,
+ Alfred Wassermann,
+ Peter Wilfahrt
+
+ This file is part of JSXGraph.
+
+ JSXGraph is free software dual licensed under the GNU LGPL or MIT License.
+
+ You can redistribute it and/or modify it under the terms of the
+
+ * GNU Lesser General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version
+ OR
+ * MIT License: https://github.com/jsxgraph/jsxgraph/blob/master/LICENSE.MIT
+
+ JSXGraph is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License and
+ the MIT License along with JSXGraph. If not, see <http://www.gnu.org/licenses/>
+ and <http://opensource.org/licenses/MIT/>.
+ */
+
+/*global JXG: true*/
+/*jslint nomen: true, plusplus: true*/
+
+/* depends:
+ jxg
+ base/constants
+ math/math
+ options
+ utils/zip
+ utils/encoding
+ utils/base64
+ utils/uuid
+ utils/type
+ */
+
+(function () {
+
+ "use strict";
+
+ // this is a small workaround to adapt the SketchReader to our new file API
+ // we don't have to change anything in sketchometry.
+ JXG.SketchReader = function (board, str) {
+ this.read = function () {
+ var i, t, arr, unzipped, meta, constr;
+
+ unzipped = new JXG.Util.Unzip(JXG.Util.Base64.decodeAsArray(str)).unzip();
+
+ if (!JXG.exists(unzipped[0])) {
+ return '';
+ }
+
+ unzipped = JXG.Util.UTF8.decode(unzipped[0][0]);
+ constr = JSON.parse(unzipped);
+
+ meta = constr.pop();
+
+ if (!JXG.exists(meta.unredo)) {
+ t = constr.length - 1;
+ } else {
+ t = meta.unredo;
+ }
+
+ for (i = 0; i <= t; i++) {
+ if (constr[i].type !== 0) {
+ try {
+ if (constr[i].type > 50) {
+ arr = JXG.SketchReader.generateJCodeMeta(constr[i], board);
+ } else {
+ arr = JXG.SketchReader.generateJCode(constr[i], board, constr);
+ }
+ } catch (e) {
+ JXG.debug('#steps: ' + constr.length);
+ JXG.debug('step: ' + i + ', type: ' + constr[i].type);
+ JXG.debug(constr[i]);
+ }
+
+ board.jc.parse(arr[0], true);
+ }
+ }
+
+
+ // bounding box
+ arr = meta.boundingBox;
+ board.jc.parse('$board.setView(' + JSON.stringify(arr) + ');');
+
+ return '';
+ };
+ };
+
+ // No prototype here
+ JXG.extend(JXG.SketchReader, /** @lends JXG.SketchReader */ {
+ generateJCodeMeta: function () {
+ return ['', '', '', ''];
+ },
+
+ id: function () {
+ return JXG.Util.genUUID();
+ },
+
+ generator: {
+ toFixed: 8, // should be enough for now ...
+ freeLine: false,
+ useGlider: false,
+ useSymbols: false
+ },
+
+ /**
+ * Generates {@link JXG.JessieCode} code from a sketchometry construction step.
+ * @param {Object} step
+ * @param {Number} step.type One of the JXG.GENTYPE_* constant values
+ * @param {Array} step.args Mostly visual properties
+ * @param {Array} step.src_ids Parent element ids
+ * @param {Array} step.dest_sub_ids Ids for subelements, e.g. the center of a circumcircle or the baseline
+ * of a glider
+ * @param {String} step.dest_id Id of the generated main element
+ * @param {JXG.Board} board
+ * @param {Array} step_log The complete step log
+ * @returns {Array} JessieCode to set and reset the step.
+ */
+ generateJCode: function (step, board, step_log) {
+ var i, j, k, sub_id, str, str1, str2, objects, pid1, pid2, pid3,
+ xstart, ystart, el, arr, step2, options, assign, attrid,
+ copy_log = [],
+ set_str = '',
+ reset_str = '',
+ ctx_set_str = '',
+ ctx_reset_str = '',
+
+ // these two could be outsourced into the iife surrounding the SketchReader definition
+
+ // print number -- helper to prepare numbers
+ // for printing, e.g. trim them with toFixed()
+ pn = function (v) {
+ if (options.toFixed > 0) {
+ // toFixed is a method if Number since JavaScript 1.5, resp. ECMAScript (ECMA 262) 3rd Edition
+ // introduced somewhat around 1999/2000. It is part of every recent version of every major browser.
+ // See this table: http://en.wikipedia.org/wiki/JavaScript#Versions
+ // The only possible explanation is that v might not be a number but a string or something else.
+ // In that case the caller should be fixed instead of rendering this function completely useless.
+
+ // make sure v is a float (or NaN if it neither is a float nor could be converted to float).
+ v = parseFloat(v);
+ v = v.toFixed(options.toFixed); // toFixed is not a member function of the Number class ...
+ }
+
+ return v;
+ },
+
+ getObject = function (v) {
+ var o;
+
+ if (options.useSymbols) {
+ if (board.jc.sstack[0][v]) {
+ o = board.jc.sstack[0][v];
+ } else {
+ o = objects[v];
+ }
+ } else {
+ o = objects[v];
+ }
+
+ return o;
+ };
+
+
+
+ options = JXG.SketchReader.generator;
+ objects = board.objects;
+
+ assign = '';
+ attrid = 'id: \'' + step.dest_id + '\', ';
+
+ if (JXG.exists(board) && options.useSymbols && step.type !== JXG.GENTYPE_ABLATION) {
+ attrid = '';
+ assign = step.dest_id + ' = ';
+
+ for (i = 0; i < step.src_ids.length; i++) {
+ str = board.jc.findSymbol(getObject(step.src_ids[i]), 0);
+
+ if (str.length > 0) {
+ step.src_ids[i] = str[0];
+ }
+ }
+ }
+
+ if (step.type > 50) {
+ return JXG.SketchReader.generateJCodeMeta(step, board);
+ }
+
+ switch (step.type) {
+
+ case JXG.GENTYPE_TRUNCATE:
+ set_str = 'trunclen = ' + JXG.Options.trunclen + '; ';
+ break;
+
+ case JXG.GENTYPE_JCODE:
+ set_str = step.args.code;
+ break;
+
+ case JXG.GENTYPE_AXIS:
+ set_str = step.args.name[0] + ' = point(' + step.args.coords[0].usrCoords[1] + ', ';
+ set_str += step.args.coords[0].usrCoords[2] + ') <<id: \'' + step.dest_sub_ids[0] + '\', name: \'';
+ set_str += step.args.name[0] + '\', fixed: true, priv: true, visible: false>>; ' + step.args.name[1];
+ set_str += ' = point(' + step.args.coords[1].usrCoords[1] + ', ';
+ set_str += step.args.coords[1].usrCoords[2] + ') <<id: \'' + step.dest_sub_ids[1] + '\', name: \'';
+ set_str += step.args.name[1] + '\', fixed: true, priv: true, visible: false>>; ' + step.args.name[2];
+ set_str += ' = point(' + step.args.coords[2].usrCoords[1] + ', ';
+ set_str += step.args.coords[2].usrCoords[2] + ') <<id: \'' + step.dest_sub_ids[2] + '\', name: \'';
+ set_str += step.args.name[2] + '\', fixed: true, priv: true, visible: false>>; ';
+
+ set_str += step.args.name[3] + ' = axis(' + step.args.name[0] + ', ' + step.args.name[1] + ') ';
+ set_str += '<<id: \'' + step.dest_sub_ids[3] + '\', name: \'' + step.args.name[3] + '\', ticks: ';
+ set_str += '<<minorHeight:0, majorHeight:10, ticksDistance: 1, drawLabels: true, drawZero: true>>>>; ';
+ set_str += step.args.name[4] + ' = axis(' + step.args.name[0] + ', ' + step.args.name[2] + ') ';
+ set_str += '<<id: \'' + step.dest_sub_ids[4] + '\', name: \'' + step.args.name[4] + '\', ticks: ';
+ set_str += '<<minorHeight:0, majorHeight:10, ticksDistance: 1, drawLabels: true, drawZero: true>>>>; ';
+
+ set_str += step.dest_sub_ids[3] + '.visible = false; ';
+ set_str += step.dest_sub_ids[4] + '.visible = false; ';
+
+ set_str += 'delete jxgBoard1_infobox; ';
+
+ reset_str = 'delete ' + step.dest_sub_ids[4] + '; delete ' + step.dest_sub_ids[3];
+ reset_str += '; delete ' + step.dest_sub_ids[2] + '; ';
+ reset_str += 'delete ' + step.dest_sub_ids[1] + '; delete ' + step.dest_sub_ids[0] + '; ';
+
+ break;
+
+ case JXG.GENTYPE_MID:
+ set_str = assign + 'midpoint(' + step.src_ids[0] + ', ' + step.src_ids[1] + ') <<' + attrid;
+ set_str += 'fillColor: \'' + step.args.fillColor + '\'>>; ';
+ reset_str = 'delete ' + step.dest_id + '; ';
+ break;
+
+ case JXG.GENTYPE_REFLECTION:
+ set_str = assign + 'reflection(' + step.src_ids[0] + ', ' + step.src_ids[1] + ') <<' + attrid;
+ set_str += 'fillColor: \'' + step.args.fillColor + '\'>>; ';
+ reset_str = 'delete ' + step.dest_id + '; ';
+ break;
+
+ case JXG.GENTYPE_MIRRORPOINT:
+ set_str = assign + 'mirrorpoint(' + step.src_ids[1] + ', ' + step.src_ids[0] + ') <<' + attrid;
+ set_str += 'fillColor: \'' + step.args.fillColor + '\'>>; ';
+ reset_str = 'delete ' + step.dest_id + '; ';
+ break;
+
+ case JXG.GENTYPE_TANGENT:
+ if (step.args.create_point) {
+ sub_id = step.dest_sub_ids[2];
+ set_str = 'point(' + pn(step.args.usrCoords[1]) + ',' + pn(step.args.usrCoords[2]) + ') <<id: \'';
+ set_str += sub_id + '\', fillColor: \'' + step.args.fillColor + '\'>>; ' + sub_id + '.glide(';
+ set_str += step.src_ids[0] + '); ';
+ reset_str = 'delete ' + sub_id + '; ';
+ } else {
+ sub_id = step.src_ids[0];
+ }
+
+ set_str += assign + 'tangent(' + sub_id + ') <<' + attrid + 'point1: <<name: \'' + step.dest_sub_ids[0];
+ set_str += '\', id: \'' + step.dest_sub_ids[0] + '\', priv: true>>, point2: <<name: \'' + step.dest_sub_ids[1];
+ set_str += '\', id: \'' + step.dest_sub_ids[1] + '\', priv: true>> >>; ';
+ reset_str = 'delete ' + step.dest_sub_ids[0] + '; ' + reset_str;
+ reset_str = 'delete ' + step.dest_id + '; delete ' + step.dest_sub_ids[1] + '; ' + reset_str;
+ break;
+
+ case JXG.GENTYPE_PARALLEL:
+ if (step.args.create_point) {
+ sub_id = step.dest_sub_ids[1];
+ set_str = 'point(' + pn(step.args.usrCoords[1]) + ', ' + pn(step.args.usrCoords[2]) + ') <<id: \'';
+ set_str += sub_id + '\', name: \'\', visible: false, priv: true>>; ';
+ reset_str = 'delete ' + sub_id + '; ';
+ } else {
+ sub_id = step.src_ids[1];
+ }
+
+ set_str += assign + 'parallel(' + step.src_ids[0] + ', ' + sub_id + ') <<' + attrid + 'name: \'\', point: <<id: \'';
+ set_str += step.dest_sub_ids[0] + '\', name: \'' + step.dest_sub_ids[0] + '\'>> >>; ';
+ reset_str = 'delete ' + step.dest_id + '; delete ' + step.dest_sub_ids[0] + '; ' + reset_str;
+ break;
+
+ case JXG.GENTYPE_BISECTORLINES:
+ set_str = 'bisectorlines(' + step.src_ids[0] + ', ' + step.src_ids[1] + ') <<line1: <<id: \'';
+ set_str = set_str + step.dest_sub_ids[2] + '\', point1: <<id: \'' + step.dest_sub_ids[1];
+ set_str += '\', name: \'' + step.dest_sub_ids[1] + '\'>>, point2: <<id: \'' + step.dest_sub_ids[0];
+ set_str += '\', name: \'' + step.dest_sub_ids[0] + '\'>>>>, line2: <<id: \'' + step.dest_sub_ids[5];
+ set_str += '\', point1: <<id: \'' + step.dest_sub_ids[4] + '\', name: \'' + step.dest_sub_ids[4];
+ set_str += '\'>>, point2: <<id: \'' + step.dest_sub_ids[3] + '\', name: \'' + step.dest_sub_ids[3];
+ set_str += '\'>>>>>>; ';
+ reset_str = 'delete ' + step.dest_sub_ids[5] + '; delete ' + step.dest_sub_ids[4] + '; delete ';
+ reset_str += step.dest_sub_ids[3] + '; delete ' + step.dest_sub_ids[2] + '; delete ';
+ reset_str += step.dest_sub_ids[1] + '; delete ' + step.dest_sub_ids[0] + '; ';
+ break;
+
+ case JXG.GENTYPE_BOARDIMG:
+ set_str = "image('" + step.args.s + "', [ " + step.args.anchor + " ], [ " + step.args.scale + " ]) ";
+ set_str += "<<id: '" + step.dest_id + "'>>; ";
+
+ reset_str = "delete " + step.dest_id + "; ";
+ break;
+
+ case JXG.GENTYPE_BISECTOR:
+ if (step.args.create_point) {
+ // TODO: use "if (options.useGlider) {"
+
+ // Projection to first line
+ pid1 = step.dest_sub_ids[1];
+ set_str = 'point(' + pn(step.args.usrCoords[1]) + ', ' + pn(step.args.usrCoords[2]) + ') ';
+ set_str += '<<id:\'' + pid1 + '\', ';
+ set_str += 'name:\'\', priv:true, visible:false >>; ';
+ set_str += pid1 + '.glide(' + step.src_ids[0] + '); ';
+ reset_str = 'delete ' + pid1 + '; ';
+
+ // Projection to second line
+ pid2 = step.dest_sub_ids[2];
+ set_str += 'point(' + pn(step.args.usrCoords[1]) + ', ' + pn(step.args.usrCoords[2]) + ') ';
+ set_str += '<<id:\'' + pid2 + '\', ';
+ set_str += 'name:\'\', priv:true, visible:false >>; ';
+ set_str += pid2 + '.glide(' + step.src_ids[1] + '); ';
+ reset_str += 'delete ' + pid2 + '; ';
+
+ if (step.args.create_intersection) {
+ // intersection point
+ pid3 = step.dest_sub_ids[3];
+ set_str += 'intersection(' + step.src_ids[0] + ', ' + step.src_ids[1] + ', 0) ';
+ set_str += '<<id:\'' + pid3 + '\', fillColor: \'' + step.args.fillColor + '\', ';
+ set_str += 'name:\'\', priv:true, visible:false >>; ';
+ reset_str += 'delete ' + pid3 + '; ';
+ } else {
+ pid3 = step.src_ids[2];
+ }
+
+ set_str += assign + 'bisector(' + pid1 + ', ' + pid3 + ', ' + pid2 + ') ';
+ set_str += '<<' + attrid + 'name: \'\', point: <<id: \'' + step.dest_sub_ids[0] + '\', priv: true, name: \'';
+ set_str += step.dest_sub_ids[0] + '\'>> >>;';
+ reset_str += 'delete ' + step.dest_id + '; delete ' + step.dest_sub_ids[0] + ';';
+ } else {
+ set_str = assign + 'bisector(' + step.src_ids[1] + ', ' + step.src_ids[2] + ', ' + step.src_ids[0];
+ set_str += ') <<' + attrid + 'name: \'\', point: <<id: \'' + step.dest_sub_ids[0] + '\', priv: true, name: \'';
+ set_str += step.dest_sub_ids[0] + '\'>>>>;';
+ reset_str = 'delete ' + step.dest_id + '; delete ' + step.dest_sub_ids[0] + ';';
+ }
+ break;
+
+ case JXG.GENTYPE_NORMAL:
+ if (step.args.create_point) {
+ sub_id = step.dest_sub_ids[1];
+ set_str = 'point(' + pn(step.args.usrCoords[1]) + ', ' + pn(step.args.usrCoords[2]);
+ set_str += ') <<id: \'' + sub_id + '\', name: \'\', visible: false, priv: true>>; ';
+ reset_str = 'delete ' + sub_id + '; ';
+ } else {
+ sub_id = step.src_ids[1];
+ }
+
+ set_str += assign + 'normal(' + sub_id + ', ' + step.src_ids[0] + ') <<' + attrid;
+ set_str += 'name: \'\', point: <<id: \'' + step.dest_sub_ids[0] + '\', name: \'' + step.dest_sub_ids[0];
+ set_str += '\'>> >>; ';
+ reset_str = 'delete ' + step.dest_id + '; delete ' + step.dest_sub_ids[0] + '; ' + reset_str;
+ break;
+
+ case JXG.GENTYPE_PERPSEGMENT:
+ set_str += assign + 'perpendicularsegment(' + step.src_ids[1] + ', ' + step.src_ids[0] + ') <<' + attrid;
+ set_str += 'name: \'\', point: <<id: \'' + step.dest_sub_ids[0] + '\', name: \'' + step.dest_sub_ids[0];
+ set_str += '\'>> >>; ';
+ reset_str = 'delete ' + step.dest_id + '; delete ' + step.dest_sub_ids[0] + '; ' + reset_str;
+ break;
+
+ case JXG.GENTYPE_POINT:
+ set_str = assign + 'point(' + pn(step.args.usrCoords[1]) + ', ' + pn(step.args.usrCoords[2]);
+ set_str += ')' + (options.useSymbols ? '' : ' <<id: \'' + step.dest_id + '\''
+ + ', snaptogrid: ' + JXG.Options.elements.snapToGrid
+ + ', snaptopoints: ' + JXG.Options.elements.snapToPoints + '>>') + '; ';
+
+ reset_str = 'delete ' + step.dest_id + '; ';
+ break;
+
+ case JXG.GENTYPE_GLIDER:
+ if (options.useGlider) {
+ set_str = assign + 'glider(' + pn(step.args.usrCoords[1]) + ', ' + pn(step.args.usrCoords[2]);
+ set_str += ', ' + step.src_ids[0] + ')';
+ set_str += (options.useSymbols ? '' : '<<id: \'' + step.dest_id + '\''
+ + ', snaptogrid: false, snaptopoints: false'
+ + ', snaptopoints: ' + JXG.Options.elements.snapToPoints + '>>') + ';';
+
+ } else {
+ set_str = assign + 'point(' + pn(step.args.usrCoords[1]) + ', ' + pn(step.args.usrCoords[2]);
+ set_str += ') <<' + attrid + 'fillColor: \'' + JXG.Options.glider.fillColor + '\'>>; ' + step.dest_id;
+ set_str += '.glide(' + step.src_ids[0] + '); ';
+ }
+
+ if (!(step.args && step.args.undoIsEmpty)) {
+ reset_str = 'delete ' + step.dest_id + '; ';
+ }
+
+ break;
+
+ case JXG.GENTYPE_INTERSECTION:
+ set_str = assign + 'intersection(' + step.src_ids[0] + ', ' + step.src_ids[1] + ', ' + step.args.choice;
+ set_str += ') <<' + attrid + ' fillColor: \'' + JXG.Options.intersection.fillColor + '\'>>; ';
+
+ if (!(step.args && step.args.undoIsEmpty)) {
+ reset_str = 'delete ' + step.dest_id + '; ';
+ }
+
+ break;
+
+ case JXG.GENTYPE_MIGRATE:
+
+ set_str = '$board.migratePoint(' + step.src_ids[0] + ', ' + step.dest_id + ', false); ';
+
+ if (step.args && step.args.migrateToGlider) {
+
+ var o, gl, uc1, uc2;
+
+ reset_str = step.dest_id + '.free(); ' + step.dest_id;
+ reset_str += '.fillColor = \'' + step.args.fillColor + '\'; ' + step.dest_id;
+ reset_str += '.strokeColor = \'' + step.args.strokeColor + '\'; ';
+
+ uc1 = step.args.usrCoords[1];
+ uc2 = step.args.usrCoords[2];
+
+ reset_str += 'point(' + uc1 + ', ' + uc2 + ')';
+ reset_str += ' <<id: \'' + step.src_ids[0] + '\', name: \'\'>>' + '; ';
+ reset_str += '$board.migratePoint(' + step.dest_id + ', ' + step.src_ids[0] + ', false); ';
+ reset_str += step.src_ids[0] + '.name = \'' + step.args.orig_name + '\'; ';
+ reset_str += step.src_ids[0] + '.label.setText(\'' + step.args.orig_name + '\'); ';
+
+ o = board.objects[step.dest_id];
+ gl = o.slideObject.id;
+
+ uc1 = o.coords.usrCoords[1];
+ uc2 = o.coords.usrCoords[2];
+
+ reset_str += assign + 'point(' + uc1 + ', ' + uc2 + ') ';
+ reset_str += '<<' + attrid + 'fillColor: \'' + JXG.Options.glider.fillColor + '\'>>; ';
+ reset_str += step.dest_id + '.glide(' + gl + '); ';
+
+ } else {
+ reset_str = 'delete ' + step.dest_id + '; ';
+ }
+
+ break;
+
+ case JXG.GENTYPE_COMBINED:
+
+ set_str = reset_str = '';
+
+ for (i = 0; i < step.args.steps.length; i++) {
+ arr = this.generateJCode(step.args.steps[i], board, step_log);
+
+ set_str = set_str + arr[0];
+ reset_str = arr[2] + reset_str;
+ }
+
+ break;
+
+ case JXG.GENTYPE_CIRCLE:
+ reset_str = 'delete ' + step.dest_sub_ids[0] + '; ';
+
+ if (step.args.create_point) {
+ set_str = 'point(' + pn(step.args.usrCoords[1]) + ', ' + pn(step.args.usrCoords[2]);
+ set_str += ') <<id: \'' + step.dest_sub_ids[0] + '\', priv: false>>; ';
+
+ set_str += assign + 'circle(' + step.dest_sub_ids[0] + ', ' + step.src_ids[0] + ') <<' + attrid;
+ set_str += 'name: \'\', fillOpacity: ' + JXG.Options.opacityLevel
+ + ', snaptogrid: ' + JXG.Options.elements.snapToGrid
+ + ', snaptopoints: ' + JXG.Options.elements.snapToPoints + '>>;';
+
+ reset_str = 'delete ' + step.dest_id + '; ' + reset_str;
+ } else if (step.args.create_by_radius) {
+ set_str = 'point(' + pn(step.args.x) + ', ' + pn(step.args.y) + ') <<id: \'' + step.dest_sub_ids[0];
+ set_str += '\', name: \'\', withLabel: true, visible: true, priv: false>>; ';
+ set_str += step.dest_sub_ids[0] + '.visible = true; ';
+ set_str += assign + 'circle(\'' + step.dest_sub_ids[0] + '\', ' + pn(step.args.r) + ') <<' + attrid;
+ set_str += 'name: \'\', fillOpacity: ' + JXG.Options.opacityLevel
+ + ', snaptogrid: ' + JXG.Options.elements.snapToGrid
+ + ', snaptopoints: ' + JXG.Options.elements.snapToPoints + '>>;';
+
+ reset_str = 'delete ' + step.dest_id + '; delete ' + step.dest_sub_ids[0] + '; ';
+ } else {
+ set_str = assign + 'circle(' + step.src_ids[0] + ', ' + step.src_ids[1] + ', ' + step.src_ids[2];
+ set_str += ') <<center: <<id: \'' + step.dest_sub_ids[0] + '\', name: \'' + step.dest_sub_ids[0];
+ set_str += '\', visible: true>>, ' + attrid + 'name: \'\', fillOpacity: ' + JXG.Options.opacityLevel
+ + ', snaptogrid: ' + JXG.Options.elements.snapToGrid
+ + ', snaptopoints: ' + JXG.Options.elements.snapToPoints + '>>; ';
+
+ reset_str = 'delete ' + step.dest_id + '; ' + reset_str;
+ }
+
+ break;
+
+ case JXG.GENTYPE_CIRCLE2POINTS:
+ if (step.args.create_two_points) {
+ set_str = 'point(' + pn(step.args.x1) + ', ' + pn(step.args.y1) + ') <<id: \'' + step.dest_sub_ids[0];
+ set_str += '\'>>; ';
+ set_str += 'point(' + pn(step.args.x2) + ', ' + pn(step.args.y2) + ') <<id: \'';
+ set_str += step.dest_sub_ids[1] + '\'>>; ';
+ set_str += assign + 'circle(' + step.dest_sub_ids[0] + ', ' + step.dest_sub_ids[1] + ') <<' + attrid;
+ set_str += 'name: \'\', fillOpacity: ' + JXG.Options.opacityLevel
+ + ', snaptogrid: ' + JXG.Options.elements.snapToGrid
+ + ', snaptopoints: ' + JXG.Options.elements.snapToPoints + '>>; ';
+
+ reset_str = 'delete ' + step.dest_id + '; delete ' + step.dest_sub_ids[1] + '; delete ';
+ reset_str += step.dest_sub_ids[0] + '; ';
+ } else if (step.args.create_point) {
+ set_str = 'point(' + pn(step.args.x) + ', ' + pn(step.args.y) + ') <<id: \'' + step.dest_sub_ids[0];
+ set_str += '\'>>; ';
+ set_str += assign + 'circle(' + step.dest_sub_ids[0] + ', ' + step.src_ids[0] + ') <<' + attrid;
+ set_str += 'name: \'\', fillOpacity: ' + JXG.Options.opacityLevel
+ + ', snaptogrid: ' + JXG.Options.elements.snapToGrid
+ + ', snaptopoints: ' + JXG.Options.elements.snapToPoints + '>>; ';
+
+ reset_str = 'delete ' + step.dest_id + '; delete ' + step.dest_sub_ids[0] + '; ';
+ } else if (step.args.create_by_radius) {
+ set_str = assign + 'circle(' + step.src_ids[0] + ', ' + step.args.r + ') <<' + attrid;
+ set_str += 'name: \'\', fillOpacity: ' + JXG.Options.opacityLevel
+ + ', snaptogrid: ' + JXG.Options.elements.snapToGrid
+ + ', snaptopoints: ' + JXG.Options.elements.snapToPoints + '>>; ';
+
+ reset_str = 'delete ' + step.dest_id + '; ';
+ } else {
+ set_str = assign + 'circle(' + step.src_ids[0] + ', ' + step.src_ids[1] + ') <<' + attrid;
+ set_str += 'name: \'\', fillOpacity: ' + JXG.Options.opacityLevel
+ + ', snaptogrid: ' + JXG.Options.elements.snapToGrid
+ + ', snaptopoints: ' + JXG.Options.elements.snapToPoints + '>>; ';
+
+ reset_str = 'delete ' + step.dest_id + '; ';
+ }
+
+ break;
+
+ case JXG.GENTYPE_LINE:
+
+ k = 0;
+ j = 0;
+
+ if (step.args.create_point1) {
+ pid1 = step.dest_sub_ids[k];
+ k += 1;
+ str1 = [];
+ for (i = 0; i < step.args.p1.length; i++) {
+ str1[i] = pn(step.args.p1[i]);
+ }
+
+ set_str = 'point(' + str1.join(', ') + ') <<id: \'' + pid1 + '\', name: \'\', visible: false, ';
+ set_str += 'snaptogrid: false, snaptopoints: false, priv: true>>; ';
+ reset_str = 'delete ' + pid1 + '; ';
+ } else {
+ pid1 = step.src_ids[j];
+ j += 1;
+ }
+
+ if (step.args.create_point2) {
+ pid2 = step.dest_sub_ids[k++];
+ str1 = [];
+ for (i = 0; i < step.args.p2.length; i++) {
+ str1[i] = pn(step.args.p2[i]);
+ }
+
+ set_str += 'point(' + str1.join(', ') + ') <<id: \'' + pid2 + '\', name: \'\', visible: false, ';
+ set_str += 'snaptogrid: false, snaptopoints: false, priv: true>>; ';
+ reset_str = 'delete ' + pid2 + '; ' + reset_str;
+ } else {
+ pid2 = step.src_ids[j];
+ j += 1;
+ }
+
+ str = 'line';
+ str1 = '';
+
+ // the line's parents
+ str2 = pid1 + ', ' + pid2;
+
+ // if we want a truly free line
+ if (step.args.create_point1 && step.args.create_point2 && options.freeLine) {
+ // forget the points
+ set_str = '';
+ reset_str = '';
+
+ // use the stdform instead
+ if (step.args.p1.length === 2) {
+ step.args.p1.unshift(1);
+ }
+
+ if (step.args.p2.length === 2) {
+ step.args.p2.unshift(1);
+ }
+
+ str2 = JXG.Math.crossProduct(step.args.p1, step.args.p2);
+ for (i = 0; i < str2.length; i++) {
+ str2[i] = pn(str2[i]);
+ }
+
+ str2 = str2.join(', ');
+ }
+
+ if (!step.args.first && !step.args.last) {
+ str = 'segment';
+ } else {
+ if (!step.args.first) {
+ str1 = 'straightFirst: ' + step.args.first;
+ }
+
+ if (!step.args.last) {
+ str1 = 'straightLast: ' + step.args.last;
+ }
+
+ if (str1.length > 0 && !options.useSymbols) {
+ str1 += ', ';
+ }
+ }
+
+ // this is a corner case, we have to get rid of the ',' at the end
+ // simple solution: rebuild attrid
+ if (!options.useSymbols) {
+ attrid = 'id: \'' + step.dest_id + '\'';
+ }
+
+ set_str += assign + str + '(' + str2 + ')';
+
+ if (str1.length + attrid.length > 0) {
+ set_str += ' <<' + str1 + attrid + ', name: \'\', snaptogrid: ' + JXG.Options.elements.snapToGrid
+ + ', snaptopoints: ' + JXG.Options.elements.snapToPoints + '>>; ';
+
+ } else {
+ set_str += ' <<name: \'\', snaptogrid: ' + JXG.Options.elements.snapToGrid
+ + ', snaptopoints: ' + JXG.Options.elements.snapToPoints + '>>; ';
+ }
+
+ reset_str = 'delete ' + step.dest_id + '; ' + reset_str;
+
+ break;
+
+ case JXG.GENTYPE_SLOPETRIANGLE:
+ set_str = assign + 'slopetriangle(' + step.src_ids[0] + ') <<';
+ set_str += attrid + ' name: \'\',';
+ set_str += 'borders: <<ids: [\'' + step.dest_sub_ids[4] + '\', \'' + step.dest_sub_ids[5] + '\', \'' + step.dest_sub_ids[6] + '\']>>,';
+ set_str += 'basepoint: <<id: \'' + step.dest_sub_ids[0] + '\'>>, baseline: <<id: \'' + step.dest_sub_ids[1] + '\'>>,';
+ set_str += 'glider: <<id: \'' + step.dest_sub_ids[2] + '\'>>, toppoint: <<id: \'' + step.dest_sub_ids[3] + '\'>>';
+ set_str += '>>;';
+ reset_str = 'delete ' + step.dest_id + '; ';
+
+ break;
+
+ case JXG.GENTYPE_TRIANGLE:
+ for (i = 0; i < step.args.create_point.length; i++) {
+ if (step.args.create_point[i]) {
+ set_str += 'point(' + pn(step.args.coords[i].usrCoords[1]) + ', ';
+ set_str += pn(step.args.coords[i].usrCoords[2]) + ') <<id: \'' + step.dest_sub_ids[i];
+ set_str += '\', snaptogrid: ' + JXG.Options.elements.snapToGrid;
+ set_str += ', snaptopoints: ' + JXG.Options.elements.snapToPoints + '>>; ';
+ }
+ }
+
+ for (i = 0; i < step.dest_sub_ids.length; i++) {
+ if (step.dest_sub_ids[i] !== 0) {
+ reset_str = 'delete ' + step.dest_sub_ids[i] + '; ' + reset_str;
+ }
+ }
+
+ reset_str = 'delete ' + step.dest_id + '; ' + reset_str;
+ set_str += assign + 'polygon(';
+
+ for (i = 0; i < step.src_ids.length; i++) {
+ set_str += step.src_ids[i];
+ if (i < step.src_ids.length - 1) {
+ set_str += ', ';
+ }
+ }
+
+ for (i = 0; i < 3; i++) {
+ if (step.dest_sub_ids[i] !== 0) {
+ if (step.src_ids.length > 0 || i > 0) {
+ set_str += ', ';
+ }
+ set_str += step.dest_sub_ids[i];
+ }
+ }
+
+ set_str += ') <<borders: <<ids: [ \'' + step.dest_sub_ids[3] + '\', \'' + step.dest_sub_ids[4];
+ set_str += '\', \'' + step.dest_sub_ids[5] + '\' ]';
+ set_str += ', name: \'\'>>, ' + attrid + ' fillOpacity: ';
+ set_str += JXG.Options.opacityLevel + ', name: \'\', hasInnerPoints:' + JXG.Options.polygon.hasInnerPoints;
+ set_str += ', snaptogrid: ' + JXG.Options.elements.snapToGrid;
+ set_str += ', snaptopoints: ' + JXG.Options.elements.snapToPoints + ', scalable:true>>; ';
+ break;
+
+ case JXG.GENTYPE_QUADRILATERAL:
+ for (i = 0; i < step.args.create_point.length; i++) {
+ if (step.args.create_point[i]) {
+ set_str += 'point(' + pn(step.args.coords[i].usrCoords[1]) + ', ';
+ set_str += pn(step.args.coords[i].usrCoords[2]) + ') <<id: \'' + step.dest_sub_ids[i];
+ set_str += '\', snaptogrid: ' + JXG.Options.elements.snapToGrid;
+ set_str += ', snaptopoints: ' + JXG.Options.elements.snapToPoints + '>>; ';
+ }
+ }
+
+ for (i = 0; i < step.dest_sub_ids.length; i++) {
+ if (step.dest_sub_ids[i] !== 0) {
+ reset_str = 'delete ' + step.dest_sub_ids[i] + '; ' + reset_str;
+ }
+ }
+
+ reset_str = 'delete ' + step.dest_id + '; ' + reset_str;
+ set_str += assign + 'polygon(';
+
+ for (i = 0; i < step.src_ids.length; i++) {
+ set_str += step.src_ids[i];
+ if (i < step.src_ids.length - 1) {
+ set_str += ', ';
+ }
+ }
+
+ set_str += ') <<borders: <<ids: [ \'' + step.dest_sub_ids[4] + '\', \'' + step.dest_sub_ids[5];
+ set_str += '\', \'';
+ set_str += step.dest_sub_ids[6] + '\', \'' + step.dest_sub_ids[7] + '\' ]';
+ set_str += ', name: \'\'>>, ' + attrid;
+ set_str += ' fillOpacity: ';
+ set_str += JXG.Options.opacityLevel + ', name: \'\', hasInnerPoints:' + JXG.Options.polygon.hasInnerPoints;
+ set_str += ', snaptogrid: ' + JXG.Options.elements.snapToGrid;
+ set_str += ', snaptopoints: ' + JXG.Options.elements.snapToPoints + ', scalable:true>>; ';
+ break;
+
+ case JXG.GENTYPE_TEXT:
+ set_str = assign + 'text(' + pn(step.args.x) + ', ' + pn(step.args.y) + ', ' + step.args.str + ') <<';
+ set_str += attrid + 'name: \'' + step.dest_id + '\'';
+ if (typeof step.args.anchor != 'undefined') {
+ set_str += ', anchor: ' + step.args.anchor;
+ }
+ set_str += '>>; ' + step.dest_id + '.setText(' + step.args.str;
+ set_str += '); ';
+ reset_str = 'delete ' + step.dest_id + '; ';
+ break;
+
+ case JXG.GENTYPE_RULER:
+ set_str = assign + 'tapemeasure([ ' + step.args.p1 + ' ], [ ' + step.args.p2 + ' ]) <<';
+ /*
+ set_str += attrid + 'name: \'\', point1: <<id: \'' + step.dest_sub_ids[0] + '\', snaptogrid: '
+ + JXG.Options.elements.snapToGrid + ', snaptopoints: ' + JXG.Options.elements.snapToPoints + '>>, '
+ + 'point2: <<id: \'' + step.dest_sub_ids[1] + '\''+ ', snaptogrid: '
+ + JXG.Options.elements.snapToGrid + ', snaptopoints: ' + JXG.Options.elements.snapToPoints + '>> >>; ';
+ */
+ set_str += attrid + 'name: \'\', point1: <<id: \'' + step.dest_sub_ids[0] + '\', snaptogrid: '
+ + JXG.Options.elements.snapToGrid + '>>, '
+ + 'point2: <<id: \'' + step.dest_sub_ids[1] + '\'' + ', snaptogrid: '
+ + JXG.Options.elements.snapToGrid + '>> >>; ';
+ reset_str = 'delete ' + step.dest_id + '; ';
+ break;
+
+ case JXG.GENTYPE_POLYGON:
+ set_str = assign + 'polygon(';
+
+ for (i = 0; i < step.src_ids.length; i++) {
+ set_str += step.src_ids[i];
+ if (i !== step.src_ids.length - 1) {
+ set_str += ', ';
+ }
+ }
+
+ set_str += ') <<borders: <<ids: [ \'';
+
+ for (i = 0; i < step.dest_sub_ids.length; i++) {
+ set_str += step.dest_sub_ids[i];
+ if (i < step.dest_sub_ids.length - 1) {
+ set_str += '\', \'';
+ }
+ }
+
+ set_str += '\' ], name: \'\'>>, ' + attrid + ' fillOpacity: ' + JXG.Options.opacityLevel + ', name: \'\'>>; ';
+ reset_str = 'delete ' + step.dest_id + '; ';
+ break;
+
+ case JXG.GENTYPE_REGULARPOLYGON:
+ set_str = assign + 'regularpolygon(' + step.src_ids[0] + ', ' + step.src_ids[1] + ', ';
+ set_str += step.args.corners + ') <<borders: <<ids: [ ';
+
+ for (i = 0; i < step.args.corners; i++) {
+ set_str += '\'' + step.dest_sub_ids[i] + '\'';
+ if (i !== step.args.corners - 1) {
+ set_str += ', ';
+ }
+ reset_str = 'delete ' + step.dest_sub_ids[i] + '; ' + reset_str;
+ }
+
+ set_str += ' ]>>, vertices: <<ids: [ ';
+
+ for (i = 0; i < step.args.corners - 2; i++) {
+ set_str += '\'' + step.dest_sub_ids[i + parseInt(step.args.corners, 10)] + '\'';
+ if (i !== step.args.corners - 3) {
+ set_str += ', ';
+ }
+ reset_str = 'delete ' + step.dest_sub_ids[i + parseInt(step.args.corners, 10)] + '; ' + reset_str;
+ }
+
+ set_str += ' ]>>, ' + attrid + ' fillOpacity: ' + JXG.Options.opacityLevel + ', name: \'\'>>; ';
+ reset_str = 'delete ' + step.dest_id + '; ' + reset_str;
+ break;
+
+ case JXG.GENTYPE_SECTOR:
+ set_str = assign + 'sector(' + step.src_ids[0] + ', ' + step.src_ids[1] + ', ' + step.src_ids[2];
+ set_str += ') <<';
+ set_str += attrid + ' name: \'' + step.dest_id + '\', fillOpacity: ' + JXG.Options.opacityLevel;
+ set_str += '>>; ';
+ reset_str = 'delete ' + step.dest_id + '; ';
+ break;
+
+ case JXG.GENTYPE_ANGLE:
+ set_str = assign + 'angle(' + step.src_ids[0] + ', ' + step.src_ids[1] + ', ' + step.src_ids[2] + ') ';
+ set_str += '<<radiuspoint: << priv:true, id: \'' + step.dest_sub_ids[0] + '\', name: \'' + step.dest_sub_ids[0];
+ set_str += '\'>>, pointsquare: << priv:true, id: \'' + step.dest_sub_ids[1] + '\', name: \'' + step.dest_sub_ids[1];
+ set_str += '\'>>, dot: << priv:true, id: \'' + step.dest_sub_ids[2] + '\', name: \'' + step.dest_sub_ids[2];
+ set_str += '\'>>, ';
+ set_str += attrid + ' fillOpacity: ' + JXG.Options.opacityLevel + '>>; ';
+ reset_str = 'delete ' + step.dest_id + '; delete ' + step.dest_sub_ids[2] + '; delete ';
+ reset_str += step.dest_sub_ids[1];
+ reset_str += '; delete ' + step.dest_sub_ids[0] + '; ';
+ break;
+
+ case JXG.GENTYPE_PLOT:
+
+ set_str = assign + step.args.plot_type + '(' + step.args.func;
+
+ if (isNaN(step.args.a) || step.args.a == null)
+ step.args.a = "-infinity";
+ if (isNaN(step.args.b) || step.args.b == null)
+ step.args.b = "infinity";
+
+ if (step.args.a != step.args.b)
+ set_str += ', ' + step.args.a + ', ' + step.args.b;
+
+ set_str += ') <<';
+
+ if (step.args.isPolar)
+ set_str += 'curveType: \'polar\', ';
+
+ set_str += attrid + 'name: \'' + step.dest_id + '\', strokeColor: \'' + step.args.color + '\'>>; ';
+ reset_str = 'delete ' + step.dest_id + '; ';
+
+ break;
+
+ case JXG.GENTYPE_SLOPETRIANGLE:
+ set_str = assign + 'slopetriangle(' + step.args.tangent + ') <<id: \'' + step.dest_id + '\', name: \'\'>>; ';
+ reset_str = 'delete ' + step.dest_id + '; ';
+ break;
+
+ case JXG.GENTYPE_SLIDER:
+ set_str = assign + 'slider([' + pn(step.args.x1) + ', ' + pn(step.args.y1) + '], [' + pn(step.args.x2);
+ set_str += ', ' + pn(step.args.y2) + '], [' + pn(step.args.start) + ', ' + pn(step.args.ini) + ', ';
+ set_str += pn(step.args.end) + ']) <<' + attrid + 'baseline: <<id: \'';
+ set_str += step.dest_sub_ids[0] + '\', name: \'' + step.dest_sub_ids[0] + '\'>>, highline: <<id: \'';
+ set_str += step.dest_sub_ids[1] + '\', name: \'' + step.dest_sub_ids[1] + '\'>>, point1: <<id: \'';
+ set_str += step.dest_sub_ids[2] + '\', name: \'' + step.dest_sub_ids[2] + '\'>>, point2: <<id: \'';
+ set_str += step.dest_sub_ids[3] + '\', name: \'' + step.dest_sub_ids[3] + '\'>>, label: <<id: \'';
+ set_str += step.dest_sub_ids[4] + '\', name: \'' + step.dest_sub_ids[4] + '\'>>>>; ';
+
+ reset_str = 'delete ' + step.dest_id + '; delete ' + step.dest_sub_ids[4] + '; delete ';
+ reset_str += step.dest_sub_ids[3] + '; delete ' + step.dest_sub_ids[2] + '; delete ';
+ reset_str += step.dest_sub_ids[1] + '; delete ';
+ reset_str += step.dest_sub_ids[0] + '; ';
+ break;
+
+
+ case JXG.GENTYPE_DELETE:
+
+ arr = [];
+ ctx_set_str = [];
+ ctx_reset_str = [];
+
+ for (i = 0; i < step.args.steps.length; i++) {
+ if (step_log[step.args.steps[i]].type > 50) {
+ arr = this.generateJCodeMeta(step_log[step.args.steps[i]], board);
+ } else {
+ arr = this.generateJCode(step_log[step.args.steps[i]], board, step_log);
+ }
+
+ if (JXG.trim(arr[2]) !== '') {
+ set_str = arr[2] + set_str;
+ }
+ if (JXG.isFunction(arr[3])) {
+ ctx_set_str.unshift(arr[3]);
+ }
+ if (JXG.trim(arr[0]) !== '') {
+ reset_str += arr[0];
+ }
+ if (JXG.isFunction(arr[1])) {
+ ctx_reset_str.push(arr[1]);
+ }
+ }
+
+ break;
+
+ case JXG.GENTYPE_COPY:
+ copy_log = [];
+
+ // Adapt the steps to the new IDs
+ for (el in step.args.steps) {
+ if (step.args.steps.hasOwnProperty(el)) {
+ step2 = JXG.deepCopy(step_log[step.args.steps[el]]);
+
+ if (step2.type === JXG.GENTYPE_COPY) {
+ for (i = 0; i < step2.args.map.length; i++) {
+ for (j = 0; j < step.args.map.length; j++) {
+ if (step2.args.map[i].copy === step.args.map[j].orig) {
+ step2.args.map[i].copy = step.args.map[j].copy;
+ }
+ }
+ }
+
+ step2 = JXG.SketchReader.replaceStepDestIds(step2, step2.args.map);
+ } else {
+ step2 = JXG.SketchReader.replaceStepDestIds(step2, step.args.map);
+ }
+
+ copy_log.push(step2);
+ }
+ }
+
+ for (i = 0; i < copy_log.length; i++) {
+ if (copy_log[i].type > 50) {
+ arr = this.generateJCodeMeta(copy_log[i], board);
+ } else {
+ arr = this.generateJCode(copy_log[i], board, step_log);
+ }
+
+ if (JXG.trim(arr[0]) !== '') {
+ set_str += arr[0];
+ }
+
+ if (JXG.isFunction(arr[1])) {
+ ctx_set_str.push(arr[1]);
+ }
+
+ if (JXG.trim(arr[2]) !== '') {
+ reset_str = arr[2] + reset_str;
+ }
+
+ if (JXG.isFunction(arr[3])) {
+ ctx_reset_str.unshift(arr[3]);
+ }
+ }
+
+ // Apply the offset-translation to the free points of the copy
+ if (step.args.dep_copy) {
+ for (i = 0; i < step.args.map.length; i++) {
+ if (getObject(step.args.map[i].orig).elementClass === JXG.OBJECT_CLASS_POINT) {
+ set_str += step.args.map[i].copy;
+ set_str += '.X = function() { return (' + step.args.map[i].orig + '.X() - ';
+ set_str += pn(step.args.x) + '); }; ';
+ set_str += step.args.map[i].copy;
+ set_str += '.Y = function() { return (' + step.args.map[i].orig + '.Y() - ';
+ set_str += pn(step.args.y) + '); }; ';
+ }
+ }
+ } else {
+ for (i = 0; i < step.args.free_points.length; i++) {
+ xstart = getObject(step.args.free_points[i].orig).coords.usrCoords[1];
+ ystart = getObject(step.args.free_points[i].orig).coords.usrCoords[2];
+
+ set_str += step.args.free_points[i].copy + '.X = function() { return ';
+ set_str += pn(xstart - step.args.x) + '; }; ';
+ set_str += step.args.free_points[i].copy + '.Y = function() { return ';
+ set_str += pn(ystart - step.args.y) + '; }; ';
+ set_str += step.args.free_points[i].copy + '.free(); ';
+ }
+ }
+
+ for (j = 0; j < step.args.map.length; j++) {
+ el = getObject(step.args.map[j].orig);
+
+ // Check if a radius-defined circle should be copied
+ if (el.type === JXG.OBJECT_TYPE_CIRCLE && !JXG.exists(el.point2)) {
+ // Make the radius of the circle copy depend on the original circle's radius
+ set_str += step.args.map[j].copy + '.setRadius(function () { return ';
+ set_str += step.args.map[j].orig + '.radius(); }); ';
+ }
+ }
+
+ break;
+
+ case JXG.GENTYPE_ABLATION:
+
+ xstart = getObject(step.src_ids[0]).coords.usrCoords[1];
+ ystart = getObject(step.src_ids[0]).coords.usrCoords[2];
+
+ set_str = 'point(' + pn(xstart - step.args.x) + ', ' + pn(ystart - step.args.y) + ') <<id: \'';
+ set_str += step.dest_sub_ids[0] + '\', withLabel: false>>; ';
+ set_str += 'circle(\'' + step.dest_sub_ids[0] + '\', 1) <<id: \'' + step.dest_sub_ids[1];
+ set_str += '\', fillOpacity: ' + JXG.Options.opacityLevel + ', strokeColor: \'#888888\', visible: true>>; ';
+
+ if (step.args.fids.length === 1) {
+ step.args.func = step.args.fids[0] + '.radius()';
+ } else {
+ step.args.func = 'dist(' + step.args.fids[0] + ', ' + step.args.fids[1] + ')';
+ }
+
+ set_str += step.dest_sub_ids[1] + '.setRadius(function() { return ' + step.args.func + '; }); ';
+
+ if (step.args.migrate !== 0 && step.args.migrate !== -1) {
+ set_str += '$board.migratePoint(' + step.dest_sub_ids[0] + ', ' + step.args.migrate + '); ';
+ }
+
+ reset_str = 'delete ' + step.dest_sub_ids[1] + '; delete ' + step.dest_sub_ids[0] + '; ';
+
+ break;
+/*
+ case JXG.GENTYPE_TRANSFORM:
+
+ set_str = step.dest_sub_ids[0] + ' = transform(' + step.args.tmat + ') <<type: \'generic\'>>; ';
+ set_str += 'point(' + step.src_ids[0] + ', ' + step.dest_sub_ids[0] + ') <<id: \'' + step.dest_id;
+ set_str += '\', visible: true>>; ';
+
+ reset_str = 'delete ' + step.dest_id + '; ';
+ reset_str += 'delete ' + step.dest_sub_ids[0] + '; ';
+
+ break;
+
+ case JXG.GENTYPE_PERPENDICULAR_BISECTOR:
+ if (step.args.create_line) {
+ sub_id = step.dest_sub_ids[2];
+ set_str = 'line(' + step.src_ids[0] + ', ' + step.src_ids[1] + ') <<id: \'' + sub_id;
+ set_str += '\', visible: true>>; ';
+ reset_str = 'delete ' + sub_id + '; ';
+ } else {
+ sub_id = step.src_ids[2];
+ }
+
+ set_str += 'midpoint(' + step.src_ids[0] + ', ' + step.src_ids[1] + ') <<id: \'' + step.dest_sub_ids[0];
+ set_str += '\', fillColor: \'' + step.args.fillColor + '\'>>; ';
+ set_str += assign + 'normal(' + step.dest_sub_ids[0] + ', ' + sub_id + ') <<' + attrid;
+ set_str += ' point: <<id: \'' + step.dest_sub_ids[1] + '\', name: \'' + step.dest_sub_ids[1];
+ set_str += '\'>> >>; ';
+ reset_str = 'delete ' + step.dest_sub_ids[0] + '; ' + reset_str;
+ reset_str = 'delete ' + step.dest_id + '; delete ' + step.dest_sub_ids[1] + '; ' + reset_str;
+ break;
+*/
+ case JXG.GENTYPE_MOVEMENT:
+
+ if (step.args.obj_type === JXG.OBJECT_TYPE_LINE) {
+ set_str = step.src_ids[0] + '.move([' + pn(step.args.coords[0].usrCoords[0]) + ', ';
+ set_str += pn(step.args.coords[0].usrCoords[1]) + ', ' + pn(step.args.coords[0].usrCoords[2]) + ']); ';
+ reset_str = step.src_ids[0] + '.move([' + step.args.zstart[0] + ', ' + step.args.xstart[0] + ', ';
+ reset_str += step.args.ystart[0] + ']); ';
+
+ set_str += step.src_ids[1] + '.move([' + pn(step.args.coords[1].usrCoords[0]) + ', ';
+ set_str += pn(step.args.coords[1].usrCoords[1]) + ', ' + pn(step.args.coords[1].usrCoords[2]) + ']); ';
+ reset_str += step.src_ids[1] + '.move([' + step.args.zstart[1] + ', ' + step.args.xstart[1] + ', ';
+ reset_str += step.args.ystart[1] + ']); ';
+
+ } else if (step.args.obj_type === JXG.OBJECT_TYPE_CIRCLE) {
+ set_str = step.src_ids[0] + '.move([' + pn(step.args.coords[0].usrCoords[1]) + ', ';
+ set_str += pn(step.args.coords[0].usrCoords[2]) + ']); ';
+ reset_str = step.src_ids[0] + '.move([' + step.args.xstart + ', ' + step.args.ystart + ']); ';
+
+ if (step.args.has_point2) {
+ set_str += step.src_ids[1] + '.move([' + pn(step.args.coords[1].usrCoords[1]) + ', ';
+ set_str += pn(step.args.coords[1].usrCoords[2]) + ']); ';
+ reset_str += step.src_ids[1] + '.move([' + step.args.old_p2x + ', ' + step.args.old_p2y;
+ reset_str += ']); ';
+ }
+
+ } else if (step.args.obj_type === JXG.OBJECT_TYPE_POLYGON) {
+ set_str = reset_str = "";
+
+ for (i = 0; i < step.src_ids.length; i++) {
+ set_str += step.src_ids[i] + '.move([' + pn(step.args.coords[i].usrCoords[1]) + ', ';
+ set_str += pn(step.args.coords[i].usrCoords[2]) + ']); ';
+ reset_str += step.src_ids[i] + '.move([' + step.args.xstart[i] + ', ' + step.args.ystart[i];
+ reset_str += ']); ';
+ }
+
+ } else {
+ set_str = step.src_ids[0] + '.move([' + pn(step.args.coords[0].usrCoords[1]) + ', ';
+ set_str += pn(step.args.coords[0].usrCoords[2]) + ']); ';
+
+ reset_str = step.src_ids[0] + '.move([' + step.args.xstart + ', ' + step.args.ystart + ']); ';
+ }
+
+ break;
+
+ default:
+ JXG.debug("No such GENTYPE!" + step.type);
+ return [];
+ }
+
+ return [set_str, ctx_set_str, reset_str, ctx_reset_str];
+ },
+
+ replaceStepDestIds: function (step, id_map) {
+ var i, j, copy_ids = [];
+
+ for (i = 0; i < id_map.length; i++) {
+ copy_ids.push(id_map[i].copy);
+
+ if (step.dest_id === id_map[i].orig) {
+ step.dest_id = id_map[i].copy;
+ }
+
+ for (j = 0; j < step.dest_sub_ids.length; j++) {
+ if (step.dest_sub_ids[j] === id_map[i].orig) {
+ step.dest_sub_ids[j] = id_map[i].copy;
+ }
+ }
+
+ for (j = 0; j < step.src_ids.length; j++) {
+ if (step.src_ids[j] === id_map[i].orig) {
+ step.src_ids[j] = id_map[i].copy;
+ }
+ }
+ }
+
+ for (j = 0; j < step.dest_sub_ids.length; j++) {
+ if (!JXG.isInArray(copy_ids, step.dest_sub_ids[j])) {
+ step.dest_sub_ids[j] = this.id();
+ }
+ }
+
+ step.src_ids = JXG.uniqueArray(step.src_ids);
+ step.dest_sub_ids = JXG.uniqueArray(step.dest_sub_ids);
+
+ return step;
+ }
+ });
+
+ JXG.registerReader(JXG.SketchReader, ['sketch', 'sketchometry']);
+}());
diff --git a/Sketchometry.activity/js/audio.js b/Sketchometry.activity/js/audio.js
new file mode 100644
index 0000000..3bc4160
--- /dev/null
+++ b/Sketchometry.activity/js/audio.js
@@ -0,0 +1,131 @@
+/*
+ Copyright 2011 / 2012
+
+ Alfred Wassermann
+ Michael Gerhaeuser,
+ Carsten Miller,
+ Matthias Ehmann,
+ Heiko Vogel
+
+ This file is part of the JSXGraph GUI project.
+ This code isn't licensed yet.
+*/
+
+(function () {
+
+ 'use strict';
+
+ var s;
+
+ GUI.Audio = {
+
+ /**
+ * List of available sounds.
+ * @type Object
+ */
+ sounds: {
+ 'click': 'audio-click',
+ 'bubble': 'audio-bubble',
+ 'plastic': 'audio-plastic'
+ },
+
+ levels: [0, 0.23, 0.55, 1],
+
+ /**
+ * Sound enabled?
+ * @type Boolean
+ * @default true
+ */
+ enabled: true,
+
+ /**
+ * Dummy player to extract supported codecs etc.
+ * @type Node
+ */
+ dummy: document.getElementById('audio-dummy'),
+
+ /**
+ * Used sound format, depends on the browser. Possible values: 'mp3' and 'ogg'.
+ * @type String
+ * @default 'mp3'
+ */
+ format: 'mp3',
+
+ /**
+ * Plays a sound.
+ * @param what What sound to play. Currently only 'click' is available.
+ */
+ play: function (what) {
+ var volume = GUI.Settings.get('volume');
+ //base = 6*Math.E;
+
+ if (GUI.Settings.get('sound') && GUI.Audio.sounds[what] && GUI.Audio[what] && volume > 0) {
+ //GUI.Audio[what].volume = volume / 3;
+ //GUI.Audio[what].volume = (Math.pow(base, volume*0.33333)-1)/(base-1);
+ GUI.Audio[what].volume = this.levels[volume];
+ GUI.Audio[what].play();
+ }
+ }
+ };
+
+ // determine codec
+ if (GUI.Audio.dummy) {
+ GUI.Audio.format = (typeof GUI.Audio.dummy.canPlayType === "function" && GUI.Audio.dummy.canPlayType("audio/mpeg") !== "") ? 'mp3' : 'ogg';
+
+ // load audio files
+ for (s in GUI.Audio.sounds) {
+ if (GUI.Audio.sounds.hasOwnProperty(s)) {
+ GUI.Audio[s] = document.getElementById(GUI.Audio.sounds[s]);
+ GUI.Audio[s].src = 'audio/' + s + '.' + GUI.Audio.format;
+ }
+ }
+ }
+
+ /**
+ * Browser independent vibrate function.
+ */
+ GUI.Audio.vibrate = (function(){
+ if (navigator.vibrate) {
+ return function (dur) {
+ if (GUI.Settings.get('vibrate')) {
+ return navigator.vibrate(dur);
+ }
+ };
+ }
+
+ if (navigator.mozVibrate) {
+ return function (dur) {
+ if (GUI.Settings.get('vibrate')) {
+ return navigator.mozVibrate(dur);
+ }
+ };
+ }
+
+ if (navigator.webkitVibrate) {
+ return function (dur) {
+ if (GUI.Settings.get('vibrate')) {
+ return navigator.webkitVibrate(dur);
+ }
+ };
+ }
+
+ if (navigator.oVibrate) {
+ return function (dur) {
+ if (GUI.Settings.get('vibrate')) {
+ return navigator.oVibrate(dur);
+ }
+ };
+ }
+
+ if (navigator.msVibrate) {
+ return function (dur) {
+ if (GUI.Settings.get('vibrate')) {
+ return navigator.msVibrate(dur);
+ }
+ };
+ }
+
+ return function (dur) { };
+ }());
+
+}());
diff --git a/Sketchometry.activity/js/cache.js b/Sketchometry.activity/js/cache.js
new file mode 100644
index 0000000..a01a04e
--- /dev/null
+++ b/Sketchometry.activity/js/cache.js
@@ -0,0 +1,61 @@
+/*
+ Copyright 2011 / 2012
+
+ Alfred Wassermann
+ Michael Gerhaeuser,
+ Carsten Miller,
+ Matthias Ehmann,
+ Heiko Vogel,
+
+ This file is part of the JSXGraph GUI project.
+ This code isn't licensed yet.
+*/
+
+(function () {
+ if ($.browser.msie) {
+ // Internet Explorer doesn't really support this stuff. At least not IE <= 9
+ return;
+ }
+
+ var appCache = window.applicationCache;
+
+ if (typeof appCache == 'undefined') {
+ // in case app cache is not supported by the browser we don't need to tell the user.
+ // besides: GUI.Lang.std is not initialized by now, all the alert box would tell us is "undefined".
+ //GUI.alert(GUI.Lang.std.appcache_error);
+ }
+
+ appCache.on = appCache.addEventListener;
+
+ var report = function (ev) {
+
+ console.log('appCacheEvent: ' + ev.type + ' -- ' + new Date().toISOString());
+
+ if (!('progress' === ev.type || 'downloading' === ev.type || 'checking' === ev.type
+ || 'noupdate' === ev.type || 'cached' === ev.type)) {
+
+ if ('updateready' == ev.type) {
+ if (!GUI.release) {
+ GUI.alert('new version available, updating');
+ }
+ window.location.reload();
+ }
+
+ if ('error' === ev.type && !GUI.release) {
+ if (navigator.onLine)
+ GUI.alert('appcache error!');
+ else
+ console.log('appcache error!');
+ }
+ }
+ };
+
+ appCache.on('checking', report, false);
+ appCache.on('error', report, false);
+ appCache.on('noupdate', report, false);
+ appCache.on('downloading', report, false);
+ appCache.on('progress', report, false);
+ appCache.on('updateready', report, false);
+ appCache.on('cached', report, false);
+
+}()); \ No newline at end of file
diff --git a/Sketchometry.activity/js/ext_ecma.js b/Sketchometry.activity/js/ext_ecma.js
new file mode 100644
index 0000000..8f95823
--- /dev/null
+++ b/Sketchometry.activity/js/ext_ecma.js
@@ -0,0 +1,50 @@
+/*
+ Copyright 2011 / 2012
+
+ Matthias Ehmann,
+ Michael Gerhaeuser,
+ Carsten Miller,
+ Heiko Vogel
+ Alfred Wassermann,
+
+ This file is part of the JSXGraph GUI project.
+ This code isn't licensed yet.
+*/
+
+Array.prototype.dist = function (v) {
+ var i, dist = 0;
+ for (i=0; i<this.length; i++)
+ dist += Math.pow((this[i]-v[i]), 2)
+ return Math.sqrt(dist);
+};
+
+String.prototype.trim = function() {
+ return this.replace(/^\s+|\s+$/g, "");
+};
+
+String.prototype.trimTrailZeroes = function() {
+ return this.replace(/(.\d*?)0+$/, "$1").replace(/\.$/, "");
+};
+
+String.prototype.sanitize = function() {
+ return this.replace(/\n/g, " ").replace(/\r/g, "").replace(/\t+/, '').replace(/ +/g, ' ').trim();
+};
+
+String.prototype.cleanTerm = function() {
+ var ret = this.replace(/\n/g, "").replace(/\r/g, "");
+
+ ret = ret.replace(/^ *function *\( *x* *\) *{ *return */, "").replace(/[ ;]*} *$/, "");
+ //ret = ret./*replace(/;/g, "").*/replace(/"/g, "&quot;");
+
+ return ret;
+};
+
+String.prototype.capitalize = function() {
+ return this.replace(/(^|\s)([a-z])/g, function(m, p1, p2) {
+ return p1 + p2.toUpperCase();
+ });
+};
+
+Number.prototype.trimTrailZeroes = function() {
+ return parseFloat(this.toString().trimTrailZeroes());
+}; \ No newline at end of file
diff --git a/Sketchometry.activity/js/ext_jquery.js b/Sketchometry.activity/js/ext_jquery.js
new file mode 100644
index 0000000..c9c5468
--- /dev/null
+++ b/Sketchometry.activity/js/ext_jquery.js
@@ -0,0 +1,90 @@
+/*
+ Copyright 2011 / 2012
+
+ Alfred Wassermann
+ Michael Gerhaeuser,
+ Carsten Miller,
+ Matthias Ehmann,
+ Heiko Vogel,
+
+ This file is part of the JSXGraph GUI project.
+ This code isn't licensed yet.
+*/
+
+(function($) {
+
+ /* Enable the text selection functionality */
+ $.fn.enableSelection = function() {
+ return this.each(function() {
+ $(this).removeAttr('unselectable')
+ .css({
+ '-moz-user-select':'text',
+ '-webkit-user-select':'text',
+ '-khtml-user-select':'text',
+ '-o-user-select':'text',
+ 'user-select':'text'
+ });
+
+ });
+ };
+
+ /* Disable the text selection functionality */
+ $.fn.disableSelection = function() {
+ return this.each(function() {
+ $(this).attr('unselectable', 'on')
+ .css({
+ '-moz-user-select':'none',
+ '-webkit-user-select':'none',
+ '-khtml-user-select':'none',
+ '-o-user-select':'none',
+ 'user-select':'none'
+ });
+
+ });
+ };
+
+ /* Compute the height of an elements margins, borders and paddings */
+ $.fn.mbpHeight = function() {
+ var height = parseInt(this.css('padding-top'));
+ height += parseInt(this.css('padding-bottom'));
+ height += parseInt(this.css('margin-top'));
+ height += parseInt(this.css('margin-bottom'));
+ height += parseInt(this.css('border-top-width'));
+ height += parseInt(this.css('border-bottom-width'));
+ return height;
+ };
+
+ /* Compute the width of an elements margins, borders and paddings */
+ $.fn.mbpWidth = function() {
+ var width = parseInt(this.css('padding-left'));
+ width += parseInt(this.css('padding-right'));
+ width += parseInt(this.css('margin-left'));
+ width += parseInt(this.css('margin-right'));
+ width += parseInt(this.css('border-left-width'));
+ width += parseInt(this.css('border-right-width'));
+ return width;
+ };
+
+ /* Compute the outer height of an element including its margins, paddings and borders */
+ $.fn.outerHeight = function() {
+ return parseInt(this.css('height')) + this.mbpHeight();
+ };
+
+ /* Compute the outer width of an element including its margins, paddings and borders */
+ $.fn.outerWidth = function() {
+ return parseInt(this.css('width')) + this.mbpWidth();
+ };
+
+ /*function scrollbarWidth() {
+ var div = $('<div style="width:50px;height:50px;overflow:hidden;position:absolute;top:-200px;left:-200px;"><div style="height:100px;"></div>');
+ // Append our div, do our calculation and then remove it
+ $('body').append(div);
+ var w1 = $('div', div).innerWidth();
+ div.css('overflow-y', 'scroll');
+ var w2 = $('div', div).innerWidth();
+ $(div).remove();
+ return (w1 - w2);
+ }
+ */
+
+})(jQuery); \ No newline at end of file
diff --git a/Sketchometry.activity/js/gui.js b/Sketchometry.activity/js/gui.js
new file mode 100644
index 0000000..6b7ddae
--- /dev/null
+++ b/Sketchometry.activity/js/gui.js
@@ -0,0 +1,115 @@
+JXG.Options = JXG.merge(JXG.Options, {
+
+ device: 'tablet',
+
+ opacityLevel: 0.5,
+
+ sensitive_area: 20,
+
+ lastRegPolCorners: 4,
+
+ lastSliderStart: 0,
+ lastSliderEnd: 2,
+ lastSliderIni: 1,
+
+ angle: {
+ fillColor: '#ddd',
+ strokeColor: '#000',
+ orthotype: 'sectordot'
+ },
+
+ axis: {
+ ticks: {
+ strokeColor: '#666666',
+ strokeOpacity: 0.4,
+ label: {
+ fontSize: 14,
+ display: 'internal'
+ }
+ },
+ label: {
+ position: 'urt',
+ offset: [-15, 30],
+ display: 'internal'
+ }
+ },
+
+ glider : {
+ fillColor: '#ff0',
+ strokeColor: '#000'
+ },
+
+ intersection: {
+ fillColor: '#fff'
+ },
+
+ point: {
+ size: 4,
+ fillColor: '#c00',
+ strokeColor: '#000',
+
+ // snap on majorTicks
+
+ snapX: -1,
+ snapY: -1
+ },
+
+ polygon: {
+ fillColor: '#ffff00',
+ highlightFillColor: '#ffff00',
+ hasInnerPoints: false
+ },
+
+ precision: {
+ touchMax: Infinity
+ },
+
+ segment: {
+ label: {
+ position: 'bot',
+ offsets: [0,-12]
+ }
+ },
+
+ tapemeasure: {
+ point1: {
+ snapToPoints: true,
+ attractorUnit: 'screen',
+ attractorDistance: 20
+ },
+ point2: {
+ snapToPoints: true,
+ attractorUnit: 'screen',
+ attractorDistance: 20
+ }
+ },
+
+ text: {
+ fontSize: 18
+ },
+
+ trunclen: 2
+
+/*
+ line: {
+ strokeColor: '#f00' // can't see red lines anymore for NOW ...
+ },
+
+ slider: {
+ point1: { needsRegularUpdate: true },
+ point2: { needsRegularUpdate: true },
+ baseline: { needsRegularUpdate: true },
+ highline: { needsRegularUpdate: true },
+ ticks: { needsRegularUpdate: true }
+ },
+
+ renderer: 'canvas'
+*/
+});
+
+if (JXG.isAndroid() || JXG.isApple()) {
+ JXG.Options.curve.RDPsmoothing = false;
+ JXG.Options.curve.numberPointsHigh = 600;
+ JXG.Options.curve.numberPointsLow = 100;
+ JXG.Options.curve.doAdvancedPlot = true;
+}
diff --git a/Sketchometry.activity/js/jsxgraph.js b/Sketchometry.activity/js/jsxgraph.js
new file mode 100644
index 0000000..bcec8cd
--- /dev/null
+++ b/Sketchometry.activity/js/jsxgraph.js
@@ -0,0 +1,16 @@
+(function(){var requirejs,require,define;(function(t){function e(t,e){return g.call(t,e)}function i(t,e){var i,r,s,o,n,a,h,l,c,d,u=e&&e.split("/"),p=m.map,f=p&&p["*"]||{};if(t&&"."===t.charAt(0))if(e){for(u=u.slice(0,u.length-1),t=u.concat(t.split("/")),l=0;t.length>l;l+=1)if(d=t[l],"."===d)t.splice(l,1),l-=1;else if(".."===d){if(1===l&&(".."===t[2]||".."===t[0]))break;l>0&&(t.splice(l-1,2),l-=2)}t=t.join("/")}else 0===t.indexOf("./")&&(t=t.substring(2));if((u||f)&&p){for(i=t.split("/"),l=i.length;l>0;l-=1){if(r=i.slice(0,l).join("/"),u)for(c=u.length;c>0;c-=1)if(s=p[u.slice(0,c).join("/")],s&&(s=s[r])){o=s,n=l;break}if(o)break;!a&&f&&f[r]&&(a=f[r],h=l)}!o&&a&&(o=a,n=h),o&&(i.splice(0,n,o),t=i.join("/"))}return t}function r(e,i){return function(){return c.apply(t,v.call(arguments,0).concat([e,i]))}}function s(t){return function(e){return i(e,t)}}function o(t){return function(e){p[t]=e}}function n(i){if(e(f,i)){var r=f[i];delete f[i],b[i]=!0,l.apply(t,r)}if(!e(p,i)&&!e(b,i))throw Error("No "+i);return p[i]}function a(t){var e,i=t?t.indexOf("!"):-1;return i>-1&&(e=t.substring(0,i),t=t.substring(i+1,t.length)),[e,t]}function h(t){return function(){return m&&m.config&&m.config[t]||{}}}var l,c,d,u,p={},f={},m={},b={},g=Object.prototype.hasOwnProperty,v=[].slice;d=function(t,e){var r,o=a(t),h=o[0];return t=o[1],h&&(h=i(h,e),r=n(h)),h?t=r&&r.normalize?r.normalize(t,s(e)):i(t,e):(t=i(t,e),o=a(t),h=o[0],t=o[1],h&&(r=n(h))),{f:h?h+"!"+t:t,n:t,pr:h,p:r}},u={require:function(t){return r(t)},exports:function(t){var e=p[t];return e!==void 0?e:p[t]={}},module:function(t){return{id:t,uri:"",exports:p[t],config:h(t)}}},l=function(i,s,a,h){var l,c,m,g,v,C,y=[];if(h=h||i,"function"==typeof a){for(s=!s.length&&a.length?["require","exports","module"]:s,v=0;s.length>v;v+=1)if(g=d(s[v],h),c=g.f,"require"===c)y[v]=u.require(i);else if("exports"===c)y[v]=u.exports(i),C=!0;else if("module"===c)l=y[v]=u.module(i);else if(e(p,c)||e(f,c)||e(b,c))y[v]=n(c);else{if(!g.p)throw Error(i+" missing "+c);g.p.load(g.n,r(h,!0),o(c),{}),y[v]=p[c]}m=a.apply(p[i],y),i&&(l&&l.exports!==t&&l.exports!==p[i]?p[i]=l.exports:m===t&&C||(p[i]=m))}else i&&(p[i]=a)},requirejs=require=c=function(e,i,r,s,o){return"string"==typeof e?u[e]?u[e](i):n(d(e,i).f):(e.splice||(m=e,i.splice?(e=i,i=r,r=null):e=t),i=i||function(){},"function"==typeof r&&(r=s,s=o),s?l(t,e,i,r):setTimeout(function(){l(t,e,i,r)},4),c)},c.config=function(t){return m=t,m.deps&&c(m.deps,m.callback),c},define=function(t,i,r){i.splice||(r=i,i=[]),e(p,t)||e(f,t)||(f[t]=[t,i,r])},define.amd={jQuery:!0}})(),define("../node_modules/almond/almond",function(){}),define("jxg",[],function(){var t={};return"object"!=typeof JXG||JXG.extend||(t=JXG),t.extend=function(t,e,i,r){var s,o;i=i||!1,r=r||!1;for(s in e)(!i||i&&e.hasOwnProperty(s))&&(o=r?s.toLowerCase():s,t[o]=e[s])},t.extend(t,{boards:{},readers:{},elements:{},registerElement:function(t,e){t=t.toLowerCase(),this.elements[t]=e},registerReader:function(t,e){var i,r;for(i=0;e.length>i;i++)r=e[i].toLowerCase(),"function"!=typeof this.readers[r]&&(this.readers[r]=t)},shortcut:function(t,e){return function(){return t[e].apply(this,arguments)}},getRef:function(t,e){return t.select(e)},getReference:function(t,e){return t.select(e)},debugInt:function(){var t,e;for(t=0;arguments.length>t;t++)e=arguments[t],"object"==typeof window&&window.console&&console.log?console.log(e):"object"==typeof document&&document.getElementById("debug")&&(document.getElementById("debug").innerHTML+=e+"<br/>")},debugWST:function(){var e=Error();t.debugInt.apply(this,arguments),e&&e.stack&&(t.debugInt("stacktrace"),t.debugInt(e.stack.split("\n").slice(1).join("\n")))},debugLine:function(){var e=Error();t.debugInt.apply(this,arguments),e&&e.stack&&t.debugInt("Called from",e.stack.split("\n").slice(2,3).join("\n"))},debug:function(){t.debugInt.apply(this,arguments)}}),t}),define("base/constants",["jxg"],function(t){var e;return e={version:"0.98.0-dev",licenseText:"JSXGraph v0.98.0-dev Copyright (C) see http://jsxgraph.org",COORDS_BY_USER:1,COORDS_BY_SCREEN:2,OBJECT_TYPE_ARC:1,OBJECT_TYPE_ARROW:2,OBJECT_TYPE_AXIS:3,OBJECT_TYPE_AXISPOINT:4,OBJECT_TYPE_TICKS:5,OBJECT_TYPE_CIRCLE:6,OBJECT_TYPE_CONIC:7,OBJECT_TYPE_CURVE:8,OBJECT_TYPE_GLIDER:9,OBJECT_TYPE_IMAGE:10,OBJECT_TYPE_LINE:11,OBJECT_TYPE_POINT:12,OBJECT_TYPE_SLIDER:13,OBJECT_TYPE_CAS:14,OBJECT_TYPE_GXTCAS:15,OBJECT_TYPE_POLYGON:16,OBJECT_TYPE_SECTOR:17,OBJECT_TYPE_TEXT:18,OBJECT_TYPE_ANGLE:19,OBJECT_TYPE_INTERSECTION:20,OBJECT_TYPE_TURTLE:21,OBJECT_TYPE_VECTOR:22,OBJECT_TYPE_OPROJECT:23,OBJECT_TYPE_GRID:24,OBJECT_TYPE_TANGENT:25,OBJECT_CLASS_POINT:1,OBJECT_CLASS_LINE:2,OBJECT_CLASS_CIRCLE:3,OBJECT_CLASS_CURVE:4,OBJECT_CLASS_AREA:5,OBJECT_CLASS_OTHER:6,GENTYPE_ABC:1,GENTYPE_AXIS:2,GENTYPE_MID:3,GENTYPE_REFLECTION:4,GENTYPE_MIRRORPOINT:5,GENTYPE_TANGENT:6,GENTYPE_PARALLEL:7,GENTYPE_BISECTORLINES:8,GENTYPE_BOARDIMG:9,GENTYPE_BISECTOR:10,GENTYPE_NORMAL:11,GENTYPE_POINT:12,GENTYPE_GLIDER:13,GENTYPE_INTERSECTION:14,GENTYPE_CIRCLE:15,GENTYPE_CIRCLE2POINTS:16,GENTYPE_LINE:17,GENTYPE_TRIANGLE:18,GENTYPE_QUADRILATERAL:19,GENTYPE_TEXT:20,GENTYPE_POLYGON:21,GENTYPE_REGULARPOLYGON:22,GENTYPE_SECTOR:23,GENTYPE_ANGLE:24,GENTYPE_PLOT:25,GENTYPE_SLIDER:26,GENTYPE_TRUNCATE:27,GENTYPE_JCODE:28,GENTYPE_MOVEMENT:29,GENTYPE_COMBINED:30,GENTYPE_RULER:31,GENTYPE_SLOPETRIANGLE:32,GENTYPE_PERPSEGMENT:33,GENTYPE_DELETE:41,GENTYPE_COPY:42,GENTYPE_MIRROR:43,GENTYPE_ROTATE:44,GENTYPE_ABLATION:45,GENTYPE_MIGRATE:46,GENTYPE_CTX_TYPE_G:51,GENTYPE_CTX_TYPE_P:52,GENTYPE_CTX_TRACE:53,GENTYPE_CTX_VISIBILITY:54,GENTYPE_CTX_CCVISIBILITY:55,GENTYPE_CTX_MPVISIBILITY:56,GENTYPE_CTX_WITHLABEL:57,GENTYPE_CTX_LABEL:58,GENTYPE_CTX_FIXED:59,GENTYPE_CTX_STROKEWIDTH:60,GENTYPE_CTX_LABELSIZE:61,GENTYPE_CTX_SIZE:62,GENTYPE_CTX_FACE:63,GENTYPE_CTX_STRAIGHT:64,GENTYPE_CTX_ARROW:65,GENTYPE_CTX_COLOR:66,GENTYPE_CTX_RADIUS:67,GENTYPE_CTX_COORDS:68,GENTYPE_CTX_TEXT:69,GENTYPE_CTX_ANGLERADIUS:70,GENTYPE_CTX_DOTVISIBILITY:71,GENTYPE_CTX_FILLOPACITY:72,GENTYPE_CTX_PLOT:73,GENTYPE_CTX_SCALE:74,GENTYPE_CTX_INTVAL:75,GENTYPE_CTX_POINT1:76,GENTYPE_CTX_POINT2:77,GENTYPE_CTX_LABELSTICKY:78},t.extend(t,e),e}),define("utils/type",["jxg","base/constants"],function(t,e){return t.extend(t,{isId:function(t,e){return"string"==typeof e&&!!t.objects[e]},isName:function(t,e){return"string"==typeof e&&!!t.elementsByName[e]},isGroup:function(t,e){return"string"==typeof e&&!!t.groups[e]},isString:function(t){return"string"==typeof t},isNumber:function(t){return"number"==typeof t},isFunction:function(t){return"function"==typeof t},isArray:function(t){var e;return e=Array.isArray?Array.isArray(t):null!==t&&"object"==typeof t&&"function"==typeof t.splice&&"function"==typeof t.join},isObject:function(e){return"object"==typeof e&&!t.isArray(e)},isPoint:function(t){return"object"==typeof t?t.elementClass===e.OBJECT_CLASS_POINT:!1},exists:function(t){return function(e){return!(e===t||null===e)}}(),def:function(e,i){return t.exists(e)?e:i},str2Bool:function(e){return t.exists(e)?"boolean"==typeof e?e:t.isString(e)?"true"===e.toLowerCase():!1:!0},createEvalFunction:function(e,i,r){var s,o=[];for(s=0;r>s;s++)o[s]=t.createFunction(i[s],e,"",!0);return function(t){return o[t]()}},createFunction:function(e,i,r,s){var o=null;return t.exists(s)&&!s||!t.isString(e)?t.isFunction(e)?o=e:t.isNumber(e)?o=function(){return e}:t.isString(e)&&(o=function(){return e}):o=i.jc.snippet(e,!0,r,!0),null!==o&&(o.origin=e),o},bind:function(t,e){return function(){return t.apply(e,arguments)}},evaluate:function(e){return t.isFunction(e)?e():e},indexOf:function(e,i,r){var s,o=t.exists(r);if(Array.indexOf&&!o)return e.indexOf(i);for(s=0;e.length>s;s++)if(o&&e[s][r]===i||!o&&e[s]===i)return s;return-1},eliminateDuplicates:function(t){var e,i=t.length,r=[],s={};for(e=0;i>e;e++)s[t[e]]=0;for(e in s)s.hasOwnProperty(e)&&r.push(e);return r},swap:function(t,e,i){var r;return r=t[e],t[e]=t[i],t[i]=r,t},uniqueArray:function(e){var i,r,s,o=[];if(0===e.length)return[];for(i=0;e.length>i;i++)for(s=t.isArray(e[i]),r=i+1;e.length>r;r++)s&&t.cmpArrays(e[i],e[r])?e[i]=[]:s||e[i]!==e[r]||(e[i]="");for(r=0,i=0;e.length>i;i++)s=t.isArray(e[i]),s||""===e[i]?s&&0!==e[i].length&&(o[r]=e[i].slice(0),r+=1):(o[r]=e[i],r+=1);return e=o,o},isInArray:function(e,i){return t.indexOf(e,i)>-1},coordsArrayToMatrix:function(t,e){var i,r=[],s=[];for(i=0;t.length>i;i++)e?(r.push(t[i].usrCoords[1]),s.push(t[i].usrCoords[2])):s.push([t[i].usrCoords[1],t[i].usrCoords[2]]);return e&&(s=[r,s]),s},cmpArrays:function(t,e){var i;if(t===e)return!0;if(t.length!==e.length)return!1;for(i=0;t.length>i;i++)if(t[i]!==e[i])return!1;return!0},removeElementFromArray:function(t,e){var i;for(i=0;t.length>i;i++)if(t[i]===e)return t.splice(i,1),t;return t},trunc:function(e,i){return i=t.def(i,0),0===i?(e=~e,e=~e):e=e.toFixed(i),e},autoDigits:function(t){var e=Math.abs(t);return e=e>.1?t.toFixed(2):e>=.01?t.toFixed(4):e>=1e-4?t.toFixed(6):t},keys:function(t,e){var i,r=[];for(i in t)e?t.hasOwnProperty(i)&&r.push(i):r.push(i);return r},clone:function(t){var e={};return e.prototype=t,e},cloneAndCopy:function(t,e){var i,r=function(){};r.prototype=t;for(i in e)r[i]=e[i];return r},merge:function(t,e){var i,r;for(i in e)if(e.hasOwnProperty(i))if(this.isArray(e[i]))for(t[i]||(t[i]=[]),r=0;e[i].length>r;r++)t[i][r]="object"==typeof e[i][r]?this.merge(t[i][r],e[i][r]):e[i][r];else"object"==typeof e[i]?(t[i]||(t[i]={}),t[i]=this.merge(t[i],e[i])):t[i]=e[i];return t},deepCopy:function(e,i,r){var s,o,n,a;if(r=r||!1,"object"!=typeof e||null===e)return e;if(this.isArray(e))for(s=[],o=0;e.length>o;o++)n=e[o],s[o]="object"==typeof n?this.deepCopy(n):n;else{s={};for(o in e)a=r?o.toLowerCase():o,n=e[o],s[a]="object"==typeof n?this.deepCopy(n):n;for(o in i)a=r?o.toLowerCase():o,n=i[o],s[a]="object"==typeof n?t.isArray(n)||!t.exists(s[a])?this.deepCopy(n):this.deepCopy(s[a],n,r):n}return s},copyAttributes:function(e,i,r){var s,o,n,a,h,l={circle:1,curve:1,image:1,line:1,point:1,polygon:1,text:1,ticks:1,integral:1};for(n=arguments.length,s=3>n||l[r]?t.deepCopy(i.elements,null,!0):{},4>n&&this.exists(r)&&this.exists(i.layer[r])&&(s.layer=i.layer[r]),a=i,h=!0,o=2;n>o;o++){if(!t.exists(a[arguments[o]])){h=!1;break}a=a[arguments[o]]}for(h&&(s=t.deepCopy(s,a,!0)),a=e,h=!0,o=3;n>o;o++){if(!t.exists(a[arguments[o]])){h=!1;break}a=a[arguments[o]]}for(h&&this.extend(s,a,null,!0),a=i,h=!0,o=2;n>o;o++){if(!t.exists(a[arguments[o]])){h=!1;break}a=a[arguments[o]]}return h&&t.exists(a.label)&&(s.label=t.deepCopy(a.label,s.label)),s.label=t.deepCopy(i.label,s.label),s},toJSON:function(e,i){var r,s,o,n,a;if(i=t.def(i,!1),JSON.stringify&&!i)try{return n=JSON.stringify(e)}catch(h){}switch(typeof e){case"object":if(e){if(r=[],t.isArray(e)){for(o=0;e.length>o;o++)r.push(t.toJSON(e[o],i));return"["+r.join(",")+"]"}for(s in e)if(e.hasOwnProperty(s)){try{a=t.toJSON(e[s],i)}catch(l){a=""}i?r.push(s+":"+a):r.push('"'+s+'":'+a)}return"{"+r.join(",")+"} "}return"null";case"string":return"'"+e.replace(/(["'])/g,"\\$1")+"'";case"number":case"boolean":return""+e}return"0"},clearVisPropOld:function(t){return t.visPropOld={strokecolor:"",strokeopacity:"",strokewidth:"",fillcolor:"",fillopacity:"",shadow:!1,firstarrow:!1,lastarrow:!1,cssclass:"",fontsize:-1,left:-1e5,right:1e5,top:-1e5},t},isInObject:function(t,e){var i;for(i in t)if(t.hasOwnProperty(i)&&t[i]===e)return!0;return!1},escapeHTML:function(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")},unescapeHTML:function(t){return t.replace(/<\/?[^>]+>/gi,"").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">")},capitalize:function(t){return t.charAt(0).toUpperCase()+t.substring(1).toLowerCase()},trimNumber:function(t){return t=t.replace(/^0+/,""),t=t.replace(/0+$/,""),("."===t[t.length-1]||","===t[t.length-1])&&(t=t.slice(0,-1)),("."===t[0]||","===t[0])&&(t="0"+t),t},filterElements:function(t,e){var i,r,s,o,n,a,h,l=t.length,c=[];if("function"!=typeof e&&"object"!=typeof e)return c;for(i=0;l>i;i++){if(h=!0,s=t[i],"object"==typeof e){for(r in e)if(e.hasOwnProperty(r)&&(o=r.toLowerCase(),n="function"==typeof s[r]?s[r]():s[r],a=s.visProp&&"function"==typeof s.visProp[o]?s.visProp[o]():s.visProp&&s.visProp[o],h="function"==typeof e[r]?e[r](n)||e[r](a):n===e[r]||a===e[r],!h))break}else"function"==typeof e&&(h=e(s));h&&c.push(s)}return c},trim:function(t){return t=t.replace(/^\s+/,""),t=t.replace(/\s+$/,"")},sanitizeHTML:function(t,e){return"function"==typeof html_sanitize&&e?html_sanitize(t,function(){},function(t){return t}):(t&&(t=t.replace(/</g,"&lt;").replace(/>/g,"&gt;")),t)},evalSlider:function(t){return t.type===e.OBJECT_TYPE_GLIDER&&"function"==typeof t.Value&&(t=t.Value()),t}}),t}),define("utils/env",["jxg","utils/type"],function(t,e){return t.extend(t,{touchProperty:"touches",isBrowser:"object"==typeof window&&"object"==typeof document,supportsVML:function(){return this.isBrowser&&!!document.namespaces},supportsSVG:function(){return this.isBrowser&&document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")},supportsCanvas:function(){var t,e=!1;if(this.isNode())try{t="object"==typeof module?module.require("canvas"):require("canvas"),e=!0}catch(i){}return e||this.isBrowser&&!!document.createElement("canvas").getContext},isNode:function(){return!this.isBrowser&&("object"==typeof module&&!!module.exports||"object"==typeof global&&global.requirejsVars&&!global.requirejsVars.isBrowser)},isWebWorker:function(){return!this.isBrowser&&"object"==typeof self&&"function"==typeof self.postMessage},supportsPointerEvents:function(){return t.isBrowser&&window.navigator&&(window.navigator.msPointerEnabled||window.navigator.pointerEnabled)},isTouchDevice:function(){return this.isBrowser&&document.documentElement.hasOwnProperty("ontouchstart")},isAndroid:function(){return e.exists(navigator)&&navigator.userAgent.toLowerCase().indexOf("android")>-1},isWebkitAndroid:function(){return this.isAndroid()&&navigator.userAgent.indexOf(" AppleWebKit/")>-1},isApple:function(){return e.exists(navigator)&&(navigator.userAgent.indexOf("iPad")>-1||navigator.userAgent.indexOf("iPhone")>-1)},isWebkitApple:function(){return this.isApple()&&navigator.userAgent.search(/Mobile\/[0-9A-Za-z\.]*Safari/)>-1},isMozilla:function(){return e.exists(navigator)&&navigator.userAgent.toLowerCase().indexOf("mozilla")>-1&&-1===navigator.userAgent.toLowerCase().indexOf("apple")},isMetroApp:function(){return"object"==typeof window&&window.clientInformation&&window.clientInformation.appName&&window.clientInformation.appName.indexOf("MSAppHost")>-1},ieVersion:function(){var t,e,i,r=3;if("object"!=typeof document)return 0;e=document.createElement("div"),i=e.getElementsByTagName("i");do e.innerHTML="<!--[if gt IE "+ ++r+"]><"+"i><"+"/i><![endif]-->";while(i[0]);return r>4?r:t}(),getDimensions:function(i){var r,s,o,n,a,h,l,c;if(!t.isBrowser||null===i)return{width:500,height:500};if(r=document.getElementById(i),!e.exists(r))throw Error("\nJSXGraph: HTML container element '"+i+"' not found.");return s=r.style.display,"none"!==s&&null!==s?{width:r.offsetWidth,height:r.offsetHeight}:(o=r.style,n=o.visibility,a=o.position,h=o.display,o.visibility="hidden",o.position="absolute",o.display="block",l=r.clientWidth,c=r.clientHeight,o.display=h,o.position=a,o.visibility=n,{width:l,height:c})},addEvent:function(t,i,r,s){var o=function(){return r.apply(s,arguments)};o.origin=r,s["x_internal"+i]=s["x_internal"+i]||[],s["x_internal"+i].push(o),e.exists(t)&&e.exists(t.addEventListener)&&t.addEventListener(i,o,!1),e.exists(t)&&e.exists(t.attachEvent)&&t.attachEvent("on"+i,o)},removeEvent:function(i,r,s,o){var n;if(!e.exists(o))return t.debug("no such owner"),void 0;if(!e.exists(o["x_internal"+r]))return t.debug("no such type: "+r),void 0;if(!e.isArray(o["x_internal"+r]))return t.debug("owner[x_internal + "+r+"] is not an array"),void 0;if(n=e.indexOf(o["x_internal"+r],s,"origin"),-1===n)return t.debug("no such event function in internal list: "+s),void 0;try{e.exists(i)&&e.exists(i.removeEventListener)&&i.removeEventListener(r,o["x_internal"+r][n],!1),e.exists(i)&&e.exists(i.detachEvent)&&i.detachEvent("on"+r,o["x_internal"+r][n])}catch(a){t.debug("event not registered in browser: ("+r+" -- "+s+")")}o["x_internal"+r].splice(n,1)},removeAllEvents:function(e,i,r){var s,o;if(r["x_internal"+i]){for(o=r["x_internal"+i].length,s=o-1;s>=0;s--)t.removeEvent(e,i,r["x_internal"+i][s].origin,r);r["x_internal"+i].length>0&&t.debug("removeAllEvents: Not all events could be removed.")}},getPosition:function(i,r){var s,o,n,a=0,h=0;if(i||(i=window.event),n=i[t.touchProperty],e.exists(r))if(-1===r){for(o=n.length,s=0;o>s;s++)if(n[s]){i=n[s];break}}else i=n[r];return i.pageX||i.pageY?(a=i.pageX,h=i.pageY):(i.clientX||i.clientY)&&(a=i.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,h=i.clientY+document.body.scrollTop+document.documentElement.scrollTop),[a,h]},getOffset:function(t){var e,i=t,r=t,s=i.offsetLeft-i.scrollLeft,o=i.offsetTop-i.scrollTop;for(e=this.getCSSTransform([s,o],i),s=e[0],o=e[1],i=i.offsetParent;i;){for(s+=i.offsetLeft,o+=i.offsetTop,i.offsetParent&&(s+=i.clientLeft-i.scrollLeft,o+=i.clientTop-i.scrollTop),e=this.getCSSTransform([s,o],i),s=e[0],o=e[1],r=r.parentNode;r!==i;)s+=r.clientLeft-r.scrollLeft,o+=r.clientTop-r.scrollTop,e=this.getCSSTransform([s,o],r),s=e[0],o=e[1],r=r.parentNode;i=i.offsetParent}return[s,o]},getStyle:function(e,i){var r;return window.getComputedStyle?r=document.defaultView.getComputedStyle(e,null).getPropertyValue(i):e.currentStyle&&t.ieVersion>=9?r=e.currentStyle[i]:e.style&&(i=i.replace(/-([a-z]|[0-9])/gi,function(t,e){return e.toUpperCase()}),r=e.style[i]),r},getCSSTransform:function(t,i){var r,s,o,n,a,h,l,c,d=["transform","webkitTransform","MozTransform","msTransform","oTransform"];for(h=d.length,r=0,o="";h>r;r++)if(e.exists(i.style[d[r]])){o=i.style[d[r]];break}if(""!==o&&(a=o.indexOf("("),a>0)){for(h=o.length,n=o.substring(a+1,h-1),c=n.split(","),s=0,l=c.length;l>s;s++)c[s]=parseFloat(c[s]);0===o.indexOf("matrix")?(t[0]+=c[4],t[1]+=c[5]):0===o.indexOf("translateX")?t[0]+=c[0]:0===o.indexOf("translateY")?t[1]+=c[0]:0===o.indexOf("translate")&&(t[0]+=c[0],t[1]+=c[1])}return t},getCSSTransformMatrix:function(t){var i,r,s,o,n,a,h,l,c=["transform","webkitTransform","MozTransform","msTransform","oTransform"],d=[[1,0,0],[0,1,0],[0,0,1]];for(a=c.length,i=0,s="";a>i;i++)if(e.exists(t.style[c[i]])){s=t.style[c[i]];break}if(""!==s&&(n=s.indexOf("("),n>0)){for(a=s.length,o=s.substring(n+1,a-1),l=o.split(","),r=0,h=l.length;h>r;r++)l[r]=parseFloat(l[r]);0===s.indexOf("matrix")?d=[[1,0,0],[0,l[0],l[1]],[0,l[2],l[3]]]:0===s.indexOf("scaleX")?d[1][1]=l[0]:0===s.indexOf("scaleY")?d[2][2]=l[0]:0===s.indexOf("scale")&&(d[1][1]=l[0],d[2][2]=l[1])}return d},timedChunk:function(t,e,i,r){var s=t.concat(),o=function(){var n=+new Date;do e.call(i,s.shift());while(s.length>0&&300>+new Date-n);s.length>0?window.setTimeout(o,1):r(t)};window.setTimeout(o,1)}}),t}),define("utils/xml",["jxg","utils/type"],function(t,e){return t.XML={cleanWhitespace:function(t){for(var i=t.firstChild;e.exists(i);)3!==i.nodeType||/\S/.test(i.nodeValue)?1===i.nodeType&&this.cleanWhitespace(i):t.removeChild(i),i=i.nextSibling},parse:function(t){var e,i,r;return r="function"==typeof DOMParser||"object"==typeof DOMParser?DOMParser:function(){this.parseFromString=function(t){var e;return"function"==typeof ActiveXObject&&(e=new ActiveXObject("MSXML.DomDocument"),e.loadXML(t)),e}},e=new r,i=e.parseFromString(t,"text/xml"),this.cleanWhitespace(i),i}},t.XML}),define("utils/event",["jxg","utils/type"],function(t,e){return t.EventEmitter={eventHandlers:{},suspended:{},trigger:function(t,e){var i,r,s,o,n,a;for(n=t.length,r=0;n>r;r++)if(o=this.eventHandlers[t[r]],!this.suspended[t[r]]){if(this.suspended[t[r]]=!0,o)for(a=o.length,i=0;a>i;i++)s=o[i],s.handler.apply(s.context,e);this.suspended[t[r]]=!1}return this},on:function(t,i,r){return e.isArray(this.eventHandlers[t])||(this.eventHandlers[t]=[]),r=e.def(r,this),this.eventHandlers[t].push({handler:i,context:r}),this},off:function(t,i){var r;return t&&e.isArray(this.eventHandlers[t])?(i?(r=e.indexOf(this.eventHandlers[t],i,"handler"),r>-1&&this.eventHandlers[t].splice(r,1),0===this.eventHandlers[t].length&&delete this.eventHandlers[t]):delete this.eventHandlers[t],this):this},eventify:function(t){t.eventHandlers={},t.on=this.on,t.off=this.off,t.triggerEventHandlers=this.trigger,t.trigger=this.trigger,t.suspended={}}},t.EventEmitter}),define("math/math",["jxg"],function(t){var e,i=function(t){var i,r;return t.memo?t.memo:(i={},r=Array.prototype.join,t.memo=function(){var s=r.call(arguments);return i[s]!==e?i[s]:i[s]=t.apply(this,arguments)},t.memo)};return t.Math={eps:1e-6,mod:function(t,e){return t-Math.floor(t/e)*e},vector:function(t,e){var i,r;for(e=e||0,i=[],r=0;t>r;r++)i[r]=e;return i},matrix:function(t,e,i){var r,s,o;for(i=i||0,e=e||t,r=[],s=0;t>s;s++)for(r[s]=[],o=0;e>o;o++)r[s][o]=i;return r},identity:function(t,i){var r,s;for(i===e&&"number"!=typeof i&&(i=t),r=this.matrix(t,i),s=0;Math.min(t,i)>s;s++)r[s][s]=1;return r},frustum:function(t,e,i,r,s,o){var n=this.matrix(4,4);return n[0][0]=2*s/(e-t),n[0][1]=0,n[0][2]=(e+t)/(e-t),n[0][3]=0,n[1][0]=0,n[1][1]=2*s/(r-i),n[1][2]=(r+i)/(r-i),n[1][3]=0,n[2][0]=0,n[2][1]=0,n[2][2]=-(o+s)/(o-s),n[2][3]=-(2*o*s)/(o-s),n[3][0]=0,n[3][1]=0,n[3][2]=-1,n[3][3]=0,n},projection:function(t,e,i,r){var s=i*Math.tan(t/2),o=s*e;return this.frustum(-o,o,-s,s,i,r)},matVecMult:function(t,e){var i,r,s,o=t.length,n=e.length,a=[];if(3===n)for(i=0;o>i;i++)a[i]=t[i][0]*e[0]+t[i][1]*e[1]+t[i][2]*e[2];else for(i=0;o>i;i++){for(r=0,s=0;n>s;s++)r+=t[i][s]*e[s];a[i]=r}return a},matMatMult:function(t,e){var i,r,s,o,n=t.length,a=n>0?e[0].length:0,h=e.length,l=this.matrix(n,a);for(i=0;n>i;i++)for(r=0;a>r;r++){for(s=0,o=0;h>o;o++)s+=t[i][o]*e[o][r];l[i][r]=s}return l},transpose:function(t){var e,i,r,s,o;for(s=t.length,o=t.length>0?t[0].length:0,e=this.matrix(o,s),i=0;o>i;i++)for(r=0;s>r;r++)e[i][r]=t[r][i];return e},inverse:function(t){var e,i,r,s,o,n,a,h=t.length,l=[],c=[],d=[];for(e=0;h>e;e++){for(l[e]=[],i=0;h>i;i++)l[e][i]=t[e][i];c[e]=e}for(i=0;h>i;i++){for(o=Math.abs(l[i][i]),n=i,e=i+1;h>e;e++)Math.abs(l[e][i])>o&&(o=Math.abs(l[e][i]),n=e);if(this.eps>=o)return[];if(n>i){for(r=0;h>r;r++)a=l[i][r],l[i][r]=l[n][r],l[n][r]=a;a=c[i],c[i]=c[n],c[n]=a}for(s=1/l[i][i],e=0;h>e;e++)l[e][i]*=s;for(l[i][i]=s,r=0;h>r;r++)if(r!==i){for(e=0;h>e;e++)e!==i&&(l[e][r]-=l[e][i]*l[i][r]);l[i][r]=-s*l[i][r]}}for(e=0;h>e;e++){for(r=0;h>r;r++)d[c[r]]=l[e][r];for(r=0;h>r;r++)l[e][r]=d[r]}return l},innerProduct:function(t,i,r){var s,o=0;for((r===e||"number"!=typeof r)&&(r=t.length),s=0;r>s;s++)o+=t[s]*i[s];return o},crossProduct:function(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]},factorial:i(function(t){return 0>t?0/0:(t=Math.floor(t),0===t||1===t?1:t*this.factorial(t-1))}),binomial:i(function(t,e){var i,r;if(e>t||0>e)return 0/0;if(e=Math.round(e),t=Math.round(t),0===e||e===t)return 1;for(i=1,r=0;e>r;r++)i*=t-r,i/=r+1;return i}),cosh:function(t){return.5*(Math.exp(t)+Math.exp(-t))},sinh:function(t){return.5*(Math.exp(t)-Math.exp(-t))},pow:function(t,e){return 0===t?0===e?1:0:Math.floor(e)===e?Math.pow(t,e):t>0?Math.exp(e*Math.log(Math.abs(t))):0/0},squampow:function(t,e){var i;if(Math.floor(e)===e){for(i=1,0>e&&(t=1/t,e*=-1);0!==e;)1&e&&(i*=t),e>>=1,t*=t;return i}return this.pow(t,e)},normalize:function(t){var e,i,r=2*t[3],s=t[4]/r;return t[5]=s,t[6]=-t[1]/r,t[7]=-t[2]/r,1/0===s||isNaN(s)?(e=Math.sqrt(t[1]*t[1]+t[2]*t[2]),t[0]/=e,t[1]/=e,t[2]/=e,t[3]=0,t[4]=1):Math.abs(s)>=1?(t[0]=(t[6]*t[6]+t[7]*t[7]-s*s)/(2*s),t[1]=-t[6]/s,t[2]=-t[7]/s,t[3]=1/(2*s),t[4]=1):(i=0>=s?-1:1,t[0]=.5*i*(t[6]*t[6]+t[7]*t[7]-s*s),t[1]=-i*t[6],t[2]=-i*t[7],t[3]=i/2,t[4]=i*s),t},toGL:function(t){var e,i,r;if(e="function"==typeof Float32Array?new Float32Array(16):Array(16),4!==t.length&&4!==t[0].length)return e;for(i=0;4>i;i++)for(r=0;4>r;r++)e[i+4*r]=t[i][r];return e}},t.Math}),define("base/coords",["jxg","base/constants","utils/event","utils/type","math/math"],function(t,e,i,r,s){return t.Coords=function(t,e,s,o){this.board=s,this.usrCoords=[],this.scrCoords=[],this.emitter=!r.exists(o)||o,this.emitter&&i.eventify(this),this.setCoordinates(t,e,!0,!0)},t.extend(t.Coords.prototype,{normalizeUsrCoords:function(){var t=s.eps;Math.abs(this.usrCoords[0])>t&&(this.usrCoords[1]/=this.usrCoords[0],this.usrCoords[2]/=this.usrCoords[0],this.usrCoords[0]=1)},usr2screen:function(t){var e=Math.round,i=this.board,r=this.usrCoords,s=i.origin.scrCoords;null===t||t?(this.scrCoords[0]=e(r[0]),this.scrCoords[1]=e(r[0]*s[1]+r[1]*i.unitX),this.scrCoords[2]=e(r[0]*s[2]-r[2]*i.unitY)):(this.scrCoords[0]=r[0],this.scrCoords[1]=r[0]*s[1]+r[1]*i.unitX,this.scrCoords[2]=r[0]*s[2]-r[2]*i.unitY)},screen2usr:function(){var t=this.board.origin.scrCoords,e=this.scrCoords,i=this.board;this.usrCoords[0]=1,this.usrCoords[1]=(e[1]-t[1])/i.unitX,this.usrCoords[2]=(t[2]-e[2])/i.unitY},distance:function(t,i){var r,o,n=0,a=this.usrCoords,h=this.scrCoords;if(t===e.COORDS_BY_USER){if(r=i.usrCoords,o=a[0]-r[0],n=o*o,n>s.eps)return Number.POSITIVE_INFINITY;o=a[1]-r[1],n+=o*o,o=a[2]-r[2],n+=o*o}else r=i.scrCoords,o=h[1]-r[1],n+=o*o,o=h[2]-r[2],n+=o*o;return Math.sqrt(n)},setCoordinates:function(t,i,r,s){var o=this.usrCoords,n=this.scrCoords,a=[o[0],o[1],o[2]],h=[n[0],n[1],n[2]];return t===e.COORDS_BY_USER?(2===i.length?(o[0]=1,o[1]=i[0],o[2]=i[1]):(o[0]=i[0],o[1]=i[1],o[2]=i[2],this.normalizeUsrCoords()),this.usr2screen(r)):(n[1]=i[0],n[2]=i[1],this.screen2usr()),!this.emitter||s||h[1]===n[1]&&h[2]===n[2]||this.triggerEventHandlers(["update"],[a,h]),this},__evt__update:function(){},__evt:function(){}}),t.Coords}),define("utils/color",["jxg","utils/type","math/math"],function(t,e,i){var r={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"},s=[{re:/^\s*rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*([\d\.]{1,3})\s*\)\s*$/,example:["rgba(123, 234, 45, 0.5)","rgba(255,234,245,1.0)"],process:function(t){return[parseInt(t[1],10),parseInt(t[2],10),parseInt(t[3],10)]}},{re:/^\s*rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)\s*$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function(t){return[parseInt(t[1],10),parseInt(t[2],10),parseInt(t[3],10)]}},{re:/^(\w{2})(\w{2})(\w{2})$/,example:["#00ff00","336699"],process:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}}];return t.rgbParser=function(t,i,o){var n,a,h,l,c,d,u,p,f,m=t,b=!1;if(!e.exists(t))return[];if(e.exists(i)&&e.exists(o)&&(m=[t,i,o]),n=m,e.isArray(n)){for(d=0;3>d;d++)b=b||/\./.test(""+m[d]);for(d=0;3>d;d++)b=b&&m[d]>=0&&1>=m[d];return b?[Math.ceil(255*m[0]),Math.ceil(255*m[1]),Math.ceil(255*m[2])]:m}for("string"==typeof m&&(n=m),"#"===n.charAt(0)&&(n=n.substr(1,6)),n=n.replace(/ /g,"").toLowerCase(),n=r[n]||n,d=0;s.length>d;d++)h=s[d].re,l=s[d].process,c=h.exec(n),c&&(a=l(c),u=a[0],p=a[1],f=a[2]);return isNaN(u)||isNaN(p)||isNaN(f)?[]:(u=0>u||isNaN(u)?0:u>255?255:u,p=0>p||isNaN(p)?0:p>255?255:p,f=0>f||isNaN(f)?0:f>255?255:f,[u,p,f])},t.rgb2css=function(e,i,r){var s;return s=t.rgbParser(e,i,r),"rgb("+s[0]+", "+s[1]+", "+s[2]+")"},t.rgb2hex=function(e,i,r){var s,o,n;return s=t.rgbParser(e,i,r),o=s[1],n=s[2],s=s[0],s=s.toString(16),o=o.toString(16),n=n.toString(16),1===s.length&&(s="0"+s),1===o.length&&(o="0"+o),1===n.length&&(n="0"+n),"#"+s+o+n},t.hex2rgb=function(e){var i;return i=t.rgbParser(e),"rgb("+i[0]+", "+i[1]+", "+i[2]+")"},t.hsv2rgb=function(t,e,r){var s,o,n,a,h,l,c,d,u;if(t=(t%360+360)%360,0===e){if(!(isNaN(t)||i.eps>t))return"#ffffff";s=r,o=r,n=r}else switch(l=t>=360?0:t,l/=60,h=Math.floor(l),a=l-h,c=r*(1-e),d=r*(1-e*a),u=r*(1-e*(1-a)),h){case 0:s=r,o=u,n=c;break;case 1:s=d,o=r,n=c;break;case 2:s=c,o=r,n=u;break;case 3:s=c,o=d,n=r;break;case 4:s=u,o=c,n=r;break;case 5:s=r,o=c,n=d}return s=Math.round(255*s).toString(16),s=2===s.length?s:1===s.length?"0"+s:"00",o=Math.round(255*o).toString(16),o=2===o.length?o:1===o.length?"0"+o:"00",n=Math.round(255*n).toString(16),n=2===n.length?n:1===n.length?"0"+n:"00",["#",s,o,n].join("")},t.rgb2hsv=function(e,i,r){var s,o,n,a,h,l,c,d,u,p,f,m,b;return s=t.rgbParser(e,i,r),o=s[1],n=s[2],s=s[0],a=s/255,h=o/255,l=n/255,m=Math.max(s,o,n),b=Math.min(s,o,n),c=m/255,d=b/255,f=c,p=0,f>0&&(p=(f-d)/f),u=1/(c-d),p>0&&(u=m===s?(h-l)*u:m===o?2+(l-a)*u:4+(a-h)*u),u*=60,0>u&&(u+=360),m===b&&(u=0),[u,p,f]},t.rgb2LMS=function(e,i,r){var s,o,n,a,h,l,c,d=[[.05059983,.08585369,.0095242],[.01893033,.08925308,.01370054],[.00292202,.00975732,.07145979]];return s=t.rgbParser(e,i,r),o=s[1],n=s[2],s=s[0],s=Math.pow(s,.476190476),o=Math.pow(o,.476190476),n=Math.pow(n,.476190476),a=s*d[0][0]+o*d[0][1]+n*d[0][2],h=s*d[1][0]+o*d[1][1]+n*d[1][2],l=s*d[2][0]+o*d[2][1]+n*d[2][2],c=[a,h,l],c.l=a,c.m=h,c.s=l,c},t.LMS2rgb=function(t,e,i){var r,s,o,n,a=[[30.830854,-29.832659,1.610474],[-6.481468,17.715578,-2.532642],[-.37569,-1.199062,14.273846]],h=function(t){for(var e=127,i=64;i>0;){if(Math.pow(e,.476190476)>t)e-=i;else{if(Math.pow(e+1,.476190476)>t)return e;e+=i}i/=2}return 254===e&&t>13.994955247?255:e};return r=t*a[0][0]+e*a[0][1]+i*a[0][2],s=t*a[1][0]+e*a[1][1]+i*a[1][2],o=t*a[2][0]+e*a[2][1]+i*a[2][2],r=h(r),s=h(s),o=h(o),n=[r,s,o],n.r=r,n.g=s,n.b=o,n
+},t.rgba2rgbo=function(t){var e;return 9===t.length&&"#"===t.charAt(0)?(e=parseInt(t.substr(7,2).toUpperCase(),16)/255,t=t.substr(0,7)):e=1,[t,e]},t.rgbo2rgba=function(t,e){var i;return"none"===t?t:(i=Math.round(255*e).toString(16),1===i.length&&(i="0"+i),t+i)},t.rgb2bw=function(e){var i,r,s,o="0123456789ABCDEF";return"none"===e?e:(s=t.rgbParser(e),i=Math.floor(.3*s[0]+.59*s[1]+.11*s[2]),r=o.charAt(15&i>>4)+o.charAt(15&i),e="#"+r+r+r)},t.rgb2cb=function(e,i){var r,s,o,n,a,h,l,c,d,u,p,f,m,b="0123456789ABCDEF";if("none"===e)return e;switch(a=t.rgb2LMS(e),s=a[0],o=a[1],n=a[2],i=i.toLowerCase()){case"protanopia":l=-.06150039994295001,c=.08277001656812001,d=-.013200141220000003,u=.05858939668799999,p=-.07934519995360001,f=.013289415272000003,m=.6903216543277437,h=n/o,s=m>h?-(c*o+d*n)/l:-(p*o+f*n)/u;break;case"tritanopia":l=-.00058973116217,c=.007690316482,d=-.01011703519052,u=.025495080838999994,p=-.0422740347,f=.017005316784,m=.8349489908460004,h=o/s,n=m>h?-(l*s+c*o)/d:-(u*s+p*o)/f;break;default:l=-.06150039994295001,c=.08277001656812001,d=-.013200141220000003,u=.05858939668799999,p=-.07934519995360001,f=.013289415272000003,m=.5763833686400911,h=n/s,o=m>h?-(l*s+d*n)/c:-(u*s+f*n)/p}return r=t.LMS2rgb(s,o,n),h=b.charAt(15&r[0]>>4)+b.charAt(15&r[0]),e="#"+h,h=b.charAt(15&r[1]>>4)+b.charAt(15&r[1]),e+=h,h=b.charAt(15&r[2]>>4)+b.charAt(15&r[2]),e+=h},t}),define("options",["jxg","base/constants","math/math","utils/color","utils/type"],function(t,e,i,r,s){return t.Options={jc:{enabled:!0,compile:!0},board:{boundingBox:[-5,5,5,-5],zoomFactor:1,zoomX:1,zoomY:1,showCopyright:!0,axis:!1,showNavigation:!0,showReload:!1,keepAspectRatio:!1,takeFirst:!1,takeSizeFromFile:!1,renderer:"svg",animationDelay:35,registerEvents:!0,zoom:{factorX:1.25,factorY:1.25,wheel:!1,needshift:!1,eps:.1},pan:{needShift:!0,needTwoFingers:!0,enabled:!0}},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,priv:!1,layer:0,dash:0,shadow:!1,trace:!1,traceAttributes:{},highlight:!0,needsRegularUpdate:!0,snapToGrid:!1,scalable:!0,draft:{draft:!1,strokeColor:"#565656",fillColor:"#565656",strokeOpacity:.8,fillOpacity:.8,strokeWidth:1},isLabel:!1},ticks:{drawLabels:!1,label:{},anchor:"left",drawZero:!1,insertTicks:!1,minTicksDistance:50,minorHeight:4,majorHeight:10,tickEndings:[1,1],minorTicks:4,scale:1,scaleSymbol:"",labels:[],ticksDistance:1,strokeOpacity:1,strokeWidth:1,strokeColor:"black",highlightStrokeColor:"#888888"},hash:{drawLabels:!1,drawZero:!0,majorHeight:20,anchor:"middle",strokeWidth:2,strokeColor:"blue",ticksDistance:.2},precision:{touch:30,touchMax:100,mouse:4,epsilon:1e-4,hasPoint:4},layer:{numlayers:20,text:9,point:9,glider:9,arc:8,line:7,circle:6,curve:5,turtle:5,polygon:3,sector:3,angle:3,integral:3,axis:2,grid:1,image:0,trace:0},angle:{withLabel:!0,radius:.5,type:"sector",orthoType:"square",orthoSensitivity:1,fillColor:"#FF7F00",highlightFillColor:"#FF7F00",strokeColor:"#FF7F00",fillOpacity:.3,highlightFillOpacity:.3,radiuspoint:{withLabel:!1,visible:!1,name:""},pointsquare:{withLabel:!1,visible:!1,name:""},dot:{visible:!1,strokeColor:"none",fillColor:"black",size:2,face:"o",withLabel:!1,name:""},label:{position:"top",offset:[0,0],strokeColor:"#0000FF"}},arc:{label:{},firstArrow:!1,lastArrow:!1,fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",useDirection:!1},axis:{name:"",needsRegularUpdate:!1,strokeWidth:1,strokeColor:"#666666",highlightStrokeWidth:1,highlightStrokeColor:"#888888",withTicks:!0,straightFirst:!0,straightLast:!0,lastArrow:!0,withLabel:!1,scalable:!1,ticks:{label:{offset:[4,-9],parse:!1},needsRegularUpdate:!1,strokeWidth:1,strokeColor:"#666666",highlightStrokeColor:"#888888",drawLabels:!0,drawZero:!1,insertTicks:!0,minTicksDistance:10,minorHeight:10,majorHeight:-1,tickEndings:[0,1],minorTicks:4,ticksDistance:1,strokeOpacity:.25},point1:{needsRegularUpdate:!1},point2:{needsRegularUpdate:!1},label:{position:"lft",offset:[10,-20]}},bisector:{strokeColor:"#000000",point:{visible:!1,fixed:!1,withLabel:!1,name:""}},bisectorlines:{line1:{strokeColor:"black"},line2:{strokeColor:"black"}},chart:{chartStyle:"line",colors:["#B02B2C","#3F4C6B","#C79810","#D15600","#FFFF88","#C3D9FF","#4096EE","#008C00"],highlightcolors:null,fillcolor:null,highlightonsector:!1,highlightbysize:!1,label:{}},circle:{hasInnerPoints:!1,fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",center:{visible:!1,withLabel:!1,fixed:!1,name:""},label:{position:"urt"}},circumcircle:{fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",center:{visible:!1,fixed:!1,withLabel:!1,name:""}},circumcirclearc:{fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",center:{visible:!1,withLabel:!1,fixed:!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",fixed:!0,handDrawing:!1,curveType:null,RDPsmoothing:!1,numberPointsHigh:1600,numberPointsLow:400,doAdvancedPlot:!0,label:{position:"lft"}},glider:{label:{}},grid:{needsRegularUpdate:!1,hasGrid:!1,gridX:1,gridY:1,strokeColor:"#C0C0C0",strokeOpacity:.5,strokeWidth:1,dash:0,snapToGrid:!1,snapSizeX:10,snapSizeY:10},image:{imageString:null,fillOpacity:1,cssClass:"JXGimage",highlightCssClass:"JXGimageHighlight",rotate:0},incircle:{fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",center:{visible:!1,fixed:!1,withLabel:!1,name:""}},inequality:{fillColor:"red",fillOpacity:.2,strokeColor:"none",inverse:!1},infobox:{fontSize:12,isLabel:!1,strokeColor:"#bbbbbb",display:"html",anchorX:"left",anchorY:"middle",cssClass:"JXGinfobox",rotate:0,visible:!0,parse:!1},integral:{axis:"x",withLabel:!0,strokeWidth:0,strokeOpacity:0,fillOpacity:.8,curveLeft:{visible:!0,withLabel:!1,layer:9},baseLeft:{visible:!1,fixed:!1,withLabel:!1,name:""},curveRight:{visible:!0,withLabel:!1,layer:9},baseRight:{visible:!1,fixed:!1,withLabel:!1,name:""},label:{fontSize:20}},intersection:{alwaysIntersect:!0},label:{strokeColor:"black",highlightStrokeOpacity:1,highlightStrokeColor:"#C3D9FF",fixed:!0,position:"urt",offset:[10,10]},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,label:{offset:[4,-9]},drawZero:!1,insertTicks:!1,minTicksDistance:50,maxTicksDistance:300,minorHeight:4,majorHeight:-1,minorTicks:4,defaultDistance:1,strokeOpacity:.3},label:{position:"llft"},snapToGrid:!1,snapSizeX:1,snapSizeY:1},locus:{translateToOrigin:!1,translateTo10:!1,stretch:!1,toOrigin:null,to10:null},normal:{strokeColor:"#000000",point:{visible:!1,fixed:!1,withLabel:!1,name:""}},orthogonalprojection:{},parallel:{strokeColor:"#000000",point:{visible:!1,fixed:!1,withLabel:!1,name:""}},perpendicular:{strokeColor:"#000000",straightFirst:!0,straightLast:!0},perpendicularsegment:{strokeColor:"#000000",straightFirst:!1,straightLast:!1,point:{visible:!1,fixed:!0,withLabel:!1,name:""}},point:{withLabel:!0,label:{},style:5,face:"o",size:3,fillColor:"#ff0000",highlightFillColor:"#EEEEEE",strokeWidth:2,strokeColor:"#ff0000",highlightStrokeColor:"#C3D9FF",zoom:!1,showInfobox:!0,infoboxDigits:"auto",draft:!1,attractors:[],attractorUnit:"user",attractorDistance:0,snatchDistance:0,snapToGrid:!1,snapSizeX:1,snapSizeY:1,snapToPoints:!1},polygon:{hasInnerPoints:!1,fillColor:"#00FF00",highlightFillColor:"#00FF00",fillOpacity:.3,highlightFillOpacity:.3,withLines:!0,borders:{withLabel:!1,strokeWidth:1,highlightStrokeWidth:1,layer:5,label:{position:"top"}},vertices:{withLabel:!0,strokeColor:"#ff0000",fillColor:"#ff0000",fixed:!0},label:{offset:[0,0]}},prescribedangle:{anglepoint:{size:2,visible:!1,withLabel:!1}},riemannsum:{withLabel:!1,fillOpacity:.3,fillColor:"#ffff00"},sector:{fillColor:"#00FF00",highlightFillColor:"#00FF00",fillOpacity:.3,highlightFillOpacity:.3,radiuspoint:{visible:!1,withLabel:!1},center:{visible:!1,withLabel:!1},anglepoint:{visible:!1,withLabel:!1},label:{offset:[0,0]}},segment:{label:{position:"top"}},semicircle:{midpoint:{visible:!1,withLabel:!1,fixed:!1,name:""}},slider:{snapWidth:-1,precision:2,firstArrow:!1,lastArrow:!1,withTicks:!0,withLabel:!0,layer:9,showInfobox:!1,name:"",visible:!0,strokeColor:"#000000",highlightStrokeColor:"#888888",fillColor:"#ffffff",highlightFillColor:"none",size:6,point1:{needsRegularUpdate:!1,showInfobox:!1,withLabel:!1,visible:!1,fixed:!0,name:""},point2:{needsRegularUpdate:!1,showInfobox:!1,withLabel:!1,visible:!1,fixed:!0,name:""},baseline:{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"},highline:{strokeWidth:3,name:"",strokeColor:"#000000",highlightStrokeColor:"#888888"},label:{strokeColor:"#000000"}},tapemeasure:{strokeColor:"#000000",strokeWidth:2,highlightStrokeColor:"#000000",withTicks:!0,withLabel:!0,precision:2,point1:{strokeColor:"#000000",fillColor:"#ffffff",fillOpacity:0,highlightFillOpacity:.1,size:6,snapToPoints:!0,attractorUnit:"screen",attractorDistance:20,showInfobox:!1,withLabel:!1,name:""},point2:{strokeColor:"#000000",fillColor:"#ffffff",fillOpacity:0,highlightFillOpacity:.1,size:6,snapToPoints:!0,attractorUnit:"screen",attractorDistance:20,showInfobox:!1,withLabel:!1,name:""},ticks:{drawLabels:!1,drawZero:!0,insertTicks:!0,minorHeight:8,majorHeight:16,minorTicks:4,tickEndings:[0,1],defaultDistance:.1,strokeOpacity:1,strokeWidth:1,strokeColor:"#000000"},label:{position:"top"}},text:{fontSize:12,digits:2,parse:!0,useCaja:!1,isLabel:!1,strokeColor:"black",useASCIIMathML:!1,useMathJax:!1,display:"html",anchorX:"left",anchorY:"middle",cssClass:"JXGtext",highlightCssClass:"JXGtext",withLabel:!1,rotate:0,visible:!0},tracecurve:{strokeColor:"#000000",fillColor:"none",numberPoints:100},turtle:{strokeWidth:1,fillColor:"none",strokeColor:"#000000",arrow:{strokeWidth:2,withLabel:!1,strokeColor:"#ff0000"}},shortcuts:{color:["strokeColor","fillColor"],opacity:["strokeOpacity","fillOpacity"],highlightColor:["highlightStrokeColor","highlightFillColor"],highlightOpacity:["highlightStrokeOpacity","highlightFillOpacity"],strokeWidth:["strokeWidth","highlightStrokeWidth"]}},t.Validator=function(){var e,r=function(t){return/^[0-9]+px$/.test(t)},o=function(t){return"html"===t||"internal"===t},n=function(t){return s.isString(t)},a=function(e){return s.exists(t.normalizePointFace(e))},h=function(t){return Math.abs(t-Math.round(t))<i.eps},l=function(t){return h(t)&&t>0},c=function(t){return"vml"===t||"svg"===t||"canvas"===t||"no"===t},d=function(t){return t>0},u=function(t){return t>=0},p={},f={attractorDistance:u,color:n,defaultDistance:s.isNumber,display:o,doAdvancedPlot:!1,draft:!1,drawLabels:!1,drawZero:!1,face:a,factor:s.isNumber,fillColor:n,fillOpacity:s.isNumber,firstArrow:!1,fontSize:h,dash:h,gridX:s.isNumber,gridY:s.isNumber,hasGrid:!1,highlightFillColor:n,highlightFillOpacity:s.isNumber,highlightStrokeColor:n,highlightStrokeOpacity:s.isNumber,insertTicks:!1,lastArrow:!1,majorHeight:h,maxTicksDistance:l,minorHeight:h,minorTicks:l,minTicksDistance:l,numberPointsHigh:l,numberPointsLow:l,opacity:s.isNumber,radius:s.isNumber,RDPsmoothing:!1,renderer:c,right:r,showCopyright:!1,showInfobox:!1,showNavigation:!1,size:h,snapSizeX:d,snapSizeY:d,snapWidth:s.isNumber,snapToGrid:!1,snatchDistance:u,straightFirst:!1,straightLast:!1,stretch:!1,strokeColor:n,strokeOpacity:s.isNumber,strokeWidth:h,takeFirst:!1,takeSizeFromFile:!1,to10:!1,toOrigin:!1,translateTo10:!1,translateToOrigin:!1,useASCIIMathML:!1,useDirection:!1,useMathJax:!1,withLabel:!1,withTicks:!1,zoom:!1};for(e in f)f.hasOwnProperty(e)&&(p[e.toLowerCase()]=f[e]);return p}(),t.normalizePointFace=function(t){var e={cross:"x",x:"x",circle:"o",o:"o",square:"[]","[]":"[]",plus:"+","+":"+",diamond:"<>","<>":"<>",triangleup:"^",a:"^","^":"^",triangledown:"v",v:"v",triangleleft:"<","<":"<",triangleright:">",">":">"};return e[t]},t.useStandardOptions=function(i){var r,s,o,n,a=t.Options,h=i.hasGrid;i.options.grid.hasGrid=a.grid.hasGrid,i.options.grid.gridX=a.grid.gridX,i.options.grid.gridY=a.grid.gridY,i.options.grid.gridColor=a.grid.gridColor,i.options.grid.gridOpacity=a.grid.gridOpacity,i.options.grid.gridDash=a.grid.gridDash,i.options.grid.snapToGrid=a.grid.snapToGrid,i.options.grid.snapSizeX=a.grid.SnapSizeX,i.options.grid.snapSizeY=a.grid.SnapSizeY,i.takeSizeFromFile=a.takeSizeFromFile,n=function(t,e){t.visProp.fillcolor=e.fillColor,t.visProp.highlightfillcolor=e.highlightFillColor,t.visProp.strokecolor=e.strokeColor,t.visProp.highlightstrokecolor=e.highlightStrokeColor};for(r in i.objects)if(i.objects.hasOwnProperty(r))if(o=i.objects[r],o.elementClass===e.OBJECT_CLASS_POINT)n(o,a.point);else if(o.elementClass===e.OBJECT_CLASS_LINE)for(n(o,a.line),s=0;o.ticks.length>s;s++)o.ticks[s].majorTicks=a.line.ticks.majorTicks,o.ticks[s].minTicksDistance=a.line.ticks.minTicksDistance,o.ticks[s].visProp.minorheight=a.line.ticks.minorHeight,o.ticks[s].visProp.majorheight=a.line.ticks.majorHeight;else o.elementClass===e.OBJECT_CLASS_CIRCLE?n(o,a.circle):o.type===e.OBJECT_TYPE_ANGLE?n(o,a.angle):o.type===e.OBJECT_TYPE_ARC?n(o,a.arc):o.type===e.OBJECT_TYPE_POLYGON?n(o,a.polygon):o.type===e.OBJECT_TYPE_CONIC?n(o,a.conic):o.type===e.OBJECT_TYPE_CURVE?n(o,a.curve):o.type===e.OBJECT_TYPE_SECTOR&&(o.arc.visProp.fillcolor=a.sector.fillColor,o.arc.visProp.highlightfillcolor=a.sector.highlightFillColor,o.arc.visProp.fillopacity=a.sector.fillOpacity,o.arc.visProp.highlightfillopacity=a.sector.highlightFillOpacity);i.fullUpdate(),h&&!i.hasGrid?i.removeGrids(i):!h&&i.hasGrid&&i.create("grid",[])},t.useBlackWhiteOptions=function(e){var i=t.Options;i.point.fillColor=r.rgb2bw(i.point.fillColor),i.point.highlightFillColor=r.rgb2bw(i.point.highlightFillColor),i.point.strokeColor=r.rgb2bw(i.point.strokeColor),i.point.highlightStrokeColor=r.rgb2bw(i.point.highlightStrokeColor),i.line.fillColor=r.rgb2bw(i.line.fillColor),i.line.highlightFillColor=r.rgb2bw(i.line.highlightFillColor),i.line.strokeColor=r.rgb2bw(i.line.strokeColor),i.line.highlightStrokeColor=r.rgb2bw(i.line.highlightStrokeColor),i.circle.fillColor=r.rgb2bw(i.circle.fillColor),i.circle.highlightFillColor=r.rgb2bw(i.circle.highlightFillColor),i.circle.strokeColor=r.rgb2bw(i.circle.strokeColor),i.circle.highlightStrokeColor=r.rgb2bw(i.circle.highlightStrokeColor),i.arc.fillColor=r.rgb2bw(i.arc.fillColor),i.arc.highlightFillColor=r.rgb2bw(i.arc.highlightFillColor),i.arc.strokeColor=r.rgb2bw(i.arc.strokeColor),i.arc.highlightStrokeColor=r.rgb2bw(i.arc.highlightStrokeColor),i.polygon.fillColor=r.rgb2bw(i.polygon.fillColor),i.polygon.highlightFillColor=r.rgb2bw(i.polygon.highlightFillColor),i.sector.fillColor=r.rgb2bw(i.sector.fillColor),i.sector.highlightFillColor=r.rgb2bw(i.sector.highlightFillColor),i.curve.strokeColor=r.rgb2bw(i.curve.strokeColor),i.grid.gridColor=r.rgb2bw(i.grid.gridColor),t.useStandardOptions(e)},t.Options.normalizePointFace=t.normalizePointFace,t.Options}),define("math/numerics",["utils/type","math/math"],function(t,e){var i={rk4:{s:4,A:[[0,0,0,0],[.5,0,0,0],[0,.5,0,0],[0,0,1,0]],b:[1/6,1/3,1/3,1/6],c:[0,.5,.5,1]},heun:{s:2,A:[[0,0],[1,0]],b:[.5,.5],c:[0,1]},euler:{s:1,A:[[0]],b:[1],c:[0]}};return e.Numerics={Gauss:function(i,r){var s,o,n,a,h,l=e.eps,c=i.length>0?i[0].length:0;if(c!==r.length||c!==i.length)throw Error("JXG.Math.Numerics.Gauss: Dimensions don't match. A must be a square matrix and b must be of the same length as A.");for(a=[],h=r.slice(0,c),s=0;c>s;s++)a[s]=i[s].slice(0,c);for(o=0;c>o;o++){for(s=c-1;s>o;s--)if(Math.abs(a[s][o])>l)if(l>Math.abs(a[o][o]))t.swap(a,s,o),t.swap(h,s,o);else for(a[s][o]/=a[o][o],h[s]-=a[s][o]*h[o],n=o+1;c>n;n++)a[s][n]-=a[s][o]*a[o][n];if(l>Math.abs(a[o][o]))throw Error("JXG.Math.Numerics.Gauss(): The given matrix seems to be singular.")}return this.backwardSolve(a,h,!0),h},backwardSolve:function(t,e,i){var r,s,o,n,a;for(r=i?e:e.slice(0,e.length),s=t.length,o=t.length>0?t[0].length:0,n=s-1;n>=0;n--){for(a=o-1;a>n;a--)r[n]-=t[n][a]*r[a];r[n]/=t[n][n]}return r},gaussBareiss:function(t){var i,r,s,o,n,a,h,l,c,d=e.eps;if(h=t.length,0>=h)return 0;for(h>t[0].length&&(h=t[0].length),l=[],o=0;h>o;o++)l[o]=t[o].slice(0,h);for(r=1,s=1,i=0;h-1>i;i++){if(a=l[i][i],d>Math.abs(a)){for(o=0;h>o&&!(Math.abs(l[o][i])>=d);o++);if(o===h)return 0;for(n=i;h>n;n++)c=l[o][n],l[o][n]=l[i][n],l[i][n]=c;s=-s,a=l[i][i]}for(o=i+1;h>o;o++)for(n=i+1;h>n;n++)c=a*l[o][n]-l[o][i]*l[i][n],l[o][n]=c/r;r=a}return s*l[h-1][h-1]},det:function(t){var e=t.length;return 2===e&&2===t[0].length?t[0][0]*t[1][1]-t[1][0]*t[0][1]:this.gaussBareiss(t)},Jacobi:function(t){var i,r,s,o,n,a,h,l,c,d=e.eps,u=0,p=t.length,f=[[0,0,0],[0,0,0],[0,0,0]],m=[[0,0,0],[0,0,0],[0,0,0]],b=0;for(i=0;p>i;i++){for(r=0;p>r;r++)f[i][r]=0,m[i][r]=t[i][r],u+=Math.abs(m[i][r]);f[i][i]=1}if(1===p)return[m,f];if(0>=u)return[m,f];u/=p*p;do{for(l=0,c=0,r=1;p>r;r++)for(i=0;r>i;i++)if(o=Math.abs(m[i][r]),o>c&&(c=o),l+=o,o>=d){for(o=.5*Math.atan2(2*m[i][r],m[i][i]-m[r][r]),n=Math.sin(o),a=Math.cos(o),s=0;p>s;s++)h=m[s][i],m[s][i]=a*h+n*m[s][r],m[s][r]=-n*h+a*m[s][r],h=f[s][i],f[s][i]=a*h+n*f[s][r],f[s][r]=-n*h+a*f[s][r];for(m[i][i]=a*m[i][i]+n*m[r][i],m[r][r]=-n*m[i][r]+a*m[r][r],m[i][r]=0,s=0;p>s;s++)m[i][s]=m[s][i],m[r][s]=m[s][r]}b+=1}while(Math.abs(l)/u>d&&2e3>b);return[m,f]},NewtonCotes:function(t,e,i){var r,s,o,n=0,a=i&&"number"==typeof i.number_of_nodes?i.number_of_nodes:28,h={trapez:!0,simpson:!0,milne:!0},l=i&&i.integration_type&&h.hasOwnProperty(i.integration_type)&&h[i.integration_type]?i.integration_type:"milne",c=(t[1]-t[0])/a;switch(l){case"trapez":for(n=.5*(e(t[0])+e(t[1])),r=t[0],s=0;a-1>s;s++)r+=c,n+=e(r);n*=c;break;case"simpson":if(a%2>0)throw Error("JSXGraph: INT_SIMPSON requires config.number_of_nodes dividable by 2.");for(o=a/2,n=e(t[0])+e(t[1]),r=t[0],s=0;o-1>s;s++)r+=2*c,n+=2*e(r);for(r=t[0]-c,s=0;o>s;s++)r+=2*c,n+=4*e(r);n*=c/3;break;default:if(a%4>0)throw Error("JSXGraph: Error in INT_MILNE: config.number_of_nodes must be a multiple of 4");for(o=.25*a,n=7*(e(t[0])+e(t[1])),r=t[0],s=0;o-1>s;s++)r+=4*c,n+=14*e(r);for(r=t[0]-3*c,s=0;o>s;s++)r+=4*c,n+=32*(e(r)+e(r+2*c));for(r=t[0]-2*c,s=0;o>s;s++)r+=4*c,n+=12*e(r);n*=2*c/45}return n},I:function(t,e){return this.NewtonCotes(t,e,{number_of_nodes:16,integration_type:"milne"})},Newton:function(i,r,s){var o,n=0,a=e.eps,h=i.apply(s,[r]),l=1;for(t.isArray(r)&&(r=r[0]);50>n&&Math.abs(h)>a;)o=this.D(i,s)(r),l+=2,Math.abs(o)>a?r-=h/o:r+=.2*Math.random()-1,h=i.apply(s,[r]),l+=1,n+=1;return r},root:function(t,e,i){return this.fzero(t,e,i)},generalizedNewton:function(t,i,r,s){var o,n,a,h,l,c,d,u,p,f,m,b,g,v,C=0;for(this.generalizedNewton.t1memo?(o=this.generalizedNewton.t1memo,n=this.generalizedNewton.t2memo):(o=r,n=s),u=t.X(o)-i.X(n),p=t.Y(o)-i.Y(n),f=u*u+p*p,m=this.D(t.X,t),b=this.D(i.X,i),g=this.D(t.Y,t),v=this.D(i.Y,i);f>e.eps&&10>C;)a=m(o),h=-b(n),l=g(o),c=-v(n),d=a*c-h*l,o-=(c*u-h*p)/d,n-=(a*p-l*u)/d,u=t.X(o)-i.X(n),p=t.Y(o)-i.Y(n),f=u*u+p*p,C+=1;return this.generalizedNewton.t1memo=o,this.generalizedNewton.t2memo=n,Math.abs(o)<Math.abs(n)?[t.X(o),t.Y(o)]:[i.X(n),i.Y(n)]},Neville:function(t){var i=[],r=function(r){return function(s,o){var n,a,h,l=e.binomial,c=t.length,d=c-1,u=0,p=0;if(!o)for(h=1,n=0;c>n;n++)i[n]=l(d,n)*h,h*=-1;for(a=s,n=0;c>n;n++){if(0===a)return t[n][r]();h=i[n]/a,a-=1,u+=t[n][r]()*h,p+=h}return u/p}},s=r("X"),o=r("Y");return[s,o,0,function(){return t.length-1}]},splineDef:function(t,e){var i,r,s,o=Math.min(t.length,e.length),n=[],a=[],h=[],l=[],c=[],d=[];if(2===o)return[0,0];for(r=0;o>r;r++)i={X:t[r],Y:e[r]},h.push(i);for(h.sort(function(t,e){return t.X-e.X}),r=0;o>r;r++)t[r]=h[r].X,e[r]=h[r].Y;for(r=0;o-1>r;r++)l.push(t[r+1]-t[r]);for(r=0;o-2>r;r++)c.push(6*(e[r+2]-e[r+1])/l[r+1]-6*(e[r+1]-e[r])/l[r]);for(n.push(2*(l[0]+l[1])),a.push(c[0]),r=0;o-3>r;r++)s=l[r+1]/n[r],n.push(2*(l[r+1]+l[r+2])-s*l[r+1]),a.push(c[r+1]-s*a[r]);for(d[o-3]=a[o-3]/n[o-3],r=o-4;r>=0;r--)d[r]=(a[r]-l[r+1]*d[r+1])/n[r];for(r=o-3;r>=0;r--)d[r+1]=d[r];return d[0]=0,d[o-1]=0,d},splineEval:function(e,i,r,s){var o,n,a,h,l,c,d,u=Math.min(i.length,r.length),p=1,f=!1,m=[];for(t.isArray(e)?(p=e.length,f=!0):e=[e],o=0;p>o;o++){if(e[o]<i[0]||i[o]>i[u-1])return 0/0;for(n=1;u>n&&!(e[o]<=i[n]);n++);n-=1,a=r[n],h=(r[n+1]-r[n])/(i[n+1]-i[n])-(i[n+1]-i[n])/6*(s[n+1]+2*s[n]),l=s[n]/2,c=(s[n+1]-s[n])/(6*(i[n+1]-i[n])),d=e[o]-i[n],m.push(a+(h+(l+c*d)*d)*d)}return f?m:m[0]},generatePolynomialTerm:function(t,e,i,r){var s,o=[];for(s=e;s>=0;s--)o=o.concat(["(",t[s].toPrecision(r),")"]),s>1?o=o.concat(["*",i,"<sup>",s,"<","/sup> + "]):1===s&&(o=o.concat(["*",i," + "]));return o.join("")},lagrangePolynomial:function(t){var e=[],i=function(i,r){var s,o,n,a,h,l,c=t.length,d=0,u=0;if(!r){for(s=0;c>s;s++){for(e[s]=1,a=t[s].X(),n=0;c>n;n++)n!==s&&(e[s]*=a-t[n].X());e[s]=1/e[s]}for(l=[],o=0;c>o;o++)l.push([1])}for(s=0;c>s;s++){if(a=t[s].X(),i===a)return t[s].Y();h=e[s]/(i-a),u+=h,d+=h*t[s].Y()}return d/u};return i.getTerm=function(){return""},i},CatmullRomSpline:function(t){var e,i=[],r={},s={},o=function(o){return function(n,a){var h,l,c=t.length;if(2>c)return 0/0;if(!a)for(r[o]=function(){return 2*t[0][o]()-t[1][o]()},s[o]=function(){return 2*t[c-1][o]()-t[c-2][o]()},e=[r].concat(t,[s]),i[o]=[],h=0;c-1>h;h++)i[o][h]=[2*e[h+1][o](),-e[h][o]()+e[h+2][o](),2*e[h][o]()-5*e[h+1][o]()+4*e[h+2][o]()-e[h+3][o](),-e[h][o]()+3*e[h+1][o]()-3*e[h+2][o]()+e[h+3][o]()];return c+=2,isNaN(n)?0/0:0>n?e[1][o]():n>=c-3?e[c-2][o]():(h=Math.floor(n),h===n?e[h][o]():(n-=h,l=i[o][h],.5*(((l[3]*n+l[2])*n+l[1])*n+l[0])))}};return[o("X"),o("Y"),0,function(){return t.length-1}]},regressionPolynomial:function(i,r,s){var o,n,a,h,l,c,d="";if(t.isPoint(i)&&"function"==typeof i.Value)n=function(){return i.Value()};else if(t.isFunction(i))n=i;else{if(!t.isNumber(i))throw Error("JSXGraph: Can't create regressionPolynomial from degree of type'"+typeof i+"'.");n=function(){return i}}if(3===arguments.length&&t.isArray(r)&&t.isArray(s))l=0;else if(2===arguments.length&&t.isArray(r)&&r.length>0&&t.isPoint(r[0]))l=1;else{if(!(2===arguments.length&&t.isArray(r)&&r.length>0&&r[0].usrCoords&&r[0].scrCoords))throw Error("JSXGraph: Can't create regressionPolynomial. Wrong parameters.");l=2}return c=function(i,c){var u,p,f,m,b,g,v,C,y,P=r.length;if(y=Math.floor(n()),!c){if(1===l)for(a=[],h=[],u=0;P>u;u++)a[u]=r[u].X(),h[u]=r[u].Y();if(2===l)for(a=[],h=[],u=0;P>u;u++)a[u]=r[u].usrCoords[1],h[u]=r[u].usrCoords[2];if(0===l)for(a=[],h=[],u=0;P>u;u++)t.isFunction(r[u])?a.push(r[u]()):a.push(r[u]),t.isFunction(s[u])?h.push(s[u]()):h.push(s[u]);for(f=[],p=0;P>p;p++)f.push([1]);for(u=1;y>=u;u++)for(p=0;P>p;p++)f[p][u]=f[p][u-1]*a[p];b=h,m=e.transpose(f),g=e.matMatMult(m,f),v=e.matVecMult(m,b),o=e.Numerics.Gauss(g,v),d=e.Numerics.generatePolynomialTerm(o,y,"x",3)}for(C=o[y],u=y-1;u>=0;u--)C=C*i+o[u];return C},c.getTerm=function(){return d},c},bezier:function(t){var e,i,r=function(r){return function(s,o){var n=3*Math.floor(s),a=s%1,h=1-a;return o||(i=3*Math.floor((t.length-1)/3),e=Math.floor(i/3)),0>s?t[0][r]():s>=e?t[i][r]():isNaN(s)?0/0:h*h*(h*t[n][r]()+3*a*t[n+1][r]())+(3*h*t[n+2][r]()+a*t[n+3][r]())*a*a}};return[r("X"),r("Y"),0,function(){return Math.floor(t.length/3)}]},bspline:function(t,e){var i,r=[],s=function(t,e){var i,r=[];for(i=0;t+e+1>i;i++)r[i]=e>i?0:t>=i?i-e+1:t-e+2;return r},o=function(t,e,i,r,s){var o,n,a,h,l,c=[];for(c[s]=t>=e[s]&&e[s+1]>t?1:0,o=2;r>=o;o++)for(n=s-o+1;s>=n;n++)a=s-o+1>=n||0>n?0:c[n],h=n>=s?0:c[n+1],l=e[n+o-1]-e[n],c[n]=0===l?0:(t-e[n])/l*a,l=e[n+o]-e[n+1],0!==l&&(c[n]+=(e[n+o]-t)/l*h);return c},n=function(n){return function(a){var h,l,c,d=t.length,u=d-1,p=e;if(0>=u)return 0/0;if(p>=u+2&&(p=u+1),0>=a)return t[0][n]();if(a>=u-p+2)return t[u][n]();for(c=Math.floor(a)+p-1,i=s(u,p),r=o(a,i,u,p,c),h=0,l=c-p+1;c>=l;l++)d>l&&l>=0&&(h+=t[l][n]()*r[l]);return h}};return[n("X"),n("Y"),0,function(){return t.length-1}]},D:function(e,i){var r=1e-5,s=1/(2*r);return t.exists(i)?function(t,o){return(e.apply(i,[t+r,o])-e.apply(i,[t-r,o]))*s}:function(t,i){return(e(t+r,i)-e(t-r,i))*s}},riemann:function(t,e,i,r,s){var o,n,a,h,l,c,d=[],u=[],p=0,f=r,m=0;if(e=Math.round(e),d[p]=f,u[p]=0,e>0)for(l=(s-r)/e,h=.01*l,o=0;e>o;o++){if("right"===i)c=t(f+l);else if("middle"===i)c=t(f+.5*l);else if("left"===i||"trapezodial"===i)c=t(f);else if("lower"===i)for(c=t(f),n=f+h;f+l>=n;n+=h)a=t(n),c>a&&(c=a);else if("upper"===i)for(c=t(f),n=f+h;f+l>=n;n+=h)a=t(n),a>c&&(c=a);else c=t(f+l*Math.random());p+=1,d[p]=f,u[p]=c,p+=1,f+=l,"trapezodial"===i&&(c=t(f)),d[p]=f,u[p]=c,p+=1,d[p]=f,u[p]=0,m+=c*l}return[d,u,m]},riemannsum:function(t,e,i,r,s){var o,n,a,h,l,c,d=0,u=r;if(e=Math.floor(e),e>0)for(l=(s-r)/e,h=.01*l,o=0;e>o;o++){if("right"===i)c=t(u+l);else if("middle"===i)c=t(u+.5*l);else if("trapezodial"===i)c=.5*(t(u+l)+t(u));else if("left"===i)c=t(u);else if("lower"===i)for(c=t(u),n=u+h;u+l>=n;n+=h)a=t(n),c>a&&(c=a);else if("upper"===i)for(c=t(u),n=u+h;u+l>=n;n+=h)a=t(n),a>c&&(c=a);else c=t(u+l*Math.random());d+=l*c,u+=l}return d},rungeKutta:function(e,r,s,o,n){var a,h,l,c,d,u,p=[],f=[],m=(s[1]-s[0])/o,b=s[0],g=r.length,v=[],C=0;for(t.isString(e)&&(e=i[e]||i.euler),u=e.s,a=0;g>a;a++)p[a]=r[a];for(h=0;o>h;h++){for(v[C]=[],a=0;g>a;a++)v[C][a]=p[a];for(C+=1,c=[],l=0;u>l;l++){for(a=0;g>a;a++)f[a]=0;for(d=0;l>d;d++)for(a=0;g>a;a++)f[a]+=e.A[l][d]*m*c[d][a];for(a=0;g>a;a++)f[a]+=p[a];c.push(n(b+e.c[l]*m,f))}for(a=0;g>a;a++)f[a]=0;for(d=0;u>d;d++)for(a=0;g>a;a++)f[a]+=e.b[d]*c[d][a];for(a=0;g>a;a++)p[a]=p[a]+m*f[a];b+=m}return v},maxIterationsRoot:80,maxIterationsMinimize:500,fzero:function(i,r,s){var o,n,a,h,l,c,d,u,p,f,m,b,g,v,C,y,P,_,E,S,O=e.eps,T=this.maxIterationsRoot,x=0,w=0;if(t.isArray(r)){if(2>r.length)throw Error("JXG.Math.Numerics.fzero: length of array x0 has to be at least two.");o=r[0],h=i.call(s,o),w+=1,n=r[1],l=i.call(s,n),w+=1}else{for(o=r,h=i.call(s,o),w+=1,d=0===o?1:o,u=[.9*d,1.1*d,d-1,d+1,.5*d,1.5*d,-d,2*d,-10*d,10*d],f=u.length,p=0;f>p&&(n=u[p],l=i.call(s,n),w+=1,!(0>=h*l));p++);o>n&&(m=o,o=n,n=m,b=h,h=l,l=b)}if(h*l>0)return t.isArray(r)?this.fminbr(i,[o,n],s):this.Newton(i,o,s);for(a=o,c=h;T>x;){if(g=n-o,Math.abs(c)<Math.abs(l)&&(o=n,n=a,a=o,h=l,l=c,c=h),P=2*O*Math.abs(n)+.5*O,S=.5*(a-n),P>=Math.abs(S)&&O>=Math.abs(l))return n;Math.abs(g)>=P&&Math.abs(h)>Math.abs(l)&&(C=a-n,o===a?(v=l/h,_=C*v,E=1-v):(E=h/c,v=l/c,y=l/h,_=y*(C*E*(E-v)-(n-o)*(v-1)),E=(E-1)*(v-1)*(y-1)),_>0?E=-E:_=-_,.75*C*E-.5*Math.abs(P*E)>_&&Math.abs(.5*g*E)>_&&(S=_/E)),P>Math.abs(S)&&(S=S>0?P:-P),o=n,h=l,n+=S,l=i.call(s,n),w+=1,(l>0&&c>0||0>l&&0>c)&&(a=o,c=h),x++}return n},fminbr:function(i,r,s){var o,n,a,h,l,c,d,u,p,f,m,b,g,v,C,y,P=.5*(3-Math.sqrt(5)),_=e.eps,E=e.eps,S=this.maxIterationsMinimize,O=0,T=0;if(!t.isArray(r)||2>r.length)throw Error("JXG.Math.Numerics.fminbr: length of array x0 has to be at least two.");for(o=r[0],n=r[1],h=o+P*(n-o),d=i.call(s,h),T+=1,a=h,l=h,c=d,u=d;S>O;){if(p=n-o,f=.5*(o+n),m=E*Math.abs(a)+_/3,2*m>=Math.abs(a-f)+.5*p)return a;b=P*(f>a?n-a:o-a),Math.abs(a-l)>=m&&(C=(a-l)*(c-d),v=(a-h)*(c-u),g=(a-h)*v-(a-l)*C,v=2*(v-C),v>0?g=-g:v=-v,Math.abs(g)<Math.abs(b*v)&&g>v*(o-a+2*m)&&v*(n-a-2*m)>g&&(b=g/v)),m>Math.abs(b)&&(b=b>0?m:-m),C=a+b,y=i.call(s,C),T+=1,c>=y?(a>C?n=a:o=a,h=l,l=a,a=C,d=u,u=c,c=y):(a>C?o=C:n=C,u>=y||l===a?(h=l,l=C,d=u,u=y):(d>=y||h===a||h===l)&&(h=C,d=y)),O+=1}return a},RamerDouglasPeuker:function(t,i){var r,s,o,n=[],a=function(t,i,r){var s,o,n,a,h,l,c,d,u,p,f,m=0,b=i;if(2>r-i)return[-1,0];if(n=t[i].scrCoords,a=t[r].scrCoords,isNaN(n[1]+n[2]+a[1]+a[2]))return[0/0,r];for(o=i+1;r>o;o++)h=t[o].scrCoords,l=h[1]-n[1],c=h[2]-n[2],d=a[1]-n[1],u=a[2]-n[2],p=d*d+u*u,p>=e.eps?(f=(l*d+c*u)/p,0>f?f=0:f>1&&(f=1),l-=f*d,c-=f*u,s=l*l+c*c):(f=0,s=l*l+c*c),s>m&&(m=s,b=o);return[Math.sqrt(m),b]},h=function(t,e,i,r,s){var o=a(t,e,i);o[0]>r?(h(t,e,o[1],r,s),h(t,o[1],i,r,s)):s.push(t[i])};for(o=t.length,r=0;o>r&&isNaN(t[r].scrCoords[1]+t[r].scrCoords[2]);)r+=1;for(s=o-1;s>r&&isNaN(t[s].scrCoords[1]+t[s].scrCoords[2]);)s-=1;return r>s||r===o||(n[0]=t[r],h(t,r,s,i,n)),n}},e.Numerics}),define("math/geometry",["jxg","base/constants","base/coords","math/math","math/numerics","utils/type","utils/expect"],function(t,e,i,r,s,o,n){return r.Geometry={},t.extend(r.Geometry,{angle:function(t,e,i){var r,s,o,n,a=[],h=[],l=[];return t.coords?(a[0]=t.coords.usrCoords[1],a[1]=t.coords.usrCoords[2]):(a[0]=t[0],a[1]=t[1]),e.coords?(h[0]=e.coords.usrCoords[1],h[1]=e.coords.usrCoords[2]):(h[0]=e[0],h[1]=e[1]),i.coords?(l[0]=i.coords.usrCoords[1],l[1]=i.coords.usrCoords[2]):(l[0]=i[0],l[1]=i[1]),r=a[0]-h[0],s=a[1]-h[1],o=l[0]-h[0],n=l[1]-h[1],Math.atan2(r*n-s*o,r*o+s*n)},trueAngle:function(t,e,i){return 57.29577951308232*this.rad(t,e,i)},rad:function(t,e,i){var r,s,o,n,a,h,l;return t.coords?(r=t.coords.usrCoords[1],s=t.coords.usrCoords[2]):(r=t[0],s=t[1]),e.coords?(o=e.coords.usrCoords[1],n=e.coords.usrCoords[2]):(o=e[0],n=e[1]),i.coords?(a=i.coords.usrCoords[1],h=i.coords.usrCoords[2]):(a=i[0],h=i[1]),l=Math.atan2(h-n,a-o)-Math.atan2(s-n,r-o),0>l&&(l+=6.283185307179586),l},angleBisector:function(t,r,s,n){var a,h,l,c=t.coords.usrCoords,d=r.coords.usrCoords,u=s.coords.usrCoords,p=c[1]-d[1],f=c[2]-d[2],m=Math.sqrt(p*p+f*f);return o.exists(n)||(n=t.board),p/=m,f/=m,a=Math.acos(p),0>f&&(a*=-1),0>a&&(a+=2*Math.PI),p=u[1]-d[1],f=u[2]-d[2],m=Math.sqrt(p*p+f*f),p/=m,f/=m,h=Math.acos(p),0>f&&(h*=-1),0>h&&(h+=2*Math.PI),l=.5*(a+h),a>h&&(l+=Math.PI),p=Math.cos(l)+d[1],f=Math.sin(l)+d[2],new i(e.COORDS_BY_USER,[p,f],n)},reflection:function(t,r,s){var n,a,h,l,c,d,u,p=r.coords.usrCoords,f=t.point1.coords.usrCoords,m=t.point2.coords.usrCoords;return o.exists(s)||(s=r.board),c=m[1]-f[1],d=m[2]-f[2],n=p[1]-f[1],a=p[2]-f[2],u=(c*a-d*n)/(c*c+d*d),h=p[1]+2*u*d,l=p[2]-2*u*c,new i(e.COORDS_BY_USER,[h,l],s)},rotation:function(t,r,s,n){var a,h,l,c,d,u,p=r.coords.usrCoords,f=t.coords.usrCoords;return o.exists(n)||(n=r.board),a=p[1]-f[1],h=p[2]-f[2],l=Math.cos(s),c=Math.sin(s),d=a*l-h*c+f[1],u=a*c+h*l+f[2],new i(e.COORDS_BY_USER,[d,u],n)},perpendicular:function(t,e,s){var n,a,h,l,c,d=t.point1.coords.usrCoords,u=t.point2.coords.usrCoords,p=e.coords.usrCoords;return o.exists(s)||(s=e.board),e===t.point1?(n=d[1]+u[2]-d[2],a=d[2]-u[1]+d[1],c=d[0]*u[0],Math.abs(c)<r.eps&&(n=u[2],a=-u[1]),l=[c,n,a],h=!0):e===t.point2?(n=u[1]+d[2]-u[2],a=u[2]-d[1]+u[1],c=d[0]*u[0],Math.abs(c)<r.eps&&(n=d[2],a=-d[1]),l=[c,n,a],h=!1):Math.abs(r.innerProduct(p,t.stdform,3))<r.eps?(n=p[1]+u[2]-p[2],a=p[2]-u[1]+p[1],c=u[0],Math.abs(c)<r.eps&&(n=u[2],a=-u[1]),h=!0,Math.abs(c)>r.eps&&Math.abs(n-p[1])<r.eps&&Math.abs(a-p[2])<r.eps&&(n=p[1]+d[2]-p[2],a=p[2]-d[1]+p[1],h=!1),l=[c,n,a]):(l=[0,t.stdform[1],t.stdform[2]],l=r.crossProduct(l,p),l=r.crossProduct(l,t.stdform),h=!0),[new i(o.COORDS_BY_USER,l,s),h]},circumcenterMidpoint:t.shortcut(r.Geometry,"circumcenter"),circumcenter:function(t,s,n,a){var h,l,c,d,u=t.coords.usrCoords,p=s.coords.usrCoords,f=n.coords.usrCoords;return o.exists(a)||(a=t.board),h=[p[0]-u[0],-p[2]+u[2],p[1]-u[1]],l=[.5*(u[0]+p[0]),.5*(u[1]+p[1]),.5*(u[2]+p[2])],c=r.crossProduct(h,l),h=[f[0]-p[0],-f[2]+p[2],f[1]-p[1]],l=[.5*(p[0]+f[0]),.5*(p[1]+f[1]),.5*(p[2]+f[2])],d=r.crossProduct(h,l),new i(e.COORDS_BY_USER,r.crossProduct(c,d),a)
+},distance:function(t,e,i){var r,s=0;for(i||(i=Math.min(t.length,e.length)),r=0;i>r;r++)s+=(t[r]-e[r])*(t[r]-e[r]);return Math.sqrt(s)},affineDistance:function(t,e,i){var s;return s=this.distance(t,e,i),s>r.eps&&(Math.abs(t[0])<r.eps||Math.abs(e[0])<r.eps)?1/0:s},sortVertices:function(t){var e,i,s=n.each(t,n.coordsArray),a=s.length;for(e=1;a>e;e++)(s[e][2]<s[0][2]||Math.abs(s[e][2]-s[0][2])<r.eps&&s[e][1]<s[0][1])&&(s=o.swap(s,e,0));return i=s.shift(),s.sort(function(t,e){var r=Math.atan2(t[2]-i[2],t[1]-i[1]),s=Math.atan2(e[2]-i[2],e[1]-i[1]);return r-s}),s.unshift(i),s.unshift(s[s.length-1]),s},signedTriangle:function(t,e,i){var r=n.coordsArray(t),s=n.coordsArray(e),o=n.coordsArray(i);return.5*((s[1]-r[1])*(o[2]-r[2])-(s[2]-r[2])*(o[1]-r[1]))},signedPolygon:function(t,e){var i,r,s=0,o=n.each(t,n.coordsArray);for(e?o.unshift(o[o.length-1]):o=this.sortVertices(o),r=o.length,i=1;r>i;i++)s+=o[i-1][1]*o[i][2]-o[i][1]*o[i-1][2];return.5*s},GrahamScan:function(t){var e,i=1,r=n.each(t,n.coordsArray),s=r.length;for(r=this.sortVertices(r),s=r.length,e=2;s>e;e++){for(;0>=this.signedTriangle(r[i-1],r[i],r[e]);)if(i>1)i-=1;else{if(e===s-1)break;e+=1}i+=1,r=o.swap(r,i,e)}return r.slice(0,i)},calcStraight:function(t,s,n,a){var h,l,c,d,u,p,f,m,b,g,v,C;if(o.exists(a)||(a=10),u=t.visProp.straightfirst,p=t.visProp.straightlast,Math.abs(s.scrCoords[0])<r.eps&&(u=!0),Math.abs(n.scrCoords[0])<r.eps&&(p=!0),(u||p)&&(f=[],f[0]=t.stdform[0]-t.stdform[1]*t.board.origin.scrCoords[1]/t.board.unitX+t.stdform[2]*t.board.origin.scrCoords[2]/t.board.unitY,f[1]=t.stdform[1]/t.board.unitX,f[2]=-t.stdform[2]/t.board.unitY,!isNaN(f[0]+f[1]+f[2]))){for(m=[],m[0]=r.crossProduct(f,[a,0,1]),m[1]=r.crossProduct(f,[a,1,0]),m[2]=r.crossProduct(f,[-a-t.board.canvasHeight,0,1]),m[3]=r.crossProduct(f,[-a-t.board.canvasWidth,1,0]),b=0;4>b;b++)if(Math.abs(m[b][0])>r.eps){for(g=2;g>0;g--)m[b][g]/=m[b][0];m[b][0]=1}if(h=!1,l=!1,h=!u&&Math.abs(s.usrCoords[0])>=r.eps&&s.scrCoords[1]>=0&&s.scrCoords[1]<=t.board.canvasWidth&&s.scrCoords[2]>=0&&s.scrCoords[2]<=t.board.canvasHeight,l=!p&&Math.abs(n.usrCoords[0])>=r.eps&&n.scrCoords[1]>=0&&n.scrCoords[1]<=t.board.canvasWidth&&n.scrCoords[2]>=0&&n.scrCoords[2]<=t.board.canvasHeight,Math.abs(m[1][0])<r.eps?(c=m[0],d=m[2]):Math.abs(m[0][0])<r.eps?(c=m[1],d=m[3]):0>m[1][2]?(c=m[0],d=m[3][2]>t.board.canvasHeight?m[2]:m[3]):m[1][2]>t.board.canvasHeight?(c=m[2],d=0>m[3][2]?m[0]:m[3]):(c=m[1],d=0>m[3][2]?m[0]:m[3][2]>t.board.canvasHeight?m[2]:m[3]),c=new i(e.COORDS_BY_SCREEN,c.slice(1),t.board),d=new i(e.COORDS_BY_SCREEN,d.slice(1),t.board),!h&&!l){if(!u&&p&&!this.isSameDirection(s,n,c)&&!this.isSameDirection(s,n,d))return;if(u&&!p&&!this.isSameDirection(n,s,c)&&!this.isSameDirection(n,s,d))return}h?l||(C=this.isSameDir(s,n,c,d)?d:c):l?v=this.isSameDir(s,n,c,d)?c:d:this.isSameDir(s,n,c,d)?(v=c,C=d):(C=c,v=d),v&&s.setCoordinates(e.COORDS_BY_USER,v.usrCoords.slice(1)),C&&n.setCoordinates(e.COORDS_BY_USER,C.usrCoords.slice(1))}},isSameDir:function(t,e,i,s){var o=e.usrCoords[1]-t.usrCoords[1],n=e.usrCoords[2]-t.usrCoords[2],a=s.usrCoords[1]-i.usrCoords[1],h=s.usrCoords[2]-i.usrCoords[2];return Math.abs(e.usrCoords[0])<r.eps&&(o=e.usrCoords[1],n=e.usrCoords[2]),Math.abs(t.usrCoords[0])<r.eps&&(o=-t.usrCoords[1],n=-t.usrCoords[2]),o*a+n*h>=0},isSameDirection:function(t,e,i){var s,o,n,a,h=!1;return s=e.usrCoords[1]-t.usrCoords[1],o=e.usrCoords[2]-t.usrCoords[2],n=i.usrCoords[1]-t.usrCoords[1],a=i.usrCoords[2]-t.usrCoords[2],Math.abs(s)<r.eps&&(s=0),Math.abs(o)<r.eps&&(o=0),Math.abs(n)<r.eps&&(n=0),Math.abs(a)<r.eps&&(a=0),s>=0&&n>=0?h=o>=0&&a>=0||0>=o&&0>=a:0>=s&&0>=n&&(h=o>=0&&a>=0||0>=o&&0>=a),h},meet:function(t,e,i,s){var o,n=r.eps;return o=n>Math.abs(t[3])&&n>Math.abs(e[3])?this.meetLineLine(t,e,i,s):Math.abs(t[3])>=n&&n>Math.abs(e[3])?this.meetLineCircle(e,t,i,s):n>Math.abs(t[3])&&Math.abs(e[3])>=n?this.meetLineCircle(t,e,i,s):this.meetCircleCircle(t,e,i,s)},meetLineLine:function(t,s,o,n){var a=r.crossProduct(t,s);return Math.abs(a[0])>r.eps&&(a[1]/=a[0],a[2]/=a[0],a[0]=1),new i(e.COORDS_BY_USER,a,n)},meetLineCircle:function(t,s,o,n){var a,h,l,c,d,u,p,f,m,b;return s[4]<r.eps?Math.abs(r.innerProduct([1,s[6],s[7]],t,3))<r.eps?new i(e.COORDS_BY_USER,s.slice(6,8),n):new i(e.COORDS_BY_USER,[0/0,0/0],n):(l=s[0],h=s.slice(1,3),a=s[3],c=t[0],d=t.slice(1,3),u=a,p=h[0]*d[1]-h[1]*d[0],f=a*c*c-(h[0]*d[0]+h[1]*d[1])*c+l,m=p*p-4*u*f,m>=0?(m=Math.sqrt(m),b=[(-p+m)/(2*u),(-p-m)/(2*u)],0===o?new i(e.COORDS_BY_USER,[-b[0]*-d[1]-c*d[0],-b[0]*d[0]-c*d[1]],n):new i(e.COORDS_BY_USER,[-b[1]*-d[1]-c*d[0],-b[1]*d[0]-c*d[1]],n)):new i(e.COORDS_BY_USER,[0,0,0],n))},meetCircleCircle:function(t,s,o,n){var a;return t[4]<r.eps?Math.abs(this.distance(t.slice(6,2),s.slice(6,8))-s[4])<r.eps?new i(e.COORDS_BY_USER,t.slice(6,8),n):new i(e.COORDS_BY_USER,[0,0,0],n):s[4]<r.eps?Math.abs(this.distance(s.slice(6,2),t.slice(6,8))-t[4])<r.eps?new i(e.COORDS_BY_USER,s.slice(6,8),n):new i(e.COORDS_BY_USER,[0,0,0],n):(a=[s[3]*t[0]-t[3]*s[0],s[3]*t[1]-t[3]*s[1],s[3]*t[2]-t[3]*s[2],0,1,1/0,1/0,1/0],a=r.normalize(a),this.meetLineCircle(a,t,o,n))},meetCurveCurve:function(t,r,n,a,h,l){var c;return c=o.exists(l)&&"newton"===l?s.generalizedNewton(t,r,n,a):3===t.bezierDegree&&3===r.bezierDegree?this.meetBezierCurveRedBlueSegments(t,r,n):this.meetCurveRedBlueSegments(t,r,n),new i(e.COORDS_BY_USER,c,h)},meetCurveLine:function(t,i,r,s,n){var a,h,l=[0,0/0,0/0];return o.exists(s)||(s=t.board),t.elementClass===e.OBJECT_CLASS_CURVE?(a=t,h=i):(a=i,h=t),l="plot"===a.visProp.curvetype?this.meetCurveLineDiscrete(a,h,r,s,n):this.meetCurveLineContinuous(a,h,r,s)},meetCurveLineContinuous:function(t,o,n,a){var h,l,c,d,u,p,f,m,b,g,v,C;if(d=function(e){return o.stdform[0]+o.stdform[1]*t.X(e)+o.stdform[2]*t.Y(e)},this.meetCurveLineContinuous.t1memo?(b=this.meetCurveLineContinuous.t1memo,h=s.root(d,b)):(b=t.minX(),g=t.maxX(),h=s.root(d,[b,g])),this.meetCurveLineContinuous.t1memo=h,v=t.X(h),C=t.Y(h),1===n){if(this.meetCurveLineContinuous.t2memo&&(b=this.meetCurveLineContinuous.t2memo,l=s.root(d,b)),!(Math.abs(l-h)>.1&&Math.abs(v-t.X(l))>.1&&Math.abs(C-t.Y(l))>.1))for(f=20,m=(t.maxX()-t.minX())/f,p=t.minX(),c=0;f>c&&(l=s.root(d,[p,p+m]),!(Math.abs(l-h)>.1&&Math.abs(v-t.X(l))>.1&&Math.abs(C-t.Y(l))>.1));c++)p+=m;h=l,this.meetCurveLineContinuous.t2memo=h}return u=Math.abs(d(h))>r.eps?0/0:1,new i(e.COORDS_BY_USER,[u,t.X(h),t.Y(h)],a)},meetCurveLineDiscrete:function(t,s,o,n,a){var h,l,c,d,u,p,f,m,b=0,g=t.numberPoints;for(u=new i(e.COORDS_BY_USER,[0,0/0,0/0],n),d=t.points[0].usrCoords,h=1;g>h;h++)if(c=d.slice(0),d=t.points[h].usrCoords,p=this.distance(c,d),p>r.eps)for(3===t.bezierDegree?(f=this.meetBeziersegmentBeziersegment([t.points[h-1].usrCoords.slice(1),t.points[h].usrCoords.slice(1),t.points[h+1].usrCoords.slice(1),t.points[h+2].usrCoords.slice(1)],[s.point1.coords.usrCoords.slice(1),s.point2.coords.usrCoords.slice(1)]),h+=2):f=[this.meetSegmentSegment(c,d,s.point1.coords.usrCoords,s.point2.coords.usrCoords)],l=0;f.length>l;l++)if(m=f[l],m[1]>=0&&1>=m[1]){if(b===o)return a&&(!s.visProp.straightfirst&&0>m[2]||!s.visProp.straightlast&&m[2]>1)?u:u=new i(e.COORDS_BY_USER,m[0],n);b+=1}return u},meetCurveRedBlueSegments:function(t,e,i){var r,s,o,n,a,h,l,c,d,u=0,p=e.points.length,f=t.points.length;if(1>=p||1>=f)return[0,0/0,0/0];for(r=1;f>r;r++)for(o=t.points[r-1].usrCoords,n=t.points[r].usrCoords,c=Math.min(o[1],n[1]),d=Math.max(o[1],n[1]),h=e.points[0].usrCoords,s=1;p>s;s++)if(a=h,h=e.points[s].usrCoords,d>Math.min(a[1],h[1])&&Math.max(a[1],h[1])>c&&(l=this.meetSegmentSegment(o,n,a,h),l[1]>=0&&l[2]>=0&&(1>l[1]&&1>l[2]||r===f-1&&1===l[1]||s===p-1&&1===l[2]))){if(u===i)return l[0];u++}return[0,0/0,0/0]},meetSegmentSegment:function(t,e,i,s){var o,n,a,h=r.crossProduct(t,e),l=r.crossProduct(i,s),c=r.crossProduct(h,l),d=c[0];return Math.abs(d)<r.eps?[c,1/0,1/0]:(a=[i[1]-t[1],i[2]-t[2]],o=(a[0]*(s[2]-i[2])-a[1]*(s[1]-i[1]))/d,n=(a[0]*(e[2]-t[2])-a[1]*(e[1]-t[1]))/d,[c,o,n])},_bezierSplit:function(t){var e,i,r,s,o,n;return e=[.5*(t[0][0]+t[1][0]),.5*(t[0][1]+t[1][1])],i=[.5*(t[1][0]+t[2][0]),.5*(t[1][1]+t[2][1])],r=[.5*(t[2][0]+t[3][0]),.5*(t[2][1]+t[3][1])],s=[.5*(e[0]+i[0]),.5*(e[1]+i[1])],o=[.5*(i[0]+r[0]),.5*(i[1]+r[1])],n=[.5*(s[0]+o[0]),.5*(s[1]+o[1])],[[t[0],e,s,n],[n,o,r,t[3]]]},_bezierBbox:function(t){var e=[];return 4===t.length?(e[0]=Math.min(t[0][0],t[1][0],t[2][0],t[3][0]),e[1]=Math.max(t[0][1],t[1][1],t[2][1],t[3][1]),e[2]=Math.max(t[0][0],t[1][0],t[2][0],t[3][0]),e[3]=Math.min(t[0][1],t[1][1],t[2][1],t[3][1])):(e[0]=Math.min(t[0][0],t[1][0]),e[1]=Math.max(t[0][1],t[1][1]),e[2]=Math.max(t[0][0],t[1][0]),e[3]=Math.min(t[0][1],t[1][1])),e},_bezierOverlap:function(t,e){return t[2]>=e[0]&&t[0]<=e[2]&&t[1]>=e[3]&&t[3]<=e[1]},_bezierListConcat:function(t,e,i,r){var s,n=o.exists(r),a=0,h=e.length,l=t.length;for(l>0&&(1===t[l-1][1]&&0===e[0][1]||n&&1===t[l-1][2]&&0===e[0][2])&&(a=1),s=a;h>s;s++)n&&(e[s][2]*=.5,e[s][2]+=r),e[s][1]*=.5,e[s][1]+=i,t.push(e[s])},_bezierMeetSubdivision:function(t,e,i){var r,s,o,n,a,h,l,c,d,u,p,f,m=[],b=5;return s=this._bezierBbox(e),r=this._bezierBbox(t),this._bezierOverlap(s,r)?b>i?(o=this._bezierSplit(t),h=o[0],l=o[1],o=this._bezierSplit(e),n=o[0],a=o[1],this._bezierListConcat(m,this._bezierMeetSubdivision(h,n,i+1),0,0),this._bezierListConcat(m,this._bezierMeetSubdivision(h,a,i+1),0,.5),this._bezierListConcat(m,this._bezierMeetSubdivision(l,n,i+1),.5,0),this._bezierListConcat(m,this._bezierMeetSubdivision(l,a,i+1),.5,.5),m):(p=[1].concat(t[0]),f=[1].concat(t[3]),d=[1].concat(e[0]),u=[1].concat(e[3]),c=this.meetSegmentSegment(p,f,d,u),c[1]>=0&&c[2]>=0&&1>=c[1]&&1>=c[2]?[c]:[]):[]},_bezierLineMeetSubdivision:function(t,e,i){var r,s,o,n,a,h,l,c,d,u,p=[],f=5;return r=this._bezierBbox(e),s=this._bezierBbox(t),this._bezierOverlap(s,r)?f>i?(o=this._bezierSplit(t),n=o[0],a=o[1],this._bezierListConcat(p,this._bezierLineMeetSubdivision(n,e,i+1),0),this._bezierListConcat(p,this._bezierLineMeetSubdivision(a,e,i+1),.5),p):(d=[1].concat(t[0]),u=[1].concat(t[3]),l=[1].concat(e[0]),c=[1].concat(e[1]),h=this.meetSegmentSegment(d,u,l,c),h[1]>=0&&h[2]>=0&&1>=h[1]&&1>=h[2]?[h]:[]):[]},meetBeziersegmentBeziersegment:function(t,e){var i,r,s;for(i=4===t.length&&4===e.length?this._bezierMeetSubdivision(t,e,0):this._bezierLineMeetSubdivision(t,e,0),i.sort(function(t,e){return 1e7*(t[1]-e[1])+(t[2]-e[2])}),r=[],s=0;i.length>s;s++)(0===s||i[s][1]!==i[s-1][1]||i[s][2]!==i[s-1][2])&&r.push(i[s]);return r},meetBezierCurveRedBlueSegments:function(t,e,i){var r,s,o,n,a,h,l,c=e.points.length,d=t.points.length,u=[];if(4>c||4>d)return[0,0/0,0/0];for(s=0;d-3>s;s+=3)for(r=t.points,n=[[r[s].usrCoords[1],r[s].usrCoords[2]],[r[s+1].usrCoords[1],r[s+1].usrCoords[2]],[r[s+2].usrCoords[1],r[s+2].usrCoords[2]],[r[s+3].usrCoords[1],r[s+3].usrCoords[2]]],h=this._bezierBbox(n),o=0;c-3>o;o+=3)if(r=e.points,a=[[r[o].usrCoords[1],r[o].usrCoords[2]],[r[o+1].usrCoords[1],r[o+1].usrCoords[2]],[r[o+2].usrCoords[1],r[o+2].usrCoords[2]],[r[o+3].usrCoords[1],r[o+3].usrCoords[2]]],l=this._bezierBbox(a),this._bezierOverlap(h,l)&&(u=u.concat(this.meetBeziersegmentBeziersegment(n,a)),u.length>i))return u[i][0];return u.length>i?u[i][0]:[0,0/0,0/0]},bezierSegmentEval:function(t,e){var i,r,s,o=1-t;return r=0,s=0,i=o*o*o,r+=i*e[0][0],s+=i*e[0][1],i=3*t*o*o,r+=i*e[1][0],s+=i*e[1][1],i=3*t*t*o,r+=i*e[2][0],s+=i*e[2][1],i=t*t*t,r+=i*e[3][0],s+=i*e[3][1],[1,r,s]},projectPointToCircle:function(t,s,n){var a,h,l,c,d,u=s.center.coords.usrCoords;return o.exists(n)||(n=t.board),o.isPoint(t)?(a=t.coords.distance(e.COORDS_BY_USER,s.center.coords),h=t.coords.usrCoords):(a=t.distance(e.COORDS_BY_USER,s.center.coords),h=t.usrCoords),Math.abs(a)<r.eps&&(a=r.eps),d=s.Radius()/a,l=u[1]+d*(h[1]-u[1]),c=u[2]+d*(h[2]-u[2]),new i(e.COORDS_BY_USER,[l,c],n)},projectPointToLine:function(t,e,i){var s=[0,e.stdform[1],e.stdform[2]];return o.exists(i)||(i=t.board),s=r.crossProduct(s,t.coords.usrCoords),this.meetLineLine(s,e.stdform,0,i)},projectCoordsToSegment:function(t,e,i){var s,o,n=[i[1]-e[1],i[2]-e[2]],a=[t[1]-e[1],t[2]-e[2]];return Math.abs(n[0])<r.eps&&Math.abs(n[1])<r.eps?e:(s=r.innerProduct(a,n),o=r.innerProduct(n,n),s/=o,[[1,s*n[0]+e[1],s*n[1]+e[2]],s])},projectCoordsToBeziersegment:function(e,i,r){var s,o=function(t){var s=[1,i.X(r+t),i.Y(r+t)];return s[1]-=e[1],s[2]-=e[2],s[1]*s[1]+s[2]*s[2]};return s=t.Math.Numerics.fminbr(o,[0,1]),[[1,i.X(s+r),i.Y(s+r)],s]},projectPointToCurve:function(t,e,i){o.exists(i)||(i=t.board);var r=t.X(),s=t.Y(),n=t.position||0,a=this.projectCoordsToCurve(r,s,n,e,i);return t.position=a[1],a[0]},projectCoordsToCurve:function(t,r,n,a,h){var l,c,d,u,p,f,m,b,g,v,C,y,P,_,E,S,O,T=Number.POSITIVE_INFINITY;if(o.exists(h)||(h=a.board),"plot"===a.visProp.curvetype){if(n=0,d=T,l=0===a.numberPoints?[0,1,1]:[a.Z(0),a.X(0),a.Y(0)],a.numberPoints>1)for(g=[a.Z(0),a.X(0),a.Y(0)],c=0;a.numberPoints-1>c;c++)v=[a.Z(c+1),a.X(c+1),a.Y(c+1)],f=[1,t,r],C=this.projectCoordsToSegment(f,g,v),p=C[1],m=C[0],p>=0&&1>=p?(u=this.distance(m,f),b=c+p):0>p?(m=g,u=this.distance(g,f),b=c):p>1&&c===a.numberPoints-2&&(m=v,u=this.distance(m,f),b=a.numberPoints-1),d>u&&(d=u,n=b,l=m),g=v;l=new i(e.COORDS_BY_USER,l,h)}else{for(y=function(e){var i=t-a.X(e),s=r-a.Y(e);return i*i+s*s},E=y(n),O=50,S=(a.maxX()-a.minX())/O,P=a.minX(),c=0;O>c;c++)_=y(P),E>_&&(n=P,E=_),P+=S;n=s.fminbr(y,[n-S,n+S]),a.minX()>n&&(n=a.maxX()+n-a.minX()),n>a.maxX()&&(n=a.minX()+n-a.maxX()),l=new i(e.COORDS_BY_USER,[a.X(n),a.Y(n)],h)}return[a.updateTransform(l),n]},projectPointToTurtle:function(t,r,s){var n,a,h,l,c,d,u,p,f=0,m=0,b=Number.POSITIVE_INFINITY,g=r.objects.length;for(o.exists(s)||(s=t.board),c=0;g>c;c++)u=r.objects[c],u.elementClass===e.OBJECT_CLASS_CURVE&&(n=this.projectPointToCurve(t,u),d=this.distance(n.usrCoords,t.coords.usrCoords),b>d&&(h=n.usrCoords[1],l=n.usrCoords[2],a=t.position,b=d,p=u,m=f),f+=u.numberPoints);return n=new i(e.COORDS_BY_USER,[h,l],s),t.position=a+m,p.updateTransform(n)},projectPointToPoint:function(t,e){return e.coords},projectPointToBoard:function(t,e){var i,s,o,n=e||t.board,a=[[1,1,0,0,3,0,1],[-1,2,1,0,1,2,1],[-1,1,2,2,1,2,3],[1,2,3,0,3,2,3]],h=t.coords||t,l=n.getBoundingBox();for(i=0;4>i;i++)o=a[i],o[0]*h.usrCoords[o[1]]<o[0]*l[o[2]]&&(s=r.crossProduct([1,l[o[3]],l[o[4]]],[1,l[o[5]],l[o[6]]]),s[3]=0,s=r.normalize(s),h=this.projectPointToLine({coords:h,board:n},{stdform:s}));return h},distPointLine:function(t,e){var i,s=e[1],o=e[2],n=e[0];return Math.abs(s)+Math.abs(o)<r.eps?Number.POSITIVE_INFINITY:(i=s*t[1]+o*t[2]+n,s*=s,o*=o,Math.abs(i)/Math.sqrt(s+o))},reuleauxPolygon:function(t,e){var i,s=2*Math.PI,o=s/e,n=(e-1)/2,a=0,h=function(h,l){return function(c,d){var u=(c%s+s)%s,p=Math.floor(u/o)%e;return d||(a=t[0].Dist(t[n]),i=r.Geometry.rad([t[0].X()+1,t[0].Y()],t[0],t[n%e])),isNaN(p)?p:(u=.5*u+.5*p*o+i,t[p][h]()+a*Math[l](u))}};return[h("X","cos"),h("Y","sin"),0,s]}}),r.Geometry}),define("parser/geonext",["jxg","base/constants","utils/type"],function(t,e,i){return t.GeonextParser={replacePow:function(t){var e,i,r,s,o,n,a,h,l,c,d;for(t=t.replace(/(\s*)\^(\s*)/g,"^"),l=t.indexOf("^");l>=0;){if(h=t.slice(0,l),c=t.slice(l+1),")"===h.charAt(h.length-1)){for(e=1,i=h.length-2;i>=0&&e>0;)r=h.charAt(i),")"===r?e++:"("===r&&(e-=1),i-=1;if(0!==e)throw Error("JSXGraph: Missing '(' in expression");for(s="",n=h.substring(0,i+1),a=i;a>=0&&n.substr(a,1).match(/([\w\.]+)/);)s=RegExp.$1+s,a-=1;s+=h.substring(i+1,h.length),s=s.replace(/([\(\)\+\*\%\^\-\/\]\[])/g,"\\$1")}else s="[\\w\\.]+";if(c.match(/^([\w\.]*\()/)){for(e=1,i=RegExp.$1.length;c.length>i&&e>0;)r=c.charAt(i),")"===r?e-=1:"("===r&&(e+=1),i+=1;if(0!==e)throw Error("JSXGraph: Missing ')' in expression");o=c.substring(0,i),o=o.replace(/([\(\)\+\*\%\^\-\/\[\]])/g,"\\$1")}else o="[\\w\\.]+";d=RegExp("("+s+")\\^("+o+")"),t=t.replace(d,"pow($1,$2)"),l=t.indexOf("^")}return t},replaceIf:function(t){var e,i,r,s,o,n,a,h,l,c="",d=null,u=null,p=null;if(r=t.indexOf("If("),0>r)return t;for(t=t.replace(/""/g,"0");r>=0;){for(e=t.slice(0,r),i=t.slice(r+3),o=1,s=0,n=-1,a=-1;i.length>s&&o>0;)h=i.charAt(s),")"===h?o-=1:"("===h?o+=1:","===h&&1===o&&(0>n?n=s:a=s),s+=1;if(l=i.slice(0,s-1),i=i.slice(s),0>n)return"";if(0>a)return"";d=l.slice(0,n),u=l.slice(n+1,a),p=l.slice(a+1),d=this.replaceIf(d),u=this.replaceIf(u),p=this.replaceIf(p),c+=e+"(("+d+")?"+"("+u+"):("+p+"))",t=i,d=null,u=null,r=t.indexOf("If(")}return c+=i},replaceNameById:function(t,e,i){var r,s,o,n,a=0,h=["X","Y","L","V"],l=function(t){return i?"$('"+t+"')":t};for(n=0;h.length>n;n++)for(a=t.indexOf(h[n]+"(");a>=0;)a>=0&&(r=t.indexOf(")",a+2),r>=0&&(s=t.slice(a+2,r),s=s.replace(/\\(['"])?/g,"$1"),o=e.elementsByName[s],o&&(t=t.slice(0,a+2)+(i?"$('":"")+l(o.id)+t.slice(r)))),r=t.indexOf(")",a+2),a=t.indexOf(h[n]+"(",r);for(a=t.indexOf("Dist(");a>=0;)a>=0&&(r=t.indexOf(",",a+5),r>=0&&(s=t.slice(a+5,r),s=s.replace(/\\(['"])?/g,"$1"),o=e.elementsByName[s],o&&(t=t.slice(0,a+5)+l(o.id)+t.slice(r)))),r=t.indexOf(",",a+5),a=t.indexOf(",",r),r=t.indexOf(")",a+1),r>=0&&(s=t.slice(a+1,r),s=s.replace(/\\(['"])?/g,"$1"),o=e.elementsByName[s],o&&(t=t.slice(0,a+1)+l(o.id)+t.slice(r))),r=t.indexOf(")",a+1),a=t.indexOf("Dist(",r);for(h=["Deg","Rad"],n=0;h.length>n;n++)for(a=t.indexOf(h[n]+"(");a>=0;)a>=0&&(r=t.indexOf(",",a+4),r>=0&&(s=t.slice(a+4,r),s=s.replace(/\\(['"])?/g,"$1"),o=e.elementsByName[s],o&&(t=t.slice(0,a+4)+l(o.id)+t.slice(r)))),r=t.indexOf(",",a+4),a=t.indexOf(",",r),r=t.indexOf(",",a+1),r>=0&&(s=t.slice(a+1,r),s=s.replace(/\\(['"])?/g,"$1"),o=e.elementsByName[s],o&&(t=t.slice(0,a+1)+l(o.id)+t.slice(r))),r=t.indexOf(",",a+1),a=t.indexOf(",",r),r=t.indexOf(")",a+1),r>=0&&(s=t.slice(a+1,r),s=s.replace(/\\(['"])?/g,"$1"),o=e.elementsByName[s],o&&(t=t.slice(0,a+1)+l(o.id)+t.slice(r))),r=t.indexOf(")",a+1),a=t.indexOf(h[n]+"(",r);return t},replaceIdByObj:function(t){var e=/(X|Y|L)\(([\w_]+)\)/g;return t=t.replace(e,"$('$2').$1()"),e=/(V)\(([\w_]+)\)/g,t=t.replace(e,"$('$2').Value()"),e=/(Dist)\(([\w_]+),([\w_]+)\)/g,t=t.replace(e,"dist($('$2'), $('$3'))"),e=/(Deg)\(([\w_]+),([ \w\[\w_]+),([\w_]+)\)/g,t=t.replace(e,"deg($('$2'),$('$3'),$('$4'))"),e=/Rad\(([\w_]+),([\w_]+),([\w_]+)\)/g,t=t.replace(e,"rad($('$1'),$('$2'),$('$3'))"),e=/N\((.+)\)/g,t=t.replace(e,"($1)")},geonext2JS:function(t,e){var i,r,s,o=["Abs","ACos","ASin","ATan","Ceil","Cos","Exp","Factorial","Floor","Log","Max","Min","Random","Round","Sin","Sqrt","Tan","Trunc"],n=["abs","acos","asin","atan","ceil","cos","exp","factorial","floor","log","max","min","random","round","sin","sqrt","tan","ceil"];for(t=t.replace(/&lt;/g,"<"),t=t.replace(/&gt;/g,">"),t=t.replace(/&amp;/g,"&"),r=t,r=this.replaceNameById(r,e),r=this.replaceIf(r),r=this.replacePow(r),r=this.replaceIdByObj(r),s=0;o.length>s;s++)i=RegExp(["(\\W|^)(",o[s],")"].join(""),"ig"),r=r.replace(i,["$1",n[s]].join(""));return r=r.replace(/True/g,"true"),r=r.replace(/False/g,"false"),r=r.replace(/fasle/g,"false"),r=r.replace(/Pi/g,"PI"),r=r.replace(/"/g,"'")},findDependencies:function(t,r,s){var o,n,a,h;i.exists(s)||(s=t.board),o=s.elementsByName;for(n in o)o.hasOwnProperty(n)&&n!==t.name&&(o[n].type===e.OBJECT_TYPE_TEXT?o[n].visProp.islabel||(h=n.replace(/\[/g,"\\["),h=h.replace(/\]/g,"\\]"),a=RegExp("\\(([\\w\\[\\]'_ ]+,)*("+h+")(,[\\w\\[\\]'_ ]+)*\\)","g"),r.search(a)>=0&&o[n].addChild(t)):(h=n.replace(/\[/g,"\\["),h=h.replace(/\]/g,"\\]"),a=RegExp("\\(([\\w\\[\\]'_ ]+,)*("+h+")(,[\\w\\[\\]'_ ]+)*\\)","g"),r.search(a)>=0&&o[n].addChild(t)))},gxt2jc:function(t,e){var i;return t=t.replace(/&lt;/g,"<"),t=t.replace(/&gt;/g,">"),t=t.replace(/&amp;/g,"&"),i=t,i=this.replaceNameById(i,e,!0),i=i.replace(/True/g,"true"),i=i.replace(/False/g,"false"),i=i.replace(/fasle/g,"false")}},t.GeonextParser}),define("base/element",["jxg","base/constants","base/coords","math/math","options","parser/geonext","utils/event","utils/color","utils/type"],function(t,e,i,r,s,o,n,a,h){return t.GeometryElement=function(t,i,r,s){var o,a,l;if(this.needsUpdate=!0,this.isDraggable=!1,this.isReal=!0,this.childElements={},this.hasLabel=!1,this.highlighted=!1,this.notExistingParents={},this.traces={},this.numTraces=0,this.transformations=[],this.baseElement=null,this.descendants={},this.ancestors={},this.symbolic={},this.rendNode=null,this.elType="",this.dump=!0,this.subs={},this._pos=-1,this.stdform=[1,0,0,0,1,1,0,0],this.methodMap={setLabel:"setLabelText",label:"label",getName:"getName",addTransform:"addTransform",setProperty:"setAttribute",setAttribute:"setAttribute",animate:"animate",on:"on",off:"off",trigger:"trigger"},this.quadraticform=[[1,0,0],[0,1,0],[0,0,1]],this.visProp={},n.eventify(this),this.mouseover=!1,arguments.length>0){this.board=t,this.type=r,this.elementClass=s||e.OBJECT_CLASS_OTHER,this.id=i.id,o=i.name,h.exists(o)||(o=this.board.generateName(this)),""!==o&&(this.board.elementsByName[o]=this),this.name=o,this.needsRegularUpdate=i.needsregularupdate,h.clearVisPropOld(this),l=this.resolveShortcuts(i);for(a in l)l.hasOwnProperty(a)&&this._set(a,l[a]);this.visProp.draft=l.draft&&l.draft.draft,this.visProp.gradientangle="270",this.visProp.gradientsecondopacity=this.visProp.fillopacity,this.visProp.gradientpositionx=.5,this.visProp.gradientpositiony=.5}},t.extend(t.GeometryElement.prototype,{addChild:function(t){var e,i;this.childElements[t.id]=t,this.addDescendants(t),t.ancestors[this.id]=this;for(e in this.descendants)if(this.descendants.hasOwnProperty(e)){this.descendants[e].ancestors[this.id]=this;for(i in this.ancestors)this.ancestors.hasOwnProperty(i)&&(this.descendants[e].ancestors[this.ancestors[i].id]=this.ancestors[i])}for(e in this.ancestors)if(this.ancestors.hasOwnProperty(e))for(i in this.descendants)this.descendants.hasOwnProperty(i)&&(this.ancestors[e].descendants[this.descendants[i].id]=this.descendants[i]);return this},addDescendants:function(t){var e;this.descendants[t.id]=t;for(e in t.childElements)t.childElements.hasOwnProperty(e)&&this.addDescendants(t.childElements[e]);return this},countChildren:function(){var t,e,i=0;e=this.childElements;for(t in e)e.hasOwnProperty(t)&&0>t.indexOf("Label")&&i++;return i},getName:function(){return this.name},addTransform:function(){return this},draggable:function(){return this.isDraggable&&!this.visProp.fixed&&!this.visProp.frozen&&this.type!==e.OBJECT_TYPE_GLIDER},generatePolynomial:function(){return[]},animate:function(t,i,r){r=r||{};var s,o,n,h=this.board.attr.animationdelay,l=Math.ceil(i/h),c=this,d=function(t,e,i){var r,s,o,h,d;for(r=a.rgb2hsv(t),s=a.rgb2hsv(e),o=(s[0]-r[0])/l,h=(s[1]-r[1])/l,d=(s[2]-r[2])/l,c.animationData[i]=[],n=0;l>n;n++)c.animationData[i][l-n-1]=a.hsv2rgb(r[0]+(n+1)*o,r[1]+(n+1)*h,r[2]+(n+1)*d)},u=function(t,e,i,r){var s,o;if(t=parseFloat(t),e=parseFloat(e),!isNaN(t)&&!isNaN(e))for(o=(e-t)/l,c.animationData[i]=[],n=0;l>n;n++)s=t+(n+1)*o,c.animationData[i][l-n-1]=r?Math.floor(s):s};this.animationData={};for(s in t)if(t.hasOwnProperty(s))switch(o=s.toLowerCase()){case"strokecolor":case"fillcolor":d(this.visProp[o],t[s],o);break;case"size":if(this.elementClass!==e.OBJECT_CLASS_POINT)break;u(this.visProp[o],t[s],o,!0);break;case"strokeopacity":case"strokewidth":case"fillopacity":u(this.visProp[o],t[s],o,!1)}return this.animationCallback=r.callback,this.board.addAnimation(this),this},update:function(){return this.visProp.trace&&this.cloneToBackground(),this},updateRenderer:function(){return this},hideElement:function(){return this.visProp.visible=!1,this.board.renderer.hide(this),h.exists(this.label)&&this.hasLabel&&(this.label.hiddenByParent=!0,this.label.visProp.visible&&this.label.hideElement()),this},showElement:function(){return this.visProp.visible=!0,this.board.renderer.show(this),h.exists(this.label)&&this.hasLabel&&this.label.hiddenByParent&&(this.label.hiddenByParent=!1,this.label.visProp.visible||this.label.showElement().updateRenderer()),this},_set:function(t,e){t=t.toLocaleLowerCase(),this.visProp.hasOwnProperty(t)&&t.indexOf("color")>=0&&h.isString(e)&&9===e.length&&"#"===e.charAt(0)?(e=a.rgba2rgbo(e),this.visProp[t]=e[0],this.visProp[t.replace("color","opacity")]=e[1]):this.visProp[t]=e},resolveShortcuts:function(t){var e,i;for(e in s.shortcuts)if(s.shortcuts.hasOwnProperty(e)&&h.exists(t[e]))for(i=0;s.shortcuts[e].length>i;i++)h.exists(t[s.shortcuts[e][i]])||(t[s.shortcuts[e][i]]=t[e]);return t},setLabelText:function(t){return t=t.replace(/</g,"&lt;").replace(/>/g,"&gt;"),null!==this.label&&this.label.setText(t),this},setProperty:t.shortcut(t.GeometryElement.prototype,"setAttribute"),setAttribute:function(){var i,r,s,o,n,l,c,d={},u=function(t){return function(){return t}};for(i=0;arguments.length>i;i++)o=arguments[i],h.isString(o)?(l=o.split(":"),d[h.trim(l[0])]=h.trim(l[1])):h.isArray(o)?d[o[0]]=o[1]:t.extend(d,o);d=this.resolveShortcuts(d);for(i in d)if(d.hasOwnProperty(i)){switch(r=i.replace(/\s+/g,"").toLowerCase(),s=d[i],c=this.visProp[r],r){case"name":c=this.name,delete this.board.elementsByName[this.name],this.name=s,this.board.elementsByName[this.name]=this;break;case"needsregularupdate":this.needsRegularUpdate=!("false"===s||s===!1),this.board.renderer.setBuffering(this,this.needsRegularUpdate?"auto":"static");break;case"labelcolor":s=a.rgba2rgbo(s),n=s[1],s=s[0],0===n&&h.exists(this.label)&&this.hasLabel&&this.label.hideElement(),h.exists(this.label)&&this.hasLabel&&(this.label.visProp.strokecolor=s,this.board.renderer.setObjectStrokeColor(this.label,s,n)),this.type===e.OBJECT_TYPE_TEXT&&(this.visProp.strokecolor=s,this.visProp.strokeopacity=n,this.board.renderer.setObjectStrokeColor(this,this.visProp.strokecolor,this.visProp.strokeopacity));break;case"infoboxtext":this.infoboxText="string"==typeof s?s:!1;break;case"visible":"false"===s||s===!1?(this.visProp.visible=!1,this.hideElement()):("true"===s||s===!0)&&(this.visProp.visible=!0,this.showElement());break;case"face":this.elementClass===e.OBJECT_CLASS_POINT&&(this.visProp.face=s,this.board.renderer.changePointStyle(this));break;case"trace":"false"===s||s===!1?(this.clearTrace(),this.visProp.trace=!1):this.visProp.trace=!0;break;case"gradient":this.visProp.gradient=s,this.board.renderer.setGradient(this);break;case"gradientsecondcolor":s=a.rgba2rgbo(s),this.visProp.gradientsecondcolor=s[0],this.visProp.gradientsecondopacity=s[1],this.board.renderer.updateGradient(this);break;case"gradientsecondopacity":this.visProp.gradientsecondopacity=s,this.board.renderer.updateGradient(this);break;case"withlabel":this.visProp.withlabel=s,s?this.label?this.visProp.visible&&this.label.showElement():(this.createLabel(),this.visProp.visible||this.label.hideElement()):this.label&&this.hasLabel&&this.label.hideElement(),this.hasLabel=s;break;case"rotate":(this.type===e.OBJECT_TYPE_TEXT&&"internal"===this.visProp.display||this.type===e.OBJECT_TYPE_IMAGE)&&this.addRotation(s);break;case"ticksdistance":this.type===e.OBJECT_TYPE_TICKS&&"number"==typeof s&&(this.ticksFunction=u(s));break;case"generatelabelvalue":this.type===e.OBJECT_TYPE_TICKS&&"function"==typeof s&&(this.generateLabelValue=s);break;case"onpolygon":this.type===e.OBJECT_TYPE_GLIDER&&(this.onPolygon=!!s);break;default:h.exists(this.visProp[r])&&(!t.Validator[r]||t.Validator[r]&&t.Validator[r](s)||t.Validator[r]&&h.isFunction(s)&&t.Validator[r](s()))&&(s=s.toLowerCase&&"false"===s.toLowerCase()?!1:s,this._set(r,s))}this.triggerEventHandlers(["attribute:"+r],[c,s,this])}return this.triggerEventHandlers(["attribute"],[d,this]),this.visProp.needsregularupdate?this.board.update(this):this.board.fullUpdate(),this},getProperty:t.shortcut(t.GeometryElement.prototype,"getAttribute"),getAttribute:function(t){var e;switch(t=t.toLowerCase()){case"needsregularupdate":e=this.needsRegularUpdate;break;case"labelcolor":e=this.label.visProp.strokecolor;break;case"infoboxtext":e=this.infoboxText;break;case"withlabel":e=this.hasLabel;break;default:e=this.visProp[t]}return e},setDash:function(t){return this.setAttribute({dash:t}),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.id)),this},getTextAnchor:function(){return new i(e.COORDS_BY_USER,[0,0],this.board)},getLabelAnchor:function(){return new i(e.COORDS_BY_USER,[0,0],this.board)},setArrow:function(t,e){return this.visProp.firstarrow=t,this.visProp.lastarrow=e,this.prepareUpdate().update(),this},createGradient:function(){("linear"===this.visProp.gradient||"radial"===this.visProp.gradient)&&this.board.renderer.setGradient(this)},createLabel:function(){var e;return t.elements.text?(e=h.deepCopy(this.visProp.label,null),e.id=this.id+"Label",e.isLabel=!0,e.visible=this.visProp.visible,e.anchor=this,e.priv=this.visProp.priv,this.visProp.withlabel&&(this.label=t.elements.text(this.board,[0,0,this.name],e),this.label.needsUpdate=!0,this.label.update(),this.label.dump=!1,this.visProp.visible||(this.label.hiddenByParent=!0,this.label.visProp.visible=!1),this.hasLabel=!0)):t.debug("JSXGraph: Can't create label: text element is not available. Make sure you include base/text"),this},highlight:function(t){return t=h.def(t,!1),!this.visProp.highlight||this.highlighted&&!t||(this.highlighted=!0,this.board.highlightedObjects[this.id]=this,this.board.renderer.highlight(this)),this},noHighlight:function(){return this.highlighted&&(this.highlighted=!1,delete this.board.highlightedObjects[this.id],this.board.renderer.noHighlight(this)),this},clearTrace:function(){var t;for(t in this.traces)this.traces.hasOwnProperty(t)&&this.board.renderer.remove(this.traces[t]);return this.numTraces=0,this},cloneToBackground:function(){return this},bounds:function(){return[0,0,0,0]},normalize:function(){return this.stdform=r.normalize(this.stdform),this},toJSON:function(){var t,e,i=['{"name":',this.name];i.push(', "id":'+this.id),t=[];for(e in this.visProp)this.visProp.hasOwnProperty(e)&&h.exists(this.visProp[e])&&t.push('"'+e+'":'+this.visProp[e]);return i.push(', "visProp":{'+(""+t)+"}"),i.push("}"),i.join("")},addRotation:function(t){var i,r,s,o,n,a=this;return(this.type===e.OBJECT_TYPE_TEXT&&"internal"===this.visProp.display||this.type===e.OBJECT_TYPE_IMAGE)&&0!==t&&(i=this.board.create("transform",[function(){return-a.X()},function(){return-a.Y()}],{type:"translate"}),r=this.board.create("transform",[function(){return a.X()},function(){return a.Y()}],{type:"translate"}),s=this.board.create("transform",[function(){return a.board.unitX/a.board.unitY},function(){return 1}],{type:"scale"}),o=this.board.create("transform",[function(){return a.board.unitY/a.board.unitX},function(){return 1}],{type:"scale"}),n=this.board.create("transform",[t*Math.PI/180],{type:"rotate"}),i.bindTo(this),s.bindTo(this),n.bindTo(this),o.bindTo(this),r.bindTo(this)),this},highlightStrokeColor:function(t){return this.setAttribute({highlightStrokeColor:t}),this},strokeColor:function(t){return this.setAttribute({strokeColor:t}),this},strokeWidth:function(t){return this.setAttribute({strokeWidth:t}),this},fillColor:function(t){return this.setAttribute({fillColor:t}),this},highlightFillColor:function(t){return this.setAttribute({highlightFillColor:t}),this},labelColor:function(t){return this.setAttribute({labelColor:t}),this},dash:function(t){return this.setAttribute({dash:t}),this},visible:function(t){return this.setAttribute({visible:t}),this},shadow:function(t){return this.setAttribute({shadow:t}),this},getType:function(){return this.elType},getParents:function(){return this.parents},snapToGrid:function(){return this},getAttributes:function(){var t,e=h.deepCopy(this.visProp),i=["attractors","snatchdistance","traceattributes","frozen","shadow","gradientangle","gradientsecondopacity","gradientpositionx","gradientpositiony","needsregularupdate","zoom","layer","offset"];for(e.id=this.id,e.name=this.name,t=0;i.length>t;t++)delete e[i[t]];return e},hasPoint:function(){return!1},addEvent:t.shortcut(t.GeometryElement.prototype,"on"),removeEvent:t.shortcut(t.GeometryElement.prototype,"off"),__evt__over:function(){},__evt__mouseover:function(){},__evt__out:function(){},__evt__mouseout:function(){},__evt__move:function(){},__evt__mousemove:function(){},__evt__drag:function(){},__evt__mousedrag:function(){},__evt__touchdrag:function(){},__evt__down:function(){},__evt__mousedown:function(){},__evt__touchdown:function(){},__evt__up:function(){},__evt__mouseup:function(){},__evt__touchup:function(){},__evt__attribute:function(){},__evt__attribute_:function(){},__evt:function(){}}),t.GeometryElement
+}),define("base/transformation",["jxg","base/constants","math/math","utils/type"],function(t,e,i,r){return t.Transformation=function(t,i,r){this.elementClass=e.OBJECT_CLASS_OTHER,this.matrix=[[1,0,0],[0,1,0],[0,0,1]],this.board=t,this.isNumericMatrix=!1,this.setMatrix(t,i,r),this.methodMap={apply:"apply",applyOnce:"applyOnce",bindTo:"bindTo",bind:"bind",melt:"melt"}},t.Transformation.prototype={},t.extend(t.Transformation.prototype,{update:function(){return this},setMatrix:function(t,e,s){var o;for(this.isNumericMatrix=!0,o=0;s.length>o;o++)if("number"!=typeof s[o]){this.isNumericMatrix=!1;break}"translate"===e?(this.evalParam=r.createEvalFunction(t,s,2),this.update=function(){this.matrix[1][0]=this.evalParam(0),this.matrix[2][0]=this.evalParam(1)}):"scale"===e?(this.evalParam=r.createEvalFunction(t,s,2),this.update=function(){this.matrix[1][1]=this.evalParam(0),this.matrix[2][2]=this.evalParam(1)}):"reflect"===e?(4>s.length&&(s[0]=t.select(s[0])),2===s.length&&(s[1]=t.select(s[1])),4===s.length&&(this.evalParam=r.createEvalFunction(t,s,4)),this.update=function(){var t,e,r,o,n,a,h,l;1===s.length?h=s[0].stdform:2===s.length?h=i.crossProduct(s[1].coords.usrCoords,s[0].coords.usrCoords):4===s.length&&(h=i.crossProduct([1,this.evalParam(2),this.evalParam(3)],[1,this.evalParam(0),this.evalParam(1)])),t=h[1],e=h[2],r=h[0],l=[-r*t,-r*e,t*t+e*e],a=l[2],o=l[0]/l[2],n=l[1]/l[2],t=-h[2],e=h[1],this.matrix[1][1]=(t*t-e*e)/a,this.matrix[1][2]=2*t*e/a,this.matrix[2][1]=this.matrix[1][2],this.matrix[2][2]=-this.matrix[1][1],this.matrix[1][0]=o*(1-this.matrix[1][1])-n*this.matrix[1][2],this.matrix[2][0]=n*(1-this.matrix[2][2])-o*this.matrix[2][1]}):"rotate"===e?(3===s.length?this.evalParam=r.createEvalFunction(t,s,3):2>=s.length&&(this.evalParam=r.createEvalFunction(t,s,1),2===s.length&&(s[1]=t.select(s[1]))),this.update=function(){var t,e,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,s.length>1&&(3===s.length?(t=this.evalParam(1),e=this.evalParam(2)):(t=s[1].X(),e=s[1].Y()),this.matrix[1][0]=t*(1-r)+e*o,this.matrix[2][0]=e*(1-r)-t*o)}):"shear"===e?(this.evalParam=r.createEvalFunction(t,s,1),this.update=function(){var t=this.evalParam(0);this.matrix[1][1]=Math.tan(t)}):"generic"===e&&(this.evalParam=r.createEvalFunction(t,s,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(t,e){return this.update(),r.exists(e)?i.matVecMult(this.matrix,t.initialCoords.usrCoords):i.matVecMult(this.matrix,t.coords.usrCoords)},applyOnce:function(t){var s,o,n;for(r.isArray(t)||(t=[t]),o=t.length,n=0;o>n;n++)this.update(),s=i.matVecMult(this.matrix,t[n].coords.usrCoords),t[n].coords.setCoordinates(e.COORDS_BY_USER,s)},bindTo:function(t){var e,i;if(r.isArray(t))for(i=t.length,e=0;i>e;e++)t[e].transformations.push(this);else t.transformations.push(this)},setProperty:function(){},setAttribute:function(){},melt:function(t){var e,i,r,s,o,n,a=[];for(i=t.matrix.length,r=this.matrix[0].length,e=0;i>e;e++)a[e]=[];for(this.update(),t.update(),e=0;i>e;e++)for(n=0;r>n;n++){for(o=0,s=0;i>s;s++)o+=t.matrix[e][s]*this.matrix[s][n];a[e][n]=o}return this.update=function(){var t=this.matrix.length,i=this.matrix[0].length;for(e=0;t>e;e++)for(n=0;i>n;n++)this.matrix[e][n]=a[e][n]},this}}),t.createTransform=function(e,i,r){return new t.Transformation(e,r.type,i)},t.registerElement("transform",t.createTransform),{Transformation:t.Transformation,createTransform:t.createTransform}}),define("base/point",["jxg","options","math/math","math/geometry","math/numerics","base/coords","base/constants","base/element","parser/geonext","utils/type","base/transformation"],function(t,e,i,r,s,o,n,a,h,l){return t.Point=function(t,e,i){this.constructor(t,i,n.OBJECT_TYPE_POINT,n.OBJECT_CLASS_POINT),l.exists(e)||(e=[0,0]),this.coords=new o(n.COORDS_BY_USER,e,this.board),this.initialCoords=new o(n.COORDS_BY_USER,e,this.board),this.position=null,this.onPolygon=!1,this.slideObject=null,this.slideObjects=[],this.needsUpdateFromParent=!0,this.Xjc=null,this.Yjc=null,this.methodMap=l.deepCopy(this.methodMap,{move:"moveTo",moveTo:"moveTo",moveAlong:"moveAlong",visit:"visit",glide:"makeGlider",makeGlider:"makeGlider",X:"X",Y:"Y",free:"free",setPosition:"setGliderPosition",setGliderPosition:"setGliderPosition",addConstraint:"addConstraint",dist:"Dist",onPolygon:"onPolygon"}),this.group=[],this.elType="point",this.id=this.board.setId(this,"P"),this.board.renderer.drawPoint(this),this.board.finalizeAdding(this),this.createLabel()},t.Point.prototype=new a,t.extend(t.Point.prototype,{hasPoint:function(t,e){var i,r=this.coords.scrCoords;return i=parseFloat(this.visProp.size)+.5*parseFloat(this.visProp.strokewidth),this.board.options.precision.hasPoint>i&&(i=this.board.options.precision.hasPoint),i+2>Math.abs(r[1]-t)&&i+2>Math.abs(r[2]-e)},updateConstraint:function(){return this},update:function(t){return this.needsUpdate?(l.exists(t)||(t=!1),this.type===n.OBJECT_TYPE_GLIDER&&(t?this.updateGliderFromParent():this.updateGlider()),(this.type===n.OBJECT_TYPE_CAS||this.type===n.OBJECT_TYPE_INTERSECTION||this.type===n.OBJECT_TYPE_AXISPOINT)&&this.updateConstraint(),this.updateTransform(),this.visProp.trace&&this.cloneToBackground(!0),this):this},updateGlider:function(){var t,e,s,a,h,l,c,d,u,p,f,m,b,g,v,C,y,P=!1,_=this.slideObject;if(this.needsUpdateFromParent=!1,_.elementClass===n.OBJECT_CLASS_CIRCLE)C=r.projectPointToCircle(this,_,this.board),y=r.rad([_.center.X()+1,_.center.Y()],_.center,this);else if(_.elementClass===n.OBJECT_CLASS_LINE){if(this.onPolygon){if(e=_.point1.coords.usrCoords,s=_.point2.coords.usrCoords,t=1,a=s[t]-e[t],Math.abs(a)<i.eps&&(t=2,a=s[t]-e[t]),c=r.projectPointToLine(this,_,this.board),d=(c.usrCoords[t]-e[t])/a,l=_.parentPolygon,0>d){for(t=0;l.borders.length>t;t++)if(_===l.borders[t]){_=l.borders[(t-1+l.borders.length)%l.borders.length];break}}else if(d>1)for(t=0;l.borders.length>t;t++)if(_===l.borders[t]){_=l.borders[(t+1+l.borders.length)%l.borders.length];break}_.id!==this.slideObject.id&&(this.slideObject=_)}e=_.point1.coords,s=_.point2.coords,a=e.distance(n.COORDS_BY_USER,s),i.eps>a?(C=e,P=!0,y=0):(C=r.projectPointToLine(this,_,this.board),e=e.usrCoords.slice(0),s=s.usrCoords.slice(0),Math.abs(s[0])<i.eps?(t=1,a=s[t],Math.abs(a)<i.eps&&(t=2,a=s[t]),a=(C.usrCoords[t]-e[t])/a,u=a>=0?1:-1,a=Math.abs(a),y=u*a/(a+1)):Math.abs(e[0])<i.eps?(t=1,a=e[t],Math.abs(a)<i.eps&&(t=2,a=e[t]),a=(C.usrCoords[t]-s[t])/a,y=0>a?(1-2*a)/(1-a):1/(a+1)):(t=1,a=s[t]-e[t],Math.abs(a)<i.eps&&(t=2,a=s[t]-e[t]),y=(C.usrCoords[t]-e[t])/a)),this.visProp.snapwidth>0&&Math.abs(this._smax-this._smin)>=i.eps&&(y=Math.max(Math.min(y,1),0),h=y*(this._smax-this._smin)+this._smin,h=Math.round(h/this.visProp.snapwidth)*this.visProp.snapwidth,y=(h-this._smin)/(this._smax-this._smin),this.update(!0)),e=_.point1.coords,!_.visProp.straightfirst&&Math.abs(e.usrCoords[0])>i.eps&&0>y&&(C=e,P=!0,y=0),s=_.point2.coords,!_.visProp.straightlast&&Math.abs(s.usrCoords[0])>i.eps&&y>1&&(C=s,P=!0,y=1)}else _.type===n.OBJECT_TYPE_TURTLE?(this.updateConstraint(),C=r.projectPointToTurtle(this,_,this.board),y=this.position):_.elementClass===n.OBJECT_CLASS_CURVE?_.type===n.OBJECT_TYPE_ARC||_.type===n.OBJECT_TYPE_SECTOR?(C=r.projectPointToCircle(this,_,this.board),m=r.rad(_.radiuspoint,_.center,this),p=0,f=r.rad(_.radiuspoint,_.center,_.anglepoint),y=m,("minor"===_.visProp.type&&f>Math.PI||"major"===_.visProp.type&&Math.PI>f)&&(p=f,f=2*Math.PI),(p>m||m>f)&&(y=f,(p>m&&m>.5*p||m>f&&m>.5*f+Math.PI)&&(y=p),this.updateGliderFromParent())):(this.updateConstraint(),_.transformations.length>0?(_.updateTransformMatrix(),v=i.inverse(_.transformMat),g=i.matVecMult(v,this.coords.usrCoords),b=new o(n.COORDS_BY_USER,g,this.board).usrCoords,g=r.projectCoordsToCurve(b[1],b[2],this.position||0,_,this.board),C=g[0],y=g[1]):(C=r.projectPointToCurve(this,_,this.board),y=this.position)):_.elementClass===n.OBJECT_CLASS_POINT&&(C=r.projectPointToPoint(this,_,this.board),y=this.position);this.coords.setCoordinates(n.COORDS_BY_USER,C.usrCoords,P),this.position=y},updateGliderFromParent:function(){var t,e,s,o,a,h,l=this.slideObject;return this.needsUpdateFromParent?(l.elementClass===n.OBJECT_CLASS_CIRCLE?(s=l.Radius(),a=[l.center.X()+s*Math.cos(this.position),l.center.Y()+s*Math.sin(this.position)]):l.elementClass===n.OBJECT_CLASS_LINE?(t=l.point1.coords.usrCoords,e=l.point2.coords.usrCoords,Math.abs(e[0])<i.eps?(o=Math.min(Math.abs(this.position),1-i.eps),o/=1-o,0>this.position&&(o=-o),a=[t[0]+o*e[0],t[1]+o*e[1],t[2]+o*e[2]]):Math.abs(t[0])<i.eps?(o=Math.max(this.position,i.eps),o=Math.min(o,2-i.eps),o=o>1?(o-1)/(o-2):(1-o)/o,a=[e[0]+o*t[0],e[1]+o*t[1],e[2]+o*t[2]]):(o=this.position,a=[t[0]+o*(e[0]-t[0]),t[1]+o*(e[1]-t[1]),t[2]+o*(e[2]-t[2])])):l.type===n.OBJECT_TYPE_TURTLE?(this.coords.setCoordinates(n.COORDS_BY_USER,[l.Z(this.position),l.X(this.position),l.Y(this.position)]),this.updateConstraint(),a=r.projectPointToTurtle(this,l,this.board).usrCoords):l.elementClass===n.OBJECT_CLASS_CURVE?(this.coords.setCoordinates(n.COORDS_BY_USER,[l.Z(this.position),l.X(this.position),l.Y(this.position)]),l.type===n.OBJECT_TYPE_ARC||l.type===n.OBJECT_TYPE_SECTOR?(h=r.rad([l.center.X()+1,l.center.Y()],l.center,l.radiuspoint),s=l.Radius(),a=[l.center.X()+s*Math.cos(this.position+h),l.center.Y()+s*Math.sin(this.position+h)]):(this.updateConstraint(),a=r.projectPointToCurve(this,l,this.board).usrCoords)):l.elementClass===n.OBJECT_CLASS_POINT&&(a=r.projectPointToPoint(this,l,this.board).usrCoords),this.coords.setCoordinates(n.COORDS_BY_USER,a,!1),void 0):(this.needsUpdateFromParent=!0,void 0)},updateRenderer:function(){var t;return this.needsUpdate?(this.visProp.visible&&this.visProp.size>0&&(t=this.isReal,this.isReal=!isNaN(this.coords.usrCoords[1]+this.coords.usrCoords[2]),this.isReal=Math.abs(this.coords.usrCoords[0])>i.eps?this.isReal:!1,this.isReal?(t!==this.isReal&&(this.board.renderer.show(this),this.hasLabel&&this.label.visProp.visible&&this.board.renderer.show(this.label)),this.board.renderer.updatePoint(this)):t!==this.isReal&&(this.board.renderer.hide(this),this.hasLabel&&this.label.visProp.visible&&this.board.renderer.hide(this.label))),this.hasLabel&&this.visProp.visible&&this.label&&this.label.visProp.visible&&this.isReal&&(this.label.update(),this.board.renderer.updateText(this.label)),this.needsUpdate=!1,this):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(t){var e,i,r=0/0,s=t.coords.usrCoords,o=this.coords.usrCoords;return this.isReal&&t.isReal&&(i=o[0]-s[0],e=i*i,i=o[1]-s[1],e+=i*i,i=o[2]-s[2],e+=i*i,r=Math.sqrt(e)),r},snapToGrid:function(){return this.handleSnapToGrid()},handleSnapToGrid:function(){var t,e,i=this.visProp.snapsizex,r=this.visProp.snapsizey;return this.visProp.snaptogrid&&(t=this.coords.usrCoords[1],e=this.coords.usrCoords[2],0>=i&&this.board.defaultAxes&&this.board.defaultAxes.x.defaultTicks&&(i=this.board.defaultAxes.x.defaultTicks.ticksDelta*(this.board.defaultAxes.x.defaultTicks.visProp.minorticks+1)),0>=r&&this.board.defaultAxes&&this.board.defaultAxes.y.defaultTicks&&(r=this.board.defaultAxes.y.defaultTicks.ticksDelta*(this.board.defaultAxes.y.defaultTicks.visProp.minorticks+1)),i>0&&r>0&&this.coords.setCoordinates(n.COORDS_BY_USER,[Math.round(t/i)*i,Math.round(e/r)*r])),this},handleSnapToPoints:function(){var t,e,i,s=0,o=1/0,a=null;if(this.visProp.snaptopoints){for(t=0;this.board.objectsList.length>t;t++)e=this.board.objectsList[t],e.elementClass===n.OBJECT_CLASS_POINT&&e!==this&&e.visProp.visible&&(i=r.projectPointToPoint(this,e,this.board),s="screen"===this.visProp.attractorunit?i.distance(n.COORDS_BY_SCREEN,this.coords):i.distance(n.COORDS_BY_USER,this.coords),this.visProp.attractordistance>s&&o>s&&(o=s,a=i));null!==a&&this.coords.setCoordinates(n.COORDS_BY_USER,a.usrCoords)}return this},handleAttractors:function(){var t,e,i,s=0,o=this.visProp.attractors.length;if(0!==this.visProp.attractordistance){for(t=0;o>t;t++)if(e=this.board.select(this.visProp.attractors[t]),l.exists(e)&&e!==this){if(e.elementClass===n.OBJECT_CLASS_POINT?i=r.projectPointToPoint(this,e,this.board):e.elementClass===n.OBJECT_CLASS_LINE?i=r.projectPointToLine(this,e,this.board):e.elementClass===n.OBJECT_CLASS_CIRCLE?i=r.projectPointToCircle(this,e,this.board):e.elementClass===n.OBJECT_CLASS_CURVE?i=r.projectPointToCurve(this,e,this.board):e.type===n.OBJECT_TYPE_TURTLE&&(i=r.projectPointToTurtle(this,e,this.board)),s="screen"===this.visProp.attractorunit?i.distance(n.COORDS_BY_SCREEN,this.coords):i.distance(n.COORDS_BY_USER,this.coords),this.visProp.attractordistance>s){(this.type!==n.OBJECT_TYPE_GLIDER||this.slideObject!==e)&&this.makeGlider(e);break}e===this.slideObject&&s>=this.visProp.snatchdistance&&this.popSlideObject()}return this}},setPositionDirectly:function(t,e){var r,s;if(this.coords,this.coords.setCoordinates(t,e),this.handleSnapToGrid(),this.handleSnapToPoints(),this.handleAttractors(),0===this.group.length){for(r=this.transformations.length-1;r>=0;r--)t===n.COORDS_BY_SCREEN?s=new o(t,e,this.board).usrCoords:(2===e.length&&(e=[1].concat(e)),s=e),this.initialCoords.setCoordinates(n.COORDS_BY_USER,i.matVecMult(i.inverse(this.transformations[r].matrix),s));this.update()}return this.board.isSuspendedUpdate&&this.type===n.OBJECT_TYPE_GLIDER&&this.updateGlider(),e},setPositionByTransform:function(t,e){var i;return e=new o(t,e,this.board),i=this.board.create("transform",e.usrCoords.slice(1),{type:"translate"}),this.transformations.length>0&&this.transformations[this.transformations.length-1].isNumericMatrix?this.transformations[this.transformations.length-1].melt(i):this.addTransform(this,i),this.update(),this},setPosition:function(t,e){return this.setPositionDirectly(t,e)},setGliderPosition:function(t){return this.type===n.OBJECT_TYPE_GLIDER&&(this.position=t,this.board.update()),this},makeGlider:function(t){return this.slideObject=this.board.select(t),this.slideObjects.push(this.slideObject),this.type=n.OBJECT_TYPE_GLIDER,this.elType="glider",this.visProp.snapwidth=-1,this.slideObject.addChild(this),this.isDraggable=!0,this.generatePolynomial=function(){return this.slideObject.generatePolynomial(this)},this.updateGlider(),this},popSlideObject:function(){this.slideObjects.length>0&&(this.slideObjects.pop(),delete this.slideObject.childElements[this.id],0===this.slideObjects?(this.elType="point",this.type=n.OBJECT_TYPE_POINT,this.slideObject=null):this.slideObject=this.slideObjects[this.slideObjects.length-1])},free:function(){var t,e;if(this.type!==n.OBJECT_TYPE_GLIDER){if(this.isDraggable)return;this.isDraggable=!0,this.type=n.OBJECT_TYPE_POINT,this.XEval=function(){return this.coords.usrCoords[1]},this.YEval=function(){return this.coords.usrCoords[2]},this.ZEval=function(){return this.coords.usrCoords[0]},this.Xjc=null,this.Yjc=null}for(t in this.board.objects)this.board.objects.hasOwnProperty(t)&&(e=this.board.objects[t],e.descendants&&(delete e.descendants[this.id],delete e.childElements[this.id],this.hasLabel&&(delete e.descendants[this.label.id],delete e.childElements[this.label.id])));this.ancestors={},this.slideObject=null,this.slideObjects=[],this.elType="point",this.type=n.OBJECT_TYPE_POINT},addConstraint:function(t){var e,i,r=[],s=["X","Y"],o=function(t){return function(){return t}},a=function(t){return function(){return t.Value()}};for(this.type=n.OBJECT_TYPE_CAS,this.isDraggable=!1,e=0;t.length>e;e++)i=t[e],"string"==typeof i?(r[e]=this.board.jc.snippet(i,!0,null,!0),2===t.length&&(this[s[e]+"jc"]=t[e])):"function"==typeof i?r[e]=i:"number"==typeof i?r[e]=o(i):"object"==typeof i&&"function"==typeof i.Value&&(r[e]=a(i)),r[e].origin=i;return 1===t.length?this.updateConstraint=function(){var t=r[0]();l.isArray(t)?this.coords.setCoordinates(n.COORDS_BY_USER,t):this.coords=t}:2===t.length?(this.XEval=r[0],this.YEval=r[1],this.parents=[r[0].origin,r[1].origin],this.updateConstraint=function(){this.coords.setCoordinates(n.COORDS_BY_USER,[this.XEval(),this.YEval()])}):(this.ZEval=r[0],this.XEval=r[1],this.YEval=r[2],this.parents=[r[0].origin,r[1].origin,r[2].origin],this.updateConstraint=function(){this.coords.setCoordinates(n.COORDS_BY_USER,[this.ZEval(),this.XEval(),this.YEval()])}),this.update(),this.board.isSuspendedUpdate||this.updateRenderer(),this},updateTransform:function(){var t,e;if(0===this.transformations.length||null===this.baseElement)return this;for(t=this===this.baseElement?this.transformations[0].apply(this.baseElement,"self"):this.transformations[0].apply(this.baseElement),this.coords.setCoordinates(n.COORDS_BY_USER,t),e=1;this.transformations.length>e;e++)this.coords.setCoordinates(n.COORDS_BY_USER,this.transformations[e].apply(this));return this},addTransform:function(t,e){var i,r=l.isArray(e)?e:[e],s=r.length;for(0===this.transformations.length&&(this.baseElement=t),i=0;s>i;i++)this.transformations.push(r[i]);return this},startAnimation:function(t,e){var i=this;return this.type!==n.OBJECT_TYPE_GLIDER||l.exists(this.intervalCode)||(this.intervalCode=window.setInterval(function(){i._anim(t,e)},250),l.exists(this.intervalCount)||(this.intervalCount=0)),this},stopAnimation:function(){return l.exists(this.intervalCode)&&(window.clearInterval(this.intervalCode),delete this.intervalCode),this},moveAlong:function(t,e,i){i=i||{};var r,o,a=[],h=[],c=this.board.attr.animationdelay,d=e/c,u=function(e,i){return function(){return t[e][i]}};if(l.isArray(t)){for(r=0;t.length>r;r++)h[r]=l.isPoint(t[r])?t[r]:{elementClass:n.OBJECT_CLASS_POINT,X:u(r,0),Y:u(r,1)};if(e=e||0,0===e)return this.setPosition(n.COORDS_BY_USER,[h[h.length-1].X(),h[h.length-1].Y()]),this.board.update(this);if(!l.exists(i.interpolate)||i.interpolate)for(o=s.Neville(h),r=0;d>r;r++)a[r]=[],a[r][0]=o[0]((d-r)/d*o[3]()),a[r][1]=o[1]((d-r)/d*o[3]());else for(r=0;d>r;r++)a[r]=[],a[r][0]=t[Math.floor((d-r)/d*(t.length-1))][0],a[r][1]=t[Math.floor((d-r)/d*(t.length-1))][1];this.animationPath=a}else l.isFunction(t)&&(this.animationPath=t,this.animationStart=(new Date).getTime());return this.animationCallback=i.callback,this.board.addAnimation(this),this},moveTo:function(t,e,r){r=r||{},t=new o(n.COORDS_BY_USER,t,this.board);var s,a=this.board.attr.animationdelay,h=Math.ceil(e/a),c=[],d=this.coords.usrCoords[1],u=this.coords.usrCoords[2],p=t.usrCoords[1]-d,f=t.usrCoords[2]-u,m=function(t){return r.effect&&"<>"===r.effect?Math.pow(Math.sin(t/h*Math.PI/2),2):t/h};if(!l.exists(e)||0===e||Math.abs(t.usrCoords[0]-this.coords.usrCoords[0])>i.eps)return this.setPosition(n.COORDS_BY_USER,t.usrCoords),this.board.update(this);if(Math.abs(p)<i.eps&&Math.abs(f)<i.eps)return this;for(s=h;s>=0;s--)c[h-s]=[t.usrCoords[0],d+p*m(s),u+f*m(s)];return this.animationPath=c,this.animationCallback=r.callback,this.board.addAnimation(this),this},visit:function(t,e,i){t=new o(n.COORDS_BY_USER,t,this.board);var r,s,a,h=this.board.attr.animationdelay,c=[],d=this.coords.usrCoords[1],u=this.coords.usrCoords[2],p=t.usrCoords[1]-d,f=t.usrCoords[2]-u,m=function(t){var e=a/2>t?2*t/a:2*(a-t)/a;return i.effect&&"<>"===i.effect?Math.pow(Math.sin(e*Math.PI/2),2):e};for("number"==typeof i?i={repeat:i}:(i=i||{},l.exists(i.repeat)||(i.repeat=1)),a=Math.ceil(e/(h*i.repeat)),s=0;i.repeat>s;s++)for(r=a;r>=0;r--)c[s*(a+1)+a-r]=[t.usrCoords[0],d+p*m(r),u+f*m(r)];return this.animationPath=c,this.animationCallback=i.callback,this.board.addAnimation(this),this},_anim:function(t,e){var i,s,o,a,h,l,c,d,u=1;return this.intervalCount+=1,this.intervalCount>e&&(this.intervalCount=0),this.slideObject.elementClass===n.OBJECT_CLASS_LINE?(i=this.slideObject.point1.coords.distance(n.COORDS_BY_SCREEN,this.slideObject.point2.coords),s=this.slideObject.getSlope(),1/0!==s?(h=Math.atan(s),o=Math.round(this.intervalCount/e*i*Math.cos(h)),a=Math.round(this.intervalCount/e*i*Math.sin(h))):(o=0,a=Math.round(this.intervalCount/e*i)),0>t?(l=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)):(l=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(n.COORDS_BY_SCREEN,[l.coords.scrCoords[1]+u*o,l.coords.scrCoords[2]+u*a])):this.slideObject.elementClass===n.OBJECT_CLASS_CURVE?(c=t>0?Math.round(this.intervalCount/e*this.board.canvasWidth):Math.round((e-this.intervalCount)/e*this.board.canvasWidth),this.coords.setCoordinates(n.COORDS_BY_SCREEN,[c,0]),this.coords=r.projectPointToCurve(this,this.slideObject,this.board)):this.slideObject.elementClass===n.OBJECT_CLASS_CIRCLE&&(h=0>t?2*(this.intervalCount/e)*Math.PI:2*((e-this.intervalCount)/e)*Math.PI,d=this.slideObject.Radius(),this.coords.setCoordinates(n.COORDS_BY_USER,[this.slideObject.center.coords.usrCoords[1]+d*Math.cos(h),this.slideObject.center.coords.usrCoords[2]+d*Math.sin(h)])),this.board.update(this),this},setStyle:function(t){var e=["cross","cross","cross","circle","circle","circle","circle","square","square","square","plus","plus","plus"],i=[2,3,4,1,2,3,4,2,3,4,2,3,4];return this.visProp.face=e[t],this.visProp.size=i[t],this.board.renderer.changePointStyle(this),this},normalizeFace:function(t){return e.normalizePointFace(t)},remove:function(){this.hasLabel&&this.board.renderer.remove(this.board.renderer.getElementById(this.label.id)),this.board.renderer.remove(this.board.renderer.getElementById(this.id))},getTextAnchor:function(){return this.coords},getLabelAnchor:function(){return this.coords},face:function(t){this.setAttribute({face:t})},size:function(t){this.setAttribute({size:t})},cloneToBackground:function(){var t={};return t.id=this.id+"T"+this.numTraces,this.numTraces+=1,t.coords=this.coords,t.visProp=l.deepCopy(this.visProp,this.visProp.traceattributes,!0),t.visProp.layer=this.board.options.layer.trace,t.elementClass=n.OBJECT_CLASS_POINT,t.board=this.board,l.clearVisPropOld(t),this.board.renderer.drawPoint(t),this.traces[t.id]=t.rendNode,this},getParents:function(){var t=[this.Z(),this.X(),this.Y()];return this.parents&&(t=this.parents),this.type===n.OBJECT_TYPE_GLIDER&&(t=[this.X(),this.Y(),this.slideObject.id]),t}}),t.createPoint=function(e,i,r){var s,o,n,a=!1;for(n=l.copyAttributes(r,e.options,"point"),o=0;i.length>o;o++)("function"==typeof i[o]||"string"==typeof i[o])&&(a=!0);if(a)s=new t.Point(e,[0/0,0/0],n),s.addConstraint(i);else if(l.isNumber(i[0])&&l.isNumber(i[1]))s=new t.Point(e,i,n),l.exists(n.slideobject)?s.makeGlider(n.slideobject):s.baseElement=s,s.isDraggable=!0;else{if("object"!=typeof i[0]||"object"!=typeof i[1])throw Error("JSXGraph: Can't create point with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"'."+"\nPossible parent types: [x,y], [z,x,y], [point,transformation]");s=new t.Point(e,[0,0],n),s.addTransform(i[0],i[1]),s.isDraggable=!1,s.parents=[i[0].id]}return e.isSuspendedUpdate||(s.handleSnapToGrid(),s.handleSnapToPoints(),s.handleAttractors()),s},t.createGlider=function(t,e,i){var r,s=l.copyAttributes(i,t.options,"glider");return r=1===e.length?t.create("point",[0,0],s):t.create("point",e.slice(0,2),s),r.makeGlider(e[e.length-1]),r},t.createIntersectionPoint=function(t,e,i){var s,a,h,c,d,u,p=l.copyAttributes(i,t.options,"intersection");e.push(0,0),s=t.create("point",[0,0,0],p),a=t.select(e[0]),h=t.select(e[1]),d=e[2],u=e[3],c=a.elementClass===n.OBJECT_CLASS_CURVE&&h.elementClass===n.OBJECT_CLASS_CURVE?function(){return r.meetCurveCurve(a,h,d,u,a.board)}:a.elementClass===n.OBJECT_CLASS_CURVE&&h.elementClass===n.OBJECT_CLASS_LINE||h.elementClass===n.OBJECT_CLASS_CURVE&&a.elementClass===n.OBJECT_CLASS_LINE?function(){return r.meetCurveLine(a,h,d,a.board,s.visProp.alwaysintersect)}:a.elementClass===n.OBJECT_CLASS_LINE&&h.elementClass===n.OBJECT_CLASS_LINE?function(){var t,e,i=a.visProp.straightfirst,l=h.visProp.straightfirst,c=a.visProp.straightlast,u=h.visProp.straightlast;return s.visProp.alwaysintersect||i&&c&&l&&u?r.meet(a.stdform,h.stdform,d,a.board):(t=r.meetSegmentSegment(a.point1.coords.usrCoords,a.point2.coords.usrCoords,h.point1.coords.usrCoords,h.point2.coords.usrCoords,a.board),e=!i&&0>t[1]||!c&&t[1]>1||!l&&0>t[2]||!u&&t[2]>1?[0,0/0,0/0]:t[0],new o(n.COORDS_BY_USER,e,a.board))}:function(){return r.meet(a.stdform,h.stdform,d,a.board)},s.addConstraint([c]);try{a.addChild(s),h.addChild(s)}catch(f){throw Error("JSXGraph: Can't create 'intersection' with parent types '"+typeof e[0]+"' and '"+typeof e[1]+"'.")}return s.type=n.OBJECT_TYPE_INTERSECTION,s.elType="intersection",s.parents=[a.id,h.id,d,u],s.generatePolynomial=function(){var t=a.generatePolynomial(s),e=h.generatePolynomial(s);return 0===t.length||0===e.length?[]:[t[0],e[0]]},s},t.createOtherIntersectionPoint=function(t,e,s){var o,a,h,c;if(3!==e.length||!l.isPoint(e[2])||e[0].elementClass!==n.OBJECT_CLASS_LINE&&e[0].elementClass!==n.OBJECT_CLASS_CIRCLE||e[1].elementClass!==n.OBJECT_CLASS_LINE&&e[1].elementClass!==n.OBJECT_CLASS_CIRCLE)throw Error("JSXGraph: Can't create 'other intersection point' with parent types '"+typeof e[0]+"', '"+typeof e[1]+"'and '"+typeof e[2]+"'."+"\nPossible parent types: [circle|line,circle|line,point]");return a=t.select(e[0]),h=t.select(e[1]),c=t.select(e[2]),o=t.create("point",[function(){var t=r.meet(a.stdform,h.stdform,0,a.board);return Math.abs(c.X()-t.usrCoords[1])>i.eps||Math.abs(c.Y()-t.usrCoords[2])>i.eps||Math.abs(c.Z()-t.usrCoords[0])>i.eps?t:r.meet(a.stdform,h.stdform,1,a.board)}],s),o.type=n.OBJECT_TYPE_INTERSECTION,o.elType="otherintersection",o.parents=[a.id,h.id,c],a.addChild(o),h.addChild(o),o.generatePolynomial=function(){var t=a.generatePolynomial(o),e=h.generatePolynomial(o);return 0===t.length||0===e.length?[]:[t[0],e[0]]},o},t.registerElement("point",t.createPoint),t.registerElement("glider",t.createGlider),t.registerElement("intersection",t.createIntersectionPoint),t.registerElement("otherintersection",t.createOtherIntersectionPoint),{Point:t.Point,createPoint:t.createPoint,createGlider:t.createGlider,createIntersection:t.createIntersectionPoint,createOtherIntersection:t.createOtherIntersectionPoint}}),define("utils/expect",["jxg","utils/type","base/constants","base/coords","base/point"],function(t,e,i,r){var s={each:function(t,e,i){var r,s=[];for(r=0;t.length>r;r++)s.push(e.call(this,t[r],i));return s},coords:function(t,e){var s=t;return t&&t.elementClass===i.OBJECT_CLASS_POINT?s=t.coords:t.usrCoords&&t.scrCoords&&t.usr2screen&&(s=t),e&&(s=new r(i.COORDS_BY_USER,s.usrCoords,s.board)),s},coordsArray:function(t,i){var r;return r=e.isArray(t)?t:this.coords(t).usrCoords,3>r.length&&r.unshift(1),i&&(r=[r[0],r[1],r[2]]),r}};return t.Expect=s,s}),define("math/statistics",["jxg","base/constants","math/math","utils/type"],function(t,e,i,r){return i.Statistics={sum:function(t){var e,i=t.length,r=0;for(e=0;i>e;e++)r+=t[e];return r},prod:function(t){var e,i=t.length,r=1;for(e=0;i>e;e++)r*=t[e];return r},mean:function(t){return t.length>0?this.sum(t)/t.length:0},median:function(t){var e,i;return t.length>0?(e=t.slice(0),e.sort(function(t,e){return t-e}),i=e.length,1===i%2?e[parseInt(.5*i,10)]:.5*(e[.5*i-1]+e[.5*i])):0},variance:function(t){var e,i,r,s=t.length;if(s>1){for(e=this.mean(t),i=0,r=0;s>r;r++)i+=(t[r]-e)*(t[r]-e);return i/(t.length-1)}return 0},sd:function(t){return Math.sqrt(this.variance(t))},weightedMean:function(t,e){if(t.length!==e.length)throw Error("JSXGraph error (Math.Statistics.weightedMean): Array dimension mismatch.");return t.length>0?this.mean(this.multiply(t,e)):0},max:function(t){return Math.max.apply(this,t)},min:function(t){return Math.min.apply(this,t)},range:function(t){return[this.min(t),this.max(t)]},abs:function(t){var e,i,s;if(r.isArray(t))for(i=t.length,s=[],e=0;i>e;e++)s[e]=Math.abs(t[e]);else s=Math.abs(t);return s},add:function(t,e){var i,s,o=[];if(t=r.evalSlider(t),e=r.evalSlider(e),r.isArray(t)&&r.isNumber(e))for(s=t.length,i=0;s>i;i++)o[i]=t[i]+e;else if(r.isNumber(t)&&r.isArray(e))for(s=e.length,i=0;s>i;i++)o[i]=t+e[i];else if(r.isArray(t)&&r.isArray(e))for(s=Math.min(t.length,e.length),i=0;s>i;i++)o[i]=t[i]+e[i];else o=t+e;return o},div:function(t,e){var i,s,o=[];if(t=r.evalSlider(t),e=r.evalSlider(e),r.isArray(t)&&r.isNumber(e))for(s=t.length,i=0;s>i;i++)o[i]=t[i]/e;else if(r.isNumber(t)&&r.isArray(e))for(s=e.length,i=0;s>i;i++)o[i]=t/e[i];else if(r.isArray(t)&&r.isArray(e))for(s=Math.min(t.length,e.length),i=0;s>i;i++)o[i]=t[i]/e[i];else o=t/e;return o},divide:t.shortcut(i.Statistics,"div"),mod:function(t,e,s){var o,n,a=[],h=function(t,e){return t%e};if(s=r.def(s,!1),s&&(h=i.mod),t=r.evalSlider(t),e=r.evalSlider(e),r.isArray(t)&&r.isNumber(e))for(n=t.length,o=0;n>o;o++)a[o]=h(t[o],e);else if(r.isNumber(t)&&r.isArray(e))for(n=e.length,o=0;n>o;o++)a[o]=h(t,e[o]);else if(r.isArray(t)&&r.isArray(e))for(n=Math.min(t.length,e.length),o=0;n>o;o++)a[o]=h(t[o],e[o]);else a=h(t,e);return a},multiply:function(t,e){var i,s,o=[];if(t=r.evalSlider(t),e=r.evalSlider(e),r.isArray(t)&&r.isNumber(e))for(s=t.length,i=0;s>i;i++)o[i]=t[i]*e;else if(r.isNumber(t)&&r.isArray(e))for(s=e.length,i=0;s>i;i++)o[i]=t*e[i];else if(r.isArray(t)&&r.isArray(e))for(s=Math.min(t.length,e.length),i=0;s>i;i++)o[i]=t[i]*e[i];else o=t*e;return o},subtract:function(t,e){var i,s,o=[];if(t=r.evalSlider(t),e=r.evalSlider(e),r.isArray(t)&&r.isNumber(e))for(s=t.length,i=0;s>i;i++)o[i]=t[i]-e;else if(r.isNumber(t)&&r.isArray(e))for(s=e.length,i=0;s>i;i++)o[i]=t-e[i];else if(r.isArray(t)&&r.isArray(e))for(s=Math.min(t.length,e.length),i=0;s>i;i++)o[i]=t[i]-e[i];else o=t-e;return o},TheilSenRegression:function(t){var e,r,s=[],o=[],n=[];for(e=0;t.length>e;e++){for(o.length=0,r=0;t.length>r;r++)Math.abs(t[r].usrCoords[1]-t[e].usrCoords[1])>i.eps&&(o[r]=(t[r].usrCoords[2]-t[e].usrCoords[2])/(t[r].usrCoords[1]-t[e].usrCoords[1]));s[e]=this.median(o),n.push(t[e].usrCoords[2]-s[e]*t[e].usrCoords[1])}return[this.median(n),this.median(s),-1]}},i.Statistics}),define("utils/zip",["jxg"],function(t){var 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],i=[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],r=[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],s=[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],n=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],a=256;
+return t.Util=t.Util||{},t.Util.Unzip=function(h){function l(){return j+=8,L>Y?h[Y++]:-1}function c(){B=1}function d(){var t;return j++,t=1&B,B>>=1,0===B&&(B=l(),t=1&B,B=128|B>>1),t}function u(t){for(var i=0,r=t;r--;)i=i<<1|d();return t&&(i=e[i]>>8-t),i}function p(){N=0}function f(t){E++,M[N++]=t,w.push(String.fromCharCode(t)),32768===N&&(N=0)}function m(){this.b0=0,this.b1=0,this.jump=null,this.jumppos=-1}function b(){for(;;){if(U[G]>=T)return-1;if(O[U[G]]===G)return U[G]++;U[G]++}}function g(){var t,e=J[X];if(17===G)return-1;if(X++,G++,t=b(),t>=0)e.b0=t;else if(e.b0=32768,g())return-1;if(t=b(),t>=0)e.b1=t,e.jump=null;else if(e.b1=32768,e.jump=J[X],e.jumppos=X,g())return-1;return G--,0}function v(t,e,i){var r;for(J=t,X=0,O=i,T=e,r=0;17>r;r++)U[r]=0;return G=0,g()?-1:0}function C(t){for(var e,i,r,s=0,o=t[s];;)if(r=d()){if(!(32768&o.b1))return o.b1;for(o=o.jump,e=t.length,i=0;e>i;i++)if(t[i]===o){s=i;break}}else{if(!(32768&o.b0))return o.b0;s++,o=t[s]}}function y(){var a,h,b,g,y,P,_,E,S,O,T,x,w,A,k,R,L;do if(a=d(),b=u(2),0===b)for(c(),O=l(),O|=l()<<8,x=l(),x|=l()<<8,65535&(O^~x)&&t.debug("BlockLen checksum mismatch\n");O--;)h=l(),f(h);else if(1===b)for(;;)if(y=e[u(7)]>>1,y>23?(y=y<<1|d(),y>199?(y-=128,y=y<<1|d()):(y-=48,y>143&&(y+=136))):y+=256,256>y)f(y);else{if(256===y)break;for(y-=257,S=u(r[y])+i[y],y=e[u(5)]>>3,o[y]>8?(T=u(8),T|=u(o[y]-8)<<8):T=u(o[y]),T+=s[y],y=0;S>y;y++)h=M[32767&N-T],f(h)}else if(2===b){for(_=Array(320),A=257+u(5),k=1+u(5),R=4+u(4),y=0;19>y;y++)_[y]=0;for(y=0;R>y;y++)_[n[y]]=u(3);for(S=I.length,g=0;S>g;g++)I[g]=new m;if(v(I,19,_,0))return p(),1;for(w=A+k,g=0,L=-1;w>g;)if(L++,y=C(I),16>y)_[g++]=y;else if(16===y){if(y=3+u(2),g+y>w)return p(),1;for(P=g?_[g-1]:0;y--;)_[g++]=P}else{if(y=17===y?3+u(3):11+u(7),g+y>w)return p(),1;for(;y--;)_[g++]=0}for(S=D.length,g=0;S>g;g++)D[g]=new m;if(v(D,A,_,0))return p(),1;for(S=D.length,g=0;S>g;g++)I[g]=new m;for(E=[],g=A;_.length>g;g++)E[g-A]=_[g];if(v(I,k,E,0))return p(),1;for(;;)if(y=C(D),y>=256){if(y-=256,0===y)break;for(y-=1,S=u(r[y])+i[y],y=C(I),o[y]>8?(T=u(8),T|=u(o[y]-8)<<8):T=u(o[y]),T+=s[y];S--;)h=M[32767&N-T],f(h)}else f(y)}while(!a);return p(),c(),0}function P(){var t,e,i,r,s,o,n,h,c=[];if(w=[],R=!1,c[0]=l(),c[1]=l(),120===c[0]&&218===c[1]&&(y(),k[A]=[w.join(""),"geonext.gxt"],A++),31===c[0]&&139===c[1]&&(x(),k[A]=[w.join(""),"file"],A++),80===c[0]&&75===c[1]&&(R=!0,c[2]=l(),c[3]=l(),3===c[2]&&4===c[3])){for(c[0]=l(),c[1]=l(),_=l(),_|=l()<<8,h=l(),h|=l()<<8,l(),l(),l(),l(),n=l(),n|=l()<<8,n|=l()<<16,n|=l()<<24,o=l(),o|=l()<<8,o|=l()<<16,o|=l()<<24,s=l(),s|=l()<<8,s|=l()<<16,s|=l()<<24,r=l(),r|=l()<<8,i=l(),i|=l()<<8,t=0,F=[];r--;)e=l(),"/"===e|":"===e?t=0:a-1>t&&(F[t++]=String.fromCharCode(e));for(S||(S=F),t=0;i>t;)e=l(),t++;E=0,8===h&&(y(),k[A]=Array(2),k[A][0]=w.join(""),k[A][1]=F.join(""),A++),x()}}var _,E,S,O,T,x,w=[],A=0,k=[],M=Array(32768),N=0,R=!1,L=h.length,Y=0,B=1,j=0,D=Array(288),I=Array(32),X=0,J=null,G=(Array(64),Array(64),0),U=Array(17),F=[];U[0]=0,x=function(){var t,e,i,r,s,o,n=[];if(8&_&&(n[0]=l(),n[1]=l(),n[2]=l(),n[3]=l(),80===n[0]&&75===n[1]&&7===n[2]&&8===n[3]?(t=l(),t|=l()<<8,t|=l()<<16,t|=l()<<24):t=n[0]|n[1]<<8|n[2]<<16|n[3]<<24,e=l(),e|=l()<<8,e|=l()<<16,e|=l()<<24,i=l(),i|=l()<<8,i|=l()<<16,i|=l()<<24),R&&P(),n[0]=l(),8===n[0]){if(_=l(),l(),l(),l(),l(),l(),r=l(),4&_)for(n[0]=l(),n[2]=l(),G=n[0]+256*n[1],s=0;G>s;s++)l();if(8&_)for(s=0,F=[],o=l();o;)("7"===o||":"===o)&&(s=0),a-1>s&&(F[s++]=o),o=l();if(16&_)for(o=l();o;)o=l();2&_&&(l(),l()),y(),t=l(),t|=l()<<8,t|=l()<<16,t|=l()<<24,i=l(),i|=l()<<8,i|=l()<<16,i|=l()<<24,R&&P()}},t.Util.Unzip.prototype.unzipFile=function(t){var e;for(this.unzip(),e=0;k.length>e;e++)if(k[e][1]===t)return k[e][0];return""},t.Util.Unzip.prototype.unzip=function(){return P(),k}},t.Util}),define("utils/encoding",["jxg"],function(t){return t.Util=t.Util||{},t.Util.UTF8={encode:function(t){var e,i,r="",s=t.length;for(t=t.replace(/\r\n/g,"\n"),e=0;s>e;e++)i=t.charCodeAt(e),128>i?r+=String.fromCharCode(i):i>127&&2048>i?(r+=String.fromCharCode(192|i>>6),r+=String.fromCharCode(128|63&i)):(r+=String.fromCharCode(224|i>>12),r+=String.fromCharCode(128|63&i>>6),r+=String.fromCharCode(128|63&i));return r},decode:function(t){for(var e=[],i=0,r=0,s=0,o=0,n=t.length;n>i;)r=t.charCodeAt(i),128>r?(e.push(String.fromCharCode(r)),i++):r>191&&224>r?(s=t.charCodeAt(i+1),e.push(String.fromCharCode((31&r)<<6|63&s)),i+=2):(s=t.charCodeAt(i+1),o=t.charCodeAt(i+2),e.push(String.fromCharCode((15&r)<<12|(63&s)<<6|63&o)),i+=3);return e.join("")},asciiCharCodeAt:function(t,e){var i=t.charCodeAt(e);if(i>255)switch(i){case 8364:i=128;break;case 8218:i=130;break;case 402:i=131;break;case 8222:i=132;break;case 8230:i=133;break;case 8224:i=134;break;case 8225:i=135;break;case 710:i=136;break;case 8240:i=137;break;case 352:i=138;break;case 8249:i=139;break;case 338:i=140;break;case 381:i=142;break;case 8216:i=145;break;case 8217:i=146;break;case 8220:i=147;break;case 8221:i=148;break;case 8226:i=149;break;case 8211:i=150;break;case 8212:i=151;break;case 732:i=152;break;case 8482:i=153;break;case 353:i=154;break;case 8250:i=155;break;case 339:i=156;break;case 382:i=158;break;case 376:i=159;break;default:}return i}},t.Util.UTF8}),define("utils/base64",["jxg","utils/encoding"],function(t,e){var i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";return t.Util=t.Util||{},t.Util.Base64={encode:function(t){var r,s,o,n,a,h,l,c=[],d=0;for(t=e.encode(t);t.length>d;)r=t.charCodeAt(d++),s=t.charCodeAt(d++),o=t.charCodeAt(d++),n=r>>2,a=(3&r)<<4|s>>4,h=(15&s)<<2|o>>6,l=63&o,isNaN(s)?h=l=64:isNaN(o)&&(l=64),c.push([i.charAt(n),i.charAt(a),i.charAt(h),i.charAt(l)].join(""));return c.join("")},decode:function(t,r){var s,o,n,a,h,l,c,d=[],u=0,p=t.length;for(t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");p>u;)a=i.indexOf(t.charAt(u++)),h=i.indexOf(t.charAt(u++)),l=i.indexOf(t.charAt(u++)),c=i.indexOf(t.charAt(u++)),s=a<<2|h>>4,o=(15&h)<<4|l>>2,n=(3&l)<<6|c,d.push(String.fromCharCode(s)),64!==l&&d.push(String.fromCharCode(o)),64!==c&&d.push(String.fromCharCode(n));return d=d.join(""),r&&(d=e.decode(d)),d},decodeAsArray:function(t){var e,i=this.decode(t),r=[],s=i.length;for(e=0;s>e;e++)r[e]=i.charCodeAt(e);return r}},t.Util.Base64}),define("server/server",["jxg","utils/zip","utils/base64","utils/type"],function(t,e,i,r){return t.Server={modules:{},runningCalls:{},handleError:function(e){t.debug("error occured, server says: "+e.message)},callServer:function(s,o,n,a){var h,l,c,d,u,p,f;a=a||!1,d="";for(f in n)n.hasOwnProperty(f)&&(d+="&"+escape(f)+"="+escape(n[f]));p=r.toJSON(n);do u=s+Math.floor(4096*Math.random());while(r.exists(this.runningCalls[u]));return this.runningCalls[u]={action:s},r.exists(n.module)&&(this.runningCalls[u].module=n.module),h=t.serverBase+"JXGServer.py",l="action="+escape(s)+"&id="+u+"&dataJSON="+escape(i.encode(p)),this.cbp=function(t){var s,n,a,h,l,c,d,u;if(s=new e.Unzip(i.decodeAsArray(t)).unzip(),r.isArray(s)&&s.length>0&&(s=s[0][0]),r.exists(s))if(n=window.JSON&&window.JSON.parse?window.JSON.parse(s):Function("return "+s)(),"error"===n.type)this.handleError(n);else if("response"===n.type){for(c=n.id,d=0;n.fields.length>d;d++)a=n.fields[d],h=a.namespace+("object"==typeof Function("return "+a.namespace)()?".":".prototype.")+a.name+" = "+a.value,Function(h)();for(d=0;n.handler.length>d;d++){for(a=n.handler[d],l=[],u=0;a.parameters.length>u;u++)l[u]='"'+a.parameters[u]+'": '+a.parameters[u];h="if(typeof JXG.Server.modules."+this.runningCalls[c].module+' == "undefined")'+"JXG.Server.modules."+this.runningCalls[c].module+" = {};",h+="JXG.Server.modules."+this.runningCalls[c].module+"."+a.name+"_cb = "+a.callback+";",h+="JXG.Server.modules."+this.runningCalls[c].module+"."+a.name+" = function ("+a.parameters.join(",")+", __JXGSERVER_CB__, __JXGSERVER_SYNC) {"+'if(typeof __JXGSERVER_CB__ == "undefined") __JXGSERVER_CB__ = JXG.Server.modules.'+this.runningCalls[c].module+"."+a.name+"_cb;"+"var __JXGSERVER_PAR__ = {"+l.join(",")+', "module": "'+this.runningCalls[c].module+'", "handler": "'+a.name+'" };'+'JXG.Server.callServer("exec", __JXGSERVER_CB__, __JXGSERVER_PAR__, __JXGSERVER_SYNC);'+"};",Function(h)()}delete this.runningCalls[c],o(n.data)}},this.cb=t.bind(this.cbp,this),window.XMLHttpRequest?(c=new XMLHttpRequest,c.overrideMimeType("text/plain; charset=iso-8859-1")):c=new ActiveXObject("Microsoft.XMLHTTP"),c&&(c.open("POST",h,!a),c.setRequestHeader("Content-type","application/x-www-form-urlencoded"),a||(c.onreadystatechange=function(t){return function(){return 4===c.readyState&&200===c.status?(t(c.responseText),!0):!1}}(this.cb)),c.send(l),a)?(this.cb(c.responseText),!0):!1},loadModule_cb:function(e){var i;for(i=0;e.length>i;i++)t.debug(e[i].name+": "+e[i].value)},loadModule:function(e){return t.Server.callServer("load",t.Server.loadModule_cb,{module:e},!0)}},t.Server.load=t.Server.loadModule,t.Server}),define("math/symbolic",["jxg","base/constants","base/coords","math/math","math/geometry","server/server","utils/type"],function(t,e,i,r,s,o,n){var a;return r.Symbolic={generateSymbolicCoordinatesPartial:function(t,e,i,r){var s,o,a,h=e.ancestors,l=0,c=function(t){var e;return e="underscore"===r?i+"_{"+t+"}":"brace"===r?i+"["+t+"]":i+t};t.listOfFreePoints=[],t.listOfDependantPoints=[];for(o in h)if(h.hasOwnProperty(o)&&(s=0,n.isPoint(h[o]))){for(a in h[o].ancestors)h[o].ancestors.hasOwnProperty(a)&&s++;0===s?(h[o].symbolic.x=h[o].coords.usrCoords[1],h[o].symbolic.y=h[o].coords.usrCoords[2],t.listOfFreePoints.push(h[o])):(l+=1,h[o].symbolic.x=c(l),l+=1,h[o].symbolic.y=c(l),t.listOfDependantPoints.push(h[o]))}return n.isPoint(e)&&(e.symbolic.x="x",e.symbolic.y="y"),l},clearSymbolicCoordinates:function(t){var e=function(t){var e,i=t&&t.length||0;for(e=0;i>e;e++)n.isPoint(t[e])&&(t[e].symbolic.x="",t[e].symbolic.y="")};e(t.listOfFreePoints),e(t.listOfDependantPoints),delete t.listOfFreePoints,delete t.listOfDependantPoints},generatePolynomials:function(t,e,i){var r,s,o,a,h=e.ancestors,l=[],c=[];i&&this.generateSymbolicCoordinatesPartial(t,e,"u","brace"),h[e.id]=e;for(r in h)if(h.hasOwnProperty(r)&&(a=0,l=[],n.isPoint(h[r]))){for(s in h[r].ancestors)h[r].ancestors.hasOwnProperty(s)&&a++;if(a>0)for(l=h[r].generatePolynomial(),o=0;l.length>o;o++)c.push(l[o])}return i&&this.clearSymbolicCoordinates(t),c},geometricLocusByGroebnerBase:function(t,h){var l,c,d,u,p,f,m,b,g,v,C,y,P,_=t.options.locus,E={},S=this.generateSymbolicCoordinatesPartial(t,h,"u","brace"),O=new i(e.COORDS_BY_USR,[0,0],t),T=new i(e.COORDS_BY_USR,[t.canvasWidth,t.canvasHeight],t),x=1,w=0,A=0,k=0;if(o.modules.geoloci===a&&o.loadModule("geoloci"),o.modules.geoloci===a)throw Error("JSXGraph: Unable to load JXG.Server module 'geoloci.py'.");if(m=O.usrCoords[1],b=T.usrCoords[1],g=T.usrCoords[2],v=O.usrCoords[2],_.translateToOrigin&&t.listOfFreePoints.length>0){for(u=_.toOrigin!==a&&null!==_.toOrigin&&n.isInArray(t.listOfFreePoints,_.toOrigin.id)?_.toOrigin:t.listOfFreePoints[0],w=u.symbolic.x,A=u.symbolic.y,f=0;t.listOfFreePoints.length>f;f++)t.listOfFreePoints[f].symbolic.x-=w,t.listOfFreePoints[f].symbolic.y-=A;if(m-=w,b-=w,g-=A,v-=A,_.translateTo10&&t.listOfFreePoints.length>1){for(p=_.to10!==a&&null!==_.to10&&_.to10.id!==_.toOrigin.id&&n.isInArray(t.listOfFreePoints,_.to10.id)?_.to10:t.listOfFreePoints[0].id===u.id?t.listOfFreePoints[1]:t.listOfFreePoints[0],k=s.rad([1,0],[0,0],[p.symbolic.x,p.symbolic.y]),C=Math.cos(-k),y=Math.sin(-k),f=0;t.listOfFreePoints.length>f;f++)P=t.listOfFreePoints[f].symbolic.x,t.listOfFreePoints[f].symbolic.x=C*t.listOfFreePoints[f].symbolic.x-y*t.listOfFreePoints[f].symbolic.y,t.listOfFreePoints[f].symbolic.y=y*P+C*t.listOfFreePoints[f].symbolic.y;if(p.symbolic.y=0,P=m,m=C*m-y*g,g=y*P+C*g,P=b,b=C*b-y*v,v=y*P+C*v,_.stretch&&Math.abs(p.symbolic.x)>r.eps){for(x=p.symbolic.x,f=0;t.listOfFreePoints.length>f;f++)t.listOfFreePoints[f].symbolic.x/=x,t.listOfFreePoints[f].symbolic.y/=x;for(f=0;t.objectsList.length>f;f++)t.objectsList[f].elementClass===e.OBJECT_CLASS_CIRCLE&&"pointRadius"===t.objectsList[f].method&&(E[f]=t.objectsList[f].radius,t.objectsList[f].radius/=x);m/=x,b/=x,g/=x,v/=x,p.symbolic.x=1}}for(f=0;t.listOfFreePoints.length>f;f++)P=t.listOfFreePoints[f].symbolic.x,Math.abs(P)<r.eps&&(t.listOfFreePoints[f].symbolic.x=0),Math.abs(P-Math.round(P))<r.eps&&(t.listOfFreePoints[f].symbolic.x=Math.round(P)),P=t.listOfFreePoints[f].symbolic.y,Math.abs(P)<r.eps&&(t.listOfFreePoints[f].symbolic.y=0),Math.abs(P-Math.round(P))<r.eps&&(t.listOfFreePoints[f].symbolic.y=Math.round(P))}l=this.generatePolynomials(t,h),c=l.join(","),this.cbp=function(t){d=t},this.cb=n.bind(this.cbp,this),o.modules.geoloci.lociCoCoA(m,b,g,v,S,c,x,k,w,A,this.cb,!0),this.clearSymbolicCoordinates(t);for(f in E)E.hasOwnProperty(f)&&(t.objects[f].radius=E[f]);return d}},r.Symbolic}),define("math/poly",["jxg","math/math","utils/type"],function(t,e,i){return e.Poly={},e.Poly.Ring=function(t){this.vars=t},t.extend(e.Poly.Ring.prototype,{}),e.Poly.Monomial=function(t,e,r){var s;if(!i.exists(t))throw Error("JSXGraph error: In JXG.Math.Poly.monomial missing parameter 'ring'.");for(i.isArray(r)||(r=[]),r=r.slice(0,t.vars.length),s=r.length;t.vars.length>s;s++)r.push(0);this.ring=t,this.coefficient=e||0,this.exponents=i.deepCopy(r)},t.extend(e.Poly.Monomial.prototype,{copy:function(){return new e.Poly.Monomial(this.ring,this.coefficient,this.exponents)},print:function(){var t,e=[];for(t=0;this.ring.vars.length>t;t++)e.push(this.ring.vars[t]+"^"+this.exponents[t]);return this.coefficient+"*"+e.join("*")}}),e.Poly.Polynomial=function(t,e){var r,s=function(){};if(!i.exists(t))throw Error("JSXGraph error: In JXG.Math.Poly.polynomial missing parameter 'ring'.");r=i.exists(e)&&"string"==typeof e?s(e):[],this.ring=t,this.monomials=r},t.extend(e.Poly.Polynomial.prototype,{findSignature:function(t){var e;for(e=0;this.monomials.length>e;e++)if(i.cmpArrays(this.monomials[e].exponents,t))return e;return-1},addSubMonomial:function(t,e){var i;i=this.findSignature(t.exponents),i>-1?this.monomials[i].coefficient+=e*t.coefficient:(t.coefficient*=e,this.monomials.push(t))},add:function(t){var e;if(!i.exists(t)||t.ring!==this.ring)throw Error("JSXGraph error: In JXG.Math.Poly.polynomial.add either summand is undefined or rings don't match.");if(i.isArray(t.exponents))this.addSubMonomial(t,1);else for(e=0;t.monomials.length>e;e++)this.addSubMonomial(t.monomials[e],1)},sub:function(t){var e;if(!i.exists(t)||t.ring!==this.ring)throw Error("JSXGraph error: In JXG.Math.Poly.polynomial.sub either summand is undefined or rings don't match.");if(i.isArray(t.exponents))this.addSubMonomial(t,-1);else for(e=0;t.monomials.length>e;e++)this.addSubMonomial(t.monomials[e],-1)},copy:function(){var t,i;for(i=new e.Poly.Polynomial(this.ring),t=0;this.monomials.length>t;t++)i.monomials.push(this.monomials[t].copy());return i},print:function(){var t,e=[];for(t=0;this.monomials.length>t;t++)e.push("("+this.monomials[t].print()+")");return e.join("+")}}),e.Poly}),define("math/complex",["jxg","math/math"],function(t){return t.Complex=function(t,e){this.isComplex=!0,t&&t.isComplex&&(e=t.imaginary,t=t.real),this.real=t||0,this.imaginary=e||0,this.absval=0,this.angle=0},t.extend(t.Complex.prototype,{toString:function(){return this.real+" + "+this.imaginary+"i"},add:function(t){return"number"==typeof t?this.real+=t:(this.real+=t.real,this.imaginary+=t.imaginary),this},sub:function(t){return"number"==typeof t?this.real-=t:(this.real-=t.real,this.imaginary-=t.imaginary),this},mult:function(t){var e,i;return"number"==typeof t?(this.real*=t,this.imaginary*=t):(e=this.real,i=this.imaginary,this.real=e*t.real-i*t.imaginary,this.imaginary=e*t.imaginary+i*t.real),this},div:function(t){var e,i,r;if("number"==typeof t){if(Math.abs(t)<Math.eps)return this.real=1/0,this.imaginary=1/0,this;this.real/=t,this.imaginary/=t}else{if(Math.abs(t.real)<Math.eps&&Math.abs(t.imaginary)<Math.eps)return this.real=1/0,this.imaginary=1/0,this;e=t.real*t.real+t.imaginary*t.imaginary,r=this.real,i=this.imaginary,this.real=(r*t.real+i*t.imaginary)/e,this.imaginary=(i*t.real-r*t.imaginary)/e}return this},conj:function(){return this.imaginary*=-1,this}}),t.C={},t.C.add=function(e,i){var r=new t.Complex(e);return r.add(i),r},t.C.sub=function(e,i){var r=new t.Complex(e);return r.sub(i),r},t.C.mult=function(e,i){var r=new t.Complex(e);return r.mult(i),r},t.C.div=function(e,i){var r=new t.Complex(e);return r.div(i),r},t.C.conj=function(e){var i=new t.Complex(e);return i.conj(),i},t.C.abs=function(e){var i=new t.Complex(e);return i.conj(),i.mult(e),Math.sqrt(i.real)},t.Complex.C=t.C,t.Complex}),define("renderer/abstract",["jxg","options","base/coords","base/constants","math/math","math/geometry","utils/type","utils/env"],function(t,e,i,r,s,o,n,a){return t.AbstractRenderer=function(){this.vOffsetText=0,this.enhancedRendering=!0,this.container=null,this.type=""},t.extend(t.AbstractRenderer.prototype,{_updateVisual:function(t,e,i){(i||this.enhancedRendering)&&(e=e||{},t.visProp.draft?this.setDraft(t):(e.stroke||(this.setObjectStrokeWidth(t,t.visProp.strokewidth),this.setObjectStrokeColor(t,t.visProp.strokecolor,t.visProp.strokeopacity)),e.fill||this.setObjectFillColor(t,t.visProp.fillcolor,t.visProp.fillopacity),e.dash||this.setDashStyle(t,t.visProp),e.shadow||this.setShadow(t),e.gradient||this.setShadow(t)))},drawPoint:function(t){var i,r=e.normalizePointFace(t.visProp.face);i="o"===r?"ellipse":"[]"===r?"rect":"path",t.rendNode=this.appendChildPrim(this.createPrim(i,t.id),t.visProp.layer),this.appendNodesToElement(t,i),this._updateVisual(t,{dash:!0,shadow:!0},!0),this.updatePoint(t)},updatePoint:function(t){var i=t.visProp.size,r=e.normalizePointFace(t.visProp.face);isNaN(t.coords.scrCoords[2]+t.coords.scrCoords[1])||(this._updateVisual(t,{dash:!1,shadow:!1}),i*=t.board&&t.board.options.point.zoom?Math.sqrt(t.board.zoomX*t.board.zoomY):1,"o"===r?this.updateEllipsePrim(t.rendNode,t.coords.scrCoords[1],t.coords.scrCoords[2],i+1,i+1):"[]"===r?this.updateRectPrim(t.rendNode,t.coords.scrCoords[1]-i,t.coords.scrCoords[2]-i,2*i,2*i):this.updatePathPrim(t.rendNode,this.updatePathStringPoint(t,i,r),t.board),this.setShadow(t))},changePointStyle:function(t){var e=this.getElementById(t.id);n.exists(e)&&this.remove(e),this.drawPoint(t),n.clearVisPropOld(t),t.visProp.visible||this.hide(t),t.visProp.draft&&this.setDraft(t)},drawLine:function(t){t.rendNode=this.appendChildPrim(this.createPrim("line",t.id),t.visProp.layer),this.appendNodesToElement(t,"lines"),this.updateLine(t)},updateLine:function(t){var e,n,a,h,l,c,d=new i(r.COORDS_BY_USER,t.point1.coords.usrCoords,t.board),u=new i(r.COORDS_BY_USER,t.point2.coords.usrCoords,t.board),p=null;(t.visProp.firstarrow||t.visProp.lastarrow)&&(p=-4),o.calcStraight(t,d,u,p),a=h=l=c=0,e=Math.max(3*parseInt(t.visProp.strokewidth,10),10),t.visProp.lastarrow&&"vml"!==t.board.renderer.type&&(n=d.distance(r.COORDS_BY_SCREEN,u),n>s.eps&&(l=(u.scrCoords[1]-d.scrCoords[1])*e/n,c=(u.scrCoords[2]-d.scrCoords[2])*e/n)),t.visProp.firstarrow&&"vml"!==t.board.renderer.type&&(n=d.distance(r.COORDS_BY_SCREEN,u),n>s.eps&&(a=(u.scrCoords[1]-d.scrCoords[1])*e/n,h=(u.scrCoords[2]-d.scrCoords[2])*e/n)),this.updateLinePrim(t.rendNode,d.scrCoords[1]+a,d.scrCoords[2]+h,u.scrCoords[1]-l,u.scrCoords[2]-c,t.board),this.makeArrows(t),this._updateVisual(t,{fill:!0})},drawTicks:function(t){t.rendNode=this.appendChildPrim(this.createPrim("path",t.id),t.visProp.layer),this.appendNodesToElement(t,"path")},updateTicks:function(){},drawCurve:function(t){t.rendNode=this.appendChildPrim(this.createPrim("path",t.id),t.visProp.layer),this.appendNodesToElement(t,"path"),this._updateVisual(t,{shadow:!0},!0),this.updateCurve(t)},updateCurve:function(t){this._updateVisual(t),t.visProp.handdrawing?this.updatePathPrim(t.rendNode,this.updatePathStringBezierPrim(t),t.board):this.updatePathPrim(t.rendNode,this.updatePathStringPrim(t),t.board),t.numberPoints>1&&this.makeArrows(t)},drawEllipse:function(t){t.rendNode=this.appendChildPrim(this.createPrim("ellipse",t.id),t.visProp.layer),this.appendNodesToElement(t,"ellipse"),this.updateEllipse(t)},updateEllipse:function(t){this._updateVisual(t);var e=t.Radius();e>0&&Math.abs(t.center.coords.usrCoords[0])>s.eps&&!isNaN(e+t.center.coords.scrCoords[1]+t.center.coords.scrCoords[2])&&2e6>e*t.board.unitX&&this.updateEllipsePrim(t.rendNode,t.center.coords.scrCoords[1],t.center.coords.scrCoords[2],e*t.board.unitX,e*t.board.unitY)},drawPolygon:function(t){t.rendNode=this.appendChildPrim(this.createPrim("polygon",t.id),t.visProp.layer),this.appendNodesToElement(t,"polygon"),this.updatePolygon(t)},updatePolygon:function(t){this._updateVisual(t,{stroke:!0,dash:!0}),this.updatePolygonPrim(t.rendNode,t)},displayCopyright:function(){},drawInternalText:function(){},updateInternalText:function(){},drawText:function(t){var e,i;"html"===t.visProp.display&&a.isBrowser?(e=this.container.ownerDocument.createElement("div"),e.style.position="absolute",e.className=t.visProp.cssclass,i=""===this.container.style.zIndex?0:parseInt(this.container.style.zIndex,10),e.style.zIndex=i+t.board.options.layer.text,this.container.appendChild(e),e.setAttribute("id",this.container.id+"_"+t.id)):e=this.drawInternalText(t),t.rendNode=e,t.htmlStr="",this.updateText(t)},updateText:function(t){var e,i=t.plaintext;t.visProp.visible&&(this.updateTextStyle(t,!1),"html"===t.visProp.display?(isNaN(t.coords.scrCoords[1]+t.coords.scrCoords[2])||("right"===t.visProp.anchorx?(e=Math.floor(t.board.canvasWidth-t.coords.scrCoords[1]),t.visPropOld.right!==e&&(t.rendNode.style.right=e+"px",t.rendNode.style.left="auto",t.visPropOld.right=e)):"middle"===t.visProp.anchorx?(e=Math.floor(t.coords.scrCoords[1]-.5*t.size[0]),t.visPropOld.left!==e&&(t.rendNode.style.left=e+"px",t.rendNode.style.right="auto",t.visPropOld.left=e)):(e=Math.floor(t.coords.scrCoords[1]),t.visPropOld.left!==e&&(t.rendNode.style.left=e+"px",t.rendNode.style.right="auto",t.visPropOld.left=e)),e="top"===t.visProp.anchory?Math.floor(t.coords.scrCoords[2]+this.vOffsetText):"middle"===t.visProp.anchory?Math.floor(t.coords.scrCoords[2]-.5*t.size[1]+this.vOffsetText):Math.floor(t.coords.scrCoords[2]-t.size[1]+this.vOffsetText),t.visPropOld.top!==e&&(t.rendNode.style.top=e+"px",t.visPropOld.top=e)),t.htmlStr!==i&&(t.rendNode.innerHTML=i,t.htmlStr=i,t.visProp.usemathjax?MathJax.Hub.Queue(["Typeset",MathJax.Hub,t.rendNode]):t.visProp.useasciimathml&&AMprocessNode(t.rendNode,!1)),this.transformImage(t,t.transformations)):this.updateInternalText(t))},updateTextStyle:function(t,e){var i,r,s,o,h=t.visProp,l=a.isBrowser?h.display:"internal";if(e?(s=h.highlightstrokecolor,r=h.highlightstrokeopacity,o=h.highlightcssclass):(s=h.strokecolor,r=h.strokeopacity,o=h.cssclass),("html"===l||"canvas"!==this.type&&"no"!==this.type)&&(i=n.evaluate(t.visProp.fontsize),t.visPropOld.fontsize!==i)){try{t.rendNode.style.fontSize=i+"px"}catch(c){t.rendNode.style.fontSize=i}t.visPropOld.fontsize=i}return"html"===l?(t.visPropOld.cssclass!==o&&(t.rendNode.className=o,t.visPropOld.cssclass=o),this.setObjectStrokeColor(t,s,r)):this.updateInternalTextStyle(t,s,r),this},updateInternalTextStyle:function(t,e,i){this.setObjectStrokeColor(t,e,i)},drawImage:function(){},updateImage:function(t){this.updateRectPrim(t.rendNode,t.coords.scrCoords[1],t.coords.scrCoords[2]-t.size[1],t.size[0],t.size[1]),this.updateImageURL(t),this.transformImage(t,t.transformations),this._updateVisual(t,{stroke:!0,dash:!0},!0)},joinTransforms:function(t,e){var i,r=[[1,0,0],[0,1,0],[0,0,1]],o=t.board.origin.scrCoords[1],n=t.board.origin.scrCoords[2],a=t.board.unitX,h=t.board.unitY,l=[[1,0,0],[-o,1,0],[-n,0,1]],c=[[1,0,0],[0,1/a,0],[0,0,-1/h]],d=[[1,0,0],[0,a,0],[0,0,-h]],u=[[1,0,0],[o,1,0],[n,0,1]],p=e.length;for(i=0;p>i;i++)r=s.matMatMult(l,r),r=s.matMatMult(c,r),r=s.matMatMult(e[i].matrix,r),r=s.matMatMult(d,r),r=s.matMatMult(u,r);return r},transformImage:function(){},updateImageURL:function(){},updateImageStyle:function(t,e){t.rendNode.className=e?t.visProp.highlightcssclass:t.visProp.cssclass},appendChildPrim:function(){},appendNodesToElement:function(){},createPrim:function(){return null},remove:function(){},makeArrows:function(){},updateEllipsePrim:function(){},updateLinePrim:function(){},updatePathPrim:function(){},updatePathStringPoint:function(){},updatePathStringPrim:function(){},updatePathStringBezierPrim:function(){},updatePolygonPrim:function(){},updateRectPrim:function(){},setPropertyPrim:function(){},show:function(){},hide:function(){},setBuffering:function(){},setDashStyle:function(){},setDraft:function(t){if(t.visProp.draft){var e=t.board.options.elements.draft.color,i=t.board.options.elements.draft.opacity;t.type===r.OBJECT_TYPE_POLYGON?this.setObjectFillColor(t,e,i):(t.elementClass===r.OBJECT_CLASS_POINT?this.setObjectFillColor(t,e,i):this.setObjectFillColor(t,"none",0),this.setObjectStrokeColor(t,e,i),this.setObjectStrokeWidth(t,t.board.options.elements.draft.strokeWidth))}},removeDraft:function(t){t.type===r.OBJECT_TYPE_POLYGON?this.setObjectFillColor(t,t.visProp.fillcolor,t.visProp.fillopacity):(t.type===r.OBJECT_CLASS_POINT&&this.setObjectFillColor(t,t.visProp.fillcolor,t.visProp.fillopacity),this.setObjectStrokeColor(t,t.visProp.strokecolor,t.visProp.strokeopacity),this.setObjectStrokeWidth(t,t.visProp.strokewidth))},setGradient:function(){},updateGradient:function(){},setObjectFillColor:function(){},setObjectStrokeColor:function(){},setObjectStrokeWidth:function(){},setShadow:function(){},highlight:function(t){var e,i=t.visProp;if(!i.draft){if(t.type===r.OBJECT_TYPE_POLYGON)for(this.setObjectFillColor(t,i.highlightfillcolor,i.highlightfillopacity),e=0;t.borders.length>e;e++)this.setObjectStrokeColor(t.borders[e],t.borders[e].visProp.highlightstrokecolor,t.borders[e].visProp.highlightstrokeopacity);else t.type===r.OBJECT_TYPE_TEXT?this.updateTextStyle(t,!0):t.type===r.OBJECT_TYPE_IMAGE?this.updateImageStyle(t,!0):(this.setObjectStrokeColor(t,i.highlightstrokecolor,i.highlightstrokeopacity),this.setObjectFillColor(t,i.highlightfillcolor,i.highlightfillopacity));i.highlightstrokewidth&&this.setObjectStrokeWidth(t,Math.max(i.highlightstrokewidth,i.strokewidth))}return this},noHighlight:function(t){var e,i=t.visProp;if(!t.visProp.draft){if(t.type===r.OBJECT_TYPE_POLYGON)for(this.setObjectFillColor(t,i.fillcolor,i.fillopacity),e=0;t.borders.length>e;e++)this.setObjectStrokeColor(t.borders[e],t.borders[e].visProp.strokecolor,t.borders[e].visProp.strokeopacity);else t.type===r.OBJECT_TYPE_TEXT?this.updateTextStyle(t,!1):t.type===r.OBJECT_TYPE_IMAGE?this.updateImageStyle(t,!1):(this.setObjectStrokeColor(t,i.strokecolor,i.strokeopacity),this.setObjectFillColor(t,i.fillcolor,i.fillopacity));this.setObjectStrokeWidth(t,i.strokewidth)}return this},suspendRedraw:function(){},unsuspendRedraw:function(){},drawZoomBar:function(t){var e,i,r=function(t){t||(t=window.event),t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},s=function(s,o){var n;n=e.createElement("span"),i.appendChild(n),n.appendChild(document.createTextNode(s)),a.addEvent(n,"click",o,t),a.addEvent(n,"mouseup",r,t),a.addEvent(n,"mousedown",r,t),a.addEvent(n,"touchend",r,t),a.addEvent(n,"touchstart",r,t)};a.isBrowser&&(e=t.containerObj.ownerDocument,i=e.createElement("div"),i.setAttribute("id",t.containerObj.id+"_navigationbar"),i.style.color=t.options.navbar.strokeColor,i.style.backgroundColor=t.options.navbar.fillColor,i.style.padding=t.options.navbar.padding,i.style.position=t.options.navbar.position,i.style.fontSize=t.options.navbar.fontSize,i.style.cursor=t.options.navbar.cursor,i.style.zIndex=t.options.navbar.zIndex,t.containerObj.appendChild(i),i.style.right=t.options.navbar.right,i.style.bottom=t.options.navbar.bottom,t.attr.showreload&&s(" ↻ ",function(){t.reload()}),s(" – ",t.zoomOut),s(" o ",t.zoom100),s(" + ",t.zoomIn),s(" ← ",t.clickLeftArrow),s(" ↓ ",t.clickUpArrow),s(" ↑ ",t.clickDownArrow),s(" → ",t.clickRightArrow))},getElementById:function(t){return document.getElementById(this.container.id+"_"+t)},removeToInsertLater:function(t){var e=t.parentNode,i=t.nextSibling;return e.removeChild(t),function(){i?e.insertBefore(t,i):e.appendChild(t)}},resize:function(){},createTouchpoints:function(){},showTouchpoint:function(){},hideTouchpoint:function(){},updateTouchpoint:function(){}}),t.AbstractRenderer}),define("renderer/no",["jxg","renderer/abstract"],function(t,e){return t.NoRenderer=function(){this.enhancedRendering=!1,this.type="no"},t.extend(t.NoRenderer.prototype,{drawPoint:function(){},updatePoint:function(){},changePointStyle:function(){},drawLine:function(){},updateLine:function(){},drawTicks:function(){},updateTicks:function(){},drawCurve:function(){},updateCurve:function(){},drawEllipse:function(){},updateEllipse:function(){},drawPolygon:function(){},updatePolygon:function(){},displayCopyright:function(){},drawInternalText:function(){},updateInternalText:function(){},drawText:function(){},updateText:function(){},updateTextStyle:function(){},updateInternalTextStyle:function(){},drawImage:function(){},updateImage:function(){},transformImage:function(){},updateImageURL:function(){},appendChildPrim:function(){},appendNodesToElement:function(){},createPrim:function(){return null},remove:function(){},makeArrows:function(){},updateEllipsePrim:function(){},updateLinePrim:function(){},updatePathPrim:function(){},updatePathStringPoint:function(){},updatePathStringPrim:function(){},updatePathStringBezierPrim:function(){},updatePolygonPrim:function(){},updateRectPrim:function(){},setPropertyPrim:function(){},show:function(){},hide:function(){},setBuffering:function(){},setDashStyle:function(){},setDraft:function(){},removeDraft:function(){},setGradient:function(){},updateGradient:function(){},setObjectFillColor:function(){},setObjectStrokeColor:function(){},setObjectStrokeWidth:function(){},setShadow:function(){},highlight:function(){},noHighlight:function(){},suspendRedraw:function(){},unsuspendRedraw:function(){},drawZoomBar:function(){},getElementById:function(){return null},resize:function(){},removeToInsertLater:function(){return function(){}}}),t.NoRenderer.prototype=new e,t.NoRenderer}),define("reader/file",["jxg","utils/env","utils/type","utils/encoding","utils/base64"],function(t,e,i,r,s){return t.FileReader={parseFileContent:function(e,o,n,a,h){var l=!1;i.exists(a)||(a=!0);try{l=new XMLHttpRequest,"raw"===n.toLowerCase()?l.overrideMimeType("text/plain; charset=iso-8859-1"):l.overrideMimeType("text/xml; charset=iso-8859-1")}catch(c){try{l=new ActiveXObject("Msxml2.XMLHTTP")}catch(d){try{l=new ActiveXObject("Microsoft.XMLHTTP")}catch(u){l=!1}}}if(!l)return t.debug("AJAX not activated!"),void 0;l.open("GET",e,a),this.cbp="raw"===n.toLowerCase()?function(){var t=l;4===t.readyState&&o(t.responseText)}:function(){var t=l,e="";4===t.readyState&&(e=!i.exists(t.responseStream)||"PK"!==t.responseText.slice(0,2)&&31!==r.asciiCharCodeAt(t.responseText.slice(0,1),0)?t.responseText:s.decode(jxgBinFileReader(t)),this.parseString(e,o,n,h))},this.cb=i.bind(this.cbp,this),l.onreadystatechange=this.cb;try{l.send(null)}catch(p){throw Error("JSXGraph: A problem occurred while trying to read '"+e+"'.")}},parseString:function(e,r,s,o){var n,a;if(s=s.toLowerCase(),n=t.readers[s],!i.exists(n))throw Error("JSXGraph: There is no reader available for '"+s+"'.");a=new n(r,e),a.read(),"function"==typeof o&&o(r)}},!e.isMetroApp()&&e.isBrowser&&"object"==typeof navigator&&/msie/i.test(navigator.userAgent)&&!/opera/i.test(navigator.userAgent)&&document&&document.write&&document.write('<script type="text/vbscript">\nFunction Base64Encode(inData)\n Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"\n Dim cOut, sOut, I\n For I = 1 To LenB(inData) Step 3\n Dim nGroup, pOut, sGroup\n nGroup = &H10000 * AscB(MidB(inData, I, 1)) + _\n &H100 * MyASC(MidB(inData, I + 1, 1)) + MyASC(MidB(inData, I + 2, 1))\n nGroup = Oct(nGroup)\n nGroup = String(8 - Len(nGroup), "0") & nGroup\n pOut = Mid(Base64, CLng("&o" & Mid(nGroup, 1, 2)) + 1, 1) + _\n Mid(Base64, CLng("&o" & Mid(nGroup, 3, 2)) + 1, 1) + _\n Mid(Base64, CLng("&o" & Mid(nGroup, 5, 2)) + 1, 1) + _\n Mid(Base64, CLng("&o" & Mid(nGroup, 7, 2)) + 1, 1)\n sOut = sOut + pOut\n Next\n Select Case LenB(inData) Mod 3\n Case 1: \'8 bit final\n sOut = Left(sOut, Len(sOut) - 2) + "=="\n Case 2: \'16 bit final\n sOut = Left(sOut, Len(sOut) - 1) + "="\n End Select\n Base64Encode = sOut\nEnd Function\n\nFunction MyASC(OneChar)\n If OneChar = "" Then MyASC = 0 Else MyASC = AscB(OneChar)\nEnd Function\n\nFunction jxgBinFileReader(xhr)\n Dim byteString\n Dim b64String\n Dim i\n byteString = xhr.responseBody\n ReDim byteArray(LenB(byteString))\n For i = 1 To LenB(byteString)\n byteArray(i-1) = AscB(MidB(byteString, i, 1))\n Next\n b64String = Base64Encode(byteString)\n jxgBinFileReader = b64String\nEnd Function\n</script>\n'),t.FileReader
+}),define("base/text",["jxg","base/constants","base/coords","base/element","parser/geonext","math/statistics","utils/env","utils/type"],function(t,e,i,r,s,o,n,a){return t.Text=function(t,r,s,o){return this.constructor(t,o,e.OBJECT_TYPE_TEXT,e.OBJECT_CLASS_OTHER),this.content="",this.plaintext="",this.isDraggable=!1,this.needsSizeUpdate=!1,this.element=this.board.select(o.anchor),this.hiddenByParent=!1,this.element?(this.relativeCoords=this.visProp.islabel?new i(e.COORDS_BY_SCREEN,[parseFloat(s[0]),parseFloat(s[1])],this.board):new i(e.COORDS_BY_USER,[parseFloat(s[0]),parseFloat(s[1])],this.board),this.element.addChild(this),this.X=function(){var t,r,s;return this.visProp.islabel?(t=parseFloat(this.visProp.offset[0]),s=this.element.getLabelAnchor(),r=new i(e.COORDS_BY_SCREEN,[t+this.relativeCoords.scrCoords[1]+s.scrCoords[1],0],this.board),r.usrCoords[1]):(s=this.element.getTextAnchor(),this.relativeCoords.usrCoords[1]+s.usrCoords[1])},this.Y=function(){var t,r,s;return this.visProp.islabel?(t=-parseFloat(this.visProp.offset[1]),s=this.element.getLabelAnchor(),r=new i(e.COORDS_BY_SCREEN,[0,t+this.relativeCoords.scrCoords[2]+s.scrCoords[2]],this.board),r.usrCoords[2]):(s=this.element.getTextAnchor(),this.relativeCoords.usrCoords[2]+s.usrCoords[2])},this.coords=new i(e.COORDS_BY_SCREEN,[0,0],this.board),this.isDraggable=!0):(a.isNumber(s[0])&&a.isNumber(s[1])&&(this.isDraggable=!0),this.X=a.createFunction(s[0],this.board,null,!0),this.Y=a.createFunction(s[1],this.board,null,!0),this.coords=new i(e.COORDS_BY_USER,[this.X(),this.Y()],this.board)),this.Z=a.createFunction(1,this.board,""),this.size=[1,1],this.id=this.board.setId(this,"T"),this.board.renderer.drawText(this),this.setText(r),this.updateSize(),this.visProp.visible||this.board.renderer.hide(this),"string"==typeof this.content&&this.notifyParents(this.content),this.elType="text",this.methodMap=a.deepCopy(this.methodMap,{setText:"setTextJessieCode",free:"free",move:"setCoords"}),this},t.Text.prototype=new r,t.extend(t.Text.prototype,{hasPoint:function(t,e){var i,r,s,o,n=this.board.options.precision.hasPoint;return i="right"===this.visProp.anchorx?this.coords.scrCoords[1]-this.size[0]:"middle"===this.visProp.anchorx?this.coords.scrCoords[1]-.5*this.size[0]:this.coords.scrCoords[1],r=i+this.size[0],o="top"===this.visProp.anchory?this.coords.scrCoords[2]+this.size[1]:"middle"===this.visProp.anchorx?this.coords.scrCoords[2]+.5*this.size[1]:this.coords.scrCoords[2],s=o-this.size[1],e>=s-n&&o+n>=e&&(t>=i-n&&i+2*n>=t||t>=r-2*n&&r+n>=t)},_setText:function(t){var e;return this.needsSizeUpdate=!1,"function"==typeof t?(this.updateText=function(){this.plaintext=t()},this.needsSizeUpdate=!0):a.isString(t)&&!this.visProp.parse?(this.updateText=function(){this.plaintext=t},this.needsSizeUpdate=!1):(a.isNumber(t)?this.content=t.toFixed(this.visProp.digits):this.visProp.useasciimathml?(this.content="'`"+t+"`'",this.needsSizeUpdate=!0):this.content=this.generateTerm(t),e=this.board.jc.snippet(this.content,!0,"",!1),this.updateText=function(){this.plaintext=e()}),this.updateText(),this.prepareUpdate().update().updateRenderer(),this.needsSizeUpdate&&this.updateSize(),this},setTextJessieCode:function(t){var e;return this.visProp.castext=t,e="function"==typeof t?function(){return a.sanitizeHTML(t())}:a.isNumber(t)?t:a.sanitizeHTML(t),this._setText(e)},setText:function(t){return this._setText(t)},updateSize:function(){var t;if(!n.isBrowser)return this;if("html"===this.visProp.display&&"vml"!==this.board.renderer.type&&"no"!==this.board.renderer.type)this.size=[this.rendNode.offsetWidth,this.rendNode.offsetHeight];else if("internal"===this.visProp.display&&"svg"===this.board.renderer.type)try{t=this.rendNode.getBBox(),this.size=[t.width,t.height]}catch(e){}else("vml"===this.board.renderer.type||"internal"===this.visProp.display&&"canvas"===this.board.renderer.type)&&(this.size=[.45*parseFloat(this.visProp.fontsize)*this.plaintext.length,.9*parseFloat(this.visProp.fontsize)]);return this},utf8_decode:function(t){return t.replace(/&#x(\w+);/g,function(t,e){return String.fromCharCode(parseInt(e,16))})},replaceSub:function(t){if(!t.indexOf)return t;for(var e,i=t.indexOf("_{");i>=0;)t=t.substr(0,i)+t.substr(i).replace(/_\{/,"<sub>"),e=t.substr(i).indexOf("}"),e>=0&&(t=t.substr(0,e)+t.substr(e).replace(/\}/,"</sub>")),i=t.indexOf("_{");for(i=t.indexOf("_");i>=0;)t=t.substr(0,i)+t.substr(i).replace(/_(.?)/,"<sub>$1</sub>"),i=t.indexOf("_");return t},replaceSup:function(t){if(!t.indexOf)return t;for(var e,i=t.indexOf("^{");i>=0;)t=t.substr(0,i)+t.substr(i).replace(/\^\{/,"<sup>"),e=t.substr(i).indexOf("}"),e>=0&&(t=t.substr(0,e)+t.substr(e).replace(/\}/,"</sup>")),i=t.indexOf("^{");for(i=t.indexOf("^");i>=0;)t=t.substr(0,i)+t.substr(i).replace(/\^(.?)/,"<sup>$1</sup>"),i=t.indexOf("^");return t},getSize:function(){return this.size},setCoords:function(t,i){return a.isArray(t)&&t.length>1&&(i=t[1],t=t[0]),this.X=function(){return t},this.Y=function(){return i},this.coords.setCoordinates(e.COORDS_BY_USER,[t,i]),this.prepareUpdate().update().updateRenderer(),this},free:function(){this.X=a.createFunction(this.X(),this.board,""),this.Y=a.createFunction(this.Y(),this.board,""),this.isDraggable=!0},update:function(){return this.needsUpdate&&(this.visProp.frozen||this.updateCoords(),this.updateText(),"internal"===this.visProp.display&&(this.plaintext=this.utf8_decode(this.plaintext)),this.needsSizeUpdate&&this.updateSize(),this.updateTransform()),this},updateCoords:function(){this.coords.setCoordinates(e.COORDS_BY_USER,[this.X(),this.Y()])},updateRenderer:function(){return this.needsUpdate&&(this.board.renderer.updateText(this),this.needsUpdate=!1),this},updateTransform:function(){var t;if(0===this.transformations.length)return this;for(t=0;this.transformations.length>t;t++)this.transformations[t].update();return this},generateTerm:function(t){var e,i,r,o,n='""';if(t=t||"",t=t.replace(/\r/g,""),t=t.replace(/\n/g,""),t=t.replace(/\"/g,"'"),t=t.replace(/\'/g,"\\'"),t=t.replace(/&amp;arc;/g,"&ang;"),t=t.replace(/<arc\s*\/>/g,"&ang;"),t=t.replace(/&lt;arc\s*\/&gt;/g,"&ang;"),t=t.replace(/&lt;sqrt\s*\/&gt;/g,"&radic;"),t=t.replace(/&lt;value&gt;/g,"<value>"),t=t.replace(/&lt;\/value&gt;/g,"</value>"),r=t.indexOf("<value>"),o=t.indexOf("</value>"),r>=0)for(this.needsSizeUpdate=!0;r>=0;)n+=' + "'+this.replaceSub(this.replaceSup(t.slice(0,r)))+'"',i=t.slice(r+7,o),e=s.geonext2JS(i,this.board),e=e.replace(/\\"/g,"'"),e=e.replace(/\\'/g,"'"),n+=0>e.indexOf("toFixed")?a.isNumber(a.bind(this.board.jc.snippet(e,!0,"",!1),this)())?"+("+e+").toFixed("+this.visProp.digits+")":"+("+e+")":"+("+e+")",t=t.slice(o+8),r=t.indexOf("<value>"),o=t.indexOf("</value>");return n+=' + "'+this.replaceSub(this.replaceSup(t))+'"',n=n.replace(/<overline>/g,"<span style=text-decoration:overline>"),n=n.replace(/&lt;overline&lt;/g,"<span style=text-decoration:overline>"),n=n.replace(/<\/overline>/g,"</span>"),n=n.replace(/&lt;\/overline&gt;/g,"</span>"),n=n.replace(/<arrow>/g,"<span style=text-decoration:overline>"),n=n.replace(/&lt;arrow&gt;/g,"<span style=text-decoration:overline>"),n=n.replace(/<\/arrow>/g,"</span>"),n=n.replace(/&lt;\/arrow&gt;/g,"</span>"),n=n.replace(/&amp;/g,"&"),n=n.replace(/"/g,"'")},notifyParents:function(t){var e,i=null;t=t.replace(/&lt;value&gt;/g,"<value>"),t=t.replace(/&lt;\/value&gt;/g,"</value>");do e=/<value>([\w\s\*\/\^\-\+\(\)\[\],<>=!]+)<\/value>/,i=e.exec(t),null!==i&&(s.findDependencies(this,i[1],this.board),t=t.substr(i.index),t=t.replace(e,""));while(null!==i);return this},bounds:function(){var t=this.coords.usrCoords;return this.visProp.islabel?[0,0,0,0]:[t[1],t[2]+this.size[1],t[1]+this.size[0],t[2]]},setPositionDirectly:function(t,e,r){var s,n,h=new i(t,e,this.board),l=new i(t,r,this.board);return this.relativeCoords?this.visProp.islabel?(s=o.subtract(h.scrCoords,l.scrCoords),this.relativeCoords.scrCoords[1]+=s[1],this.relativeCoords.scrCoords[2]+=s[2]):(s=o.subtract(h.usrCoords,l.usrCoords),this.relativeCoords.usrCoords[1]+=s[1],this.relativeCoords.usrCoords[2]+=s[2]):(s=o.subtract(h.usrCoords,l.usrCoords),n=[this.Z(),this.X(),this.Y()],this.X=a.createFunction(n[1]+s[1],this.board,""),this.Y=a.createFunction(n[2]+s[2],this.board,"")),this}}),t.createText=function(e,i,r){var s,o=a.copyAttributes(r,e.options,"text");return o.anchor=o.parent||o.anchor,s=new t.Text(e,i[i.length-1],i,o),"function"!=typeof i[i.length-1]&&(s.parents=i),0!==a.evaluate(o.rotate)&&"internal"===o.display&&s.addRotation(a.evaluate(o.rotate)),s},t.registerElement("text",t.createText),{Text:t.Text,createText:t.createText}}),define("utils/uuid",["jxg"],function(t){var e="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",i=e.split("");return t.Util=t.Util||{},t.Util.genUUID=function(){var t,e,r=[],s=0;for(e=0;36>e;e++)8===e||13===e||18===e||23===e?r[e]="-":14===e?r[e]="4":(2>=s&&(s=0|33554432+16777216*Math.random()),t=15&s,s>>=4,r[e]=i[19===e?8|3&t:t]);return r.join("")},t.Util}),define("parser/jessiecode",["jxg","base/constants","base/text","math/math","math/geometry","math/statistics","utils/type","utils/uuid","utils/env"],function(JXG,Const,Text,Mat,Geometry,Statistics,Type,UUID,Env){JXG.JessieCode=function(t,e){this.sstack=[{}],this.scope=0,this.plist=[],this.dpstack=[[]],this.pscope=0,this.propstack=[{}],this.propscope=0,this.propobj=0,this.lhs=[],this.isLHS=!1,this.warnLog="jcwarn",this.$log=[],this.builtIn=this.defineBuiltIn(),this.board=null,this.lineToElement={},this.parCurLine=1,this.parCurColumn=0,this.line=1,this.col=1,this.code="","string"==typeof t&&this.parse(t,e)},JXG.extend(JXG.JessieCode.prototype,{node:function(t,e,i){return{type:t,value:e,children:i}},createNode:function(t,e){var i,r=this.node(t,e,[]);for(i=2;arguments.length>i;i++)r.children.push(arguments[i]);return r.line=this.parCurLine,r.col=this.parCurColumn,r},getElementById:function(t){return this.board.objects[t]},log:function(){this.$log.push(arguments),"object"==typeof console&&console.log&&console.log.apply(console,arguments)},creator:function(){var t,e={};return t=function(t){var i;return"function"==typeof e[this.board.id+t]?i=e[this.board.id+t]:(i=function(e){return function(i,r){var s;return s=Type.exists(r)?r:{name:0!==e.lhs[e.scope]?e.lhs[e.scope]:""},e.board.create(t,i,s)}}(this),i.creator=!0,e[this.board.id+t]=i),i},t.clearCache=function(){e={}},t}(),letvar:function(t,e){this.builtIn[t]&&this._warn('"'+t+'" is a predefined value.'),this.sstack[this.scope][t]=e},isLocalVariable:function(t){var e;for(e=this.scope;e>-1;e--)if(Type.exists(this.sstack[e][t]))return e;return-1},isCreator:function(t){return!!JXG.elements[t]},isMathMethod:function(t){return"E"!==t&&!!Math[t]},isBuiltIn:function(t){return!!this.builtIn[t]},getvar:function(t,e){var i,r;return e=Type.def(e,!1),i=this.isLocalVariable(t),i>-1?this.sstack[i][t]:this.isCreator(t)?this.creator(t):this.isMathMethod(t)?Math[t]:this.isBuiltIn(t)?this.builtIn[t]:e||(i=this.board.select(t),i===t)?r:i},getvarJS:function(t,e,i){var r,s="";return e=Type.def(e,!1),i=Type.def(i,!1),Type.indexOf(this.plist[this.plist.length-1],t)>-1?t:(r=this.isLocalVariable(t),r>-1&&!i?"$jc$.sstack["+r+"]['"+t+"']":this.isCreator(t)?"(function () { var a = Array.prototype.slice.call(arguments, 0), props = "+(i?"a.pop()":"{}")+"; return $jc$.board.create.apply($jc$.board, ['"+t+"'].concat([a, props])); })":(i&&this._error("Syntax error (attribute values are allowed with element creators only)"),this.isMathMethod(t)?"Math."+t:this.isBuiltIn(t)?this.builtIn[t].src||this.builtIn[t]:e?"":(Type.isId(this.board,t)?s="$jc$.board.objects['"+t+"']":Type.isName(this.board,t)?s="$jc$.board.elementsByName['"+t+"']":Type.isGroup(this.board,t)&&(s="$jc$.board.groups['"+t+"']"),s)))},makeMap:function(t){return t.isMap=!0,t},defineFunction:function(node){var fun,i,bo="",bc="",list=node.children[0];if(this.board.options.jc.compile){for(this.sstack.push({}),this.scope++,"op_map"===node.value&&(bo="{ return ",bc=" }"),this.isLHS=!1,i=0;list.length>i;i++)this.sstack[this.scope][list[i]]=list[i];this.replaceNames(node.children[1]),fun=function($jc$,list){var fun,p=list.join(", "),str="var f = function ("+p+") {\n$jc$.sstack.push([]);\nvar $scope$ = ++$jc$.scope;\nvar r = (function () "+bo+$jc$.compile(node.children[1],!0)+bc+")();\n$jc$.sstack.pop();\n$jc$.scope--;\nreturn r;\n}; f;";try{return fun=eval(str)}catch(e){return $jc$._warn("error compiling function\n\n"+str+"\n\n"+(""+e)),function(){}}}(this,list),this.sstack.pop(),this.scope--}else fun=function(t,e){return function(){var i;for(e.sstack.push({}),e.scope++,i=0;t.length>i;i++)e.sstack[e.scope][t[i]]=arguments[i];return i=e.execute(node.children[1]),e.sstack.pop(),e.scope--,i}}(list,this);return fun.node=node,fun.toJS=fun.toString,fun.toString=function(t){return function(){return t.compile(t.replaceIDs(Type.deepCopy(node)))}}(this),fun.deps={},this.collectDependencies(node.children[1],fun.deps),fun},mergeAttributes:function(){var t,e={};for(t=0;arguments.length>t;t++)e=Type.deepCopy(e,arguments[t],!0);return e},setProp:function(t,e,i){var r,s,o={};t.elementClass!==Const.OBJECT_CLASS_POINT||"X"!==e&&"Y"!==e?t.type!==Const.OBJECT_TYPE_TEXT||"X"!==e&&"Y"!==e?t.type&&t.elementClass&&t.visProp?Type.exists(t[t.methodMap[e]])&&"function"!=typeof t[t.methodMap[e]]?t[t.methodMap[e]]=i:(o[e]=i,t.setProperty(o)):t[e]=i:("number"==typeof i?t[e]=function(){return i}:"function"==typeof i?(t.isDraggable=!1,t[e]=i):"string"==typeof i&&(t.isDraggable=!1,t[e]=Type.createFunction(i,this.board,null,!0),t[e+"jc"]=i),t[e].origin=i,this.board.update()):(e=e.toLowerCase(),t.isDraggable&&"number"==typeof i?(r="x"===e?i:t.X(),s="y"===e?i:t.Y(),t.setPosition(Const.COORDS_BY_USER,[r,s])):!t.isDraggable||"function"!=typeof i&&"string"!=typeof i?t.isDraggable||(r="x"===e?i:t.XEval.origin,s="y"===e?i:t.YEval.origin,t.addConstraint([r,s])):(r="x"===e?i:t.coords.usrCoords[1],s="y"===e?i:t.coords.usrCoords[2],t.addConstraint([r,s])),this.board.update())},parse:function(t,e,i){var r,s,o,n,a=t.replace(/\r\n/g,"\n").split("\n"),h=[];i||(this.code+=t+"\n"),Text&&(s=Text.Text.prototype.setText,Text.Text.prototype.setText=Text.Text.prototype.setTextJessieCode);try{for(Type.exists(e)||(e=!1),r=0;a.length>r;r++)e&&(a[r]=JXG.GeonextParser.geonext2JS(a[r],this.board)),h.push(a[r]);t=h.join("\n"),o=parser.parse(t),n=this.execute(o)}finally{Text&&(Text.Text.prototype.setText=s)}return n},snippet:function(t,e,i,r){var s;return e=Type.def(e,!0),i=Type.def(i,""),r=Type.def(r,!1),s=(e?" function ("+i+") { return ":"")+t+(e?"; }":"")+";",this.parse(s,r,!0)},replaceIDs:function(t){var e,i;if(t.replaced&&(i=this.board.objects[t.children[1][0].value],Type.exists(i)&&""!==i.name&&(t.type="node_var",t.value=i.name,t.children.length=0,delete t.replaced)),t.children)for(e=t.children.length;e>0;e--)Type.exists(t.children[e-1])&&(t.children[e-1]=this.replaceIDs(t.children[e-1]));return t},replaceNames:function(t){var e,i;if(i=t.value,"node_op"===t.type&&"op_lhs"===i&&1===t.children.length?this.isLHS=!0:"node_var"===t.type&&(this.isLHS?this.letvar(i,!0):!Type.exists(this.getvar(i,!0))&&Type.exists(this.board.elementsByName[i])&&(t=this.createReplacementNode(t))),t.children)for(e=t.children.length;e>0;e--)Type.exists(t.children[e-1])&&(t.children[e-1]=this.replaceNames(t.children[e-1]));return"node_op"===t.type&&"op_lhs"===t.value&&1===t.children.length&&(this.isLHS=!1),t},createReplacementNode:function(t){var e=t.value,i=this.board.elementsByName[e];return t=this.createNode("node_op","op_execfun",this.createNode("node_var","$"),[this.createNode("node_str",i.id)]),t.replaced=!0,t},collectDependencies:function(t,e){var i,r,s;if(r=t.value,"node_var"===t.type&&(s=this.getvar(r),s&&s.visProp&&s.type&&s.elementClass&&s.id&&(e[s.id]=s)),"node_op"===t.type&&"op_execfun"===t.value&&t.children.length>1&&"$"===t.children[0].value&&t.children[1].length>0&&(s=t.children[1][0].value,e[s]=this.board.objects[s]),t.children)for(i=t.children.length;i>0;i--)Type.exists(t.children[i-1])&&this.collectDependencies(t.children[i-1],e)},resolveProperty:function(t,e,i){return i=Type.def(i,!1),t&&t.methodMap&&(Type.exists(t.subs)&&Type.exists(t.subs[e])?t=t.subs:Type.exists(t.methodMap[e])?e=t.methodMap[e]:(t=t.visProp,e=e.toLowerCase())),Type.exists(t)||this._error(t+" is not an object"),Type.exists(t[e])||this._error("unknown property "+e),i&&"function"==typeof t[e]?function(){return t[e].apply(t,arguments)}:t[e]},getLHS:function(t){var e;if("node_var"===t.type)e={o:this.sstack[this.scope],what:t.value};else if("node_op"===t.type&&"op_property"===t.value)e={o:this.execute(t.children[0]),what:t.children[1]};else{if("node_op"!==t.type||"op_extvalue"!==t.value)throw Error("Syntax error: Invalid left-hand side of assignment.");e={o:this.execute(t.children[0]),what:this.execute(t.children[1])}}return e},getLHSCompiler:function(t,e){var i;if("node_var"===t.type)i=t.value;else if("node_op"===t.type&&"op_property"===t.value)i=[this.compile(t.children[0],e),"'"+t.children[1]+"'"];else{if("node_op"!==t.type||"op_extvalue"!==t.value)throw Error("Syntax error: Invalid left-hand side of assignment.");i=[this.compile(t.children[0]),"node_const"===t.children[1].type?t.children[1].value:this.compile(t.children[1],e)]}return i},execute:function(t){var e,i,r,s,o,n,a,h,l,c,d,u,p=[],f=!1;if(e=0,!t)return e;switch(this.line=t.line,this.col=t.col,t.type){case"node_op":switch(t.value){case"op_none":t.children[0]&&this.execute(t.children[0]),t.children[1]&&(e=this.execute(t.children[1]));break;case"op_assign":i=this.getLHS(t.children[0]),this.lhs[this.scope]=i[1],i.o.type&&i.o.elementClass&&i.o.methodMap&&"label"===i.what&&this._error("Left-hand side of assignment is read-only."),e=this.execute(t.children[1]),i.o!==this.sstack[this.scope]||Type.isArray(i.o)&&"number"==typeof i.what?this.setProp(i.o,i.what,e):this.letvar(i.what,e),this.lhs[this.scope]=0;break;case"op_if":this.execute(t.children[0])&&(e=this.execute(t.children[1]));break;case"op_conditional":case"op_if_else":e=this.execute(t.children[0])?this.execute(t.children[1]):this.execute(t.children[2]);break;case"op_while":for(;this.execute(t.children[0]);)this.execute(t.children[1]);break;case"op_do":do this.execute(t.children[0]);while(this.execute(t.children[1]));break;case"op_for":for(this.execute(t.children[0]);this.execute(t.children[1]);this.execute(t.children[2]))this.execute(t.children[3]);break;case"op_proplst":t.children[0]&&this.execute(t.children[0]),t.children[1]&&this.execute(t.children[1]);break;case"op_emptyobject":e={};break;case"op_proplst_val":this.propstack.push({}),this.propscope++,this.execute(t.children[0]),e=this.propstack[this.propscope],this.propstack.pop(),this.propscope--;break;case"op_prop":this.propstack[this.propscope][t.children[0]]=this.execute(t.children[1]);break;case"op_array":for(e=[],o=t.children[0].length,r=0;o>r;r++)e.push(this.execute(t.children[0][r]));break;case"op_extvalue":e=this.execute(t.children[0]),r=this.execute(t.children[1]),e="number"==typeof r&&Math.abs(Math.round(r)-r)<Mat.eps?e[r]:n;break;case"op_return":if(0!==this.scope)return this.execute(t.children[0]);this._error("Unexpected return.");break;case"op_map":t.children[1].isMath||this._error("In a map only function calls and mathematical expressions are allowed."),this.plist.push(t.children[0]),l=this.defineFunction(t),l.isMap=!0,this.plist.pop(),e=l;break;case"op_function":this.plist.push(t.children[0]),l=this.defineFunction(t),l.isMap=!1,this.plist.pop(),e=l;break;case"op_execfun":if(this.dpstack.push([]),this.pscope++,a=t.children[1],Type.exists(t.children[2]))if(t.children[3])for(h=t.children[2],c={},r=0;h.length>r;r++)c=Type.deepCopy(c,this.execute(h[r]),!0);else c=this.execute(t.children[2]);for(l=this.execute(t.children[0]),d=l&&l.sc?l.sc:this,!l.creator&&Type.exists(t.children[2])&&this._error("Unexpected value. Only element creators are allowed to have a value after the function call."),r=0;a.length>r;r++)p[r]=this.execute(a[r]),this.dpstack.push({line:t.children[1][r].line,col:t.children[1][r].col});if("function"!=typeof l||l.creator)if("function"==typeof l&&l.creator){s=this.line;try{for(e=l(p,c),e.jcLineStart=s,e.jcLineEnd=t.line,r=s;t.line>=r;r++)this.lineToElement[r]=e;e.debugParents=this.dpstack[this.pscope]}catch(m){this._error(""+m)}}else this._error("Function '"+l+"' is undefined.");else e=l.apply(d,p);this.dpstack.pop(),this.pscope--;break;case"op_property":s=this.execute(t.children[0]),i=t.children[1],e=this.resolveProperty(s,i,!1),Type.exists(e)&&(e.sc=s);break;case"op_use":f=!1;for(u in JXG.boards)JXG.boards.hasOwnProperty(u)&&JXG.boards[u].container===""+t.children[0]&&(this.use(JXG.boards[u]),f=!0);f||this._error("Board '"+(""+t.children[0])+"' not found!");break;case"op_delete":i=this.getvar(t.children[0]),"object"==typeof i&&JXG.exists(i.type)&&JXG.exists(i.elementClass)&&this.board.removeObject(i);break;case"op_equ":e=this.execute(t.children[0])==this.execute(t.children[1]);break;case"op_neq":e=this.execute(t.children[0])!=this.execute(t.children[1]);break;case"op_approx":e=Math.abs(this.execute(t.children[0])-this.execute(t.children[1]))<Mat.eps;break;case"op_grt":e=this.execute(t.children[0])>this.execute(t.children[1]);break;case"op_lot":e=this.execute(t.children[0])<this.execute(t.children[1]);break;case"op_gre":e=this.execute(t.children[0])>=this.execute(t.children[1]);break;case"op_loe":e=this.execute(t.children[0])<=this.execute(t.children[1]);break;case"op_or":e=this.execute(t.children[0])||this.execute(t.children[1]);break;case"op_and":e=this.execute(t.children[0])&&this.execute(t.children[1]);break;case"op_not":e=!this.execute(t.children[0]);break;case"op_add":e=Statistics.add(this.execute(t.children[0]),this.execute(t.children[1]));break;case"op_sub":e=Statistics.subtract(this.execute(t.children[0]),this.execute(t.children[1]));break;case"op_div":e=Statistics.div(this.execute(t.children[0]),this.execute(t.children[1]));break;case"op_mod":e=Statistics.mod(this.execute(t.children[0]),this.execute(t.children[1]),!0);break;case"op_mul":e=this.mul(this.execute(t.children[0]),this.execute(t.children[1]));break;case"op_exp":e=this.pow(this.execute(t.children[0]),this.execute(t.children[1]));break;case"op_neg":e=-1*this.execute(t.children[0])}break;case"node_var":e=this.getvar(t.value);break;case"node_const":e=Number(t.value);break;case"node_const_bool":e=t.value;break;case"node_str":e=t.value}return e},compile:function(t,e){var i,r,s,o="";if(Type.exists(e)||(e=!1),!t)return o;switch(t.type){case"node_op":switch(t.value){case"op_none":t.children[0]&&(o=this.compile(t.children[0],e)),t.children[1]&&(o+=this.compile(t.children[1],e));break;case"op_assign":e?(i=this.getLHSCompiler(t.children[0]),Type.isArray(i)?o="$jc$.setProp("+i[0]+", "+i[1]+", "+this.compile(t.children[1],e)+");\n":(this.isLocalVariable(i)!==this.scope&&(this.sstack[this.scope][i]=!0),o="$jc$.sstack["+this.scope+"]['"+i+"'] = "+this.compile(t.children[1],e)+";\n")):(i=this.compile(t.children[0]),o=i+" = "+this.compile(t.children[1],e)+";\n");break;case"op_if":o=" if ("+this.compile(t.children[0],e)+") "+this.compile(t.children[1],e);break;case"op_if_else":o=" if ("+this.compile(t.children[0],e)+")"+this.compile(t.children[1],e),o+=" else "+this.compile(t.children[2],e);break;case"op_conditional":o="(("+this.compile(t.children[0],e)+")?("+this.compile(t.children[1],e),o+="):("+this.compile(t.children[2],e)+"))";break;case"op_while":o=" while ("+this.compile(t.children[0],e)+") {\n"+this.compile(t.children[1],e)+"}\n";break;case"op_do":o=" do {\n"+this.compile(t.children[0],e)+"} while ("+this.compile(t.children[1],e)+");\n";break;case"op_for":o=" for ("+this.compile(t.children[0],e)+"; "+this.compile(t.children[1],e)+"; "+this.compile(t.children[2],e)+") {\n"+this.compile(t.children[3],e)+"\n}\n";break;case"op_proplst":t.children[0]&&(o=this.compile(t.children[0],e)+", "),o+=this.compile(t.children[1],e);break;case"op_prop":o=t.children[0]+": "+this.compile(t.children[1],e);break;case"op_emptyobject":o=e?"{}":"<< >>";break;case"op_proplst_val":o=this.compile(t.children[0],e);break;case"op_array":for(s=[],r=0;t.children[0].length>r;r++)s.push(this.compile(t.children[0][r]),e);o="["+s.join(", ")+"]";break;case"op_extvalue":o=this.compile(t.children[0],e)+"["+this.compile(t.children[1],e)+"]";break;case"op_return":o=" return "+this.compile(t.children[0],e)+";\n";break;case"op_map":t.children[1].isMath||this._error("In a map only function calls and mathematical expressions are allowed."),s=t.children[0],o=e?" $jc$.makeMap(function ("+s.join(", ")+") { return "+this.compile(t.children[1],e)+"; })":"map ("+s.join(", ")+") -> "+this.compile(t.children[1],e);break;case"op_function":s=t.children[0],o=" function ("+s.join(", ")+") "+this.compile(t.children[1],e);break;case"op_execfunmath":console.log("TODO"),o="-1";break;case"op_execfun":if(t.children[2]){for(s=[],r=0;t.children[2].length>r;r++)s.push(this.compile(t.children[2][r],e));e&&(i="$jc$.mergeAttributes("+s.join(", ")+")")}for(t.children[0].withProps=!!t.children[2],s=[],r=0;t.children[1].length>r;r++)s.push(this.compile(t.children[1][r],e));o=this.compile(t.children[0],e)+"("+s.join(", ")+(t.children[2]&&e?", "+i:"")+")"+(t.children[2]&&!e?i:""),e&&"$"===t.children[0].value&&(o="$jc$.board.objects["+this.compile(t.children[1][0],e)+"]");break;case"op_property":o=e&&"X"!==t.children[1]&&"Y"!==t.children[1]?"$jc$.resolveProperty("+this.compile(t.children[0],e)+", '"+t.children[1]+"', true)":this.compile(t.children[0],e)+"."+t.children[1];break;case"op_use":o=e?"$jc$.use(JXG.boards['"+t.children[0]+"'])":"use "+t.children[0]+";";break;case"op_delete":o="delete "+t.children[0];break;case"op_equ":o="("+this.compile(t.children[0],e)+" == "+this.compile(t.children[1],e)+")";break;case"op_neq":o="("+this.compile(t.children[0],e)+" != "+this.compile(t.children[1],e)+")";break;case"op_approx":o="("+this.compile(t.children[0],e)+" ~= "+this.compile(t.children[1],e)+")";break;case"op_grt":o="("+this.compile(t.children[0],e)+" > "+this.compile(t.children[1],e)+")";break;case"op_lot":o="("+this.compile(t.children[0],e)+" < "+this.compile(t.children[1],e)+")";break;case"op_gre":o="("+this.compile(t.children[0],e)+" >= "+this.compile(t.children[1],e)+")";break;case"op_loe":o="("+this.compile(t.children[0],e)+" <= "+this.compile(t.children[1],e)+")";break;case"op_or":o="("+this.compile(t.children[0],e)+" || "+this.compile(t.children[1],e)+")";break;case"op_and":o="("+this.compile(t.children[0],e)+" && "+this.compile(t.children[1],e)+")";break;case"op_not":o="!("+this.compile(t.children[0],e)+")";break;case"op_add":o=e?"JXG.Math.Statistics.add("+this.compile(t.children[0],e)+", "+this.compile(t.children[1],e)+")":"("+this.compile(t.children[0],e)+" + "+this.compile(t.children[1],e)+")";break;case"op_sub":o=e?"JXG.Math.Statistics.subtract("+this.compile(t.children[0],e)+", "+this.compile(t.children[1],e)+")":"("+this.compile(t.children[0],e)+" - "+this.compile(t.children[1],e)+")";break;case"op_div":o=e?"JXG.Math.Statistics.div("+this.compile(t.children[0],e)+", "+this.compile(t.children[1],e)+")":"("+this.compile(t.children[0],e)+" / "+this.compile(t.children[1],e)+")";break;case"op_mod":o=e?"JXG.Math.mod("+this.compile(t.children[0],e)+", "+this.compile(t.children[1],e)+", true)":"("+this.compile(t.children[0],e)+" % "+this.compile(t.children[1],e)+")";break;case"op_mul":o=e?"$jc$.mul("+this.compile(t.children[0],e)+", "+this.compile(t.children[1],e)+")":"("+this.compile(t.children[0],e)+" * "+this.compile(t.children[1],e)+")";break;case"op_exp":o=e?"$jc$.pow("+this.compile(t.children[0],e)+", "+this.compile(t.children[1],e)+")":"("+this.compile(t.children[0],e)+"^"+this.compile(t.children[1],e)+")";break;case"op_neg":o="(-"+this.compile(t.children[0],e)+")"}break;case"node_var":o=e?this.getvarJS(t.value,!1,t.withProps):t.value;break;case"node_const":o=t.value;break;case"node_const_bool":o=t.value;break;case"node_str":o="'"+t.value.replace(/'/g,"\\'")+"'"}return t.needsBrackets&&(o="{\n"+o+"}\n"),o},X:function(t){return t.X()},Y:function(t){return t.Y()},V:function(t){return t.Value()},L:function(t){return t.L()},dist:function(t,e){return Type.exists(t)&&Type.exists(t.Dist)||this._error("Error: Can't calculate distance."),t.Dist(e)},mul:function(t,e){return Type.isArray(t)*Type.isArray(e)?Mat.innerProduct(t,e,Math.min(t.length,e.length)):Statistics.multiply(t,e)},pow:function(t,e){return t=Type.evalSlider(t),e=Type.evalSlider(e),Math.pow(t,e)},ifthen:function(t,e,i){return t?e:i},use:function(t){this.board=t,this.builtIn.$board=t,this.builtIn.$board.src="$jc$.board"},findSymbol:function(t,e){var i,r;for(e=Type.def(e,-1),-1===e&&(e=this.scope),i=e;i>=0;i--)for(r in this.sstack[i])if(this.sstack[i].hasOwnProperty(r)&&this.sstack[i][r]===t)return[r,i];return[]},defineBuiltIn:function(){var t=this,e={PI:Math.PI,EULER:Math.E,X:t.X,Y:t.Y,V:t.V,L:t.L,dist:t.dist,rad:Geometry.rad,deg:Geometry.trueAngle,factorial:Mat.factorial,trunc:Type.trunc,IfThen:t.ifthen,$:t.getElementById,$board:t.board,$log:t.log};return e.rad.sc=Geometry,e.deg.sc=Geometry,e.factorial.sc=Mat,e.X.src="$jc$.X",e.Y.src="$jc$.Y",e.V.src="$jc$.V",e.L.src="$jc$.L",e.dist.src="$jc$.dist",e.rad.src="JXG.Math.Geometry.rad",e.deg.src="JXG.Math.Geometry.trueAngle",e.factorial.src="JXG.Math.factorial",e.trunc.src="JXG.trunc",e.IfThen.src="$jc$.ifthen",e.$.src="(function (n) { return $jc$.board.select(n); })",e.$board&&(e.$board.src="$jc$.board"),e.$log.src="$jc$.log",e},_debug:function(t){"object"==typeof console?console.log(t):Env.isBrowser&&document&&null!==document.getElementById("debug")&&(document.getElementById("debug").innerHTML+=t+"<br />")},_error:function(t){var e=Error("Error("+this.line+"): "+t);throw e.line=this.line,e},_warn:function(t){"object"==typeof console?console.log("Warning("+this.line+"): "+t):Env.isBrowser&&document&&null!==document.getElementById(this.warnLog)&&(document.getElementById(this.warnLog).innerHTML+="Warning("+this.line+"): "+t+"<br />")},_log:function(t){"object"!=typeof window&&"object"==typeof self&&self.postMessage?self.postMessage({type:"log",msg:"Log: "+(""+t)}):console.log("Log: ",arguments)}});var parser=function(){function t(){this.yy={}}var e={trace:function(){},yy:{},symbols_:{error:2,Program:3,StatementList:4,EOF:5,IfStatement:6,IF:7,"(":8,Expression:9,")":10,Statement:11,ELSE:12,LoopStatement:13,WHILE:14,FOR:15,";":16,DO:17,UnaryStatement:18,USE:19,IDENTIFIER:20,DELETE:21,ReturnStatement:22,RETURN:23,EmptyStatement:24,StatementBlock:25,"{":26,"}":27,ExpressionStatement:28,AssignmentExpression:29,ConditionalExpression:30,LeftHandSideExpression:31,"=":32,LogicalORExpression:33,"?":34,":":35,LogicalANDExpression:36,"||":37,EqualityExpression:38,"&&":39,RelationalExpression:40,"==":41,"!=":42,"~=":43,AdditiveExpression:44,"<":45,">":46,"<=":47,">=":48,MultiplicativeExpression:49,"+":50,"-":51,ExponentExpression:52,"*":53,"/":54,"%":55,UnaryExpression:56,"^":57,"!":58,MemberExpression:59,CallExpression:60,PrimaryExpression:61,FunctionExpression:62,MapExpression:63,".":64,"[":65,"]":66,BasicLiteral:67,ObjectLiteral:68,ArrayLiteral:69,NullLiteral:70,BooleanLiteral:71,StringLiteral:72,NumberLiteral:73,NULL:74,TRUE:75,FALSE:76,STRING:77,NUMBER:78,NAN:79,INFINITY:80,ElementList:81,"<<":82,">>":83,PropertyList:84,Property:85,",":86,PropertyName:87,Arguments:88,AttributeList:89,Attribute:90,FUNCTION:91,ParameterDefinitionList:92,MAP:93,"->":94,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",7:"IF",8:"(",10:")",12:"ELSE",14:"WHILE",15:"FOR",16:";",17:"DO",19:"USE",20:"IDENTIFIER",21:"DELETE",23:"RETURN",26:"{",27:"}",32:"=",34:"?",35:":",37:"||",39:"&&",41:"==",42:"!=",43:"~=",45:"<",46:">",47:"<=",48:">=",50:"+",51:"-",53:"*",54:"/",55:"%",57:"^",58:"!",64:".",65:"[",66:"]",74:"NULL",75:"TRUE",76:"FALSE",77:"STRING",78:"NUMBER",79:"NAN",80:"INFINITY",82:"<<",83:">>",86:",",91:"FUNCTION",93:"MAP",94:"->"},productions_:[0,[3,2],[6,5],[6,7],[13,5],[13,9],[13,7],[18,2],[18,2],[22,2],[22,3],[24,1],[25,3],[4,2],[4,0],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[28,2],[9,1],[29,1],[29,3],[30,1],[30,5],[33,1],[33,3],[36,1],[36,3],[38,1],[38,3],[38,3],[38,3],[40,1],[40,3],[40,3],[40,3],[40,3],[44,1],[44,3],[44,3],[49,1],[49,3],[49,3],[49,3],[52,1],[52,3],[56,1],[56,2],[56,2],[56,2],[31,1],[31,1],[59,1],[59,1],[59,1],[59,3],[59,4],[61,1],[61,1],[61,1],[61,1],[61,3],[67,1],[67,1],[67,1],[67,1],[70,1],[71,1],[71,1],[72,1],[73,1],[73,1],[73,1],[69,2],[69,3],[68,2],[68,3],[84,1],[84,3],[85,3],[87,1],[87,1],[87,1],[60,2],[60,3],[60,2],[60,4],[60,3],[88,2],[88,3],[89,1],[89,3],[90,1],[90,1],[81,1],[81,3],[62,4],[62,5],[63,6],[92,1],[92,3]],performAction:function(t,e,s,o,n,a,h){var l=a.length-1;
+switch(n){case 1:return a[l-1];case 2:this.$=i.createNode(r(h[l-4]),"node_op","op_if",a[l-2],a[l]);break;case 3:this.$=i.createNode(r(h[l-6]),"node_op","op_if_else",a[l-4],a[l-2],a[l]);break;case 4:this.$=i.createNode(r(h[l-4]),"node_op","op_while",a[l-2],a[l]);break;case 5:this.$=i.createNode(r(h[l-8]),"node_op","op_for",a[l-6],a[l-4],a[l-2],a[l]);break;case 6:this.$=i.createNode(r(h[l-6]),"node_op","op_do",a[l-5],a[l-2]);break;case 7:this.$=i.createNode(r(h[l-1]),"node_op","op_use",a[l]);break;case 8:this.$=i.createNode(r(h[l-1]),"node_op","op_delete",a[l]);break;case 9:this.$=i.createNode(r(h[l-1]),"node_op","op_return",void 0);break;case 10:this.$=i.createNode(r(h[l-2]),"node_op","op_return",a[l-1]);break;case 11:this.$=i.createNode(r(h[l]),"node_op","op_none");break;case 12:this.$=a[l-1],this.$.needsBrackets=!0;break;case 13:this.$=i.createNode(r(h[l-1]),"node_op","op_none",a[l-1],a[l]);break;case 14:this.$=i.createNode(r(h[l]),"node_op","op_none");break;case 15:this.$=a[l];break;case 16:this.$=a[l];break;case 17:this.$=a[l];break;case 18:this.$=a[l];break;case 19:this.$=a[l];break;case 20:this.$=a[l];break;case 21:this.$=a[l];break;case 22:this.$=a[l-1];break;case 23:this.$=a[l];break;case 24:this.$=a[l];break;case 25:this.$=i.createNode(r(h[l-2]),"node_op","op_assign",a[l-2],a[l]),this.$.isMath=!1;break;case 26:this.$=a[l];break;case 27:this.$=i.createNode(r(h[l-4]),"node_op","op_conditional",a[l-4],a[l-2],a[l]),this.$.isMath=!1;break;case 28:this.$=a[l];break;case 29:this.$=i.createNode(r(h[l-2]),"node_op","op_or",a[l-2],a[l]),this.$.isMath=!1;break;case 30:this.$=a[l];break;case 31:this.$=i.createNode(r(h[l-2]),"node_op","op_and",a[l-2],a[l]),this.$.isMath=!1;break;case 32:this.$=a[l];break;case 33:this.$=i.createNode(r(h[l-2]),"node_op","op_equ",a[l-2],a[l]),this.$.isMath=!1;break;case 34:this.$=i.createNode(r(h[l-2]),"node_op","op_neq",a[l-2],a[l]),this.$.isMath=!1;break;case 35:this.$=i.createNode(r(h[l-2]),"node_op","op_approx",a[l-2],a[l]),this.$.isMath=!1;break;case 36:this.$=a[l];break;case 37:this.$=i.createNode(r(h[l-2]),"node_op","op_lot",a[l-2],a[l]),this.$.isMath=!1;break;case 38:this.$=i.createNode(r(h[l-2]),"node_op","op_grt",a[l-2],a[l]),this.$.isMath=!1;break;case 39:this.$=i.createNode(r(h[l-2]),"node_op","op_loe",a[l-2],a[l]),this.$.isMath=!1;break;case 40:this.$=i.createNode(r(h[l-2]),"node_op","op_gre",a[l-2],a[l]),this.$.isMath=!1;break;case 41:this.$=a[l];break;case 42:this.$=i.createNode(r(h[l-2]),"node_op","op_add",a[l-2],a[l]),this.$.isMath=!0;break;case 43:this.$=i.createNode(r(h[l-2]),"node_op","op_sub",a[l-2],a[l]),this.$.isMath=!0;break;case 44:this.$=a[l];break;case 45:this.$=i.createNode(r(h[l-2]),"node_op","op_mul",a[l-2],a[l]),this.$.isMath=!0;break;case 46:this.$=i.createNode(r(h[l-2]),"node_op","op_div",a[l-2],a[l]),this.$.isMath=!0;break;case 47:this.$=i.createNode(r(h[l-2]),"node_op","op_mod",a[l-2],a[l]),this.$.isMath=!0;break;case 48:this.$=a[l];break;case 49:this.$=i.createNode(r(h[l-2]),"node_op","op_exp",a[l-2],a[l]),this.$.isMath=!0;break;case 50:this.$=a[l];break;case 51:this.$=i.createNode(r(h[l-1]),"node_op","op_not",a[l]),this.$.isMath=!1;break;case 52:this.$=a[l];break;case 53:this.$=i.createNode(r(h[l-1]),"node_op","op_neg",a[l]),this.$.isMath=!0;break;case 54:this.$=a[l];break;case 55:this.$=a[l];break;case 56:this.$=a[l];break;case 57:this.$=a[l],this.$.isMath=!1;break;case 58:this.$=a[l];break;case 59:this.$=i.createNode(r(h[l-2]),"node_op","op_property",a[l-2],a[l]),this.$.isMath=!0;break;case 60:this.$=i.createNode(r(h[l-3]),"node_op","op_extvalue",a[l-3],a[l-1]),this.$.isMath=!0;break;case 61:this.$=i.createNode(r(h[l]),"node_var",a[l]);break;case 62:this.$=a[l];break;case 63:this.$=a[l],this.$.isMath=!1;break;case 64:this.$=a[l],this.$.isMath=!1;break;case 65:this.$=a[l-1];break;case 66:this.$=a[l],this.$.isMath=!1;break;case 67:this.$=a[l],this.$.isMath=!1;break;case 68:this.$=a[l],this.$.isMath=!1;break;case 69:this.$=a[l],this.$.isMath=!0;break;case 70:this.$=i.createNode(r(h[l]),"node_const",null);break;case 71:this.$=i.createNode(r(h[l]),"node_const_bool",!0);break;case 72:this.$=i.createNode(r(h[l]),"node_const_bool",!1);break;case 73:this.$=i.createNode(r(h[l]),"node_str",a[l].substring(1,a[l].length-1));break;case 74:this.$=i.createNode(r(h[l]),"node_const",parseFloat(a[l]));break;case 75:this.$=i.createNode(r(h[l]),"node_const",0/0);break;case 76:this.$=i.createNode(r(h[l]),"node_const",1/0);break;case 77:this.$=i.createNode(r(h[l-1]),"node_op","op_array",[]);break;case 78:this.$=i.createNode(r(h[l-2]),"node_op","op_array",a[l-1]);break;case 79:this.$=i.createNode(r(h[l-1]),"node_op","op_emptyobject",{});break;case 80:this.$=i.createNode(r(h[l-2]),"node_op","op_proplst_val",a[l-1]);break;case 81:this.$=a[l];break;case 82:this.$=i.createNode(r(h[l-2]),"node_op","op_proplst",a[l-2],a[l]);break;case 83:this.$=i.createNode(r(h[l-2]),"node_op","op_prop",a[l-2],a[l]);break;case 84:this.$=a[l];break;case 85:this.$=a[l];break;case 86:this.$=a[l];break;case 87:this.$=i.createNode(r(h[l-1]),"node_op","op_execfun",a[l-1],a[l]),this.$.isMath=!0;break;case 88:this.$=i.createNode(r(h[l-2]),"node_op","op_execfun",a[l-2],a[l-1],a[l],!0),this.$.isMath=!1;break;case 89:this.$=i.createNode(r(h[l-1]),"node_op","op_execfun",a[l-1],a[l]),this.$.isMath=!0;break;case 90:this.$=i.createNode(r(h[l-3]),"node_op","op_extvalue",a[l-3],a[l-1]),this.$.isMath=!0;break;case 91:this.$=i.createNode(r(h[l-2]),"node_op","op_property",a[l-2],a[l]),this.$.isMath=!0;break;case 92:this.$=[];break;case 93:this.$=a[l-1];break;case 94:this.$=[a[l]];break;case 95:this.$=a[l-2].concat(a[l]);break;case 96:this.$=i.createNode(r(h[l]),"node_var",a[l]),this.$.isMath=!0;break;case 97:this.$=a[l],this.$.isMath=!1;break;case 98:this.$=[a[l]];break;case 99:this.$=a[l-2].concat(a[l]);break;case 100:this.$=i.createNode(r(h[l-3]),"node_op","op_function",[],a[l]),this.$.isMath=!1;break;case 101:this.$=i.createNode(r(h[l-4]),"node_op","op_function",a[l-2],a[l]),this.$.isMath=!1;break;case 102:this.$=i.createNode(r(h[l-5]),"node_op","op_map",a[l-3],a[l]);break;case 103:this.$=[a[l]];break;case 104:this.$=a[l-2].concat(a[l])}},table:[{3:1,4:2,5:[2,14],7:[2,14],8:[2,14],14:[2,14],15:[2,14],16:[2,14],17:[2,14],19:[2,14],20:[2,14],21:[2,14],23:[2,14],26:[2,14],50:[2,14],51:[2,14],58:[2,14],65:[2,14],74:[2,14],75:[2,14],76:[2,14],77:[2,14],78:[2,14],79:[2,14],80:[2,14],82:[2,14],91:[2,14],93:[2,14]},{1:[3]},{5:[1,3],6:6,7:[1,13],8:[1,37],9:20,11:4,13:7,14:[1,14],15:[1,15],16:[1,21],17:[1,16],18:8,19:[1,17],20:[1,33],21:[1,18],22:9,23:[1,19],24:11,25:5,26:[1,12],28:10,29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{1:[2,1]},{5:[2,13],7:[2,13],8:[2,13],14:[2,13],15:[2,13],16:[2,13],17:[2,13],19:[2,13],20:[2,13],21:[2,13],23:[2,13],26:[2,13],27:[2,13],50:[2,13],51:[2,13],58:[2,13],65:[2,13],74:[2,13],75:[2,13],76:[2,13],77:[2,13],78:[2,13],79:[2,13],80:[2,13],82:[2,13],91:[2,13],93:[2,13]},{5:[2,15],7:[2,15],8:[2,15],12:[2,15],14:[2,15],15:[2,15],16:[2,15],17:[2,15],19:[2,15],20:[2,15],21:[2,15],23:[2,15],26:[2,15],27:[2,15],50:[2,15],51:[2,15],58:[2,15],65:[2,15],74:[2,15],75:[2,15],76:[2,15],77:[2,15],78:[2,15],79:[2,15],80:[2,15],82:[2,15],91:[2,15],93:[2,15]},{5:[2,16],7:[2,16],8:[2,16],12:[2,16],14:[2,16],15:[2,16],16:[2,16],17:[2,16],19:[2,16],20:[2,16],21:[2,16],23:[2,16],26:[2,16],27:[2,16],50:[2,16],51:[2,16],58:[2,16],65:[2,16],74:[2,16],75:[2,16],76:[2,16],77:[2,16],78:[2,16],79:[2,16],80:[2,16],82:[2,16],91:[2,16],93:[2,16]},{5:[2,17],7:[2,17],8:[2,17],12:[2,17],14:[2,17],15:[2,17],16:[2,17],17:[2,17],19:[2,17],20:[2,17],21:[2,17],23:[2,17],26:[2,17],27:[2,17],50:[2,17],51:[2,17],58:[2,17],65:[2,17],74:[2,17],75:[2,17],76:[2,17],77:[2,17],78:[2,17],79:[2,17],80:[2,17],82:[2,17],91:[2,17],93:[2,17]},{5:[2,18],7:[2,18],8:[2,18],12:[2,18],14:[2,18],15:[2,18],16:[2,18],17:[2,18],19:[2,18],20:[2,18],21:[2,18],23:[2,18],26:[2,18],27:[2,18],50:[2,18],51:[2,18],58:[2,18],65:[2,18],74:[2,18],75:[2,18],76:[2,18],77:[2,18],78:[2,18],79:[2,18],80:[2,18],82:[2,18],91:[2,18],93:[2,18]},{5:[2,19],7:[2,19],8:[2,19],12:[2,19],14:[2,19],15:[2,19],16:[2,19],17:[2,19],19:[2,19],20:[2,19],21:[2,19],23:[2,19],26:[2,19],27:[2,19],50:[2,19],51:[2,19],58:[2,19],65:[2,19],74:[2,19],75:[2,19],76:[2,19],77:[2,19],78:[2,19],79:[2,19],80:[2,19],82:[2,19],91:[2,19],93:[2,19]},{5:[2,20],7:[2,20],8:[2,20],12:[2,20],14:[2,20],15:[2,20],16:[2,20],17:[2,20],19:[2,20],20:[2,20],21:[2,20],23:[2,20],26:[2,20],27:[2,20],50:[2,20],51:[2,20],58:[2,20],65:[2,20],74:[2,20],75:[2,20],76:[2,20],77:[2,20],78:[2,20],79:[2,20],80:[2,20],82:[2,20],91:[2,20],93:[2,20]},{5:[2,21],7:[2,21],8:[2,21],12:[2,21],14:[2,21],15:[2,21],16:[2,21],17:[2,21],19:[2,21],20:[2,21],21:[2,21],23:[2,21],26:[2,21],27:[2,21],50:[2,21],51:[2,21],58:[2,21],65:[2,21],74:[2,21],75:[2,21],76:[2,21],77:[2,21],78:[2,21],79:[2,21],80:[2,21],82:[2,21],91:[2,21],93:[2,21]},{4:61,7:[2,14],8:[2,14],14:[2,14],15:[2,14],16:[2,14],17:[2,14],19:[2,14],20:[2,14],21:[2,14],23:[2,14],26:[2,14],27:[2,14],50:[2,14],51:[2,14],58:[2,14],65:[2,14],74:[2,14],75:[2,14],76:[2,14],77:[2,14],78:[2,14],79:[2,14],80:[2,14],82:[2,14],91:[2,14],93:[2,14]},{8:[1,62]},{8:[1,63]},{8:[1,64]},{6:6,7:[1,13],8:[1,37],9:20,11:65,13:7,14:[1,14],15:[1,15],16:[1,21],17:[1,16],18:8,19:[1,17],20:[1,33],21:[1,18],22:9,23:[1,19],24:11,25:5,26:[1,12],28:10,29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{20:[1,66]},{20:[1,67]},{8:[1,37],9:69,16:[1,68],20:[1,33],29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{16:[1,70]},{5:[2,11],7:[2,11],8:[2,11],12:[2,11],14:[2,11],15:[2,11],16:[2,11],17:[2,11],19:[2,11],20:[2,11],21:[2,11],23:[2,11],26:[2,11],27:[2,11],50:[2,11],51:[2,11],58:[2,11],65:[2,11],74:[2,11],75:[2,11],76:[2,11],77:[2,11],78:[2,11],79:[2,11],80:[2,11],82:[2,11],91:[2,11],93:[2,11]},{8:[2,23],10:[2,23],16:[2,23],32:[2,23],34:[2,23],35:[2,23],37:[2,23],39:[2,23],41:[2,23],42:[2,23],43:[2,23],45:[2,23],46:[2,23],47:[2,23],48:[2,23],50:[2,23],51:[2,23],53:[2,23],54:[2,23],55:[2,23],57:[2,23],64:[2,23],65:[2,23],66:[2,23],83:[2,23],86:[2,23]},{8:[2,24],10:[2,24],16:[2,24],32:[2,24],34:[2,24],35:[2,24],37:[2,24],39:[2,24],41:[2,24],42:[2,24],43:[2,24],45:[2,24],46:[2,24],47:[2,24],48:[2,24],50:[2,24],51:[2,24],53:[2,24],54:[2,24],55:[2,24],57:[2,24],64:[2,24],65:[2,24],66:[2,24],83:[2,24],86:[2,24]},{8:[2,50],10:[2,50],16:[2,50],32:[1,71],34:[2,50],35:[2,50],37:[2,50],39:[2,50],41:[2,50],42:[2,50],43:[2,50],45:[2,50],46:[2,50],47:[2,50],48:[2,50],50:[2,50],51:[2,50],53:[2,50],54:[2,50],55:[2,50],57:[2,50],64:[2,50],65:[2,50],66:[2,50],83:[2,50],86:[2,50]},{8:[2,26],10:[2,26],16:[2,26],32:[2,26],34:[1,72],35:[2,26],37:[1,73],39:[2,26],41:[2,26],42:[2,26],43:[2,26],45:[2,26],46:[2,26],47:[2,26],48:[2,26],50:[2,26],51:[2,26],53:[2,26],54:[2,26],55:[2,26],57:[2,26],64:[2,26],65:[2,26],66:[2,26],83:[2,26],86:[2,26]},{8:[1,77],10:[2,54],16:[2,54],32:[2,54],34:[2,54],35:[2,54],37:[2,54],39:[2,54],41:[2,54],42:[2,54],43:[2,54],45:[2,54],46:[2,54],47:[2,54],48:[2,54],50:[2,54],51:[2,54],53:[2,54],54:[2,54],55:[2,54],57:[2,54],64:[1,74],65:[1,75],66:[2,54],83:[2,54],86:[2,54],88:76},{8:[1,77],10:[2,55],16:[2,55],32:[2,55],34:[2,55],35:[2,55],37:[2,55],39:[2,55],41:[2,55],42:[2,55],43:[2,55],45:[2,55],46:[2,55],47:[2,55],48:[2,55],50:[2,55],51:[2,55],53:[2,55],54:[2,55],55:[2,55],57:[2,55],64:[1,80],65:[1,79],66:[2,55],83:[2,55],86:[2,55],88:78},{8:[2,28],10:[2,28],16:[2,28],32:[2,28],34:[2,28],35:[2,28],37:[2,28],39:[1,81],41:[2,28],42:[2,28],43:[2,28],45:[2,28],46:[2,28],47:[2,28],48:[2,28],50:[2,28],51:[2,28],53:[2,28],54:[2,28],55:[2,28],57:[2,28],64:[2,28],65:[2,28],66:[2,28],83:[2,28],86:[2,28]},{8:[2,56],10:[2,56],16:[2,56],32:[2,56],34:[2,56],35:[2,56],37:[2,56],39:[2,56],41:[2,56],42:[2,56],43:[2,56],45:[2,56],46:[2,56],47:[2,56],48:[2,56],50:[2,56],51:[2,56],53:[2,56],54:[2,56],55:[2,56],57:[2,56],64:[2,56],65:[2,56],66:[2,56],83:[2,56],86:[2,56]},{8:[2,57],10:[2,57],16:[2,57],32:[2,57],34:[2,57],35:[2,57],37:[2,57],39:[2,57],41:[2,57],42:[2,57],43:[2,57],45:[2,57],46:[2,57],47:[2,57],48:[2,57],50:[2,57],51:[2,57],53:[2,57],54:[2,57],55:[2,57],57:[2,57],64:[2,57],65:[2,57],66:[2,57],83:[2,57],86:[2,57]},{8:[2,58],10:[2,58],16:[2,58],32:[2,58],34:[2,58],35:[2,58],37:[2,58],39:[2,58],41:[2,58],42:[2,58],43:[2,58],45:[2,58],46:[2,58],47:[2,58],48:[2,58],50:[2,58],51:[2,58],53:[2,58],54:[2,58],55:[2,58],57:[2,58],64:[2,58],65:[2,58],66:[2,58],83:[2,58],86:[2,58]},{8:[2,30],10:[2,30],16:[2,30],32:[2,30],34:[2,30],35:[2,30],37:[2,30],39:[2,30],41:[1,82],42:[1,83],43:[1,84],45:[2,30],46:[2,30],47:[2,30],48:[2,30],50:[2,30],51:[2,30],53:[2,30],54:[2,30],55:[2,30],57:[2,30],64:[2,30],65:[2,30],66:[2,30],83:[2,30],86:[2,30]},{8:[2,61],10:[2,61],16:[2,61],32:[2,61],34:[2,61],35:[2,61],37:[2,61],39:[2,61],41:[2,61],42:[2,61],43:[2,61],45:[2,61],46:[2,61],47:[2,61],48:[2,61],50:[2,61],51:[2,61],53:[2,61],54:[2,61],55:[2,61],57:[2,61],64:[2,61],65:[2,61],66:[2,61],83:[2,61],86:[2,61]},{8:[2,62],10:[2,62],16:[2,62],32:[2,62],34:[2,62],35:[2,62],37:[2,62],39:[2,62],41:[2,62],42:[2,62],43:[2,62],45:[2,62],46:[2,62],47:[2,62],48:[2,62],50:[2,62],51:[2,62],53:[2,62],54:[2,62],55:[2,62],57:[2,62],64:[2,62],65:[2,62],66:[2,62],83:[2,62],86:[2,62]},{8:[2,63],10:[2,63],16:[2,63],32:[2,63],34:[2,63],35:[2,63],37:[2,63],39:[2,63],41:[2,63],42:[2,63],43:[2,63],45:[2,63],46:[2,63],47:[2,63],48:[2,63],50:[2,63],51:[2,63],53:[2,63],54:[2,63],55:[2,63],57:[2,63],64:[2,63],65:[2,63],66:[2,63],83:[2,63],86:[2,63]},{8:[2,64],10:[2,64],16:[2,64],32:[2,64],34:[2,64],35:[2,64],37:[2,64],39:[2,64],41:[2,64],42:[2,64],43:[2,64],45:[2,64],46:[2,64],47:[2,64],48:[2,64],50:[2,64],51:[2,64],53:[2,64],54:[2,64],55:[2,64],57:[2,64],64:[2,64],65:[2,64],66:[2,64],83:[2,64],86:[2,64]},{8:[1,37],9:85,20:[1,33],29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,86]},{8:[1,87]},{8:[2,32],10:[2,32],16:[2,32],32:[2,32],34:[2,32],35:[2,32],37:[2,32],39:[2,32],41:[2,32],42:[2,32],43:[2,32],45:[1,88],46:[1,89],47:[1,90],48:[1,91],50:[2,32],51:[2,32],53:[2,32],54:[2,32],55:[2,32],57:[2,32],64:[2,32],65:[2,32],66:[2,32],83:[2,32],86:[2,32]},{8:[2,66],10:[2,66],16:[2,66],32:[2,66],34:[2,66],35:[2,66],37:[2,66],39:[2,66],41:[2,66],42:[2,66],43:[2,66],45:[2,66],46:[2,66],47:[2,66],48:[2,66],50:[2,66],51:[2,66],53:[2,66],54:[2,66],55:[2,66],57:[2,66],64:[2,66],65:[2,66],66:[2,66],83:[2,66],86:[2,66]},{8:[2,67],10:[2,67],16:[2,67],32:[2,67],34:[2,67],35:[2,67],37:[2,67],39:[2,67],41:[2,67],42:[2,67],43:[2,67],45:[2,67],46:[2,67],47:[2,67],48:[2,67],50:[2,67],51:[2,67],53:[2,67],54:[2,67],55:[2,67],57:[2,67],64:[2,67],65:[2,67],66:[2,67],83:[2,67],86:[2,67]},{8:[2,68],10:[2,68],16:[2,68],32:[2,68],34:[2,68],35:[2,68],37:[2,68],39:[2,68],41:[2,68],42:[2,68],43:[2,68],45:[2,68],46:[2,68],47:[2,68],48:[2,68],50:[2,68],51:[2,68],53:[2,68],54:[2,68],55:[2,68],57:[2,68],64:[2,68],65:[2,68],66:[2,68],83:[2,68],86:[2,68]},{8:[2,69],10:[2,69],16:[2,69],32:[2,69],34:[2,69],35:[2,69],37:[2,69],39:[2,69],41:[2,69],42:[2,69],43:[2,69],45:[2,69],46:[2,69],47:[2,69],48:[2,69],50:[2,69],51:[2,69],53:[2,69],54:[2,69],55:[2,69],57:[2,69],64:[2,69],65:[2,69],66:[2,69],83:[2,69],86:[2,69]},{20:[1,96],72:97,73:98,77:[1,51],78:[1,52],79:[1,53],80:[1,54],83:[1,92],84:93,85:94,87:95},{8:[1,37],20:[1,33],29:101,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],66:[1,99],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],81:100,82:[1,45],91:[1,38],93:[1,39]},{8:[2,36],10:[2,36],16:[2,36],32:[2,36],34:[2,36],35:[2,36],37:[2,36],39:[2,36],41:[2,36],42:[2,36],43:[2,36],45:[2,36],46:[2,36],47:[2,36],48:[2,36],50:[1,102],51:[1,103],53:[2,36],54:[2,36],55:[2,36],57:[2,36],64:[2,36],65:[2,36],66:[2,36],83:[2,36],86:[2,36]},{8:[2,70],10:[2,70],16:[2,70],32:[2,70],34:[2,70],35:[2,70],37:[2,70],39:[2,70],41:[2,70],42:[2,70],43:[2,70],45:[2,70],46:[2,70],47:[2,70],48:[2,70],50:[2,70],51:[2,70],53:[2,70],54:[2,70],55:[2,70],57:[2,70],64:[2,70],65:[2,70],66:[2,70],83:[2,70],86:[2,70]},{8:[2,71],10:[2,71],16:[2,71],32:[2,71],34:[2,71],35:[2,71],37:[2,71],39:[2,71],41:[2,71],42:[2,71],43:[2,71],45:[2,71],46:[2,71],47:[2,71],48:[2,71],50:[2,71],51:[2,71],53:[2,71],54:[2,71],55:[2,71],57:[2,71],64:[2,71],65:[2,71],66:[2,71],83:[2,71],86:[2,71]},{8:[2,72],10:[2,72],16:[2,72],32:[2,72],34:[2,72],35:[2,72],37:[2,72],39:[2,72],41:[2,72],42:[2,72],43:[2,72],45:[2,72],46:[2,72],47:[2,72],48:[2,72],50:[2,72],51:[2,72],53:[2,72],54:[2,72],55:[2,72],57:[2,72],64:[2,72],65:[2,72],66:[2,72],83:[2,72],86:[2,72]},{8:[2,73],10:[2,73],16:[2,73],32:[2,73],34:[2,73],35:[2,73],37:[2,73],39:[2,73],41:[2,73],42:[2,73],43:[2,73],45:[2,73],46:[2,73],47:[2,73],48:[2,73],50:[2,73],51:[2,73],53:[2,73],54:[2,73],55:[2,73],57:[2,73],64:[2,73],65:[2,73],66:[2,73],83:[2,73],86:[2,73]},{8:[2,74],10:[2,74],16:[2,74],32:[2,74],34:[2,74],35:[2,74],37:[2,74],39:[2,74],41:[2,74],42:[2,74],43:[2,74],45:[2,74],46:[2,74],47:[2,74],48:[2,74],50:[2,74],51:[2,74],53:[2,74],54:[2,74],55:[2,74],57:[2,74],64:[2,74],65:[2,74],66:[2,74],83:[2,74],86:[2,74]},{8:[2,75],10:[2,75],16:[2,75],32:[2,75],34:[2,75],35:[2,75],37:[2,75],39:[2,75],41:[2,75],42:[2,75],43:[2,75],45:[2,75],46:[2,75],47:[2,75],48:[2,75],50:[2,75],51:[2,75],53:[2,75],54:[2,75],55:[2,75],57:[2,75],64:[2,75],65:[2,75],66:[2,75],83:[2,75],86:[2,75]},{8:[2,76],10:[2,76],16:[2,76],32:[2,76],34:[2,76],35:[2,76],37:[2,76],39:[2,76],41:[2,76],42:[2,76],43:[2,76],45:[2,76],46:[2,76],47:[2,76],48:[2,76],50:[2,76],51:[2,76],53:[2,76],54:[2,76],55:[2,76],57:[2,76],64:[2,76],65:[2,76],66:[2,76],83:[2,76],86:[2,76]},{8:[2,41],10:[2,41],16:[2,41],32:[2,41],34:[2,41],35:[2,41],37:[2,41],39:[2,41],41:[2,41],42:[2,41],43:[2,41],45:[2,41],46:[2,41],47:[2,41],48:[2,41],50:[2,41],51:[2,41],53:[1,104],54:[1,105],55:[1,106],57:[2,41],64:[2,41],65:[2,41],66:[2,41],83:[2,41],86:[2,41]},{8:[2,44],10:[2,44],16:[2,44],32:[2,44],34:[2,44],35:[2,44],37:[2,44],39:[2,44],41:[2,44],42:[2,44],43:[2,44],45:[2,44],46:[2,44],47:[2,44],48:[2,44],50:[2,44],51:[2,44],53:[2,44],54:[2,44],55:[2,44],57:[2,44],64:[2,44],65:[2,44],66:[2,44],83:[2,44],86:[2,44]},{8:[2,48],10:[2,48],16:[2,48],32:[2,48],34:[2,48],35:[2,48],37:[2,48],39:[2,48],41:[2,48],42:[2,48],43:[2,48],45:[2,48],46:[2,48],47:[2,48],48:[2,48],50:[2,48],51:[2,48],53:[2,48],54:[2,48],55:[2,48],57:[1,107],64:[2,48],65:[2,48],66:[2,48],83:[2,48],86:[2,48]},{8:[1,37],20:[1,33],31:109,50:[1,59],51:[1,60],56:108,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],20:[1,33],31:109,50:[1,59],51:[1,60],56:110,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],20:[1,33],31:109,50:[1,59],51:[1,60],56:111,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{6:6,7:[1,13],8:[1,37],9:20,11:4,13:7,14:[1,14],15:[1,15],16:[1,21],17:[1,16],18:8,19:[1,17],20:[1,33],21:[1,18],22:9,23:[1,19],24:11,25:5,26:[1,12],27:[1,112],28:10,29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],9:113,20:[1,33],29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],9:114,20:[1,33],29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],9:115,20:[1,33],29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{14:[1,116]},{5:[2,7],7:[2,7],8:[2,7],12:[2,7],14:[2,7],15:[2,7],16:[2,7],17:[2,7],19:[2,7],20:[2,7],21:[2,7],23:[2,7],26:[2,7],27:[2,7],50:[2,7],51:[2,7],58:[2,7],65:[2,7],74:[2,7],75:[2,7],76:[2,7],77:[2,7],78:[2,7],79:[2,7],80:[2,7],82:[2,7],91:[2,7],93:[2,7]},{5:[2,8],7:[2,8],8:[2,8],12:[2,8],14:[2,8],15:[2,8],16:[2,8],17:[2,8],19:[2,8],20:[2,8],21:[2,8],23:[2,8],26:[2,8],27:[2,8],50:[2,8],51:[2,8],58:[2,8],65:[2,8],74:[2,8],75:[2,8],76:[2,8],77:[2,8],78:[2,8],79:[2,8],80:[2,8],82:[2,8],91:[2,8],93:[2,8]},{5:[2,9],7:[2,9],8:[2,9],12:[2,9],14:[2,9],15:[2,9],16:[2,9],17:[2,9],19:[2,9],20:[2,9],21:[2,9],23:[2,9],26:[2,9],27:[2,9],50:[2,9],51:[2,9],58:[2,9],65:[2,9],74:[2,9],75:[2,9],76:[2,9],77:[2,9],78:[2,9],79:[2,9],80:[2,9],82:[2,9],91:[2,9],93:[2,9]},{16:[1,117]},{5:[2,22],7:[2,22],8:[2,22],12:[2,22],14:[2,22],15:[2,22],16:[2,22],17:[2,22],19:[2,22],20:[2,22],21:[2,22],23:[2,22],26:[2,22],27:[2,22],50:[2,22],51:[2,22],58:[2,22],65:[2,22],74:[2,22],75:[2,22],76:[2,22],77:[2,22],78:[2,22],79:[2,22],80:[2,22],82:[2,22],91:[2,22],93:[2,22]},{8:[1,37],20:[1,33],29:118,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],20:[1,33],29:119,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],20:[1,33],31:109,36:120,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{20:[1,121]},{8:[1,37],9:122,20:[1,33],29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[2,87],10:[2,87],16:[2,87],20:[1,125],32:[2,87],34:[2,87],35:[2,87],37:[2,87],39:[2,87],41:[2,87],42:[2,87],43:[2,87],45:[2,87],46:[2,87],47:[2,87],48:[2,87],50:[2,87],51:[2,87],53:[2,87],54:[2,87],55:[2,87],57:[2,87],64:[2,87],65:[2,87],66:[2,87],68:126,82:[1,45],83:[2,87],86:[2,87],89:123,90:124},{8:[1,37],10:[1,127],20:[1,33],29:101,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],81:128,82:[1,45],91:[1,38],93:[1,39]},{8:[2,89],10:[2,89],16:[2,89],32:[2,89],34:[2,89],35:[2,89],37:[2,89],39:[2,89],41:[2,89],42:[2,89],43:[2,89],45:[2,89],46:[2,89],47:[2,89],48:[2,89],50:[2,89],51:[2,89],53:[2,89],54:[2,89],55:[2,89],57:[2,89],64:[2,89],65:[2,89],66:[2,89],83:[2,89],86:[2,89]},{8:[1,37],9:129,20:[1,33],29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{20:[1,130]},{8:[1,37],20:[1,33],31:109,38:131,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],20:[1,33],31:109,40:132,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],20:[1,33],31:109,40:133,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],20:[1,33],31:109,40:134,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{10:[1,135]},{10:[1,136],20:[1,138],92:137},{20:[1,138],92:139},{8:[1,37],20:[1,33],31:109,44:140,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],20:[1,33],31:109,44:141,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],20:[1,33],31:109,44:142,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],20:[1,33],31:109,44:143,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[2,79],10:[2,79],16:[2,79],32:[2,79],34:[2,79],35:[2,79],37:[2,79],39:[2,79],41:[2,79],42:[2,79],43:[2,79],45:[2,79],46:[2,79],47:[2,79],48:[2,79],50:[2,79],51:[2,79],53:[2,79],54:[2,79],55:[2,79],57:[2,79],64:[2,79],65:[2,79],66:[2,79],83:[2,79],86:[2,79]},{83:[1,144],86:[1,145]},{83:[2,81],86:[2,81]},{35:[1,146]},{35:[2,84]},{35:[2,85]},{35:[2,86]},{8:[2,77],10:[2,77],16:[2,77],32:[2,77],34:[2,77],35:[2,77],37:[2,77],39:[2,77],41:[2,77],42:[2,77],43:[2,77],45:[2,77],46:[2,77],47:[2,77],48:[2,77],50:[2,77],51:[2,77],53:[2,77],54:[2,77],55:[2,77],57:[2,77],64:[2,77],65:[2,77],66:[2,77],83:[2,77],86:[2,77]},{66:[1,147],86:[1,148]},{10:[2,98],66:[2,98],86:[2,98]},{8:[1,37],20:[1,33],31:109,49:149,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],20:[1,33],31:109,49:150,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],20:[1,33],31:109,50:[1,59],51:[1,60],52:151,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],20:[1,33],31:109,50:[1,59],51:[1,60],52:152,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],20:[1,33],31:109,50:[1,59],51:[1,60],52:153,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],20:[1,33],31:109,50:[1,59],51:[1,60],52:154,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[2,51],10:[2,51],16:[2,51],32:[2,51],34:[2,51],35:[2,51],37:[2,51],39:[2,51],41:[2,51],42:[2,51],43:[2,51],45:[2,51],46:[2,51],47:[2,51],48:[2,51],50:[2,51],51:[2,51],53:[2,51],54:[2,51],55:[2,51],57:[2,51],64:[2,51],65:[2,51],66:[2,51],83:[2,51],86:[2,51]},{8:[2,50],10:[2,50],16:[2,50],32:[2,50],34:[2,50],35:[2,50],37:[2,50],39:[2,50],41:[2,50],42:[2,50],43:[2,50],45:[2,50],46:[2,50],47:[2,50],48:[2,50],50:[2,50],51:[2,50],53:[2,50],54:[2,50],55:[2,50],57:[2,50],64:[2,50],65:[2,50],66:[2,50],83:[2,50],86:[2,50]},{8:[2,52],10:[2,52],16:[2,52],32:[2,52],34:[2,52],35:[2,52],37:[2,52],39:[2,52],41:[2,52],42:[2,52],43:[2,52],45:[2,52],46:[2,52],47:[2,52],48:[2,52],50:[2,52],51:[2,52],53:[2,52],54:[2,52],55:[2,52],57:[2,52],64:[2,52],65:[2,52],66:[2,52],83:[2,52],86:[2,52]},{8:[2,53],10:[2,53],16:[2,53],32:[2,53],34:[2,53],35:[2,53],37:[2,53],39:[2,53],41:[2,53],42:[2,53],43:[2,53],45:[2,53],46:[2,53],47:[2,53],48:[2,53],50:[2,53],51:[2,53],53:[2,53],54:[2,53],55:[2,53],57:[2,53],64:[2,53],65:[2,53],66:[2,53],83:[2,53],86:[2,53]},{5:[2,12],7:[2,12],8:[2,12],10:[2,12],12:[2,12],14:[2,12],15:[2,12],16:[2,12],17:[2,12],19:[2,12],20:[2,12],21:[2,12],23:[2,12],26:[2,12],27:[2,12],32:[2,12],34:[2,12],35:[2,12],37:[2,12],39:[2,12],41:[2,12],42:[2,12],43:[2,12],45:[2,12],46:[2,12],47:[2,12],48:[2,12],50:[2,12],51:[2,12],53:[2,12],54:[2,12],55:[2,12],57:[2,12],58:[2,12],64:[2,12],65:[2,12],66:[2,12],74:[2,12],75:[2,12],76:[2,12],77:[2,12],78:[2,12],79:[2,12],80:[2,12],82:[2,12],83:[2,12],86:[2,12],91:[2,12],93:[2,12]},{10:[1,155]},{10:[1,156]},{16:[1,157]},{8:[1,158]},{5:[2,10],7:[2,10],8:[2,10],12:[2,10],14:[2,10],15:[2,10],16:[2,10],17:[2,10],19:[2,10],20:[2,10],21:[2,10],23:[2,10],26:[2,10],27:[2,10],50:[2,10],51:[2,10],58:[2,10],65:[2,10],74:[2,10],75:[2,10],76:[2,10],77:[2,10],78:[2,10],79:[2,10],80:[2,10],82:[2,10],91:[2,10],93:[2,10]},{8:[2,25],10:[2,25],16:[2,25],32:[2,25],34:[2,25],35:[2,25],37:[2,25],39:[2,25],41:[2,25],42:[2,25],43:[2,25],45:[2,25],46:[2,25],47:[2,25],48:[2,25],50:[2,25],51:[2,25],53:[2,25],54:[2,25],55:[2,25],57:[2,25],64:[2,25],65:[2,25],66:[2,25],83:[2,25],86:[2,25]},{35:[1,159]},{8:[2,29],10:[2,29],16:[2,29],32:[2,29],34:[2,29],35:[2,29],37:[2,29],39:[1,81],41:[2,29],42:[2,29],43:[2,29],45:[2,29],46:[2,29],47:[2,29],48:[2,29],50:[2,29],51:[2,29],53:[2,29],54:[2,29],55:[2,29],57:[2,29],64:[2,29],65:[2,29],66:[2,29],83:[2,29],86:[2,29]},{8:[2,59],10:[2,59],16:[2,59],32:[2,59],34:[2,59],35:[2,59],37:[2,59],39:[2,59],41:[2,59],42:[2,59],43:[2,59],45:[2,59],46:[2,59],47:[2,59],48:[2,59],50:[2,59],51:[2,59],53:[2,59],54:[2,59],55:[2,59],57:[2,59],64:[2,59],65:[2,59],66:[2,59],83:[2,59],86:[2,59]},{66:[1,160]},{8:[2,88],10:[2,88],16:[2,88],32:[2,88],34:[2,88],35:[2,88],37:[2,88],39:[2,88],41:[2,88],42:[2,88],43:[2,88],45:[2,88],46:[2,88],47:[2,88],48:[2,88],50:[2,88],51:[2,88],53:[2,88],54:[2,88],55:[2,88],57:[2,88],64:[2,88],65:[2,88],66:[2,88],83:[2,88],86:[1,161]},{8:[2,94],10:[2,94],16:[2,94],32:[2,94],34:[2,94],35:[2,94],37:[2,94],39:[2,94],41:[2,94],42:[2,94],43:[2,94],45:[2,94],46:[2,94],47:[2,94],48:[2,94],50:[2,94],51:[2,94],53:[2,94],54:[2,94],55:[2,94],57:[2,94],64:[2,94],65:[2,94],66:[2,94],83:[2,94],86:[2,94]},{8:[2,96],10:[2,96],16:[2,96],32:[2,96],34:[2,96],35:[2,96],37:[2,96],39:[2,96],41:[2,96],42:[2,96],43:[2,96],45:[2,96],46:[2,96],47:[2,96],48:[2,96],50:[2,96],51:[2,96],53:[2,96],54:[2,96],55:[2,96],57:[2,96],64:[2,96],65:[2,96],66:[2,96],83:[2,96],86:[2,96]},{8:[2,97],10:[2,97],16:[2,97],32:[2,97],34:[2,97],35:[2,97],37:[2,97],39:[2,97],41:[2,97],42:[2,97],43:[2,97],45:[2,97],46:[2,97],47:[2,97],48:[2,97],50:[2,97],51:[2,97],53:[2,97],54:[2,97],55:[2,97],57:[2,97],64:[2,97],65:[2,97],66:[2,97],83:[2,97],86:[2,97]},{8:[2,92],10:[2,92],16:[2,92],20:[2,92],32:[2,92],34:[2,92],35:[2,92],37:[2,92],39:[2,92],41:[2,92],42:[2,92],43:[2,92],45:[2,92],46:[2,92],47:[2,92],48:[2,92],50:[2,92],51:[2,92],53:[2,92],54:[2,92],55:[2,92],57:[2,92],64:[2,92],65:[2,92],66:[2,92],82:[2,92],83:[2,92],86:[2,92]},{10:[1,162],86:[1,148]},{66:[1,163]},{8:[2,91],10:[2,91],16:[2,91],32:[2,91],34:[2,91],35:[2,91],37:[2,91],39:[2,91],41:[2,91],42:[2,91],43:[2,91],45:[2,91],46:[2,91],47:[2,91],48:[2,91],50:[2,91],51:[2,91],53:[2,91],54:[2,91],55:[2,91],57:[2,91],64:[2,91],65:[2,91],66:[2,91],83:[2,91],86:[2,91]},{8:[2,31],10:[2,31],16:[2,31],32:[2,31],34:[2,31],35:[2,31],37:[2,31],39:[2,31],41:[1,82],42:[1,83],43:[1,84],45:[2,31],46:[2,31],47:[2,31],48:[2,31],50:[2,31],51:[2,31],53:[2,31],54:[2,31],55:[2,31],57:[2,31],64:[2,31],65:[2,31],66:[2,31],83:[2,31],86:[2,31]},{8:[2,33],10:[2,33],16:[2,33],32:[2,33],34:[2,33],35:[2,33],37:[2,33],39:[2,33],41:[2,33],42:[2,33],43:[2,33],45:[1,88],46:[1,89],47:[1,90],48:[1,91],50:[2,33],51:[2,33],53:[2,33],54:[2,33],55:[2,33],57:[2,33],64:[2,33],65:[2,33],66:[2,33],83:[2,33],86:[2,33]},{8:[2,34],10:[2,34],16:[2,34],32:[2,34],34:[2,34],35:[2,34],37:[2,34],39:[2,34],41:[2,34],42:[2,34],43:[2,34],45:[1,88],46:[1,89],47:[1,90],48:[1,91],50:[2,34],51:[2,34],53:[2,34],54:[2,34],55:[2,34],57:[2,34],64:[2,34],65:[2,34],66:[2,34],83:[2,34],86:[2,34]},{8:[2,35],10:[2,35],16:[2,35],32:[2,35],34:[2,35],35:[2,35],37:[2,35],39:[2,35],41:[2,35],42:[2,35],43:[2,35],45:[1,88],46:[1,89],47:[1,90],48:[1,91],50:[2,35],51:[2,35],53:[2,35],54:[2,35],55:[2,35],57:[2,35],64:[2,35],65:[2,35],66:[2,35],83:[2,35],86:[2,35]},{8:[2,65],10:[2,65],16:[2,65],32:[2,65],34:[2,65],35:[2,65],37:[2,65],39:[2,65],41:[2,65],42:[2,65],43:[2,65],45:[2,65],46:[2,65],47:[2,65],48:[2,65],50:[2,65],51:[2,65],53:[2,65],54:[2,65],55:[2,65],57:[2,65],64:[2,65],65:[2,65],66:[2,65],83:[2,65],86:[2,65]},{25:164,26:[1,12]},{10:[1,165],86:[1,166]},{10:[2,103],86:[2,103]},{10:[1,167],86:[1,166]},{8:[2,37],10:[2,37],16:[2,37],32:[2,37],34:[2,37],35:[2,37],37:[2,37],39:[2,37],41:[2,37],42:[2,37],43:[2,37],45:[2,37],46:[2,37],47:[2,37],48:[2,37],50:[1,102],51:[1,103],53:[2,37],54:[2,37],55:[2,37],57:[2,37],64:[2,37],65:[2,37],66:[2,37],83:[2,37],86:[2,37]},{8:[2,38],10:[2,38],16:[2,38],32:[2,38],34:[2,38],35:[2,38],37:[2,38],39:[2,38],41:[2,38],42:[2,38],43:[2,38],45:[2,38],46:[2,38],47:[2,38],48:[2,38],50:[1,102],51:[1,103],53:[2,38],54:[2,38],55:[2,38],57:[2,38],64:[2,38],65:[2,38],66:[2,38],83:[2,38],86:[2,38]},{8:[2,39],10:[2,39],16:[2,39],32:[2,39],34:[2,39],35:[2,39],37:[2,39],39:[2,39],41:[2,39],42:[2,39],43:[2,39],45:[2,39],46:[2,39],47:[2,39],48:[2,39],50:[1,102],51:[1,103],53:[2,39],54:[2,39],55:[2,39],57:[2,39],64:[2,39],65:[2,39],66:[2,39],83:[2,39],86:[2,39]},{8:[2,40],10:[2,40],16:[2,40],32:[2,40],34:[2,40],35:[2,40],37:[2,40],39:[2,40],41:[2,40],42:[2,40],43:[2,40],45:[2,40],46:[2,40],47:[2,40],48:[2,40],50:[1,102],51:[1,103],53:[2,40],54:[2,40],55:[2,40],57:[2,40],64:[2,40],65:[2,40],66:[2,40],83:[2,40],86:[2,40]},{8:[2,80],10:[2,80],16:[2,80],32:[2,80],34:[2,80],35:[2,80],37:[2,80],39:[2,80],41:[2,80],42:[2,80],43:[2,80],45:[2,80],46:[2,80],47:[2,80],48:[2,80],50:[2,80],51:[2,80],53:[2,80],54:[2,80],55:[2,80],57:[2,80],64:[2,80],65:[2,80],66:[2,80],83:[2,80],86:[2,80]},{20:[1,96],72:97,73:98,77:[1,51],78:[1,52],79:[1,53],80:[1,54],85:168,87:95},{8:[1,37],20:[1,33],29:169,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[2,78],10:[2,78],16:[2,78],32:[2,78],34:[2,78],35:[2,78],37:[2,78],39:[2,78],41:[2,78],42:[2,78],43:[2,78],45:[2,78],46:[2,78],47:[2,78],48:[2,78],50:[2,78],51:[2,78],53:[2,78],54:[2,78],55:[2,78],57:[2,78],64:[2,78],65:[2,78],66:[2,78],83:[2,78],86:[2,78]},{8:[1,37],20:[1,33],29:170,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[2,42],10:[2,42],16:[2,42],32:[2,42],34:[2,42],35:[2,42],37:[2,42],39:[2,42],41:[2,42],42:[2,42],43:[2,42],45:[2,42],46:[2,42],47:[2,42],48:[2,42],50:[2,42],51:[2,42],53:[1,104],54:[1,105],55:[1,106],57:[2,42],64:[2,42],65:[2,42],66:[2,42],83:[2,42],86:[2,42]},{8:[2,43],10:[2,43],16:[2,43],32:[2,43],34:[2,43],35:[2,43],37:[2,43],39:[2,43],41:[2,43],42:[2,43],43:[2,43],45:[2,43],46:[2,43],47:[2,43],48:[2,43],50:[2,43],51:[2,43],53:[1,104],54:[1,105],55:[1,106],57:[2,43],64:[2,43],65:[2,43],66:[2,43],83:[2,43],86:[2,43]},{8:[2,45],10:[2,45],16:[2,45],32:[2,45],34:[2,45],35:[2,45],37:[2,45],39:[2,45],41:[2,45],42:[2,45],43:[2,45],45:[2,45],46:[2,45],47:[2,45],48:[2,45],50:[2,45],51:[2,45],53:[2,45],54:[2,45],55:[2,45],57:[2,45],64:[2,45],65:[2,45],66:[2,45],83:[2,45],86:[2,45]},{8:[2,46],10:[2,46],16:[2,46],32:[2,46],34:[2,46],35:[2,46],37:[2,46],39:[2,46],41:[2,46],42:[2,46],43:[2,46],45:[2,46],46:[2,46],47:[2,46],48:[2,46],50:[2,46],51:[2,46],53:[2,46],54:[2,46],55:[2,46],57:[2,46],64:[2,46],65:[2,46],66:[2,46],83:[2,46],86:[2,46]},{8:[2,47],10:[2,47],16:[2,47],32:[2,47],34:[2,47],35:[2,47],37:[2,47],39:[2,47],41:[2,47],42:[2,47],43:[2,47],45:[2,47],46:[2,47],47:[2,47],48:[2,47],50:[2,47],51:[2,47],53:[2,47],54:[2,47],55:[2,47],57:[2,47],64:[2,47],65:[2,47],66:[2,47],83:[2,47],86:[2,47]},{8:[2,49],10:[2,49],16:[2,49],32:[2,49],34:[2,49],35:[2,49],37:[2,49],39:[2,49],41:[2,49],42:[2,49],43:[2,49],45:[2,49],46:[2,49],47:[2,49],48:[2,49],50:[2,49],51:[2,49],53:[2,49],54:[2,49],55:[2,49],57:[2,49],64:[2,49],65:[2,49],66:[2,49],83:[2,49],86:[2,49]},{6:6,7:[1,13],8:[1,37],9:20,11:171,13:7,14:[1,14],15:[1,15],16:[1,21],17:[1,16],18:8,19:[1,17],20:[1,33],21:[1,18],22:9,23:[1,19],24:11,25:5,26:[1,12],28:10,29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{6:6,7:[1,13],8:[1,37],9:20,11:172,13:7,14:[1,14],15:[1,15],16:[1,21],17:[1,16],18:8,19:[1,17],20:[1,33],21:[1,18],22:9,23:[1,19],24:11,25:5,26:[1,12],28:10,29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],9:173,20:[1,33],29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],9:174,20:[1,33],29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],20:[1,33],29:175,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[2,60],10:[2,60],16:[2,60],32:[2,60],34:[2,60],35:[2,60],37:[2,60],39:[2,60],41:[2,60],42:[2,60],43:[2,60],45:[2,60],46:[2,60],47:[2,60],48:[2,60],50:[2,60],51:[2,60],53:[2,60],54:[2,60],55:[2,60],57:[2,60],64:[2,60],65:[2,60],66:[2,60],83:[2,60],86:[2,60]},{20:[1,125],68:126,82:[1,45],90:176},{8:[2,93],10:[2,93],16:[2,93],20:[2,93],32:[2,93],34:[2,93],35:[2,93],37:[2,93],39:[2,93],41:[2,93],42:[2,93],43:[2,93],45:[2,93],46:[2,93],47:[2,93],48:[2,93],50:[2,93],51:[2,93],53:[2,93],54:[2,93],55:[2,93],57:[2,93],64:[2,93],65:[2,93],66:[2,93],82:[2,93],83:[2,93],86:[2,93]},{8:[2,90],10:[2,90],16:[2,90],32:[2,90],34:[2,90],35:[2,90],37:[2,90],39:[2,90],41:[2,90],42:[2,90],43:[2,90],45:[2,90],46:[2,90],47:[2,90],48:[2,90],50:[2,90],51:[2,90],53:[2,90],54:[2,90],55:[2,90],57:[2,90],64:[2,90],65:[2,90],66:[2,90],83:[2,90],86:[2,90]},{8:[2,100],10:[2,100],16:[2,100],32:[2,100],34:[2,100],35:[2,100],37:[2,100],39:[2,100],41:[2,100],42:[2,100],43:[2,100],45:[2,100],46:[2,100],47:[2,100],48:[2,100],50:[2,100],51:[2,100],53:[2,100],54:[2,100],55:[2,100],57:[2,100],64:[2,100],65:[2,100],66:[2,100],83:[2,100],86:[2,100]},{25:177,26:[1,12]},{20:[1,178]},{94:[1,179]},{83:[2,82],86:[2,82]},{83:[2,83],86:[2,83]},{10:[2,99],66:[2,99],86:[2,99]},{5:[2,2],7:[2,2],8:[2,2],12:[1,180],14:[2,2],15:[2,2],16:[2,2],17:[2,2],19:[2,2],20:[2,2],21:[2,2],23:[2,2],26:[2,2],27:[2,2],50:[2,2],51:[2,2],58:[2,2],65:[2,2],74:[2,2],75:[2,2],76:[2,2],77:[2,2],78:[2,2],79:[2,2],80:[2,2],82:[2,2],91:[2,2],93:[2,2]},{5:[2,4],7:[2,4],8:[2,4],12:[2,4],14:[2,4],15:[2,4],16:[2,4],17:[2,4],19:[2,4],20:[2,4],21:[2,4],23:[2,4],26:[2,4],27:[2,4],50:[2,4],51:[2,4],58:[2,4],65:[2,4],74:[2,4],75:[2,4],76:[2,4],77:[2,4],78:[2,4],79:[2,4],80:[2,4],82:[2,4],91:[2,4],93:[2,4]},{16:[1,181]},{10:[1,182]},{8:[2,27],10:[2,27],16:[2,27],32:[2,27],34:[2,27],35:[2,27],37:[2,27],39:[2,27],41:[2,27],42:[2,27],43:[2,27],45:[2,27],46:[2,27],47:[2,27],48:[2,27],50:[2,27],51:[2,27],53:[2,27],54:[2,27],55:[2,27],57:[2,27],64:[2,27],65:[2,27],66:[2,27],83:[2,27],86:[2,27]},{8:[2,95],10:[2,95],16:[2,95],32:[2,95],34:[2,95],35:[2,95],37:[2,95],39:[2,95],41:[2,95],42:[2,95],43:[2,95],45:[2,95],46:[2,95],47:[2,95],48:[2,95],50:[2,95],51:[2,95],53:[2,95],54:[2,95],55:[2,95],57:[2,95],64:[2,95],65:[2,95],66:[2,95],83:[2,95],86:[2,95]},{8:[2,101],10:[2,101],16:[2,101],32:[2,101],34:[2,101],35:[2,101],37:[2,101],39:[2,101],41:[2,101],42:[2,101],43:[2,101],45:[2,101],46:[2,101],47:[2,101],48:[2,101],50:[2,101],51:[2,101],53:[2,101],54:[2,101],55:[2,101],57:[2,101],64:[2,101],65:[2,101],66:[2,101],83:[2,101],86:[2,101]},{10:[2,104],86:[2,104]},{8:[1,37],9:183,20:[1,33],29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{6:6,7:[1,13],8:[1,37],9:20,11:184,13:7,14:[1,14],15:[1,15],16:[1,21],17:[1,16],18:8,19:[1,17],20:[1,33],21:[1,18],22:9,23:[1,19],24:11,25:5,26:[1,12],28:10,29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{8:[1,37],9:185,20:[1,33],29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{16:[1,186]},{8:[2,102],10:[2,102],16:[2,102],32:[2,102],34:[2,102],35:[2,102],37:[2,102],39:[2,102],41:[2,102],42:[2,102],43:[2,102],45:[2,102],46:[2,102],47:[2,102],48:[2,102],50:[2,102],51:[2,102],53:[2,102],54:[2,102],55:[2,102],57:[2,102],64:[2,102],65:[2,102],66:[2,102],83:[2,102],86:[2,102]},{5:[2,3],7:[2,3],8:[2,3],12:[2,3],14:[2,3],15:[2,3],16:[2,3],17:[2,3],19:[2,3],20:[2,3],21:[2,3],23:[2,3],26:[2,3],27:[2,3],50:[2,3],51:[2,3],58:[2,3],65:[2,3],74:[2,3],75:[2,3],76:[2,3],77:[2,3],78:[2,3],79:[2,3],80:[2,3],82:[2,3],91:[2,3],93:[2,3]},{10:[1,187]},{5:[2,6],7:[2,6],8:[2,6],12:[2,6],14:[2,6],15:[2,6],16:[2,6],17:[2,6],19:[2,6],20:[2,6],21:[2,6],23:[2,6],26:[2,6],27:[2,6],50:[2,6],51:[2,6],58:[2,6],65:[2,6],74:[2,6],75:[2,6],76:[2,6],77:[2,6],78:[2,6],79:[2,6],80:[2,6],82:[2,6],91:[2,6],93:[2,6]},{6:6,7:[1,13],8:[1,37],9:20,11:188,13:7,14:[1,14],15:[1,15],16:[1,21],17:[1,16],18:8,19:[1,17],20:[1,33],21:[1,18],22:9,23:[1,19],24:11,25:5,26:[1,12],28:10,29:22,30:23,31:24,33:25,36:28,38:32,40:40,44:47,49:55,50:[1,59],51:[1,60],52:56,56:57,58:[1,58],59:26,60:27,61:29,62:30,63:31,65:[1,46],67:34,68:35,69:36,70:41,71:42,72:43,73:44,74:[1,48],75:[1,49],76:[1,50],77:[1,51],78:[1,52],79:[1,53],80:[1,54],82:[1,45],91:[1,38],93:[1,39]},{5:[2,5],7:[2,5],8:[2,5],12:[2,5],14:[2,5],15:[2,5],16:[2,5],17:[2,5],19:[2,5],20:[2,5],21:[2,5],23:[2,5],26:[2,5],27:[2,5],50:[2,5],51:[2,5],58:[2,5],65:[2,5],74:[2,5],75:[2,5],76:[2,5],77:[2,5],78:[2,5],79:[2,5],80:[2,5],82:[2,5],91:[2,5],93:[2,5]}],defaultActions:{3:[2,1],96:[2,84],97:[2,85],98:[2,86]},parseError:function(t,e){if(!e.recoverable)throw Error(t);
+this.trace(t)},parse:function(t){function e(){var t;return t=i.lexer.lex()||u,"number"!=typeof t&&(t=i.symbols_[t]||t),t}var i=this,r=[0],s=[null],o=[],n=this.table,a="",h=0,l=0,c=0,d=2,u=1;this.lexer.setInput(t),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,this.lexer.yylloc===void 0&&(this.lexer.yylloc={});var p=this.lexer.yylloc;o.push(p);var f=this.lexer.options&&this.lexer.options.ranges;this.parseError="function"==typeof this.yy.parseError?this.yy.parseError:Object.getPrototypeOf(this).parseError;for(var m,b,g,v,C,y,P,_,E,S={};;){if(g=r[r.length-1],this.defaultActions[g]?v=this.defaultActions[g]:((null===m||m===void 0)&&(m=e()),v=n[g]&&n[g][m]),v===void 0||!v.length||!v[0]){var O="";E=[];for(y in n[g])this.terminals_[y]&&y>d&&E.push("'"+this.terminals_[y]+"'");O=this.lexer.showPosition?"Parse error on line "+(h+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(h+1)+": Unexpected "+(m==u?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(O,{text:this.lexer.match,token:this.terminals_[m]||m,line:this.lexer.yylineno,loc:p,expected:E})}if(v[0]instanceof Array&&v.length>1)throw Error("Parse Error: multiple actions possible at state: "+g+", token: "+m);switch(v[0]){case 1:r.push(m),s.push(this.lexer.yytext),o.push(this.lexer.yylloc),r.push(v[1]),m=null,b?(m=b,b=null):(l=this.lexer.yyleng,a=this.lexer.yytext,h=this.lexer.yylineno,p=this.lexer.yylloc,c>0&&c--);break;case 2:if(P=this.productions_[v[1]][1],S.$=s[s.length-P],S._$={first_line:o[o.length-(P||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(P||1)].first_column,last_column:o[o.length-1].last_column},f&&(S._$.range=[o[o.length-(P||1)].range[0],o[o.length-1].range[1]]),C=this.performAction.call(S,a,l,h,this.yy,v[1],s,o),C!==void 0)return C;P&&(r=r.slice(0,2*-1*P),s=s.slice(0,-1*P),o=o.slice(0,-1*P)),r.push(this.productions_[v[1]][0]),s.push(S.$),o.push(S._$),_=n[r[r.length-2]][r[r.length-1]],r.push(_);break;case 3:return!0}}return!0}},i={node:function(t,e,i){return{type:t,value:e,children:i}},createNode:function(t,e,i){var r,s=this.node(e,i,[]);for(r=3;arguments.length>r;r++)s.children.push(arguments[r]);return s.line=t[0],s.col=t[1],s}},r=function(t){return[t.first_line,t.first_column]},s=function(){var t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw Error(t);this.yy.parser.parseError(t,e)},setInput:function(t){return this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t;var e=t.match(/(?:\r\n?|\n).*/g);return e?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,i=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e-1),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),i.length-1&&(this.yylineno-=i.length-1);var s=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:i?(i.length===r.length?this.yylloc.first_column:0)+r[r.length-i.length].length-i[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[s[0],s[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return 20>t.length&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var i,r,s;if(this.options.backtrack_lexer&&(s={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(s.yylloc.range=this.yylloc.range.slice(0))),r=t[0].match(/(?:\r\n?|\n).*/g),r&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],i=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),i)return this.options.backtrack_lexer&&delete s,i;if(this._backtrack){for(var o in s)this[o]=s[o];return!1}return this.options.backtrack_lexer&&delete s,!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var t,e,i,r;this._more||(this.yytext="",this.match="");for(var s=this._currentRules(),o=0;s.length>o;o++)if(i=this._input.match(this.rules[s[o]]),i&&(!e||i[0].length>e[0].length)){if(e=i,r=o,this.options.backtrack_lexer){if(t=this.test_match(i,s[o]),t!==!1)return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?(t=this.test_match(e,s[r]),t!==!1?t:!1):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t?t:this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){var t=this.conditionStack.length-1;return t>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return t=this.conditionStack.length-1-Math.abs(t||0),t>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,i,r){switch(i){case 0:break;case 1:return 78;case 2:return 78;case 3:return 77;case 4:return 77;case 5:break;case 6:break;case 7:return 7;case 8:return 12;case 9:return 14;case 10:return 17;case 11:return 15;case 12:return 91;case 13:return 93;case 14:return 19;case 15:return 23;case 16:return 21;case 17:return 75;case 18:return 76;case 19:return 74;case 20:return 80;case 21:return 94;case 22:return 82;case 23:return 83;case 24:return 26;case 25:return 27;case 26:return 16;case 27:return"#";case 28:return 34;case 29:return 35;case 30:return 79;case 31:return 64;case 32:return 65;case 33:return 66;case 34:return 8;case 35:return 10;case 36:return 58;case 37:return 57;case 38:return 53;case 39:return 54;case 40:return 55;case 41:return 50;case 42:return 51;case 43:return 47;case 44:return 45;case 45:return 48;case 46:return 46;case 47:return 41;case 48:return 43;case 49:return 42;case 50:return 39;case 51:return 37;case 52:return 32;case 53:return 86;case 54:return 5;case 55:return 20;case 56:return"INVALID"}},rules:[/^(?:\s+)/,/^(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+\b)/,/^(?:[0-9]+)/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:\/\/.*)/,/^(?:\/\*(.|\n|\r)*?\*\/)/,/^(?:if\b)/,/^(?:else\b)/,/^(?:while\b)/,/^(?:do\b)/,/^(?:for\b)/,/^(?:function\b)/,/^(?:map\b)/,/^(?:use\b)/,/^(?:return\b)/,/^(?:delete\b)/,/^(?:true\b)/,/^(?:false\b)/,/^(?:null\b)/,/^(?:Infinity\b)/,/^(?:->)/,/^(?:<<)/,/^(?:>>)/,/^(?:\{)/,/^(?:\})/,/^(?:;)/,/^(?:#)/,/^(?:\?)/,/^(?::)/,/^(?:NaN\b)/,/^(?:\.)/,/^(?:\[)/,/^(?:\])/,/^(?:\()/,/^(?:\))/,/^(?:!)/,/^(?:\^)/,/^(?:\*)/,/^(?:\/)/,/^(?:%)/,/^(?:\+)/,/^(?:-)/,/^(?:<=)/,/^(?:<)/,/^(?:>=)/,/^(?:>)/,/^(?:==)/,/^(?:~=)/,/^(?:!=)/,/^(?:&&)/,/^(?:\|\|)/,/^(?:=)/,/^(?:,)/,/^(?:$)/,/^(?:[A-Za-z_\$][A-Za-z0-9_]*)/,/^(?:.)/],conditions:{INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56],inclusive:!0}}};return t}();return e.lexer=s,t.prototype=e,e.Parser=t,new t}();return require!==void 0&&"undefined"!=typeof exports&&(exports.parser=parser,exports.Parser=parser.Parser,exports.parse=function(){return parser.parse.apply(parser,arguments)},exports.main=function commonjsMain(t){t[1]||(console.log("Usage: "+t[0]+" FILE"),process.exit(1));var e=require("fs").readFileSync(require("path").normalize(t[1]),"utf8");return exports.parser.parse(e)},"undefined"!=typeof module&&require.main===module&&exports.main(process.argv.slice(1))),parser.yy.parseError=parser.parseError,JXG.JessieCode}),define("base/ticks",["jxg","math/math","math/geometry","base/constants","base/element","base/coords","utils/type","base/text"],function(t,e,i,r,s,o,n,a){return t.Ticks=function(t,i,s){if(this.constructor(t.board,s,r.OBJECT_TYPE_TICKS,r.OBJECT_CLASS_OTHER),this.line=t,this.board=this.line.board,this.ticksFunction=null,this.fixedTicks=null,this.equidistant=!1,n.isFunction(i))throw this.ticksFunction=i,Error("Function arguments are no longer supported.");n.isArray(i)?this.fixedTicks=i:(Math.abs(i)<e.eps&&(i=s.defaultdistance),this.ticksFunction=function(){return i},this.equidistant=!0),this.minTicksDistance=s.minticksdistance,this.maxTicksDistance=s.maxticksdistance,this.labels=[],this.labelsRepo=[],this.labelCounter=0,this.id=this.line.addTicks(this),this.board.setId(this,"Ti")},t.Ticks.prototype=new s,t.extend(t.Ticks.prototype,{hasPoint:function(t,i){var s,o,n=this.ticks&&this.ticks.length||0,a=this.board.options.precision.hasPoint;if(!this.line.visProp.scalable)return!1;if(0!==this.line.stdform[1]&&0!==this.line.stdform[2]&&this.line.type!==r.OBJECT_TYPE_AXIS)return!1;for(s=0;n>s;s++)if(o=this.ticks[s],o[2]&&!(0===this.line.stdform[1]&&Math.abs(o[0][0]-this.line.point1.coords.scrCoords[1])<e.eps||0===this.line.stdform[2]&&Math.abs(o[1][0]-this.line.point1.coords.scrCoords[2])<e.eps)&&(Math.abs(o[0][0]-o[0][1])>=1||Math.abs(o[1][0]-o[1][1])>=1))if(0===this.line.stdform[1]){if(2*a>Math.abs(i-.5*(o[1][0]+o[1][1]))&&t>o[0][0]-a&&o[0][1]+a>t)return!0}else if(0===this.line.stdform[2]&&2*a>Math.abs(t-.5*(o[0][0]+o[0][1]))&&i>o[1][0]-a&&o[1][1]+a>i)return!0;return!1},generateLabelValue:function(t,s){var o=this.visProp.anchor,n=-1,a=this.line.point1,h=this.line.point2;return"left"===o&&Math.abs(a.coords.usrCoords[2]-h.coords.usrCoords[2])<e.eps?t.usrCoords[1]:"left"===o&&Math.abs(a.coords.usrCoords[1]-h.coords.usrCoords[1])<e.eps?t.usrCoords[2]:(("right"===this.visProp.anchor&&!i.isSameDirection(h.coords,a.coords,t)||"right"!==this.visProp.anchor&&i.isSameDirection(a.coords,h.coords,t))&&(n=1),n*s.distance(r.COORDS_BY_USER,t))},setPositionDirectly:function(t,i,r){var s,n,a=new o(t,i,this.board),h=new o(t,r,this.board),l=this.board.getBoundingBox();return this.line.visProp.scalable?(Math.abs(this.line.stdform[1])<e.eps&&Math.abs(a.usrCoords[1]*h.usrCoords[1])>e.eps?(s=h.usrCoords[1]/a.usrCoords[1],l[0]*=s,l[2]*=s,this.board.setBoundingBox(l,!1)):Math.abs(this.line.stdform[2])<e.eps&&Math.abs(a.usrCoords[2]*h.usrCoords[2])>e.eps&&(n=h.usrCoords[2]/a.usrCoords[2],l[3]*=n,l[1]*=n,this.board.setBoundingBox(l,!1)),this):this},calculateTicksCoordinates:function(){var i,s,n,a,h,l,c,d,u,p,f,m,b,g,v,C,y,P,_,E,S,O,T,x,w=this.line.point1,A=this.line.point2,k=w.Dist(A),M=(A.coords.usrCoords[1]-w.coords.usrCoords[1])/k,N=(A.coords.usrCoords[2]-w.coords.usrCoords[2])/k,R=w.coords.distance(r.COORDS_BY_SCREEN,new o(r.COORDS_BY_USER,[w.coords.usrCoords[1]+M,w.coords.usrCoords[2]+N],this.board)),L=this.equidistant?this.ticksFunction(1):1,Y=5,B=0,j=0,D=2,I=-1,X=e.eps,J=.5*this.visProp.majorheight,G=.5*this.visProp.minorheight,U=this.labelsRepo.length;if(0!==this.board.canvasWidth&&0!==this.board.canvasHeight&&(this.minStyle=0>this.visProp.minorheight?"infinite":"finite",this.majStyle=0>this.visProp.majorheight?"infinite":"finite",h="right"===this.visProp.anchor?A.coords:"middle"===this.visProp.anchor?new o(t.COORDS_BY_USER,[(w.coords.usrCoords[1]+A.coords.usrCoords[1])/2,(w.coords.usrCoords[2]+A.coords.usrCoords[2])/2],this.board):w.coords,y=this.line.visProp.straightfirst?Number.NEGATIVE_INFINITY:"middle"===this.visProp.anchor?-k/2+X:"right"===this.visProp.anchor?-k+X:X,P=this.line.visProp.straightlast?Number.POSITIVE_INFINITY:"middle"===this.visProp.anchor?k/2-X:"right"===this.visProp.anchor?-X:k-X,_=this.line.stdform[1],E=this.line.stdform[2],S=_,O=E,T=_,x=E,s=Math.sqrt(_*_*this.board.unitX*this.board.unitX+E*E*this.board.unitY*this.board.unitY),_*=J/s*this.board.unitX,E*=J/s*this.board.unitY,S*=G/s*this.board.unitX,O*=G/s*this.board.unitY,this.removeTickLabels(),!(Math.abs(T)<e.eps&&Math.abs(x)<e.eps)))if(this.ticks=[],this.labels=[],this.equidistant){l=L,L*=this.visProp.scale,this.visProp.insertticks&&this.minTicksDistance>e.eps&&(c=this._adjustTickDistance(L,R,Y,h,M,N),L*=c,l*=c),this.visProp.insertticks||(L/=this.visProp.minorticks+1,l/=this.visProp.minorticks+1),this.ticksDelta=L,n=this.board.getBoundingBox(),B=.5*(n[0]+n[2]),j=.5*(n[1]+n[3]),a=[B*this.line.stdform[2]-j*this.line.stdform[1],-this.line.stdform[2],this.line.stdform[1]],i=e.crossProduct(this.line.stdform,a),i[1]/=i[0],i[2]/=i[0],i[0]=1,d=new o(r.COORDS_BY_USER,i,this.board),s=h.distance(r.COORDS_BY_USER,d),(0>(A.X()-w.X())*(i[1]-w.X())||0>(A.Y()-w.Y())*(i[2]-w.Y()))&&(s*=-1),b=Math.round(s/L)*L,Math.abs(b)>e.eps&&(I=Math.abs(b)/b),i[1]=h.usrCoords[1]+M*b,i[2]=h.usrCoords[2]+N*b,u=b,b=0,g=0,p=u/this.visProp.scale,B=i[1],j=i[2],f=0,m=0;do d=new o(r.COORDS_BY_USER,[B,j],this.board),d.major=0===Math.round((I*b+u)/L)%(this.visProp.minorticks+1),v=this._tickEndings(d,T,x,_,E,S,O,d.major),3===v.length?(C=I*g+p,(Math.abs(C)>=X||this.visProp.drawzero)&&C>y&&P>C&&(this.ticks.push(v),d.major?this.labels.push(this._makeLabel(C,d,this.board,this.visProp.drawlabels,this.id,f,h)):this.labels.push(null),f++),2===D&&(I*=-1),(0===m%2||1===D)&&(b+=L,g+=l)):(I*=-1,D-=1),m++,B=i[1]+I*M*b,j=i[2]+I*N*b;while(D>0);for(f=U;this.labelsRepo.length>f;f++)this.labelsRepo[f].setAttribute({visible:!1});this.needsUpdate=!0,this.updateRenderer()}else for(f=0;this.fixedTicks.length>f;f++)B=h.usrCoords[1]+this.fixedTicks[f]*M,j=h.usrCoords[2]+this.fixedTicks[f]*N,d=new o(r.COORDS_BY_USER,[B,j],this.board),v=this._tickEndings(d,T,x,_,E,S,O,!0),3===v.length&&this.fixedTicks[f]>=y&&P>this.fixedTicks[f]&&this.ticks.push(v),this.labels.push(this._makeLabel(this.visProp.labels[f]||this.fixedTicks[f],d,this.board,this.visProp.drawlabels,this.id,f,h))},_adjustTickDistance:function(t,e,i,s,n,a){for(var h,l,c=1;e>4*this.minTicksDistance;)c/=10,h=s.usrCoords[1]+n*t*c,l=s.usrCoords[2]+a*t*c,e=s.distance(r.COORDS_BY_SCREEN,new o(r.COORDS_BY_USER,[h,l],this.board));for(;this.minTicksDistance>=e;)c*=i,i=5===i?2:5,h=s.usrCoords[1]+n*t*c,l=s.usrCoords[2]+a*t*c,e=s.distance(r.COORDS_BY_SCREEN,new o(r.COORDS_BY_USER,[h,l],this.board));return c},_tickEndings:function(t,i,r,s,o,n,a,h){var l,c,d,u,p,f=this.board.canvasWidth,m=this.board.canvasHeight,b=[-1e3*f,-1e3*m],g=[-1e3*f,-1e3*m],v=0,C=!1;return l=t.scrCoords,h?(c=s,d=o,p=this.majStyle):(c=n,d=a,p=this.minStyle),Math.abs(i)<e.eps?(b[0]=l[1],b[1]=l[1],g[0]=0,g[1]=m):Math.abs(r)<e.eps?(b[0]=0,b[1]=f,g[0]=l[2],g[1]=l[2]):(v=0,u=e.crossProduct([0,0,1],[-d*l[1]-c*l[2],d,c]),u[1]/=u[0],u[1]>=0&&f>=u[1]&&(b[v]=u[1],g[v]=0,v++),u=e.crossProduct([0,1,0],[-d*l[1]-c*l[2],d,c]),u[2]/=u[0],u[2]>=0&&m>=u[2]&&(b[v]=0,g[v]=u[2],v++),2>v&&(u=e.crossProduct([m*m,0,-m],[-d*l[1]-c*l[2],d,c]),u[1]/=u[0],u[1]>=0&&f>=u[1]&&(b[v]=u[1],g[v]=m,v++)),2>v&&(u=e.crossProduct([f*f,-f,0],[-d*l[1]-c*l[2],d,c]),u[2]/=u[0],u[2]>=0&&m>=u[2]&&(b[v]=f,g[v]=u[2]))),C=b[0]>=0&&f>=b[0]&&g[0]>=0&&m>=g[0]||b[1]>=0&&f>=b[1]&&g[1]>=0&&m>=g[1],"finite"===p&&(b[0]=l[1]+c*this.visProp.tickendings[0],g[0]=l[2]-d*this.visProp.tickendings[0],b[1]=l[1]-c*this.visProp.tickendings[1],g[1]=l[2]+d*this.visProp.tickendings[1]),C?[b,g,h]:[]},_makeLabel:function(t,i,s,o,h,l,c){var d,u,p,f="number"==typeof t;return o?(t=this.generateLabelValue(i,c),d=""+t,i.distance(r.COORDS_BY_USER,c)<e.eps&&(d="0"),f&&(d.length>5||-1!==d.indexOf("e"))&&(d=""+t.toPrecision(3)),f&&d.indexOf(".")>-1&&-1===d.indexOf("e")&&(d=d.replace(/0+$/,""),d=d.replace(/\.$/,"")),this.visProp.scalesymbol.length>0&&"1"===d?d=this.visProp.scalesymbol:this.visProp.scalesymbol.length>0&&"0"===d?d="0":d+=this.visProp.scalesymbol,p={isLabel:!0,layer:s.options.layer.line,highlightStrokeColor:s.options.text.strokeColor,highlightStrokeWidth:s.options.text.strokeWidth,highlightStrokeOpacity:s.options.text.strokeOpacity,visible:this.visProp.visible,priv:this.visProp.priv},p=n.deepCopy(p,this.visProp.label),this.labelsRepo.length>0?(u=this.labelsRepo.splice(this.labelsRepo.length-1,1)[0],u.setText(d),u.setAttribute(p)):(this.labelCounter+=1,p.id=h+l+"Label"+this.labelCounter,u=a.createText(s,[i.usrCoords[1],i.usrCoords[2],d],p)),u.isDraggable=!1,u.dump=!1,u.distanceX=this.visProp.label.offset[0],u.distanceY=this.visProp.label.offset[1],u.setCoords(i.usrCoords[1]+u.distanceX/s.unitX,i.usrCoords[2]+u.distanceY/s.unitY),u.visProp.visible=o,u):null},removeTickLabels:function(){var t;if(n.exists(this.labels)&&(this.board.needsFullUpdate||this.needsRegularUpdate||this.needsUpdate)&&("canvas"!==this.board.renderer.type||"internal"!==this.board.options.text.display))for(t=0;this.labels.length>t;t++)n.exists(this.labels[t])&&this.labelsRepo.push(this.labels[t])},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.minStyle,this.majStyle),this.needsUpdate=!1),this},hideElement:function(){var t;for(this.visProp.visible=!1,this.board.renderer.hide(this),t=0;this.labels.length>t;t++)n.exists(this.labels[t])&&this.labels[t].hideElement();return this},showElement:function(){var t;for(this.visProp.visible=!0,this.board.renderer.show(this),t=0;this.labels.length>t;t++)n.exists(this.labels[t])&&this.labels[t].showElement();return this}}),t.createTicks=function(e,i,s){var o,a,h=n.copyAttributes(s,e.options,"ticks");if(a=2>i.length?h.ticksdistance:i[1],i[0].elementClass!==r.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create Ticks with parent types '"+typeof i[0]+"'.");return o=new t.Ticks(i[0],a,h),"function"==typeof h.generatelabelvalue&&(o.generateLabelValue=h.generatelabelvalue),o.isDraggable=!0,o},t.createHashmark=function(t,e,i){var s,o,a,h,l,c=[],d=n.copyAttributes(i,t.options,"hash");if(e[0].elementClass!==r.OBJECT_CLASS_LINE||"number"!=typeof e[1])throw Error("JSXGraph: Can't create Hash with parent types '"+typeof e[0]+"' and '"+typeof e[1]+"'.");for(s=e[1],h=d.ticksdistance,l=(s-1)*h,a=-l/2,o=0;s>o;o++)c[o]=a+o*h;return t.create("ticks",[e[0],c],d)},t.registerElement("ticks",t.createTicks),t.registerElement("hash",t.createHashmark),{Ticks:t.Ticks,createTicks:t.createTicks,createHashmark:t.createHashmark}}),define("base/line",["jxg","math/math","math/geometry","math/numerics","math/statistics","base/constants","base/coords","base/element","utils/type","base/transformation","base/point","base/ticks"],function(t,e,i,r,s,o,n,a,h,l,c){return t.Line=function(e,i,r,s){this.constructor(e,s,o.OBJECT_TYPE_LINE,o.OBJECT_CLASS_LINE),this.point1=this.board.select(i),this.point2=this.board.select(r),this.ticks=[],this.defaultTicks=null,this.parentPolygon=null,this.id=this.board.setId(this,"L"),this.board.renderer.drawLine(this),this.board.finalizeAdding(this),this.elType="line",this.point1.addChild(this),this.point2.addChild(this),this.updateStdform(),this.createLabel(),this.methodMap=t.deepCopy(this.methodMap,{point1:"point1",point2:"point2",getSlope:"getSlope",getRise:"getRise",getYIntersect:"getRise",getAngle:"getAngle",L:"L",length:"L",addTicks:"addTicks",removeTicks:"removeTicks",removeAllTicks:"removeAllTicks"})},t.Line.prototype=new a,t.extend(t.Line.prototype,{hasPoint:function(t,r){var s,a,h,l,c,d,u,p=[],f=[1,t,r];return p[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,p[1]=this.stdform[1]/this.board.unitX,p[2]=this.stdform[2]/-this.board.unitY,s=i.distPointLine(f,p),isNaN(s)||s>this.board.options.precision.hasPoint?!1:this.visProp.straightfirst&&this.visProp.straightlast?!0:(h=this.point1.coords,l=this.point2.coords,a=[0,p[1],p[2]],a=e.crossProduct(a,f),a=e.crossProduct(a,p),a[1]/=a[0],a[2]/=a[0],a[0]=1,a=new n(o.COORDS_BY_SCREEN,a.slice(1),this.board).usrCoords,c=h.distance(o.COORDS_BY_USER,l),h=h.usrCoords.slice(0),l=l.usrCoords.slice(0),e.eps>c?d=0:(c===Number.POSITIVE_INFINITY&&(c=1/e.eps,Math.abs(l[0])<e.eps?(c/=i.distance([0,0,0],l),l=[1,h[1]+l[1]*c,h[2]+l[2]*c]):(c/=i.distance([0,0,0],h),h=[1,l[1]+h[1]*c,l[2]+h[2]*c])),u=1,c=l[u]-h[u],Math.abs(c)<e.eps&&(u=2,c=l[u]-h[u]),d=(a[u]-h[u])/c),!this.visProp.straightfirst&&0>d?!1:!this.visProp.straightlast&&d>1?!1:!0)},update:function(){var t;return this.needsUpdate?(this.constrained&&("function"==typeof this.funps?(t=this.funps(),t&&t.length&&2===t.length&&(this.point1=t[0],this.point2=t[1])):("function"==typeof this.funp1&&(t=this.funp1(),h.isPoint(t)?this.point1=t:t&&t.length&&2===t.length&&this.point1.setPositionDirectly(o.COORDS_BY_USER,t)),"function"==typeof this.funp2&&(t=this.funp2(),h.isPoint(t)?this.point2=t:t&&t.length&&2===t.length&&this.point2.setPositionDirectly(o.COORDS_BY_USER,t)))),this.updateSegmentFixedLength(),this.updateStdform(),this.visProp.trace&&this.cloneToBackground(!0),this):this},updateSegmentFixedLength:function(){var t,i,r,s,n,a,h,l;return this.hasFixedLength?(t=this.point1.Dist(this.point2),i=this.fixedLength(),r=this.fixedLengthOldCoords[0].distance(o.COORDS_BY_USER,this.point1.coords),s=this.fixedLengthOldCoords[1].distance(o.COORDS_BY_USER,this.point2.coords),(r>e.eps||s>e.eps||t!==i)&&(n=this.point1.isDraggable&&this.point1.type!==o.OBJECT_TYPE_GLIDER&&!this.point1.visProp.fixed,a=this.point2.isDraggable&&this.point2.type!==o.OBJECT_TYPE_GLIDER&&!this.point2.visProp.fixed,t>e.eps?r>s&&a||s>=r&&a&&!n?(this.point2.setPositionDirectly(o.COORDS_BY_USER,[this.point1.X()+(this.point2.X()-this.point1.X())*i/t,this.point1.Y()+(this.point2.Y()-this.point1.Y())*i/t]),this.point2.prepareUpdate().updateRenderer()):(s>=r&&n||r>s&&n&&!a)&&(this.point1.setPositionDirectly(o.COORDS_BY_USER,[this.point2.X()+(this.point1.X()-this.point2.X())*i/t,this.point2.Y()+(this.point1.Y()-this.point2.Y())*i/t]),this.point1.prepareUpdate().updateRenderer()):(h=Math.random()-.5,l=Math.random()-.5,t=Math.sqrt(h*h+l*l),a?(this.point2.setPositionDirectly(o.COORDS_BY_USER,[this.point1.X()+h*i/t,this.point1.Y()+l*i/t]),this.point2.prepareUpdate().updateRenderer()):n&&(this.point1.setPositionDirectly(o.COORDS_BY_USER,[this.point2.X()+h*i/t,this.point2.Y()+l*i/t]),this.point1.prepareUpdate().updateRenderer())),this.fixedLengthOldCoords[0].setCoordinates(o.COORDS_BY_USER,this.point1.coords.usrCoords),this.fixedLengthOldCoords[1].setCoordinates(o.COORDS_BY_USER,this.point2.coords.usrCoords)),this):this},updateStdform:function(){var t=e.crossProduct(this.point1.coords.usrCoords,this.point2.coords.usrCoords);this.stdform[0]=t[0],this.stdform[1]=t[1],this.stdform[2]=t[2],this.stdform[3]=0,this.normalize()},updateRenderer:function(){var t;return this.needsUpdate&&this.visProp.visible&&(t=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])&&e.innerProduct(this.stdform,this.stdform,3)>=e.eps*e.eps,this.isReal?(t!==this.isReal&&(this.board.renderer.show(this),this.hasLabel&&this.label.visProp.visible&&this.board.renderer.show(this.label)),this.board.renderer.updateLine(this)):t!==this.isReal&&(this.board.renderer.hide(this),this.hasLabel&&this.label.visProp.visible&&this.board.renderer.hide(this.label)),this.needsUpdate=!1),this.hasLabel&&this.label.visProp.visible&&this.isReal&&(this.label.update(),this.board.renderer.updateText(this.label)),this},generatePolynomial:function(t){var e=this.point1.symbolic.x,i=this.point1.symbolic.y,r=this.point2.symbolic.x,s=this.point2.symbolic.y,o=t.symbolic.x,n=t.symbolic.y;return[["(",i,")*(",o,")-(",i,")*(",r,")+(",n,")*(",r,")-(",e,")*(",n,")+(",e,")*(",s,")-(",o,")*(",s,")"].join("")]},getRise:function(){return Math.abs(this.stdform[2])>=e.eps?-this.stdform[0]/this.stdform[2]:1/0},getSlope:function(){return Math.abs(this.stdform[2])>=e.eps?-this.stdform[1]/this.stdform[2]:1/0},getAngle:function(){return Math.atan2(-this.stdform[1],this.stdform[2])},setStraight:function(t,e){return this.visProp.straightfirst=t,this.visProp.straightlast=e,this.board.renderer.updateLine(this),this},getTextAnchor:function(){return new n(o.COORDS_BY_USER,[.5*(this.point2.X()+this.point1.X()),.5*(this.point2.Y()+this.point1.Y())],this.board)},setLabelRelativeCoords:function(t){h.exists(this.label)&&(this.label.relativeCoords=new n(o.COORDS_BY_SCREEN,[t[0],-t[1]],this.board))},getLabelAnchor:function(){var t,r,s=0,a=0,l=0,c=new n(o.COORDS_BY_USER,this.point1.coords.usrCoords,this.board),d=new n(o.COORDS_BY_USER,this.point2.coords.usrCoords,this.board);if((this.visProp.straightfirst||this.visProp.straightlast)&&i.calcStraight(this,c,d,0),c=c.scrCoords,d=d.scrCoords,!h.exists(this.label))return new n(o.COORDS_BY_SCREEN,[0/0,0/0],this.board);switch(this.label.visProp.position){case"lft":case"llft":case"ulft":c[1]<=d[1]?(t=c[1],r=c[2]):(t=d[1],r=d[2]);break;case"rt":case"lrt":case"urt":c[1]>d[1]?(t=c[1],r=c[2]):(t=d[1],r=d[2]);break;default:t=.5*(c[1]+d[1]),r=.5*(c[2]+d[2])}return(this.visProp.straightfirst||this.visProp.straightlast)&&(h.exists(this.label)&&(a=parseFloat(this.label.visProp.offset[0]),l=parseFloat(this.label.visProp.offset[1]),s=this.label.visProp.fontsize),Math.abs(t)<e.eps?t=a:this.board.canvasWidth+e.eps>t&&t>this.board.canvasWidth-s-e.eps&&(t=this.board.canvasWidth-a-s),e.eps+s>r&&r>-e.eps?r=l+s:this.board.canvasHeight+e.eps>r&&r>this.board.canvasHeight-s-e.eps&&(r=this.board.canvasHeight-l)),new n(o.COORDS_BY_SCREEN,[t,r],this.board)},cloneToBackground:function(){var t,e,i,r={};return r.id=this.id+"T"+this.numTraces,r.elementClass=o.OBJECT_CLASS_LINE,this.numTraces++,r.point1=this.point1,r.point2=this.point2,r.stdform=this.stdform,r.board=this.board,r.visProp=h.deepCopy(this.visProp,this.visProp.traceattributes,!0),r.visProp.layer=this.board.options.layer.trace,h.clearVisPropOld(r),e=this.getSlope(),t=this.getRise(),r.getSlope=function(){return e},r.getRise=function(){return t},i=this.board.renderer.enhancedRendering,this.board.renderer.enhancedRendering=!0,this.board.renderer.drawLine(r),this.board.renderer.enhancedRendering=i,this.traces[r.id]=r.rendNode,this},addTransform:function(t){var e,i=h.isArray(t)?t:[t],r=i.length;for(e=0;r>e;e++)this.point1.transformations.push(i[e]),this.point2.transformations.push(i[e]);return this},setPosition:function(t,e){var i;return e=new n(t,e,this.board),i=this.board.create("transform",e.usrCoords.slice(1),{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),this},setPositionDirectly:function(t,e,i){var r,o,a=new n(t,e,this.board),h=new n(t,i,this.board);return this.point1.draggable()&&this.point2.draggable()?(r=s.subtract(a.usrCoords,h.usrCoords),o=this.board.create("transform",r.slice(1),{type:"translate"}),o.applyOnce([this.point1,this.point2]),this):this},snapToGrid:function(t){var r,a,h,l,c,d,u,p,f;return this.visProp.snaptogrid&&(this.point1.visProp.snaptogrid||this.point2.visProp.snaptogrid?(this.point1.snapToGrid(),this.point2.snapToGrid()):(p=this.visProp.snapsizex,f=this.visProp.snapsizey,r=new n(o.COORDS_BY_SCREEN,[t.Xprev,t.Yprev],this.board),d=r.usrCoords[1],u=r.usrCoords[2],0>=p&&this.board.defaultAxes&&this.board.defaultAxes.x.defaultTicks&&(p=this.board.defaultAxes.x.defaultTicks.ticksDelta*(this.board.defaultAxes.x.defaultTicks.visProp.minorticks+1)),0>=f&&this.board.defaultAxes&&this.board.defaultAxes.y.defaultTicks&&(f=this.board.defaultAxes.y.defaultTicks.ticksDelta*(this.board.defaultAxes.y.defaultTicks.visProp.minorticks+1)),p>0&&f>0&&(c=[0,this.stdform[1],this.stdform[2]],c=e.crossProduct(c,r.usrCoords),a=i.meetLineLine(c,this.stdform,0,this.board),h=s.subtract([1,Math.round(d/p)*p,Math.round(u/f)*f],a.usrCoords),l=this.board.create("transform",h.slice(1),{type:"translate"}),l.applyOnce([this.point1,this.point2])))),this},X:function(t){var i,r=this.stdform[2];return i=Math.abs(this.point1.coords.usrCoords[0])>e.eps?this.point1.coords.usrCoords[1]:this.point2.coords.usrCoords[1],t=2*(t-.5),(1-Math.abs(t))*i-t*r},Y:function(t){var i,r=this.stdform[1];return i=Math.abs(this.point1.coords.usrCoords[0])>e.eps?this.point1.coords.usrCoords[2]:this.point2.coords.usrCoords[2],t=2*(t-.5),(1-Math.abs(t))*i+t*r},Z:function(t){var i=Math.abs(this.point1.coords.usrCoords[0])>e.eps?this.point1.coords.usrCoords[0]:this.point2.coords.usrCoords[0];return t=2*(t-.5),(1-Math.abs(t))*i},L:function(){return this.point1.Dist(this.point2)},minX:function(){return 0},maxX:function(){return 1},bounds:function(){var t=this.point1.coords.usrCoords,e=this.point2.coords.usrCoords;return[Math.min(t[1],e[1]),Math.max(t[2],e[2]),Math.max(t[1],e[1]),Math.min(t[2],e[2])]},addTicks:function(t){return""!==t.id&&h.exists(t.id)||(t.id=this.id+"_ticks_"+(this.ticks.length+1)),this.board.renderer.drawTicks(t),this.ticks.push(t),t.id},remove:function(){this.removeAllTicks(),a.prototype.remove.call(this)},removeAllTicks:function(){var t;for(t=this.ticks.length;t>0;t--)this.removeTicks(this.ticks[t-1]);this.ticks=[],this.board.update()},removeTicks:function(t){var e,i;for(h.exists(this.defaultTicks)&&this.defaultTicks===t&&(this.defaultTicks=null),e=this.ticks.length;e>0;e--)if(this.ticks[e-1]===t){if(this.board.removeObject(this.ticks[e-1]),this.ticks[e-1].ticks)for(i=0;this.ticks[e-1].ticks.length>i;i++)h.exists(this.ticks[e-1].labels[i])&&this.board.removeObject(this.ticks[e-1].labels[i]);delete this.ticks[e-1];break}},hideElement:function(){var t;for(a.prototype.hideElement.call(this),t=0;this.ticks.length>t;t++)this.ticks[t].hideElement()},showElement:function(){var t;for(a.prototype.showElement.call(this),t=0;this.ticks.length>t;t++)this.ticks[t].showElement()}}),t.createLine=function(e,i,r){var s,n,a,l,d,u,p,f=[],m=!1;if(2===i.length){if(h.isArray(i[0])&&i[0].length>1)u=h.copyAttributes(r,e.options,"line","point1"),a=e.create("point",i[0],u);
+else if(h.isString(i[0])||i[0].elementClass===o.OBJECT_CLASS_POINT)a=e.select(i[0]);else if("function"==typeof i[0]&&i[0]().elementClass===o.OBJECT_CLASS_POINT)a=i[0](),m=!0;else{if("function"!=typeof i[0]||!i[0]().length||2!==i[0]().length)throw Error("JSXGraph: Can't create line with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"'."+"\nPossible parent types: [point,point], [[x1,y1],[x2,y2]], [a,b,c]");u=h.copyAttributes(r,e.options,"line","point1"),a=c.createPoint(e,i[0](),u),m=!0}if(h.isArray(i[1])&&i[1].length>1)u=h.copyAttributes(r,e.options,"line","point2"),l=e.create("point",i[1],u);else if(h.isString(i[1])||i[1].elementClass===o.OBJECT_CLASS_POINT)l=e.select(i[1]);else if("function"==typeof i[1]&&i[1]().elementClass===o.OBJECT_CLASS_POINT)l=i[1](),m=!0;else{if("function"!=typeof i[1]||!i[1]().length||2!==i[1]().length)throw Error("JSXGraph: Can't create line with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"'."+"\nPossible parent types: [point,point], [[x1,y1],[x2,y2]], [a,b,c]");u=h.copyAttributes(r,e.options,"line","point2"),l=c.createPoint(e,i[1](),u),m=!0}u=h.copyAttributes(r,e.options,"line"),n=new t.Line(e,a,l,u),m?(n.constrained=!0,n.funp1=i[0],n.funp2=i[1]):n.isDraggable=!0,n.constrained||(n.parents=[a.id,l.id])}else if(3===i.length){for(p=!0,d=0;3>d;d++)if("number"==typeof i[d])f[d]=h.createFunction(i[d]);else{if("function"!=typeof i[d])throw Error("JSXGraph: Can't create line with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"' and '"+typeof i[2]+"'."+"\nPossible parent types: [point,point], [[x1,y1],[x2,y2]], [a,b,c]");f[d]=i[d],p=!1}u=h.copyAttributes(r,e.options,"line","point1"),a=p?e.create("point",[f[2]()*f[2]()+f[1]()*f[1](),f[2]()-f[1]()*f[0]()+f[2](),-f[1]()-f[2]()*f[0]()-f[1]()],u):e.create("point",[function(){return.5*(f[2]()*f[2]()+f[1]()*f[1]())},function(){return.5*(f[2]()-f[1]()*f[0]()+f[2]())},function(){return.5*(-f[1]()-f[2]()*f[0]()-f[1]())}],u),u=h.copyAttributes(r,e.options,"line","point2"),l=p?e.create("point",[f[2]()*f[2]()+f[1]()*f[1](),-f[1]()*f[0]()+f[2](),-f[2]()*f[0]()-f[1]()],u):e.create("point",[function(){return f[2]()*f[2]()+f[1]()*f[1]()},function(){return-f[1]()*f[0]()+f[2]()},function(){return-f[2]()*f[0]()-f[1]()}],u),a.prepareUpdate().update(),l.prepareUpdate().update(),u=h.copyAttributes(r,e.options,"line"),n=new t.Line(e,a,l,u),n.isDraggable=p,p&&(n.parents=[f[0](),f[1](),f[2]()])}else if(1===i.length&&"function"==typeof i[0]&&2===i[0]().length&&i[0]()[0].elementClass===o.OBJECT_CLASS_POINT&&i[0]()[1].elementClass===o.OBJECT_CLASS_POINT)s=i[0](),u=h.copyAttributes(r,e.options,"line"),n=new t.Line(e,s[0],s[1],u),n.constrained=!0,n.funps=i[0];else{if(1!==i.length||"function"!=typeof i[0]||3!==i[0]().length||"number"!=typeof i[0]()[0]||"number"!=typeof i[0]()[1]||"number"!=typeof i[0]()[2])throw Error("JSXGraph: Can't create line with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"'."+"\nPossible parent types: [point,point], [[x1,y1],[x2,y2]], [a,b,c]");s=i[0],u=h.copyAttributes(r,e.options,"line","point1"),a=e.create("point",[function(){var t=s();return[.5*(t[2]*t[2]+t[1]*t[1]),.5*(t[2]-t[1]*t[0]+t[2]),.5*(-t[1]-t[2]*t[0]-t[1])]}],u),u=h.copyAttributes(r,e.options,"line","point2"),l=e.create("point",[function(){var t=s();return[t[2]*t[2]+t[1]*t[1],-t[1]*t[0]+t[2],-t[2]*t[0]-t[1]]}],u),u=h.copyAttributes(r,e.options,"line"),n=new t.Line(e,a,l,u),n.constrained=!0,n.funps=i[0]}return n},t.registerElement("line",t.createLine),t.createSegment=function(t,e,i){var r,s;if(i.straightFirst=!1,i.straightLast=!1,s=h.copyAttributes(i,t.options,"segment"),r=t.create("line",e.slice(0,2),s),3===e.length){if(r.hasFixedLength=!0,h.isNumber(e[2]))r.fixedLength=function(){return e[2]};else{if(!h.isFunction(e[2]))throw Error("JSXGraph: Can't create segment with third parent type '"+typeof e[2]+"'."+"\nPossible third parent types: number or function");r.fixedLength=e[2]}r.fixedLengthOldCoords=[],r.fixedLengthOldCoords[0]=new n(o.COORDS_BY_USER,r.point1.coords.usrCoords.slice(1,3),t),r.fixedLengthOldCoords[1]=new n(o.COORDS_BY_USER,r.point2.coords.usrCoords.slice(1,3),t)}return r.elType="segment",r},t.registerElement("segment",t.createSegment),t.createArrow=function(t,e,i){var r;return i.firstArrow=!1,i.lastArrow=!0,r=t.create("line",e,i).setStraight(!1,!1),r.type=o.OBJECT_TYPE_VECTOR,r.elType="arrow",r},t.registerElement("arrow",t.createArrow),t.createAxis=function(t,e,i){var r,s,n,a;if(!h.isArray(e[0])&&!h.isPoint(e[0])||!h.isArray(e[1])&&!h.isPoint(e[1]))throw Error("JSXGraph: Can't create axis with parent types '"+typeof e[0]+"' and '"+typeof e[1]+"'."+"\nPossible parent types: [point,point], [[x1,y1],[x2,y2]]");r=h.copyAttributes(i,t.options,"axis"),s=t.create("line",e,r),s.type=o.OBJECT_TYPE_AXIS,s.isDraggable=!1,s.point1.isDraggable=!1,s.point2.isDraggable=!1;for(n in s.ancestors)s.ancestors.hasOwnProperty(n)&&(s.ancestors[n].type=o.OBJECT_TYPE_AXISPOINT);return r=h.copyAttributes(i,t.options,"axis","ticks"),a=h.exists(r.ticksdistance)?r.ticksdistance:h.isArray(r.ticks)?r.ticks:1,s.defaultTicks=t.create("ticks",[s,a],r),s.defaultTicks.dump=!1,s.elType="axis",s.subs={ticks:s.defaultTicks},s},t.registerElement("axis",t.createAxis),t.createTangent=function(t,i,s){var n,a,l,c,d,u,p,f;if(1===i.length)n=i[0],a=n.slideObject;else{if(2!==i.length)throw Error("JSXGraph: Can't create tangent with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"'."+"\nPossible parent types: [glider], [point,line|curve|circle|conic]");if(h.isPoint(i[0]))n=i[0],a=i[1];else{if(!h.isPoint(i[1]))throw Error("JSXGraph: Can't create tangent with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"'."+"\nPossible parent types: [glider], [point,line|curve|circle|conic]");a=i[0],n=i[1]}}if(a.elementClass===o.OBJECT_CLASS_LINE?(f=t.create("line",[a.point1,a.point2],s),f.glider=n):a.elementClass===o.OBJECT_CLASS_CURVE&&a.type!==o.OBJECT_TYPE_CONIC?"plot"!==a.visProp.curvetype?(l=a.X,c=a.Y,f=t.create("line",[function(){return-n.X()*r.D(c)(n.position)+n.Y()*r.D(l)(n.position)},function(){return r.D(c)(n.position)},function(){return-r.D(l)(n.position)}],s),n.addChild(f),f.glider=n):(f=t.create("line",[function(){var t=Math.floor(n.position);return t===a.numberPoints-1&&t--,0>t?1:a.Y(t)*a.X(t+1)-a.X(t)*a.Y(t+1)},function(){var t=Math.floor(n.position);return t===a.numberPoints-1&&t--,0>t?0:a.Y(t+1)-a.Y(t)},function(){var t=Math.floor(n.position);return t===a.numberPoints-1&&t--,0>t?0:a.X(t)-a.X(t+1)}],s),n.addChild(f),f.glider=n):a.type===o.OBJECT_TYPE_TURTLE?(f=t.create("line",[function(){var t=Math.floor(n.position);for(u=0;a.objects.length>u;u++)if(p=a.objects[u],p.type===o.OBJECT_TYPE_CURVE){if(p.numberPoints>t)break;t-=p.numberPoints}return t===p.numberPoints-1&&t--,0>t?1:p.Y(t)*p.X(t+1)-p.X(t)*p.Y(t+1)},function(){var t=Math.floor(n.position);for(u=0;a.objects.length>u;u++)if(p=a.objects[u],p.type===o.OBJECT_TYPE_CURVE){if(p.numberPoints>t)break;t-=p.numberPoints}return t===p.numberPoints-1&&t--,0>t?0:p.Y(t+1)-p.Y(t)},function(){var t=Math.floor(n.position);for(u=0;a.objects.length>u;u++)if(p=a.objects[u],p.type===o.OBJECT_TYPE_CURVE){if(p.numberPoints>t)break;t-=p.numberPoints}return t===p.numberPoints-1&&t--,0>t?0:p.X(t)-p.X(t+1)}],s),n.addChild(f),f.glider=n):(a.elementClass===o.OBJECT_CLASS_CIRCLE||a.type===o.OBJECT_TYPE_CONIC)&&(f=t.create("line",[function(){return e.matVecMult(a.quadraticform,n.coords.usrCoords)[0]},function(){return e.matVecMult(a.quadraticform,n.coords.usrCoords)[1]},function(){return e.matVecMult(a.quadraticform,n.coords.usrCoords)[2]}],s),n.addChild(f),f.glider=n),!h.exists(f))throw Error("JSXGraph: Couldn't create tangent with the given parents.");for(f.elType="tangent",f.type=o.OBJECT_TYPE_TANGENT,f.parents=[],d=0;i.length>d;d++)f.parents.push(i[d].id);return f},t.registerElement("tangent",t.createTangent),t.registerElement("polar",t.createTangent),{Line:t.Line,createLine:t.createLine,createTangent:t.createTangent,createPolar:t.createTangent,createSegment:t.createSegment,createAxis:t.createAxis,createArrow:t.createArrow}}),define("base/circle",["jxg","base/element","base/coords","base/constants","parser/geonext","math/geometry","math/statistics","utils/type","base/transformation","base/point"],function(t,e,i,r,s,o,n,a){return t.Circle=function(t,e,i,s,o){this.constructor(t,o,r.OBJECT_TYPE_CIRCLE,r.OBJECT_CLASS_CIRCLE),this.method=e,this.midpoint=this.board.select(i),this.center=this.board.select(i),this.point2=null,this.radius=0,this.line=null,this.circle=null,"twoPoints"===e?(this.point2=t.select(s),this.radius=this.Radius()):"pointRadius"===e?(this.gxtterm=s,this.updateRadius=a.createFunction(s,this.board,null,!0),this.updateRadius()):"pointLine"===e?(this.line=t.select(s),this.radius=this.line.point1.coords.distance(r.COORDS_BY_USER,this.line.point2.coords)):"pointCircle"===e&&(this.circle=t.select(s),this.radius=this.circle.Radius()),this.id=this.board.setId(this,"C"),this.board.renderer.drawEllipse(this),this.board.finalizeAdding(this),this.createGradient(),this.elType="circle",this.createLabel(),this.center.addChild(this),"pointRadius"===e?this.notifyParents(s):"pointLine"===e?this.line.addChild(this):"pointCircle"===e?this.circle.addChild(this):"twoPoints"===e&&this.point2.addChild(this),this.methodMap=a.deepCopy(this.methodMap,{setRadius:"setRadius",getRadius:"getRadius",radius:"Radius",center:"center",line:"line",point2:"point2"})},t.Circle.prototype=new e,t.extend(t.Circle.prototype,{hasPoint:function(t,e){var s=this.board.options.precision.hasPoint/this.board.unitX,o=this.center.coords.usrCoords,n=new i(r.COORDS_BY_SCREEN,[t,e],this.board),a=this.Radius(),h=Math.sqrt((o[1]-n.usrCoords[1])*(o[1]-n.usrCoords[1])+(o[2]-n.usrCoords[2])*(o[2]-n.usrCoords[2]));return this.visProp.hasinnerpoints?a+s>h:s>Math.abs(h-a)},generatePolynomial:function(t){var e=this.center.symbolic.x,i=this.center.symbolic.y,r=t.symbolic.x,s=t.symbolic.y,o=this.generateRadiusSquared();return""===o?[]:["(("+r+")-("+e+"))^2 + (("+s+")-("+i+"))^2 - ("+o+")"]},generateRadiusSquared:function(){var t,e,i,r,s,o,n="";return"twoPoints"===this.method?(t=this.center.symbolic.x,e=this.center.symbolic.y,i=this.point2.symbolic.x,r=this.point2.symbolic.y,n="(("+i+")-("+t+"))^2 + (("+r+")-("+e+"))^2"):"pointRadius"===this.method?"number"==typeof this.radius&&(n=""+this.radius*this.radius):"pointLine"===this.method?(i=this.line.point1.symbolic.x,r=this.line.point1.symbolic.y,s=this.line.point2.symbolic.x,o=this.line.point2.symbolic.y,n="(("+i+")-("+s+"))^2 + (("+r+")-("+o+"))^2"):"pointCircle"===this.method&&(n=this.circle.Radius()),n},update:function(){return this.needsUpdate&&(this.visProp.trace&&this.cloneToBackground(!0),"pointLine"===this.method?this.radius=this.line.point1.coords.distance(r.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 t=this.center,e=t.X(),i=t.Y(),r=this.Radius();this.quadraticform=[[e*e+i*i-r*r,-e,-i],[-e,1,0],[-i,0,1]]},updateStdform:function(){this.stdform[3]=.5,this.stdform[4]=this.Radius(),this.stdform[1]=-this.center.coords.usrCoords[1],this.stdform[2]=-this.center.coords.usrCoords[2],this.normalize()},updateRenderer:function(){var t;this.needsUpdate&&this.visProp.visible&&(t=this.isReal,this.isReal=!isNaN(this.center.coords.usrCoords[1]+this.center.coords.usrCoords[2]+this.Radius())&&this.center.isReal,this.isReal?(t!==this.isReal&&(this.board.renderer.show(this),this.hasLabel&&this.label.visProp.visible&&this.board.renderer.show(this.label)),this.board.renderer.updateEllipse(this)):t!==this.isReal&&(this.board.renderer.hide(this),this.hasLabel&&this.label.visProp.visible&&this.board.renderer.hide(this.label)),this.needsUpdate=!1),this.hasLabel&&this.label.visProp.visible&&this.isReal&&(this.label.update(),this.board.renderer.updateText(this.label))},notifyParents:function(t){"string"==typeof t&&s.findDependencies(this,t,this.board)},setRadius:function(t){return this.updateRadius=a.createFunction(t,this.board,null,!0),this.board.update(),this},Radius:function(t){return a.exists(t)?(this.setRadius(t),this.Radius()):"twoPoints"===this.method?0===o.distance(this.point2.coords.usrCoords,[0,0,0])||0===o.distance(this.center.coords.usrCoords,[0,0,0])?0/0:this.center.Dist(this.point2):"pointLine"===this.method||"pointCircle"===this.method?this.radius:"pointRadius"===this.method?this.updateRadius():0/0},getRadius:function(){return this.Radius()},getTextAnchor:function(){return this.center.coords},getLabelAnchor:function(){var t,e,s=this.Radius(),o=this.center.coords.usrCoords;switch(this.visProp.label.position){case"lft":t=o[1]-s,e=o[2];break;case"llft":t=o[1]-Math.sqrt(.5)*s,e=o[2]-Math.sqrt(.5)*s;break;case"rt":t=o[1]+s,e=o[2];break;case"lrt":t=o[1]+Math.sqrt(.5)*s,e=o[2]-Math.sqrt(.5)*s;break;case"urt":t=o[1]+Math.sqrt(.5)*s,e=o[2]+Math.sqrt(.5)*s;break;case"top":t=o[1],e=o[2]+s;break;case"bot":t=o[1],e=o[2]-s;break;default:t=o[1]-Math.sqrt(.5)*s,e=o[2]+Math.sqrt(.5)*s}return new i(r.COORDS_BY_USER,[t,e],this.board)},cloneToBackground:function(){var t,e=this.Radius(),i={id:this.id+"T"+this.numTraces,elementClass:r.OBJECT_CLASS_CIRCLE,center:{coords:this.center.coords},Radius:function(){return e},getRadius:function(){return e},board:this.board,visProp:a.deepCopy(this.visProp,this.visProp.traceattributes,!0)};return i.visProp.layer=this.board.options.layer.trace,this.numTraces++,a.clearVisPropOld.call(i),t=this.board.renderer.enhancedRendering,this.board.renderer.enhancedRendering=!0,this.board.renderer.drawEllipse(i),this.board.renderer.enhancedRendering=t,this.traces[i.id]=i.rendNode,this},addTransform:function(t){var e,i=a.isArray(t)?t:[t],r=i.length;for(e=0;r>e;e++)this.center.transformations.push(i[e]),"twoPoints"===this.method&&this.point2.transformations.push(i[e]);return this},snapToGrid:function(){return this.visProp.snaptogrid&&(this.center.snapToGrid(),"twoPoints"===this.method&&this.point2.snapToGrid()),this},setPosition:function(t,e){var r;return e=new i(t,e,this.board),r=this.board.create("transform",e.usrCoords.slice(1),{type:"translate"}),this.addTransform(r),this},setPositionDirectly:function(t,e,s){var o,a,h,l=this.parents.length;for(e=new i(t,e,this.board),s=new i(t,s,this.board),h=n.subtract(e.usrCoords,s.usrCoords),o=0;l>o;o++)if(!this.board.select(this.parents[o]).draggable())return this;for(o=0;l>o;o++)a=this.board.select(this.parents[o]),a.setPositionDirectly(r.COORDS_BY_USER,n.add(a.coords.usrCoords,h));return this.prepareUpdate().update(),this},X:function(t){return this.Radius()*Math.cos(2*t*Math.PI)+this.center.coords.usrCoords[1]},Y:function(t){return this.Radius()*Math.sin(2*t*Math.PI)+this.center.coords.usrCoords[2]},Z:function(){return 1},minX:function(){return 0},maxX:function(){return 1},Area:function(){var t=this.Radius();return t*t*Math.PI},bounds:function(){var t=this.center.coords.usrCoords,e=this.Radius();return[t[1]-e,t[2]+e,t[1]+e,t[2]-e]}}),t.createCircle=function(e,i,s){var o,n,h,l,c=!0;for(n=[],h=0;i.length>h;h++)a.isPoint(i[h])?n[h]=i[h]:a.isArray(i[h])&&i[h].length>1?(l=a.copyAttributes(s,e.options,"circle","center"),n[h]=e.create("point",i[h],l)):n[h]=i[h];if(l=a.copyAttributes(s,e.options,"circle"),2===i.length&&a.isPoint(n[0])&&a.isPoint(n[1]))o=new t.Circle(e,"twoPoints",n[0],n[1],l);else if((a.isNumber(n[0])||a.isFunction(n[0])||a.isString(n[0]))&&a.isPoint(n[1]))o=new t.Circle(e,"pointRadius",n[1],n[0],l);else if((a.isNumber(n[1])||a.isFunction(n[1])||a.isString(n[1]))&&a.isPoint(n[0]))o=new t.Circle(e,"pointRadius",n[0],n[1],l);else if(n[0].elementClass===r.OBJECT_CLASS_CIRCLE&&a.isPoint(n[1]))o=new t.Circle(e,"pointCircle",n[1],n[0],l);else if(n[1].elementClass===r.OBJECT_CLASS_CIRCLE&&a.isPoint(n[0]))o=new t.Circle(e,"pointCircle",n[0],n[1],l);else if(n[0].elementClass===r.OBJECT_CLASS_LINE&&a.isPoint(n[1]))o=new t.Circle(e,"pointLine",n[1],n[0],l);else if(n[1].elementClass===r.OBJECT_CLASS_LINE&&a.isPoint(n[0]))o=new t.Circle(e,"pointLine",n[0],n[1],l);else{if(!(3===i.length&&a.isPoint(n[0])&&a.isPoint(n[1])&&a.isPoint(n[2])))throw Error("JSXGraph: Can't create circle with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"'."+"\nPossible parent types: [point,point], [point,number], [point,function], [point,circle], [point,point,point]");if(!t.elements.circumcircle)throw Error("JSXGraph: Can't create circle with three points. Please include the circumcircle element (element/composition).");o=t.elements.circumcircle(e,n,l)}for(o.isDraggable=c,o.parents=[],h=0;i.length>h;h++)i[h].id&&o.parents.push(i[h].id);return o.elType="circle",o},t.registerElement("circle",t.createCircle),{Circle:t.Circle,createCircle:t.createCircle}}),define("base/composition",["jxg","utils/type"],function(t,e){return t.Composition=function(t){var i,r=this,s=["setAttribute","prepareUpdate","updateRenderer","update","highlight","noHighlight"],o=function(t){return function(){var i;for(i in r.elements)r.elements.hasOwnProperty(i)&&e.exists(r.elements[i][t])&&r.elements[i][t].apply(r.elements[i],arguments);return r}};for(i=0;s.length>i;i++)this[s[i]]=o(s[i]);this.elements={},this.objects=this.elements,this.elementsByName={},this.objectsList=[],this.groups={},this.methodMap={setAttribute:"setAttribute",setProperty:"setAttribute",add:"add",remove:"remove",select:"select"};for(i in t)t.hasOwnProperty(i)&&this.add(i,t[i]);this.dump=!0,this.subs={}},t.extend(t.Composition.prototype,{add:function(t,i){return!e.exists(this[t])&&e.exists(i)?(e.exists(i.id)?this.elements[i.id]=i:this.elements[t]=i,e.exists(i.name)&&(this.elementsByName[i.name]=i),i.on("attribute:name",this.nameListener,this),this.objectsList.push(i),this[t]=i,this.methodMap[t]=i,!0):!1},remove:function(t){var e,i=!1;for(e in this.elements)if(this.elements.hasOwnProperty(e)&&this.elements[e].id===this[t].id){i=!0;break}return i&&(delete this.elements[this[t].id],delete this[t]),i},nameListener:function(t,e,i){delete this.elementsByName[t],this.elementsByName[e]=i},select:function(i){return e.exists(t.Board)?t.Board.prototype.select.call(this,i):new t.Composition},getParents:function(){return this.parents},getType:function(){return this.elType},getAttributes:function(){var t,e={};for(t in this.subs)this.subs.hasOwnProperty(t)&&(e[t]=this.subs[t].visProp);return this.attr}}),t.Composition}),define("base/curve",["jxg","base/constants","base/coords","base/element","math/math","math/statistics","math/numerics","math/geometry","parser/geonext","utils/type","base/transformation"],function(t,e,i,r,s,o,n,a,h,l){return t.Curve=function(t,i,r){this.constructor(t,r,e.OBJECT_TYPE_CURVE,e.OBJECT_CLASS_CURVE),this.points=[],this.numberPoints=this.visProp.numberpointshigh,this.bezierDegree=1,this.dataX=null,this.dataY=null,this.varname=l.exists(i[0])?i[0]:"x",this.xterm=i[1],this.yterm=i[2],this.generateTerm(this.varname,this.xterm,this.yterm,i[3],i[4]),this.updateCurve(),this.id=this.board.setId(this,"G"),this.board.renderer.drawCurve(this),this.board.finalizeAdding(this),this.createGradient(),this.elType="curve",this.createLabel(),"string"==typeof this.xterm&&this.notifyParents(this.xterm),"string"==typeof this.yterm&&this.notifyParents(this.yterm),this.methodMap=l.deepCopy(this.methodMap,{generateTerm:"generateTerm",setTerm:"generateTerm"})},t.Curve.prototype=new r,t.extend(t.Curve.prototype,{minX:function(){var t;return"polar"===this.visProp.curvetype?0:(t=new i(e.COORDS_BY_SCREEN,[0,0],this.board,!1),t.usrCoords[1])},maxX:function(){var t;return"polar"===this.visProp.curvetype?2*Math.PI:(t=new i(e.COORDS_BY_SCREEN,[this.board.canvasWidth,0],this.board,!1),t.usrCoords[1])},Z:function(){return 1},hasPoint:function(t,r,o){var n,h,c,d,u,p,f,m,b,g=this.visProp.numberpointslow,v=(this.maxX()-this.minX())/g,C=this.board.options.precision.hasPoint/this.board.unitX,y=1/0,P=!0;if(h=new i(e.COORDS_BY_SCREEN,[t,r],this.board,!1),t=h.usrCoords[1],r=h.usrCoords[2],this.transformations.length>0&&(this.updateTransformMatrix(),d=s.inverse(this.transformMat),u=s.matVecMult(d,[1,t,r]),t=u[1],r=u[2]),"parameter"===this.visProp.curvetype||"polar"===this.visProp.curvetype||"functiongraph"===this.visProp.curvetype)for(C*=C,p=0,n=this.minX();g>p;p++){if(f=this.X(n,P),m=this.Y(n,P),y=(t-f)*(t-f)+(r-m)*(r-m),C>y)return!0;n+=v}else if("plot"===this.visProp.curvetype){for((!l.exists(o)||0>o)&&(o=0),c=this.numberPoints,p=o;c-1>p;p++)if(b=3===this.bezierDegree?a.projectCoordsToBeziersegment([1,t,r],this,p):a.projectCoordsToSegment([1,t,r],[1,this.X(p),this.Y(p)],[1,this.X(p+1),this.Y(p+1)]),b[1]>=0&&1>=b[1]&&C>=a.distance([1,t,r],b[0],3))return!0;return!1}return C>y},allocatePoints:function(){var t,r;if(r=this.numberPoints,this.points.length<this.numberPoints)for(t=this.points.length;r>t;t++)this.points[t]=new i(e.COORDS_BY_USER,[0,0],this.board,!1)},update:function(){return this.needsUpdate&&(this.visProp.trace&&this.cloneToBackground(!0),this.updateCurve()),this},updateRenderer:function(){var t;return this.needsUpdate&&this.visProp.visible&&(t=this.isReal,this.isReal&&this.board.renderer.updateCurve(this),this.checkReal(),this.isReal?t!==this.isReal&&(this.board.renderer.show(this),this.hasLabel&&this.label.content.visProp.visible&&this.board.renderer.show(this.label.content)):t!==this.isReal&&(this.board.renderer.hide(this),this.hasLabel&&this.label.visProp.visible&&this.board.renderer.hide(this.label)),this.hasLabel&&l.exists(this.label.visProp)&&this.label.visProp.visible&&(this.label.update(),this.board.renderer.updateText(this.label))),this},updateDataArray:function(){},updateCurve:function(){var t,i,r,s,o,n,a=!1;if(this.updateTransformMatrix(),this.updateDataArray(),i=this.minX(),r=this.maxX(),l.exists(this.dataX))for(this.numberPoints=this.dataX.length,t=this.numberPoints,this.allocatePoints(),n=0;t>n;n++)s=n,l.exists(this.dataY)?(o=n,this.points[n].setCoordinates(e.COORDS_BY_USER,[this.dataX[n],this.dataY[n]],!1)):(o=this.X(s),this.points[n].setCoordinates(e.COORDS_BY_USER,[this.dataX[n],this.Y(o,a)],!1)),this.updateTransform(this.points[n]),a=!0;else for(this.visProp.doadvancedplot?this.updateParametricCurve(i,r,t):(this.numberPoints=this.board.updateQuality===this.board.BOARD_QUALITY_HIGH?this.visProp.numberpointshigh:this.visProp.numberpointslow,this.allocatePoints(),this.updateParametricCurveNaive(i,r,this.numberPoints)),t=this.numberPoints,n=0;t>n;n++)this.updateTransform(this.points[n]);return this},updateTransformMatrix:function(){var t,e,i=this.transformations.length;for(this.transformMat=[[1,0,0],[0,1,0],[0,0,1]],e=0;i>e;e++)t=this.transformations[e],t.update(),this.transformMat=s.matMatMult(t.matrix,this.transformMat);return this},checkReal:function(){var t,e,i=!1,r=this.numberPoints;for(t=0;r>t;t++)if(e=this.points[t].usrCoords,!isNaN(e[1])&&!isNaN(e[2])&&Math.abs(e[0])>s.eps){i=!0;break}this.isReal=i},updateParametricCurveNaive:function(t,i,r){var s,o,n=!1,a=(i-t)/r;for(s=0;r>s;s++)o=t+s*a,this.points[s].setCoordinates(e.COORDS_BY_USER,[this.X(o,n),this.Y(o,n)],!1),n=!0;return this},updateParametricCurve:function(t,r){var o,n,a,h,l,c,d,u,p,f,m,b,g,v=!1,C=new i(e.COORDS_BY_USER,[0,0],this.board,!1),y=[],P=[],_=[],E=[],S=!1,O=0,T=function(t,e,i){var r,o,n=i[1]-t[1],a=i[2]-t[2],h=e[0]-t[1],l=e[1]-t[2],c=h*h+l*l;return c>=s.eps&&(r=(n*h+a*l)/c,r>0&&(1>=r?(n-=r*h,a-=r*l):(n-=h,a-=l))),o=n*n+a*a,Math.sqrt(o)};for(this.board.updateQuality===this.board.BOARD_QUALITY_LOW?(m=15,b=10,g=10):(m=21,b=.7,g=.7),E[0]=r-t,o=1;m>o;o++)E[o]=.5*E[o-1];o=1,y[0]=1,P[0]=0,n=t,C.setCoordinates(e.COORDS_BY_USER,[this.X(n,v),this.Y(n,v)],!1),v=!0,d=C.scrCoords[1],u=C.scrCoords[2],a=n,n=r,C.setCoordinates(e.COORDS_BY_USER,[this.X(n,v),this.Y(n,v)],!1),l=C.scrCoords[1],c=C.scrCoords[2],_[0]=[l,c],p=1,f=0,this.points=[],this.points[O++]=new i(e.COORDS_BY_SCREEN,[d,u],this.board,!1);do{for(S=this.isDistOK(l-d,c-u,b,g)||this.isSegmentOutside(d,u,l,c);m>f&&(!S||6>f)&&(7>=f||this.isSegmentDefined(d,u,l,c));)y[p]=o,P[p]=f,_[p]=[l,c],p+=1,o=2*o-1,f++,n=t+o*E[f],C.setCoordinates(e.COORDS_BY_USER,[this.X(n,v),this.Y(n,v)],!1,!0),l=C.scrCoords[1],c=C.scrCoords[2],S=this.isDistOK(l-d,c-u,b,g)||this.isSegmentOutside(d,u,l,c);O>1&&(h=T(this.points[O-2].scrCoords,[l,c],this.points[O-1].scrCoords),.015>h&&(O-=1)),this.points[O]=new i(e.COORDS_BY_SCREEN,[l,c],this.board,!1),O+=1,d=l,u=c,a=n,p-=1,l=_[p][0],c=_[p][1],f=P[p]+1,o=2*y[p]}while(p>0&&5e5>O);return this.numberPoints=this.points.length,this},isSegmentOutside:function(t,e,i,r){return 0>e&&0>r||e>this.board.canvasHeight&&r>this.board.canvasHeight||0>t&&0>i||t>this.board.canvasWidth&&i>this.board.canvasWidth},isDistOK:function(t,e,i,r){return i>Math.abs(t)&&r>Math.abs(e)&&!isNaN(t+e)},isSegmentDefined:function(t,e,i,r){return!(isNaN(t+e)&&isNaN(i+r))},updateTransform:function(t){var i,r=this.transformations.length;return r>0&&(i=s.matVecMult(this.transformMat,t.usrCoords),t.setPosition(e.COORDS_BY_USER,[i[1],i[2]])),t},addTransform:function(t){var e,i=l.isArray(t)?t:[t],r=i.length;for(e=0;r>e;e++)this.transformations.push(i[e]);return this},setPosition:function(t,e){var r,s,o,n=0;for(l.exists(this.parents)&&(n=this.parents.length),o=0;n>o;o++)if(s=this.board.select(this.parents[o]),!s.draggable())return this;if(e=new i(t,e,this.board,!1),r=this.board.create("transform",e.usrCoords.slice(1),{type:"translate"}),n>0)for(o=0;n>o;o++)s=this.board.select(this.parents[o]),r.applyOnce(s);else this.transformations.length>0&&this.transformations[this.transformations.length-1].isNumericMatrix?this.transformations[this.transformations.length-1].melt(r):this.addTransform(r);return this},setPositionDirectly:function(t,r,s){var n=new i(t,r,this.board,!1),a=new i(t,s,this.board,!1),h=o.subtract(n.usrCoords,a.usrCoords);return this.setPosition(e.COORDS_BY_USER,h),this},interpolationFunctionFromArray:function(t){var e="data"+t;return function(t){var i,r,s,o,n=this[e],a=n.length,h=[];if(isNaN(t))return 0/0;if(0>t)return l.isFunction(n[0])?n[0]():n[0];if(3===this.bezierDegree){if(a/=3,t>=a)return l.isFunction(n[n.length-1])?n[n.length-1]():n[n.length-1];for(i=3*Math.floor(t),s=t%1,o=1-s,r=0;4>r;r++)h[r]=l.isFunction(n[i+r])?n[i+r]():n[i+r];return o*o*(o*h[0]+3*s*h[1])+(3*o*h[2]+s*h[3])*s*s}if(i=t>a-2?a-2:parseInt(Math.floor(t),10),i===t)return l.isFunction(n[i])?n[i]():n[i];for(r=0;2>r;r++)h[r]=l.isFunction(n[i+r])?n[i+r]():n[i+r];return h[0]+(h[1]-h[0])*(t-i)}},generateTerm:function(t,e,i,r,s){var o,n;l.isArray(e)?(this.dataX=e,this.numberPoints=this.dataX.length,this.X=this.interpolationFunctionFromArray("X"),this.visProp.curvetype="plot",this.isDraggable=!0):(this.X=l.createFunction(e,this.board,t),l.isString(e)?this.visProp.curvetype="functiongraph":(l.isFunction(e)||l.isNumber(e))&&(this.visProp.curvetype="parameter"),this.isDraggable=!0),l.isArray(i)?(this.dataY=i,this.Y=this.interpolationFunctionFromArray("Y")):this.Y=l.createFunction(i,this.board,t),l.isFunction(e)&&l.isArray(i)&&(o=l.createFunction(i[0],this.board,""),n=l.createFunction(i[1],this.board,""),this.X=function(t){return e(t)*Math.cos(t)+o()},this.Y=function(t){return e(t)*Math.sin(t)+n()},this.visProp.curvetype="polar"),l.exists(r)&&(this.minX=l.createFunction(r,this.board,"")),l.exists(s)&&(this.maxX=l.createFunction(s,this.board,""))},notifyParents:function(t){h.findDependencies(this,t,this.board)},getLabelAnchor:function(){var t,r,s,o=.05*this.board.canvasWidth,n=.05*this.board.canvasHeight,h=.95*this.board.canvasWidth,l=.95*this.board.canvasHeight;switch(this.visProp.label.position){case"ulft":r=o,s=n;break;case"llft":r=o,s=l;break;case"rt":r=h,s=.5*l;break;case"lrt":r=h,s=l;break;case"urt":r=h,s=n;break;case"top":r=.5*h,s=n;break;case"bot":r=.5*h,s=l;break;default:r=o,s=.5*l}return t=new i(e.COORDS_BY_SCREEN,[r,s],this.board,!1),a.projectCoordsToCurve(t.usrCoords[1],t.usrCoords[2],0,this,this.board)[0]},cloneToBackground:function(){var t,i={id:this.id+"T"+this.numTraces,elementClass:e.OBJECT_CLASS_CURVE,points:this.points.slice(0),bezierDegree:this.bezierDegree,numberPoints:this.numberPoints,board:this.board,visProp:l.deepCopy(this.visProp,this.visProp.traceattributes,!0)};return i.visProp.layer=this.board.options.layer.trace,i.visProp.curvetype=this.visProp.curvetype,this.numTraces++,l.clearVisPropOld(i),t=this.board.renderer.enhancedRendering,this.board.renderer.enhancedRendering=!0,this.board.renderer.drawCurve(i),this.board.renderer.enhancedRendering=t,this.traces[i.id]=i.rendNode,this},bounds:function(){var t,e=1/0,i=-1/0,r=1/0,s=-1/0,o=this.points.length;for(t=0;o>t;t++)e>this.points[t].usrCoords[1]&&(e=this.points[t].usrCoords[1]),this.points[t].usrCoords[1]>i&&(i=this.points[t].usrCoords[1]),r>this.points[t].usrCoords[2]&&(r=this.points[t].usrCoords[2]),this.points[t].usrCoords[2]>s&&(s=this.points[t].usrCoords[2]);return[e,s,i,r]}}),t.createCurve=function(e,i,r){var s=l.copyAttributes(r,e.options,"curve");return new t.Curve(e,["x"].concat(i),s)},t.registerElement("curve",t.createCurve),t.createFunctiongraph=function(e,i,r){var s,o=["x","x"].concat(i);return s=l.copyAttributes(r,e.options,"curve"),s.curvetype="functiongraph",new t.Curve(e,o,s)},t.registerElement("functiongraph",t.createFunctiongraph),t.registerElement("plot",t.createFunctiongraph),t.createSpline=function(t,e,i){var r;return r=function(){var t,i=[],r=[];return function(s,o){var a;if(!o){if(i=[],r=[],2===e.length&&l.isArray(e[0])&&l.isArray(e[1])&&e[0].length===e[1].length)for(a=0;e[0].length>a;a++)"function"==typeof e[0][a]?i.push(e[0][a]()):i.push(e[0][a]),"function"==typeof e[1][a]?r.push(e[1][a]()):r.push(e[1][a]);else for(a=0;e.length>a;a++)if(l.isPoint(e[a]))i.push(e[a].X()),r.push(e[a].Y());else if(l.isArray(e[a])&&2===e[a].length)for(a=0;e.length>a;a++)"function"==typeof e[a][0]?i.push(e[a][0]()):i.push(e[a][0]),"function"==typeof e[a][1]?r.push(e[a][1]()):r.push(e[a][1]);t=n.splineDef(i,r)}return n.splineEval(s,i,r,t)}},t.create("curve",["x",r()],i)},t.registerElement("spline",t.createSpline),t.createRiemannsum=function(t,e,i){var r,s,o,a,h,c;if(c=l.copyAttributes(i,t.options,"riemannsum"),c.curvetype="plot",o=e[0],r=l.createFunction(e[1],t,""),!l.exists(r))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(s=l.createFunction(e[2],t,"",!1),!l.exists(s))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(e.slice(3)),h=t.create("curve",a,c),h.sum=0,h.Value=function(){return this.sum},h.updateDataArray=function(){var t=n.riemann(o,r(),s(),this.minX(),this.maxX());this.dataX=t[0],this.dataY=t[1],this.sum=t[2]},h},t.registerElement("riemannsum",t.createRiemannsum),t.createTracecurve=function(t,i,r){var s,o,n,a;if(2!==i.length)throw Error("JSXGraph: Can't create trace curve with given parent'\nPossible parent types: [glider, point]");if(o=t.select(i[0]),n=t.select(i[1]),o.type!==e.OBJECT_TYPE_GLIDER||!l.isPoint(n))throw Error("JSXGraph: Can't create trace curve with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"'."+"\nPossible parent types: [glider, point]");return a=l.copyAttributes(r,t.options,"tracecurve"),a.curvetype="plot",s=t.create("curve",[[0],[0]],a),s.updateDataArray=function(){var t,i,r,s,h,l,c,d,u,p=a.numberpoints,f=o.position,m=o.slideObject,b=m.minX(),g=m.maxX();for(i=(g-b)/p,this.dataX=[],this.dataY=[],m.elementClass!==e.OBJECT_CLASS_CURVE&&p++,t=0;p>t;t++){r=b+t*i,l=m.X(r)/m.Z(r),c=m.Y(r)/m.Z(r),o.setPositionDirectly(e.COORDS_BY_USER,[l,c]),d=!1;for(s in this.board.objects)if(this.board.objects.hasOwnProperty(s)&&(h=this.board.objects[s],h===o&&(d=!0),d&&h.needsRegularUpdate&&(u=h.visProp.trace,h.visProp.trace=!1,h.needsUpdate=!0,h.update(!0),h.visProp.trace=u,h===n)))break;this.dataX[t]=n.X(),this.dataY[t]=n.Y()}o.position=f,d=!1;for(s in this.board.objects)if(this.board.objects.hasOwnProperty(s)&&(h=this.board.objects[s],h===o&&(d=!0),d&&h.needsRegularUpdate&&(u=h.visProp.trace,h.visProp.trace=!1,h.needsUpdate=!0,h.update(!0),h.visProp.trace=u,h===n)))break
+},s},t.registerElement("tracecurve",t.createTracecurve),{Curve:t.Curve,createCurve:t.createCurve,createFunctiongraph:t.createFunctiongraph,createPlot:t.createPlot,createSpline:t.createSpline,createRiemannsum:t.createRiemannsum,createTracecurve:t.createTracecurve}}),define("element/composition",["jxg","math/math","math/geometry","math/numerics","math/statistics","base/coords","utils/type","base/constants","base/point","base/line","base/circle","base/transformation","base/composition","base/curve","base/text"],function(t,e,i,r,s,o,n,a,h,l,c,d,u){return t.createOrthogonalProjection=function(t,e,r){var s,o,h,l;if(n.isPoint(e[0])&&e[1].elementClass===a.OBJECT_CLASS_LINE)o=e[0],s=e[1];else{if(!n.isPoint(e[1])||e[0].elementClass!==a.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create perpendicular point with parent types '"+typeof e[0]+"' and '"+typeof e[1]+"'."+"\nPossible parent types: [point,line]");o=e[1],s=e[0]}return l=n.copyAttributes(r,t.options,"orthogonalprojection"),h=t.create("point",[function(){return i.projectPointToLine(o,s,t)}],l),o.addChild(h),s.addChild(h),h.elType="orthogonalprojection",h.parents=[o.id,h.id],h.update(),h.generatePolynomial=function(){var t=s.point1.symbolic.x,e=s.point1.symbolic.y,i=s.point2.symbolic.x,r=s.point2.symbolic.y,n=o.symbolic.x,a=o.symbolic.y,l=h.symbolic.x,c=h.symbolic.y,d="("+e+")*("+l+")-("+e+")*("+i+")+("+c+")*("+i+")-("+t+")*("+c+")+("+t+")*("+r+")-("+l+")*("+r+")",u="("+a+")*("+e+")-("+a+")*("+r+")-("+c+")*("+e+")+("+c+")*("+r+")+("+n+")*("+t+")-("+n+")*("+i+")-("+l+")*("+t+")+("+l+")*("+i+")";return[d,u]},h},t.createPerpendicular=function(t,e,i){var r,s,o,h;if(e[0]=t.select(e[0]),e[1]=t.select(e[1]),n.isPoint(e[0])&&e[1].elementClass===a.OBJECT_CLASS_LINE)s=e[1],r=e[0];else{if(!n.isPoint(e[1])||e[0].elementClass!==a.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create perpendicular with parent types '"+typeof e[0]+"' and '"+typeof e[1]+"'."+"\nPossible parent types: [line,point]");s=e[0],r=e[1]}return h=n.copyAttributes(i,t.options,"perpendicular"),o=l.createLine(t,[function(){return s.stdform[2]*r.X()-s.stdform[1]*r.Y()},function(){return-s.stdform[2]*r.Z()},function(){return s.stdform[1]*r.Z()}],h),o.elType="perpendicular",o.parents=[s.id,r.id],o},t.createPerpendicularPoint=function(t,e,r){var s,o,h;if(n.isPoint(e[0])&&e[1].elementClass===a.OBJECT_CLASS_LINE)o=e[0],s=e[1];else{if(!n.isPoint(e[1])||e[0].elementClass!==a.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create perpendicular point with parent types '"+typeof e[0]+"' and '"+typeof e[1]+"'."+"\nPossible parent types: [point,line]");o=e[1],s=e[0]}return h=t.create("point",[function(){return i.perpendicular(s,o,t)[0]}],r),o.addChild(h),s.addChild(h),h.elType="perpendicularpoint",h.parents=[o.id,s.id],h.update(),h.generatePolynomial=function(){var t=s.point1.symbolic.x,e=s.point1.symbolic.y,i=s.point2.symbolic.x,r=s.point2.symbolic.y,n=o.symbolic.x,a=o.symbolic.y,l=h.symbolic.x,c=h.symbolic.y,d="("+e+")*("+l+")-("+e+")*("+i+")+("+c+")*("+i+")-("+t+")*("+c+")+("+t+")*("+r+")-("+l+")*("+r+")",u="("+a+")*("+e+")-("+a+")*("+r+")-("+c+")*("+e+")+("+c+")*("+r+")+("+n+")*("+t+")-("+n+")*("+i+")-("+l+")*("+t+")+("+l+")*("+i+")";return[d,u]},h},t.createPerpendicularSegment=function(e,r,s){var o,h,c,d,u;if(r[0]=e.select(r[0]),r[1]=e.select(r[1]),n.isPoint(r[0])&&r[1].elementClass===a.OBJECT_CLASS_LINE)h=r[1],o=r[0];else{if(!n.isPoint(r[1])||r[0].elementClass!==a.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create perpendicular with parent types '"+typeof r[0]+"' and '"+typeof r[1]+"'."+"\nPossible parent types: [line,point]");h=r[0],o=r[1]}return u=n.copyAttributes(s,e.options,"perpendicularsegment","point"),d=t.createPerpendicularPoint(e,[h,o],u),d.dump=!1,n.exists(s.layer)||(s.layer=e.options.layer.line),u=n.copyAttributes(s,e.options,"perpendicularsegment"),c=l.createLine(e,[function(){return i.perpendicular(h,o,e)[1]?[d,o]:[o,d]}],u),c.point=d,c.elType="perpendicularsegment",c.parents=[o.id,h.id],c.subs={point:d},c},t.createMidpoint=function(t,i,r){var s,o,h;if(2===i.length&&n.isPoint(i[0])&&n.isPoint(i[1]))s=i[0],o=i[1];else{if(1!==i.length||i[0].elementClass!==a.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create midpoint.\nPossible parent types: [point,point], [line]");s=i[0].point1,o=i[0].point2}return h=t.create("point",[function(){var t=s.coords.usrCoords[1]+o.coords.usrCoords[1];return isNaN(t)||Math.abs(s.coords.usrCoords[0])<e.eps||Math.abs(o.coords.usrCoords[0])<e.eps?0/0:.5*t},function(){var t=s.coords.usrCoords[2]+o.coords.usrCoords[2];return isNaN(t)||Math.abs(s.coords.usrCoords[0])<e.eps||Math.abs(o.coords.usrCoords[0])<e.eps?0/0:.5*t}],r),s.addChild(h),o.addChild(h),h.elType="midpoint",h.parents=[s.id,o.id],h.prepareUpdate().update(),h.generatePolynomial=function(){var t=s.symbolic.x,e=s.symbolic.y,i=o.symbolic.x,r=o.symbolic.y,n=h.symbolic.x,a=h.symbolic.y,l="("+e+")*("+n+")-("+e+")*("+i+")+("+a+")*("+i+")-("+t+")*("+a+")+("+t+")*("+r+")-("+n+")*("+r+")",c="("+t+")^2 - 2*("+t+")*("+n+")+("+e+")^2-2*("+e+")*("+a+")-("+i+")^2+2*("+i+")*("+n+")-("+r+")^2+2*("+r+")*("+a+")";return[l,c]},h},t.createParallelPoint=function(t,e,i){var r,s,o,n;if(3===e.length&&e[0].elementClass===a.OBJECT_CLASS_POINT&&e[1].elementClass===a.OBJECT_CLASS_POINT&&e[2].elementClass===a.OBJECT_CLASS_POINT)r=e[0],s=e[1],o=e[2];else if(e[0].elementClass===a.OBJECT_CLASS_POINT&&e[1].elementClass===a.OBJECT_CLASS_LINE)o=e[0],r=e[1].point1,s=e[1].point2;else{if(e[1].elementClass!==a.OBJECT_CLASS_POINT||e[0].elementClass!==a.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create parallel point with parent types '"+typeof e[0]+"', '"+typeof e[1]+"' and '"+typeof e[2]+"'."+"\nPossible parent types: [line,point], [point,point,point]");o=e[1],r=e[0].point1,s=e[0].point2}return n=t.create("point",[function(){return o.coords.usrCoords[1]+s.coords.usrCoords[1]-r.coords.usrCoords[1]},function(){return o.coords.usrCoords[2]+s.coords.usrCoords[2]-r.coords.usrCoords[2]}],i),r.addChild(n),s.addChild(n),o.addChild(n),n.elType="parallelpoint",n.parents=[r.id,s.id,o.id],n.prepareUpdate().update(),n.generatePolynomial=function(){var t=r.symbolic.x,e=r.symbolic.y,i=s.symbolic.x,a=s.symbolic.y,h=o.symbolic.x,l=o.symbolic.y,c=n.symbolic.x,d=n.symbolic.y,u="("+a+")*("+c+")-("+a+")*("+h+")-("+e+")*("+c+")+("+e+")*("+h+")-("+d+")*("+i+")+("+d+")*("+t+")+("+l+")*("+i+")-("+l+")*("+t+")",p="("+d+")*("+t+")-("+d+")*("+h+")-("+a+")*("+t+")+("+a+")*("+h+")-("+c+")*("+e+")+("+c+")*("+l+")+("+i+")*("+e+")-("+i+")*("+l+")";return[u,p]},n},t.createParallel=function(t,i,r){var s,o,h,l,c;return s=null,3===i.length?(s=i[2],l=function(){return e.crossProduct(i[0].coords.usrCoords,i[1].coords.usrCoords)}):i[0].elementClass===a.OBJECT_CLASS_POINT?(s=i[0],l=function(){return i[1].stdform}):i[1].elementClass===a.OBJECT_CLASS_POINT&&(s=i[1],l=function(){return i[0].stdform}),n.exists(r.layer)||(r.layer=t.options.layer.line),c=n.copyAttributes(r,t.options,"parallel","point"),o=t.create("point",[function(){return e.crossProduct([1,0,0],l())}],c),o.isDraggable=!0,c=n.copyAttributes(r,t.options,"parallel"),h=t.create("line",[s,o],c),h.elType="parallel",h.parents=[i[0].id,i[1].id],3===i.length&&h.parents.push(i[2].id),h.point=o,h},t.createArrowParallel=function(e,i,r){var s;try{return r.firstArrow=!1,r.lastArrow=!0,s=t.createParallel(e,i,r).setAttribute({straightFirst:!1,straightLast:!1}),s.elType="arrowparallel",s}catch(o){throw Error("JSXGraph: Can't create arrowparallel with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"'."+"\nPossible parent types: [line,point], [point,point,point]")}},t.createNormal=function(t,i,s){var o,h,l,c,d,u,p,f,m;if(1===i.length)o=i[0],h=o.slideObject;else{if(2!==i.length)throw Error("JSXGraph: Can't create normal with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"'."+"\nPossible parent types: [point,line], [point,circle], [glider]");if(n.isPoint(i[0]))o=i[0],h=i[1];else{if(!n.isPoint(i[1]))throw Error("JSXGraph: Can't create normal with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"'."+"\nPossible parent types: [point,line], [point,circle], [glider]");h=i[0],o=i[1]}}if(p=n.copyAttributes(s,t.options,"normal"),h.elementClass===a.OBJECT_CLASS_LINE)m=n.copyAttributes(s,t.options,"normal","point"),f=t.create("point",[function(){var t=e.crossProduct([1,0,0],h.stdform);return[t[0],-t[2],t[1]]}],m),f.isDraggable=!0,l=t.create("line",[o,f],p),l.point=f;else if(h.elementClass===a.OBJECT_CLASS_CIRCLE)l=t.create("line",[h.midpoint,o],p);else if(h.elementClass===a.OBJECT_CLASS_CURVE)"plot"!==h.visProp.curvetype?(d=h.X,u=h.Y,l=t.create("line",[function(){return-o.X()*r.D(d)(o.position)-o.Y()*r.D(u)(o.position)},function(){return r.D(d)(o.position)},function(){return r.D(u)(o.position)}],p)):l=t.create("line",[function(){var t=Math.floor(o.position),e=o.position-t;return t===h.numberPoints-1&&(t-=1,e=1),0>t?1:(h.Y(t)+e*(h.Y(t+1)-h.Y(t)))*(h.Y(t)-h.Y(t+1))-(h.X(t)+e*(h.X(t+1)-h.X(t)))*(h.X(t+1)-h.X(t))},function(){var t=Math.floor(o.position);return t===h.numberPoints-1&&(t-=1),0>t?0:h.X(t+1)-h.X(t)},function(){var t=Math.floor(o.position);return t===h.numberPoints-1&&(t-=1),0>t?0:h.Y(t+1)-h.Y(t)}],p);else{if(h.type!==a.OBJECT_TYPE_TURTLE)throw Error("JSXGraph: Can't create normal with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"'."+"\nPossible parent types: [point,line], [point,circle], [glider]");l=t.create("line",[function(){var t,e,i=Math.floor(o.position),r=o.position-i;for(e=0;h.objects.length>e;e++)if(t=h.objects[e],t.type===a.OBJECT_TYPE_CURVE){if(t.numberPoints>i)break;i-=t.numberPoints}return i===t.numberPoints-1&&(i-=1,r=1),0>i?1:(t.Y(i)+r*(t.Y(i+1)-t.Y(i)))*(t.Y(i)-t.Y(i+1))-(t.X(i)+r*(t.X(i+1)-t.X(i)))*(t.X(i+1)-t.X(i))},function(){var t,e,i=Math.floor(o.position);for(e=0;h.objects.length>e;e++)if(t=h.objects[e],t.type===a.OBJECT_TYPE_CURVE){if(t.numberPoints>i)break;i-=t.numberPoints}return i===t.numberPoints-1&&(i-=1),0>i?0:t.X(i+1)-t.X(i)},function(){var t,e,i=Math.floor(o.position);for(e=0;h.objects.length>e;e++)if(t=h.objects[e],t.type===a.OBJECT_TYPE_CURVE){if(t.numberPoints>i)break;i-=t.numberPoints}return i===t.numberPoints-1&&(i-=1),0>i?0:t.Y(i+1)-t.Y(i)}],p)}for(l.parents=[],c=0;i.length>c;c++)l.parents.push(i[c].id);return l.elType="normal",l},t.createBisector=function(t,e,r){var s,o,h,c;if(e[0].elementClass===a.OBJECT_CLASS_POINT&&e[1].elementClass===a.OBJECT_CLASS_POINT&&e[2].elementClass===a.OBJECT_CLASS_POINT){for(c=n.copyAttributes(r,t.options,"bisector","point"),s=t.create("point",[function(){return i.angleBisector(e[0],e[1],e[2],t)}],c),s.dump=!1,h=0;3>h;h++)e[h].addChild(s);return n.exists(r.layer)||(r.layer=t.options.layer.line),c=n.copyAttributes(r,t.options,"bisector"),o=l.createLine(t,[e[1],s],c),o.point=s,o.elType="bisector",o.parents=[e[0].id,e[1].id,e[2].id],o.subs={point:s},o}throw Error("JSXGraph: Can't create angle bisector with parent types '"+typeof e[0]+"' and '"+typeof e[1]+"'."+"\nPossible parent types: [point,point,point]")},t.createAngularBisectorsOfTwoLines=function(t,e,i){var r,s,o,h,l=t.select(e[0]),c=t.select(e[1]);if(l.elementClass!==a.OBJECT_CLASS_LINE||c.elementClass!==a.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create angle bisectors of two lines with parent types '"+typeof e[0]+"' and '"+typeof e[1]+"'."+"\nPossible parent types: [line,line]");return n.exists(i.layer)||(i.layer=t.options.layer.line),o=n.copyAttributes(i,t.options,"bisectorlines","line1"),r=t.create("line",[function(){var t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]),e=Math.sqrt(c.stdform[1]*c.stdform[1]+c.stdform[2]*c.stdform[2]);return l.stdform[0]/t-c.stdform[0]/e},function(){var t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]),e=Math.sqrt(c.stdform[1]*c.stdform[1]+c.stdform[2]*c.stdform[2]);return l.stdform[1]/t-c.stdform[1]/e},function(){var t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]),e=Math.sqrt(c.stdform[1]*c.stdform[1]+c.stdform[2]*c.stdform[2]);return l.stdform[2]/t-c.stdform[2]/e}],o),n.exists(i.layer)||(i.layer=t.options.layer.line),o=n.copyAttributes(i,t.options,"bisectorlines","line2"),s=t.create("line",[function(){var t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]),e=Math.sqrt(c.stdform[1]*c.stdform[1]+c.stdform[2]*c.stdform[2]);return l.stdform[0]/t+c.stdform[0]/e},function(){var t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]),e=Math.sqrt(c.stdform[1]*c.stdform[1]+c.stdform[2]*c.stdform[2]);return l.stdform[1]/t+c.stdform[1]/e},function(){var t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]),e=Math.sqrt(c.stdform[1]*c.stdform[1]+c.stdform[2]*c.stdform[2]);return l.stdform[2]/t+c.stdform[2]/e}],o),h=new u({line1:r,line2:s}),r.dump=!1,s.dump=!1,h.elType="bisectorlines",h.parents=[l.id,c.id],h.subs={line1:r,line2:s},h},t.createCircumcenter=function(t,e,r){var s,o,n,l,c;if(e[0].elementClass===a.OBJECT_CLASS_POINT&&e[1].elementClass===a.OBJECT_CLASS_POINT&&e[2].elementClass===a.OBJECT_CLASS_POINT){for(n=e[0],l=e[1],c=e[2],s=h.createPoint(t,[function(){return i.circumcenterMidpoint(n,l,c,t)}],r),o=0;3>o;o++)e[o].addChild(s);return s.elType="circumcenter",s.parents=[n.id,l.id,c.id],s.generatePolynomial=function(){var t=n.symbolic.x,e=n.symbolic.y,i=l.symbolic.x,r=l.symbolic.y,o=c.symbolic.x,a=c.symbolic.y,h=s.symbolic.x,d=s.symbolic.y,u=["((",h,")-(",t,"))^2+((",d,")-(",e,"))^2-((",h,")-(",i,"))^2-((",d,")-(",r,"))^2"].join(""),p=["((",h,")-(",t,"))^2+((",d,")-(",e,"))^2-((",h,")-(",o,"))^2-((",d,")-(",a,"))^2"].join("");return[u,p]},s}throw Error("JSXGraph: Can't create circumcircle midpoint with parent types '"+typeof e[0]+"', '"+typeof e[1]+"' and '"+typeof e[2]+"'."+"\nPossible parent types: [point,point,point]")},t.createIncenter=function(t,e,i){var r,s,h,l;if(!(e.length>=3&&n.isPoint(e[0])&&n.isPoint(e[1])&&n.isPoint(e[2])))throw Error("JSXGraph: Can't create incenter with parent types '"+typeof e[0]+"', '"+typeof e[1]+"' and '"+typeof e[2]+"'."+"\nPossible parent types: [point,point,point]");return s=e[0],h=e[1],l=e[2],r=t.create("point",[function(){var e,i,r;return e=Math.sqrt((h.X()-l.X())*(h.X()-l.X())+(h.Y()-l.Y())*(h.Y()-l.Y())),i=Math.sqrt((s.X()-l.X())*(s.X()-l.X())+(s.Y()-l.Y())*(s.Y()-l.Y())),r=Math.sqrt((h.X()-s.X())*(h.X()-s.X())+(h.Y()-s.Y())*(h.Y()-s.Y())),new o(a.COORDS_BY_USER,[(e*s.X()+i*h.X()+r*l.X())/(e+i+r),(e*s.Y()+i*h.Y()+r*l.Y())/(e+i+r)],t)}],i),r.elType="incenter",r.parents=[e[0].id,e[1].id,e[2].id],r},t.createCircumcircle=function(e,i,r){var s,o,a;try{a=n.copyAttributes(r,e.options,"circumcircle","center"),s=t.createCircumcenter(e,i,a),s.dump=!1,n.exists(r.layer)||(r.layer=e.options.layer.circle),a=n.copyAttributes(r,e.options,"circumcircle"),o=c.createCircle(e,[s,i[0]],a),o.elType="circumcircle",o.parents=[i[0].id,i[1].id,i[2].id],o.subs={center:s}}catch(h){throw Error("JSXGraph: Can't create circumcircle with parent types '"+typeof i[0]+"', '"+typeof i[1]+"' and '"+typeof i[2]+"'."+"\nPossible parent types: [point,point,point]")}return o},t.createIncircle=function(e,i,r){var s,o,a;try{a=n.copyAttributes(r,e.options,"incircle","center"),s=t.createIncenter(e,i,a),s.dump=!1,n.exists(r.layer)||(r.layer=e.options.layer.circle),a=n.copyAttributes(r,e.options,"incircle"),o=c.createCircle(e,[s,function(){var t=Math.sqrt((i[1].X()-i[2].X())*(i[1].X()-i[2].X())+(i[1].Y()-i[2].Y())*(i[1].Y()-i[2].Y())),e=Math.sqrt((i[0].X()-i[2].X())*(i[0].X()-i[2].X())+(i[0].Y()-i[2].Y())*(i[0].Y()-i[2].Y())),r=Math.sqrt((i[1].X()-i[0].X())*(i[1].X()-i[0].X())+(i[1].Y()-i[0].Y())*(i[1].Y()-i[0].Y())),s=(t+e+r)/2;return Math.sqrt((s-t)*(s-e)*(s-r)/s)}],a),o.elType="incircle",o.parents=[i[0].id,i[1].id,i[2].id],o.center=s,o.subs={center:s}}catch(h){throw Error("JSXGraph: Can't create circumcircle with parent types '"+typeof i[0]+"', '"+typeof i[1]+"' and '"+typeof i[2]+"'."+"\nPossible parent types: [point,point,point]")}return o},t.createReflection=function(t,e,i){var r,s,o,n;if(e[0].elementClass===a.OBJECT_CLASS_POINT&&e[1].elementClass===a.OBJECT_CLASS_LINE)s=e[0],r=e[1];else{if(e[1].elementClass!==a.OBJECT_CLASS_POINT||e[0].elementClass!==a.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create reflection point with parent types '"+typeof e[0]+"' and '"+typeof e[1]+"'."+"\nPossible parent types: [line,point]");s=e[1],r=e[0]}return n=d.createTransform(t,[r],{type:"reflect"}),o=h.createPoint(t,[s,n],i),s.addChild(o),r.addChild(o),o.elType="reflection",o.parents=[e[0].id,e[1].id],o.prepareUpdate().update(),o.generatePolynomial=function(){var t=r.point1.symbolic.x,e=r.point1.symbolic.y,i=r.point2.symbolic.x,n=r.point2.symbolic.y,a=s.symbolic.x,h=s.symbolic.y,l=o.symbolic.x,c=o.symbolic.y,d=["((",c,")-(",h,"))*((",e,")-(",n,"))+((",t,")-(",i,"))*((",l,")-(",a,"))"].join(""),u=["((",l,")-(",t,"))^2+((",c,")-(",e,"))^2-((",a,")-(",t,"))^2-((",h,")-(",e,"))^2"].join("");return[d,u]},o},t.createMirrorPoint=function(t,e,r){var s,o;if(!n.isPoint(e[0])||!n.isPoint(e[1]))throw Error("JSXGraph: Can't create mirror point with parent types '"+typeof e[0]+"' and '"+typeof e[1]+"'."+"\nPossible parent types: [point,point]");for(s=h.createPoint(t,[function(){return i.rotation(e[0],e[1],Math.PI,t)}],r),o=0;2>o;o++)e[o].addChild(s);return s.elType="mirrorpoint",s.parents=[e[0].id,e[1].id],s.prepareUpdate().update(),s},t.createIntegral=function(e,i,s){var h,l,c,d,u,p,f,m,b,g,v,C,y,P,_=null;if(n.isArray(i[0])&&i[1].elementClass===a.OBJECT_CLASS_CURVE)h=i[0],l=i[1];else{if(!n.isArray(i[1])||i[0].elementClass!==a.OBJECT_CLASS_CURVE)throw Error("JSXGraph: Can't create integral with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"'."+"\nPossible parent types: [[number|function,number|function],curve]");h=i[1],l=i[0]}return c=n.copyAttributes(s,e.options,"integral"),c.withLabel=!1,P=e.create("curve",[[0],[0]],c),d=h[0],u=h[1],n.isFunction(d)?(p=d,f=function(){return l.Y(p())},d=p()):(p=d,f=l.Y(d)),n.isFunction(d)?(m=u,b=function(){return l.Y(m())},u=m()):(m=u,b=l.Y(u)),c=n.copyAttributes(s,e.options,"integral","curveLeft"),g=e.create("glider",[p,f,l],c),n.isFunction(p)&&g.hideElement(),c=n.copyAttributes(s,e.options,"integral","baseLeft"),v=e.create("point",[function(){return"y"===P.visProp.axis?0:g.X()},function(){return"y"===P.visProp.axis?g.Y():0}],c),c=n.copyAttributes(s,e.options,"integral","curveRight"),C=e.create("glider",[m,b,l],c),n.isFunction(m)&&C.hideElement(),c=n.copyAttributes(s,e.options,"integral","baseRight"),y=e.create("point",[function(){return"y"===P.visProp.axis?0:C.X()},function(){return"y"===P.visProp.axis?C.Y():0}],c),c=n.copyAttributes(s,e.options,"integral"),c.withlabel!==!1&&"y"!==c.axis&&(c=n.copyAttributes(s,e.options,"integral","label"),c=n.copyAttributes(c,e.options,"label"),_=e.create("text",[function(){var t=new o(a.COORDS_BY_SCREEN,[this.visProp.offset[0]+this.board.origin.scrCoords[1],0],this.board,!1);return C.X()+t.usrCoords[1]},function(){var t=new o(a.COORDS_BY_SCREEN,[0,this.visProp.offset[1]+this.board.origin.scrCoords[2]],this.board,!1);return C.Y()+t.usrCoords[2]},function(){var t=r.I([v.X(),y.X()],l.Y);return"&int; = "+t.toFixed(4)}],c),_.dump=!1,g.addChild(_),C.addChild(_)),g.dump=!1,v.dump=!1,C.dump=!1,y.dump=!1,P.elType="integral",P.parents=[l.id,h],P.subs={curveLeft:g,baseLeft:v,curveRight:C,baseRight:y},c.withLabel&&(P.subs.label=_),P.Value=function(){return r.I([v.X(),y.X()],l.Y)},P.updateDataArray=function(){var t,e,i,r,s,o,n,a,h;if("y"===this.visProp.axis){for(g.Y()<C.Y()?(o=g.X(),a=g.Y(),n=C.X(),h=C.Y()):(o=C.X(),a=C.Y(),n=g.X(),h=g.Y()),r=Math.min(o,n),s=Math.max(o,n),t=[0,o],e=[a,a],i=0;l.numberPoints>i;i++)l.points[i].usrCoords[2]>=a&&l.points[i].usrCoords[1]>=r&&h>=l.points[i].usrCoords[2]&&s>=l.points[i].usrCoords[1]&&(t.push(l.points[i].usrCoords[1]),e.push(l.points[i].usrCoords[2]));t.push(n),e.push(h),t.push(0),e.push(h),t.push(0),e.push(a)}else{for(v.X()<y.X()?(r=v.X(),s=y.X()):(r=y.X(),s=v.X()),t=[r,r],e=[0,l.Y(r)],i=0;l.numberPoints>i;i++)l.points[i].usrCoords[1]>=r&&s>=l.points[i].usrCoords[1]&&(t.push(l.points[i].usrCoords[1]),e.push(l.points[i].usrCoords[2]));t.push(s),e.push(l.Y(s)),t.push(s),e.push(0),t.push(r),e.push(0)}this.dataX=t,this.dataY=e},g.addChild(P),C.addChild(P),P.baseLeft=v,P.baseRight=y,P.curveLeft=g,P.curveRight=C,P.methodMap=t.deepCopy(P.methodMap,{curveLeft:"curveLeft",baseLeft:"baseLeft",curveRight:"curveRight",baseRight:"baseRight",Value:"Value"}),P.label=_,P},t.createGrid=function(t,e,i){var r,s;return s=n.copyAttributes(i,t.options,"grid"),r=t.create("curve",[[null],[null]],s),r.elType="grid",r.parents=[],r.type=a.OBJECT_TYPE_GRID,r.updateDataArray=function(){var e,i,s,h,l,c=this.visProp.gridx,d=this.visProp.gridy;for(h=n.isArray(this.visProp.topleft)?new o(this.visProp.tltype||a.COORDS_BY_USER,this.visProp.topleft,t):new o(a.COORDS_BY_SCREEN,[0,0],t),l=n.isArray(this.visProp.bottomright)?new o(this.visProp.brtype||a.COORDS_BY_USER,this.visProp.bottomright,t):new o(a.COORDS_BY_SCREEN,[t.canvasWidth,t.canvasHeight],t),t.options.grid.hasGrid=!0,h.setCoordinates(a.COORDS_BY_USER,[Math.floor(h.usrCoords[1]/c)*c,Math.ceil(h.usrCoords[2]/d)*d]),l.setCoordinates(a.COORDS_BY_USER,[Math.ceil(l.usrCoords[1]/c)*c,Math.floor(l.usrCoords[2]/d)*d]),r.dataX=[],r.dataY=[],e=h.usrCoords[2],i=l.usrCoords[2],h.usrCoords[2]<l.usrCoords[2]&&(e=l.usrCoords[2],i=h.usrCoords[2]),s=e;s>i-d;s-=d)r.dataX.push(h.usrCoords[1],l.usrCoords[1],0/0),r.dataY.push(s,s,0/0);for(e=h.usrCoords[1],i=l.usrCoords[1],h.usrCoords[1]>l.usrCoords[1]&&(e=l.usrCoords[1],i=h.usrCoords[1]),s=e;i+c>s;s+=c)r.dataX.push(s,s,0/0),r.dataY.push(h.usrCoords[2],l.usrCoords[2],0/0)},r.hasPoint=function(){return!1},t.grids.push(r),r},t.createInequality=function(t,e,r){var o,h,l;if(l=n.copyAttributes(r,t.options,"inequality"),e[0].elementClass===a.OBJECT_CLASS_LINE)h=t.create("curve",[[],[]],l),h.hasPoint=function(){return!1},h.updateDataArray=function(){var r,o,n,h=t.getBoundingBox(),c=l.inverse?-1:1,d=1.5,u=d*Math.max(h[2]-h[0],h[1]-h[3]),p={coords:{usrCoords:[1,(h[0]+h[2])/2,l.inverse?h[1]:h[3]]}},f=e[0].stdform.slice(1),m=f;f[1]>0&&(f=s.multiply(f,-1),m=f),n=d*Math.max(i.perpendicular(e[0],p,t)[0].distance(a.COORDS_BY_USER,p.coords),u),n*=c,p={coords:{usrCoords:[1,(h[0]+h[2])/2,(h[1]+h[3])/2]}},p=i.perpendicular(e[0],p,t)[0].usrCoords,r=[1,p[1]+f[1]*u,p[2]-f[0]*u],o=[1,p[1]-m[1]*u,p[2]+m[0]*u],this.dataX=[r[1],r[1]+f[0]*n,o[1]+m[0]*n,o[1],r[1]],this.dataY=[r[2],r[2]+f[1]*n,o[2]+m[1]*n,o[2],r[2]]};else if(o=n.createFunction(e[0]),!n.exists(o))throw Error("JSXGraph: Can't create area with the given parents.\nPossible parent types: [line], [function]");return h},t.registerElement("arrowparallel",t.createArrowParallel),t.registerElement("bisector",t.createBisector),t.registerElement("bisectorlines",t.createAngularBisectorsOfTwoLines),t.registerElement("circumcircle",t.createCircumcircle),t.registerElement("circumcirclemidpoint",t.createCircumcenter),t.registerElement("circumcenter",t.createCircumcenter),t.registerElement("incenter",t.createIncenter),t.registerElement("incircle",t.createIncircle),t.registerElement("integral",t.createIntegral),t.registerElement("midpoint",t.createMidpoint),t.registerElement("mirrorpoint",t.createMirrorPoint),t.registerElement("normal",t.createNormal),t.registerElement("orthogonalprojection",t.createOrthogonalProjection),t.registerElement("parallel",t.createParallel),t.registerElement("parallelpoint",t.createParallelPoint),t.registerElement("perpendicular",t.createPerpendicular),t.registerElement("perpendicularpoint",t.createPerpendicularPoint),t.registerElement("perpendicularsegment",t.createPerpendicularSegment),t.registerElement("reflection",t.createReflection),t.registerElement("grid",t.createGrid),t.registerElement("inequality",t.createInequality),{createArrowParallel:t.createArrowParallel,createBisector:t.createBisector,createAngularBisectorOfTwoLines:t.createAngularBisectorsOfTwoLines,createCircumcircle:t.createCircumcircle,createCircumcenter:t.createCircumcenter,createIncenter:t.createIncenter,createIncircle:t.createIncircle,createIntegral:t.createIntegral,createMidpoint:t.createMidpoint,createMirrorPoint:t.createMirrorPoint,createNormal:t.createNormal,createOrthogonalProjection:t.createOrthogonalProjection,createParallel:t.createParallel,createParallelPoint:t.createParallelPoint,createPerpendicular:t.createPerpendicular,createPerpendicularPoint:t.createPerpendicularPoint,createPerpendicularSegmen:t.createPerpendicularSegment,createReflection:t.createReflection,createGrid:t.createGrid,createInequality:t.createInequality}}),define("base/board",["jxg","base/constants","base/coords","options","math/numerics","math/math","math/geometry","math/complex","parser/jessiecode","parser/geonext","utils/color","utils/type","utils/event","utils/env","base/transformation","base/point","base/line","base/text","element/composition","base/composition"],function(t,e,i,r,s,o,n,a,h,l,c,d,u,p,f,m,b,g,v,C){return t.Board=function(t,i,s,o,n,a,l,c,f,m,b){if(this.BOARD_MODE_NONE=0,this.BOARD_MODE_DRAG=1,this.BOARD_MODE_MOVE_ORIGIN=2,this.BOARD_QUALITY_LOW=1,this.BOARD_QUALITY_HIGH=2,this.BOARD_MODE_ZOOM=17,this.container=t,this.containerObj=p.isBrowser?document.getElementById(this.container):null,p.isBrowser&&null===this.containerObj)throw Error("\nJSXGraph: HTML container element '"+t+"' not found.");this.renderer=i,this.grids=[],this.options=d.deepCopy(r),this.attr=b,this.dimension=2,this.jc=new h,this.jc.use(this),this.origin={},this.origin.usrCoords=[1,0,0],this.origin.scrCoords=[1,o[0],o[1]],this.zoomX=n,this.zoomY=a,this.unitX=l*this.zoomX,this.unitY=c*this.zoomY,this.canvasWidth=f,this.canvasHeight=m,this.id=d.exists(s)&&""!==s&&p.isBrowser&&!d.exists(document.getElementById(s))?s:this.generateId(),u.eventify(this),this.hooks=[],this.dependentBoards=[],this.inUpdate=!1,this.objects={},this.objectsList=[],this.groups={},this.animationObjects={},this.highlightedObjects={},this.numObjects=0,this.elementsByName={},this.mode=this.BOARD_MODE_NONE,this.updateQuality=this.BOARD_QUALITY_HIGH,this.isSuspendedRedraw=!1,this.calculateSnapSizes(),this.drag_dx=0,this.drag_dy=0,this.mouse={},this.touches=[],this.xmlString="",this.cPos=[],this.touchMoveLast=0,this.downObjects=[],this.attr.showcopyright&&this.renderer.displayCopyright(e.licenseText,parseInt(this.options.text.fontSize,10)),this.needsFullUpdate=!1,this.reducedUpdate=!1,this.currentCBDef="none",this.geonextCompatibilityMode=!1,this.options.text.useASCIIMathML&&translateASCIIMath?init():this.options.text.useASCIIMathML=!1,this.hasMouseHandlers=!1,this.hasTouchHandlers=!1,this.hasPointerHandlers=!1,this.hasMouseUp=!1,this.hasTouchEnd=!1,this.hasPointerUp=!1,this.attr.registerevents&&this.addEventHandlers(),this.methodMap={update:"update",fullUpdate:"fullUpdate",on:"on",off:"off",trigger:"trigger",setView:"setBoundingBox",setBoundingBox:"setBoundingBox",migratePoint:"migratePoint",colorblind:"emulateColorblindness",suspendUpdate:"suspendUpdate",unsuspendUpdate:"unsuspendUpdate",clearTraces:"clearTraces",left:"clickLeftArrow",right:"clickRightArrow",up:"clickUpArrow",down:"clickDownArrow",zoomIn:"zoomIn",zoomOut:"zoomOut",zoom100:"zoom100",zoomElements:"zoomElements"}},t.extend(t.Board.prototype,{generateName:function(t){var i,r,s=2,o="",n="",a=[],h="";if(t.type===e.OBJECT_TYPE_TICKS)return"";for(i=t.elementClass===e.OBJECT_CLASS_POINT?["","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]:t.type===e.OBJECT_TYPE_ANGLE?["","&alpha;","&beta;","&gamma;","&delta;","&epsilon;","&zeta;","&eta;","&theta;","&iota;","&kappa;","&lambda;","&mu;","&nu;","&xi;","&omicron;","&pi;","&rho;","&sigma;","&tau;","&upsilon;","&phi;","&chi;","&psi;","&omega;"]:["","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],t.elementClass!==e.OBJECT_CLASS_POINT&&t.elementClass!==e.OBJECT_CLASS_LINE&&t.type!==e.OBJECT_TYPE_ANGLE&&(o=t.type===e.OBJECT_TYPE_POLYGON?"P_{":t.elementClass===e.OBJECT_CLASS_CIRCLE?"k_{":t.type===e.OBJECT_TYPE_TEXT?"t_{":"s_{",n="}"),r=0;s>r;r++)a[r]=0;for(;a[s-1]<i.length;){for(a[0]=1;a[0]<i.length;a[0]++){for(h=o,r=s;r>0;r--)h+=i[a[r-1]];if(!d.exists(this.elementsByName[h+n]))return h+n}for(a[0]=i.length,r=1;s>r;r++)a[r-1]===i.length&&(a[r-1]=1,a[r]+=1)}return""},generateId:function(){for(var e=1;d.exists(t.boards["jxgBoard"+e]);)e=Math.round(65535*Math.random());return"jxgBoard"+e},setId:function(t,e){var i=this.numObjects,r=t.id;return this.numObjects+=1,""!==r&&d.exists(r)||(r=this.id+e+i),t.id=r,this.objects[r]=t,t._pos=this.objectsList.length,this.objectsList[this.objectsList.length]=t,r},finalizeAdding:function(t){t.visProp.visible||this.renderer.hide(t)},finalizeLabel:function(t){!t.hasLabel||t.label.visProp.islabel||t.label.visProp.visible||this.renderer.hide(t.label)},getCoordsTopLeftCorner:function(){var t=this.containerObj,i=p.getOffset(t),r=document.documentElement.ownerDocument,s=function(e){var i=parseInt(p.getStyle(t,e),10);return isNaN(i)?0:i};return this.cPos.length>0&&(this.mode===e.BOARD_MODE_DRAG||this.mode===e.BOARD_MODE_MOVE_ORIGIN)?this.cPos:(!t.currentStyle&&r.defaultView&&(t=document.documentElement,i[0]+=s("margin-left"),i[1]+=s("margin-top"),i[0]+=s("border-left-width"),i[1]+=s("border-top-width"),i[0]+=s("padding-left"),i[1]+=s("padding-top"),t=this.containerObj),document.body&&(t=document.body,i[0]+=s("left"),i[1]+=s("top")),"object"==typeof google&&google.translate&&(i[0]+=10,i[1]+=25),i[0]+=s("border-left-width"),i[1]+=s("border-top-width"),"vml"!==this.renderer.type&&(i[0]+=s("padding-left"),i[1]+=s("padding-top")),this.cPos=i,i)},getMousePosition:function(t,e){var i,r,s=this.getCoordsTopLeftCorner();return i=p.getPosition(t,e),d.exists(this.cssTransMat)||this.updateCSSTransforms(),r=[1,i[0]-s[0],i[1]-s[1]],r=o.matVecMult(this.cssTransMat,r),r[1]/=r[0],r[2]/=r[0],[r[1],r[2]]},initMoveOrigin:function(t,e){this.drag_dx=t-this.origin.scrCoords[1],this.drag_dy=e-this.origin.scrCoords[2],this.mode=this.BOARD_MODE_MOVE_ORIGIN,this.updateQuality=this.BOARD_QUALITY_LOW},initMoveObject:function(t,i,r,s){var o,n,a,h=[],l=this.objectsList.length,c={visProp:{layer:-1e4}};for(n=0;l>n;n++)o=this.objectsList[n],a=o.hasPoint&&o.hasPoint(t,i),o.visProp.visible&&a&&(o.triggerEventHandlers([s+"down","down"],[r]),this.downObjects.push(o)),(!this.geonextCompatibilityMode||o.elementClass!==e.OBJECT_CLASS_POINT&&o.type!==e.OBJECT_TYPE_TEXT)&&this.geonextCompatibilityMode||!o.isDraggable||!o.visProp.visible||o.visProp.fixed||o.visProp.frozen||!a||o.visProp.layer>=c.visProp.layer&&(d.exists(c.label)&&o===c.label||(c=o,h[0]=c));return h.length>0&&(this.mode=this.BOARD_MODE_DRAG),this.attr.takefirst&&(h.length=1),h},moveObject:function(t,r,s,o,a){var h,l=new i(e.COORDS_BY_SCREEN,this.getScrCoordsOfMouse(t,r),this),c=s.obj;c&&(c.type!==e.OBJECT_TYPE_GLIDER?(isNaN(s.targets[0].Xprev+s.targets[0].Yprev)||c.setPositionDirectly(e.COORDS_BY_SCREEN,l.scrCoords.slice(1),[s.targets[0].Xprev,s.targets[0].Yprev]),s.targets[0].Xprev=l.scrCoords[1],s.targets[0].Yprev=l.scrCoords[2],c.prepareUpdate().update(!1).updateRenderer()):c.type===e.OBJECT_TYPE_GLIDER&&(h=c.coords,c.setPositionDirectly(e.COORDS_BY_USER,l.usrCoords.slice(1)),0!==c.group.length?(c.slideObject.elementClass===e.OBJECT_CLASS_CIRCLE?c.coords.setCoordinates(e.COORDS_BY_USER,n.projectPointToCircle(c,c.slideObject,this).usrCoords,!1):c.slideObject.elementClass===e.OBJECT_CLASS_LINE&&c.coords.setCoordinates(e.COORDS_BY_USER,n.projectPointToLine(c,c.slideObject,this).usrCoords,!1),c.group[c.group.length-1].dX=c.coords.scrCoords[1]-h.scrCoords[1],c.group[c.group.length-1].dY=c.coords.scrCoords[2]-h.scrCoords[2],c.group[c.group.length-1].update(this)):c.prepareUpdate().update(!1).updateRenderer()),c.triggerEventHandlers([a+"drag","drag"],[o]),this.updateInfobox(c),this.update(),c.highlight(!0))},twoFingerMove:function(t,r,s,o){var n,a,h;d.exists(s)&&d.exists(s.obj)&&(h=s.obj,n=new i(e.COORDS_BY_SCREEN,this.getScrCoordsOfMouse(t[0],t[1]),this),a=new i(e.COORDS_BY_SCREEN,this.getScrCoordsOfMouse(r[0],r[1]),this),h.elementClass===e.OBJECT_CLASS_LINE||h.type===e.OBJECT_TYPE_POLYGON?this.twoFingerTouchObject(n,a,s,h):h.elementClass===e.OBJECT_CLASS_CIRCLE&&this.twoFingerTouchCircle(n,a,s,h),h.triggerEventHandlers(["touchdrag","drag"],[o]),s.targets[0].Xprev=n.scrCoords[1],s.targets[0].Yprev=n.scrCoords[2],s.targets[1].Xprev=a.scrCoords[1],s.targets[1].Yprev=a.scrCoords[2])
+},twoFingerTouchObject:function(t,r,s,a){var h,l,c,u,p,f,m,b,g,v,C,y,P,_,E,S;if(d.exists(s.targets[0])&&d.exists(s.targets[1])&&!isNaN(s.targets[0].Xprev+s.targets[0].Yprev+s.targets[1].Xprev+s.targets[1].Yprev)){if(h=t.usrCoords,l=r.usrCoords,c=new i(e.COORDS_BY_SCREEN,[s.targets[0].Xprev,s.targets[0].Yprev],this).usrCoords,u=new i(e.COORDS_BY_SCREEN,[s.targets[1].Xprev,s.targets[1].Yprev],this).usrCoords,f=[1,.5*(c[1]+u[1]),.5*(c[2]+u[2])],p=[1,.5*(h[1]+l[1]),.5*(h[2]+l[2])],b=o.crossProduct(c,u),m=o.crossProduct(h,l),v=o.crossProduct(b,m),Math.abs(v[0])<o.eps)return;v[1]/=v[0],v[2]/=v[0],C=n.rad(f.slice(1),v.slice(1),p.slice(1)),y=this.create("transform",[C,v[1],v[2]],{type:"rotate"}),y.update(),f=o.matVecMult(y.matrix,f),f[1]/=f[0],f[2]/=f[0],P=this.create("transform",[p[1]-f[1],p[2]-f[2]],{type:"translate"}),P.update(),y.melt(P),a.visProp.scalable&&(g=n.distance(h,l)/n.distance(c,u),_=this.create("transform",[-p[1],-p[2]],{type:"translate"}),E=this.create("transform",[g,g],{type:"scale"}),S=this.create("transform",[p[1],p[2]],{type:"translate"}),y.melt(_).melt(E).melt(S)),a.elementClass===e.OBJECT_CLASS_LINE?y.applyOnce([a.point1,a.point2]):a.type===e.OBJECT_TYPE_POLYGON&&y.applyOnce(a.vertices.slice(0,-1)),this.update(),a.highlight(!0)}},twoFingerTouchCircle:function(t,r,s,o){var a,h,l,c,u,p,f,m,b,g,v;"pointCircle"!==o.method&&"pointLine"!==o.method&&d.exists(s.targets[0])&&d.exists(s.targets[1])&&!isNaN(s.targets[0].Xprev+s.targets[0].Yprev+s.targets[1].Xprev+s.targets[1].Yprev)&&(a=t.usrCoords,h=r.usrCoords,l=new i(e.COORDS_BY_SCREEN,[s.targets[0].Xprev,s.targets[0].Yprev],this).usrCoords,c=new i(e.COORDS_BY_SCREEN,[s.targets[1].Xprev,s.targets[1].Yprev],this).usrCoords,f=this.create("transform",[a[1]-l[1],a[2]-l[2]],{type:"translate"}),p=n.rad(c.slice(1),a.slice(1),h.slice(1)),m=this.create("transform",[-a[1],-a[2]],{type:"translate"}),b=this.create("transform",[p],{type:"rotate"}),f.melt(m).melt(b),o.visProp.scalable&&(u=n.distance(a,h)/n.distance(l,c),g=this.create("transform",[u,u],{type:"scale"}),f.melt(g)),v=this.create("transform",[a[1],a[2]],{type:"translate"}),f.melt(v),f.applyOnce([o.center]),"twoPoints"===o.method?f.applyOnce([o.point2]):"pointRadius"===o.method&&d.isNumber(o.updateRadius.origin)&&o.setRadius(o.radius*u),this.update(o.center),o.highlight(!0))},highlightElements:function(t,e,i,r){var s,o,n,a={},h=this.objectsList.length;for(s=0;h>s;s++)o=this.objectsList[s],n=o.id,d.exists(o.hasPoint)&&o.visProp.visible&&o.hasPoint(t,e)&&(this.updateInfobox(o),d.exists(this.highlightedObjects[n])||(a[n]=o,o.highlight(),this.triggerEventHandlers(["mousehit","hit"],[i,o,r])),o.mouseover?o.triggerEventHandlers(["mousemove","move"],[i]):(o.triggerEventHandlers(["mouseover","over"],[i]),o.mouseover=!0));for(s=0;h>s;s++)o=this.objectsList[s],n=o.id,o.mouseover&&(a[n]||(o.triggerEventHandlers(["mouseout","out"],[i]),o.mouseover=!1))},saveStartPos:function(i,r){var s,o,n=[];if(i.type===e.OBJECT_TYPE_TICKS)n.push([1,0/0,0/0]);else if(i.elementClass===e.OBJECT_CLASS_LINE)n.push(i.point1.coords.usrCoords),n.push(i.point2.coords.usrCoords);else if(i.elementClass===e.OBJECT_CLASS_CIRCLE)n.push(i.center.coords.usrCoords);else if(i.type===e.OBJECT_TYPE_POLYGON)for(o=i.vertices.length-1,s=0;o>s;s++)n.push(i.vertices[s].coords.usrCoords);else if(i.elementClass===e.OBJECT_CLASS_POINT||i.type===e.OBJECT_TYPE_GLIDER)n.push(i.coords.usrCoords);else try{n.push(i.coords.usrCoords)}catch(a){t.debug("JSXGraph+ saveStartPos: obj.coords.usrCoords not available: "+a)}for(o=n.length,s=0;o>s;s++)r.Zstart.push(n[s][0]),r.Xstart.push(n[s][1]),r.Ystart.push(n[s][2])},mouseOriginMoveStart:function(t){var e,i=this.attr.pan.enabled&&(!this.attr.pan.needshift||t.shiftKey);return i&&(e=this.getMousePosition(t),this.initMoveOrigin(e[0],e[1])),i},mouseOriginMove:function(t){var e,i=this.mode===this.BOARD_MODE_MOVE_ORIGIN;return i&&(e=this.getMousePosition(t),this.moveOrigin(e[0],e[1],!0)),i},touchOriginMoveStart:function(e){var i,r=e[t.touchProperty],s=2===r.length&&80>n.distance([r[0].screenX,r[0].screenY],[r[1].screenX,r[1].screenY]),o=this.attr.pan.enabled&&(!this.attr.pan.needtwofingers||s);return o&&(i=this.getMousePosition(e,0),this.initMoveOrigin(i[0],i[1])),o},touchOriginMove:function(t){var e,i=this.mode===this.BOARD_MODE_MOVE_ORIGIN;return i&&(e=this.getMousePosition(t,0),this.moveOrigin(e[0],e[1],!0)),i},originMoveEnd:function(){this.updateQuality=this.BOARD_QUALITY_HIGH,this.mode=this.BOARD_MODE_NONE},addEventHandlers:function(){p.supportsPointerEvents()?this.addPointerEventHandlers():(this.addMouseEventHandlers(),this.addTouchEventHandlers())},addPointerEventHandlers:function(){!this.hasPointerHandlers&&p.isBrowser&&(p.addEvent(this.containerObj,"MSPointerDown",this.pointerDownListener,this),p.addEvent(this.containerObj,"MSPointerMove",this.pointerMoveListener,this),this.hasPointerHandlers=!0)},addMouseEventHandlers:function(){!this.hasMouseHandlers&&p.isBrowser&&(p.addEvent(this.containerObj,"mousedown",this.mouseDownListener,this),p.addEvent(this.containerObj,"mousemove",this.mouseMoveListener,this),p.addEvent(this.containerObj,"mousewheel",this.mouseWheelListener,this),p.addEvent(this.containerObj,"DOMMouseScroll",this.mouseWheelListener,this),this.hasMouseHandlers=!0,this.containerObj.oncontextmenu=function(t){return d.exists(t)&&t.preventDefault(),!1})},addTouchEventHandlers:function(){!this.hasTouchHandlers&&p.isBrowser&&(p.addEvent(this.containerObj,"touchstart",this.touchStartListener,this),p.addEvent(this.containerObj,"touchmove",this.touchMoveListener,this),p.addEvent(this.containerObj,"gesturestart",this.gestureStartListener,this),p.addEvent(this.containerObj,"gesturechange",this.gestureChangeListener,this),this.hasTouchHandlers=!0)},removePointerEventHandlers:function(){this.hasPointerHandlers&&p.isBrowser&&(p.removeEvent(this.containerObj,"MSPointerDown",this.pointerDownListener,this),p.removeEvent(this.containerObj,"MSPointerMove",this.pointerMoveListener,this),this.hasPointerUp&&p.removeEvent(this.containerObj,"MSPointerUp",this.pointerUpListener,this),this.hasPointerHandlers=!1)},removeMouseEventHandlers:function(){this.hasMouseHandlers&&p.isBrowser&&(p.removeEvent(this.containerObj,"mousedown",this.mouseDownListener,this),p.removeEvent(this.containerObj,"mousemove",this.mouseMoveListener,this),this.hasMouseUp&&(p.removeEvent(document,"mouseup",this.mouseUpListener,this),this.hasMouseUp=!1),p.removeEvent(this.containerObj,"mousewheel",this.mouseWheelListener,this),p.removeEvent(this.containerObj,"DOMMouseScroll",this.mouseWheelListener,this),this.hasMouseHandlers=!1)},removeTouchEventHandlers:function(){this.hasTouchHandlers&&p.isBrowser&&(p.removeEvent(this.containerObj,"touchstart",this.touchStartListener,this),p.removeEvent(this.containerObj,"touchmove",this.touchMoveListener,this),this.hasTouchEnd&&(p.removeEvent(document,"touchend",this.touchEndListener,this),this.hasTouchEnd=!1),p.removeEvent(this.containerObj,"gesturestart",this.gestureStartListener,this),p.removeEvent(this.containerObj,"gesturechange",this.gestureChangeListener,this),this.hasTouchHandlers=!1)},removeEventHandlers:function(){this.removeMouseEventHandlers(),this.removeTouchEventHandlers(),this.removePointerEventHandlers()},clickLeftArrow:function(){return this.moveOrigin(this.origin.scrCoords[1]+.1*this.canvasWidth,this.origin.scrCoords[2]),!1},clickRightArrow:function(){return this.moveOrigin(this.origin.scrCoords[1]-.1*this.canvasWidth,this.origin.scrCoords[2]),!1},clickUpArrow:function(){return this.moveOrigin(this.origin.scrCoords[1],this.origin.scrCoords[2]-.1*this.canvasHeight),!1},clickDownArrow:function(){return this.moveOrigin(this.origin.scrCoords[1],this.origin.scrCoords[2]+.1*this.canvasHeight),!1},gestureChangeListener:function(t){var r,s=this.attr.zoom.factorx,o=this.attr.zoom.factory;return this.attr.zoom.wheel?(t.preventDefault(),this.mode===this.BOARD_MODE_ZOOM&&(r=new i(e.COORDS_BY_SCREEN,this.getMousePosition(t),this),this.attr.zoom.factorx=t.scale/this.prevScale,this.attr.zoom.factory=t.scale/this.prevScale,this.zoomIn(r.usrCoords[1],r.usrCoords[2]),this.prevScale=t.scale,this.attr.zoom.factorx=s,this.attr.zoom.factory=o),!1):!0},gestureStartListener:function(t){return this.attr.zoom.wheel?(t.preventDefault(),this.prevScale=1,this.mode===this.BOARD_MODE_NONE&&(this.mode=this.BOARD_MODE_ZOOM),!1):!0},pointerDownListener:function(e){var i,r,s,o,n,a,h,l,c=this.options.precision.touch;if(this.hasPointerUp||(p.addEvent(document,"MSPointerUp",this.pointerUpListener,this),this.hasPointerUp=!0),this.hasMouseHandlers&&this.removeMouseEventHandlers(),this.hasTouchHandlers&&this.removeTouchEventHandlers(),document.selection&&"function"==typeof document.selection.empty?document.selection.empty():window.getSelection&&window.getSelection().removeAllRanges(),t.isBrowser&&window.navigator.msMaxTouchPoints&&window.navigator.msMaxTouchPoints>1&&(this.options.precision.hasPoint=c),o=this.getMousePosition(e),n=this.initMoveObject(o[0],o[1],e,"mouse"),n.length>0){for(h=n[n.length-1],a=!1,i=0;this.touches.length>i;i++)if(this.touches[i].obj===h){r=i,s=this.touches[i].targets.push({num:e.pointerId,X:o[0],Y:o[1],Xprev:0/0,Yprev:0/0,Xstart:[],Ystart:[],Zstart:[]})-1,a=!0;break}a||(s=0,r=this.touches.push({obj:h,targets:[{num:e.pointerId,X:o[0],Y:o[1],Xprev:0/0,Yprev:0/0,Xstart:[],Ystart:[],Zstart:[]}]})-1),this.dehighlightAll(),h.highlight(!0),this.saveStartPos(h,this.touches[r].targets[s]),e&&e.preventDefault?e.preventDefault():window.event&&(window.event.returnValue=!1)}return this.touches.length>0&&(e.preventDefault(),e.stopPropagation()),this.mode===this.BOARD_MODE_NONE&&this.mouseOriginMoveStart(e)?(this.triggerEventHandlers(["touchstart","down","MSPointerDown"],[e]),!1):(this.options.precision.hasPoint=this.options.precision.mouse,this.triggerEventHandlers(["touchstart","down","MSPointerDown"],[e]),l)},pointerMoveListener:function(e){var i,r,s;if(e[t.touchProperty],this.mode!==this.BOARD_MODE_DRAG&&(this.dehighlightAll(),this.renderer.hide(this.infobox)),this.mode!==this.BOARD_MODE_NONE&&(e.preventDefault(),e.stopPropagation()),t.isBrowser&&window.navigator.msMaxTouchPoints&&window.navigator.msMaxTouchPoints>1&&(this.options.precision.hasPoint=this.options.precision.touch),this.updateQuality=this.BOARD_QUALITY_LOW,!this.mouseOriginMove(e))if(this.mode===this.BOARD_MODE_DRAG){for(i=0;this.touches.length>i;i++)for(r=0;this.touches[i].targets.length>r;r++)if(this.touches[i].targets[r].num===e.pointerId){1===this.touches[i].targets.length?(this.touches[i].targets[r].X=e.pageX,this.touches[i].targets[r].Y=e.pageY,s=this.getMousePosition(e),this.moveObject(s[0],s[1],this.touches[i],e,"touch")):2===this.touches[i].targets.length&&this.touches[i].targets[0].num>-1&&this.touches[i].targets[1].num>-1&&(this.touches[i].targets[r].X=e.pageX,this.touches[i].targets[r].Y=e.pageY,this.twoFingerMove(this.getMousePosition({pageX:this.touches[i].targets[0].X,pageY:this.touches[i].targets[0].Y}),this.getMousePosition({pageX:this.touches[i].targets[1].X,pageY:this.touches[i].targets[1].Y}),this.touches[i],e));break}}else s=this.getMousePosition(e),this.highlightElements(s[0],s[1],e,-1);return this.mode!==this.BOARD_MODE_DRAG&&this.renderer.hide(this.infobox),this.options.precision.hasPoint=this.options.precision.mouse,this.triggerEventHandlers(["touchmove","move","MSPointerMove"],[e,this.mode]),this.mode===this.BOARD_MODE_NONE},pointerUpListener:function(t){var e,i,r;for(this.options.precision.touch,this.triggerEventHandlers(["touchend","up","MSPointerUp"],[t]),this.renderer.hide(this.infobox),e=0;this.touches.length>e;e++)for(i=0;this.touches[e].targets.length>i;i++)if(this.touches[e].targets[i].num===t.pointerId){this.touches[e].targets.splice(i,1),0===this.touches[e].targets.length&&this.touches.splice(e,1);break}for(e=this.downObjects.length-1;e>-1;e--){for(r=!1,i=0;this.touches.length>i;i++)this.touches[i].obj.id===this.downObjects[e].id&&(r=!0);r||(this.downObjects[e].triggerEventHandlers(["touchend","up","MSPointerUp"],[t]),this.downObjects[e].snapToGrid(),this.downObjects.splice(e,1))}return 0===this.touches.length&&(p.removeEvent(document,"MSPointerUp",this.pointerUpListener,this),this.hasPointerUp=!1,this.dehighlightAll(),this.updateQuality=this.BOARD_QUALITY_HIGH,this.originMoveEnd(),this.update()),!0},touchStartListener:function(i,s){var o,n,a,h,l,c,u,f,m,b,g=this.options.precision.touch,v=i[t.touchProperty];for(this.hasTouchEnd||(p.addEvent(document,"touchend",this.touchEndListener,this),this.hasTouchEnd=!0),this.hasMouseHandlers&&this.removeMouseEventHandlers(),document.selection&&"function"==typeof document.selection.empty?document.selection.empty():window.getSelection&&window.getSelection().removeAllRanges(),this.options.precision.hasPoint=this.options.precision.touch,o=0;v.length>o;o++)v[o].jxg_isused=!1;for(o=0;this.touches.length>o;o++)for(h=0;this.touches[o].targets.length>h;h++){this.touches[o].targets[h].num=-1,g=this.options.precision.touch;do{for(l=0;v.length>l;l++)if(g*g>Math.abs(Math.pow(v[l].screenX-this.touches[o].targets[h].X,2)+Math.pow(v[l].screenY-this.touches[o].targets[h].Y,2))){this.touches[o].targets[h].num=l,this.touches[o].targets[h].X=v[l].screenX,this.touches[o].targets[h].Y=v[l].screenY,v[l].jxg_isused=!0;break}g*=2}while(-1===this.touches[o].targets[h].num&&this.options.precision.touchMax>g);-1===this.touches[o].targets[h].num&&(t.debug("i couldn't find a targettouches for target no "+h+" on "+this.touches[o].obj.name+" ("+this.touches[o].obj.id+"). Removed the target."),t.debug("eps = "+g+", touchMax = "+r.precision.touchMax),this.touches[o].targets.splice(o,1))}for(o=0;v.length>o;o++)if(s||!v[o].jxg_isused){if(n=this.getMousePosition(i,o),s?(a=[s],this.mode=this.BOARD_MODE_DRAG):a=this.initMoveObject(n[0],n[1],i,"touch"),0!==a.length)if(u=a[a.length-1],d.isPoint(u)||u.type===e.OBJECT_TYPE_TEXT||u.type===e.OBJECT_TYPE_TICKS)m=[{num:o,X:v[o].screenX,Y:v[o].screenY,Xprev:0/0,Yprev:0/0,Xstart:[],Ystart:[],Zstart:[]}],this.saveStartPos(u,m[0]),this.touches.push({obj:u,targets:m}),u.highlight(!0);else if(u.elementClass===e.OBJECT_CLASS_LINE||u.elementClass===e.OBJECT_CLASS_CIRCLE||u.type===e.OBJECT_TYPE_POLYGON){for(f=!1,h=0;this.touches.length>h;h++)u.id===this.touches[h].obj.id&&(f=!0,1===this.touches[h].targets.length&&(b={num:o,X:v[o].screenX,Y:v[o].screenY,Xprev:0/0,Yprev:0/0,Xstart:[],Ystart:[],Zstart:[]},this.saveStartPos(u,b),this.touches[h].targets.push(b)),v[o].jxg_isused=!0);f||(m=[{num:o,X:v[o].screenX,Y:v[o].screenY,Xprev:0/0,Yprev:0/0,Xstart:[],Ystart:[],Zstart:[]}],this.saveStartPos(u,m[0]),this.touches.push({obj:u,targets:m}),u.highlight(!0))}v[o].jxg_isused=!0}return this.touches.length>0&&(i.preventDefault(),i.stopPropagation()),this.mode===this.BOARD_MODE_NONE&&this.touchOriginMoveStart(i)?(this.triggerEventHandlers(["touchstart","down"],[i]),!1):(p.isWebkitAndroid()&&(c=new Date,this.touchMoveLast=c.getTime()-200),this.options.precision.hasPoint=this.options.precision.mouse,this.triggerEventHandlers(["touchstart","down"],[i]),this.touches.length>0)},touchMoveListener:function(e){var i,r,s,o=e[t.touchProperty];if(this.mode!==this.BOARD_MODE_NONE&&(e.preventDefault(),e.stopPropagation()),p.isWebkitAndroid()){if(s=new Date,s=s.getTime(),80>s-this.touchMoveLast)return this.updateQuality=this.BOARD_QUALITY_HIGH,this.triggerEventHandlers(["touchmove","move"],[e,this.mode]),!1;this.touchMoveLast=s}if(this.mode!==this.BOARD_MODE_DRAG&&this.renderer.hide(this.infobox),this.options.precision.hasPoint=this.options.precision.touch,this.updateQuality=this.BOARD_QUALITY_LOW,!this.touchOriginMove(e)&&this.mode===this.BOARD_MODE_DRAG)for(i=0;this.touches.length>i;i++)1===this.touches[i].targets.length?o[this.touches[i].targets[0].num]&&(this.touches[i].targets[0].X=o[this.touches[i].targets[0].num].screenX,this.touches[i].targets[0].Y=o[this.touches[i].targets[0].num].screenY,r=this.getMousePosition(e,this.touches[i].targets[0].num),this.moveObject(r[0],r[1],this.touches[i],e,"touch")):2===this.touches[i].targets.length&&this.touches[i].targets[0].num>-1&&this.touches[i].targets[1].num>-1&&o[this.touches[i].targets[0].num]&&o[this.touches[i].targets[1].num]&&(this.touches[i].targets[0].X=o[this.touches[i].targets[0].num].screenX,this.touches[i].targets[0].Y=o[this.touches[i].targets[0].num].screenY,this.touches[i].targets[1].X=o[this.touches[i].targets[1].num].screenX,this.touches[i].targets[1].Y=o[this.touches[i].targets[1].num].screenY,this.twoFingerMove(this.getMousePosition(e,this.touches[i].targets[0].num),this.getMousePosition(e,this.touches[i].targets[1].num),this.touches[i],e));return this.mode!==this.BOARD_MODE_DRAG&&this.renderer.hide(this.infobox),this.options.precision.hasPoint=this.options.precision.mouse,this.triggerEventHandlers(["touchmove","move"],[e,this.mode]),this.mode===this.BOARD_MODE_NONE},touchEndListener:function(i){var r,s,o,n,a,h=this.options.precision.touch,l=[],c=i[t.touchProperty];if(this.triggerEventHandlers(["touchend","up"],[i]),this.renderer.hide(this.infobox),c.length>0){for(r=0;this.touches.length>r;r++)l[r]=this.touches[r];for(this.touches.length=0,r=0;c.length>r;r++)c[r].jxg_isused=!1;for(r=0;l.length>r;r++){for(n=!1,a=0,s=0;l[r].targets.length>s;s++)for(l[r].targets[s].found=!1,o=0;c.length>o;o++)if(h*h>Math.abs(Math.pow(c[o].screenX-l[r].targets[s].X,2)+Math.pow(c[o].screenY-l[r].targets[s].Y,2))){l[r].targets[s].found=!0,l[r].targets[s].num=o,l[r].targets[s].X=c[o].screenX,l[r].targets[s].Y=c[o].screenY,a+=1;break}if(d.isPoint(l[r].obj)?n=l[r].targets[0]&&l[r].targets[0].found:l[r].obj.elementClass===e.OBJECT_CLASS_LINE?n=l[r].targets[0]&&l[r].targets[0].found||l[r].targets[1]&&l[r].targets[1].found:l[r].obj.elementClass===e.OBJECT_CLASS_CIRCLE&&(n=1===a||3===a),n)for(this.touches.push({obj:l[r].obj,targets:[]}),s=0;l[r].targets.length>s;s++)l[r].targets[s].found&&this.touches[this.touches.length-1].targets.push({num:l[r].targets[s].num,X:l[r].targets[s].screenX,Y:l[r].targets[s].screenY,Xprev:0/0,Yprev:0/0,Xstart:l[r].targets[s].Xstart,Ystart:l[r].targets[s].Ystart,Zstart:l[r].targets[s].Zstart});else l[r].obj.noHighlight()}}else this.touches.length=0;for(r=this.downObjects.length-1;r>-1;r--){for(n=!1,s=0;this.touches.length>s;s++)this.touches[s].obj.id===this.downObjects[r].id&&(n=!0);n||(this.downObjects[r].type===e.OBJECT_TYPE_GLIDER&&(this.downObjects[r].needsUpdateFromParent=!1),this.downObjects[r].triggerEventHandlers(["touchup","up"],[i]),this.downObjects[r].snapToGrid(),this.downObjects.splice(r,1))}return c&&0!==c.length||(p.removeEvent(document,"touchend",this.touchEndListener,this),this.hasTouchEnd=!1,this.dehighlightAll(),this.updateQuality=this.BOARD_QUALITY_HIGH,this.originMoveEnd(),this.update()),!0},mouseDownListener:function(t,e){var i,r,s;return document.selection&&"function"==typeof document.selection.empty?document.selection.empty():window.getSelection&&window.getSelection().removeAllRanges(),this.hasMouseUp||(p.addEvent(document,"mouseup",this.mouseUpListener,this),this.hasMouseUp=!0),i=this.getMousePosition(t),e?(r=[e],this.mode=this.BOARD_MODE_DRAG):r=this.initMoveObject(i[0],i[1],t,"mouse"),0===r.length?(this.mode=this.BOARD_MODE_NONE,s=!0):(this.mouse={obj:null,targets:[{X:i[0],Y:i[1],Xprev:0/0,Yprev:0/0}]},this.mouse.obj=r[r.length-1],this.dehighlightAll(),this.mouse.obj.highlight(!0),this.mouse.targets[0].Xstart=[],this.mouse.targets[0].Ystart=[],this.mouse.targets[0].Zstart=[],this.saveStartPos(this.mouse.obj,this.mouse.targets[0]),t&&t.preventDefault?t.preventDefault():window.event&&(window.event.returnValue=!1)),this.mode===this.BOARD_MODE_NONE&&(s=this.mouseOriginMoveStart(t)),e||this.triggerEventHandlers(["mousedown","down"],[t]),s},mouseUpListener:function(t){var i;for(this.triggerEventHandlers(["mouseup","up"],[t]),this.updateQuality=this.BOARD_QUALITY_HIGH,this.mouse&&this.mouse.obj&&this.mouse.obj.snapToGrid(this.mouse.targets[0]),this.mode===this.BOARD_MODE_DRAG&&this.mouse.obj.type===e.OBJECT_TYPE_GLIDER&&(this.mouse.obj.needsUpdateFromParent=!1),this.originMoveEnd(),this.dehighlightAll(),this.update(),i=0;this.downObjects.length>i;i++)this.downObjects[i].triggerEventHandlers(["mouseup","up"],[t]);this.downObjects.length=0,this.hasMouseUp&&(p.removeEvent(document,"mouseup",this.mouseUpListener,this),this.hasMouseUp=!1),this.mouse=null},mouseMoveListener:function(t){var e;e=this.getMousePosition(t),this.updateQuality=this.BOARD_QUALITY_LOW,this.mode!==this.BOARD_MODE_DRAG&&(this.dehighlightAll(),this.renderer.hide(this.infobox)),this.mouseOriginMove(t)||(this.mode===this.BOARD_MODE_DRAG?this.moveObject(e[0],e[1],this.mouse,t,"mouse"):this.highlightElements(e[0],e[1],t,-1)),this.updateQuality=this.BOARD_QUALITY_HIGH,this.triggerEventHandlers(["mousemove","move"],[t,this.mode])},mouseWheelListener:function(t){if(!this.attr.zoom.wheel||this.attr.zoom.needshift&&!t.shiftKey)return!0;t=t||window.event;var r=t.detail?-t.detail:t.wheelDelta/40,s=new i(e.COORDS_BY_SCREEN,this.getMousePosition(t),this);return r>0?this.zoomIn(s.usrCoords[1],s.usrCoords[2]):this.zoomOut(s.usrCoords[1],s.usrCoords[2]),t.preventDefault(),!1},updateInfobox:function(t){var i,r,s,o;return t.visProp.showinfobox?(t.elementClass===e.OBJECT_CLASS_POINT&&(s=t.coords.usrCoords[1],o=t.coords.usrCoords[2],this.infobox.setCoords(s+this.infobox.distanceX/this.unitX,o+this.infobox.distanceY/this.unitY),"string"!=typeof t.infoboxText?("auto"===t.visProp.infoboxdigits?(i=d.autoDigits(s),r=d.autoDigits(o)):d.isNumber(t.visProp.infoboxdigits)?(i=s.toFixed(t.visProp.infoboxdigits),r=o.toFixed(t.visProp.infoboxdigits)):(i=s,r=o),this.highlightInfobox(i,r,t)):this.highlightCustomInfobox(t.infoboxText,t),this.renderer.show(this.infobox)),this):this},highlightCustomInfobox:function(t){return this.infobox.setText(t),this},highlightInfobox:function(t,e,i){return this.highlightCustomInfobox("("+t+", "+e+")",i),this},dehighlightAll:function(){var t,e,i=!1;for(t in this.highlightedObjects)this.highlightedObjects.hasOwnProperty(t)&&(e=this.highlightedObjects[t],(this.hasMouseHandlers||this.hasPointerHandlers)&&e.noHighlight(),i=!0);return this.highlightedObjects={},"canvas"===this.renderer.type&&i&&(this.prepareUpdate(),this.renderer.suspendRedraw(this),this.updateRenderer(),this.renderer.unsuspendRedraw()),this},getScrCoordsOfMouse:function(t,e){return[t,e]},getUsrCoordsOfMouse:function(t){var r=this.getCoordsTopLeftCorner(),s=p.getPosition(t),o=s[0]-r[0],n=s[1]-r[1],a=new i(e.COORDS_BY_SCREEN,[o,n],this);return a.usrCoords.slice(1)},getAllUnderMouse:function(t){var e=this.getAllObjectsUnderMouse(t);return e.push(this.getUsrCoordsOfMouse(t)),e},getAllObjectsUnderMouse:function(t){var e,i,r=this.getCoordsTopLeftCorner(),s=p.getPosition(t),o=s[0]-r[0],n=s[1]-r[1],a=[],h=this.objectsList.length;for(e=0;h>e;e++)i=this.objectsList[e],i.visProp.visible&&i.hasPoint&&i.hasPoint(o,n)&&(a[a.length]=i);return a},updateCoords:function(){var t,e,i=this.objectsList.length;for(e=0;i>e;e++)t=this.objectsList[e],d.exists(t.coords)&&(t.visProp.frozen?t.coords.screen2usr():t.coords.usr2screen());return this},moveOrigin:function(t,e,i){return d.exists(t)&&d.exists(e)&&(this.origin.scrCoords[1]=t,this.origin.scrCoords[2]=e,i&&(this.origin.scrCoords[1]-=this.drag_dx,this.origin.scrCoords[2]-=this.drag_dy)),this.updateCoords().clearTraces().fullUpdate(),this.triggerEventHandlers(["boundingbox"]),this},addConditions:function(e){var i,r,s,o,n,a,h,l=[],u="var el, x, y, c, rgbo;\n",p=e.indexOf("<data>"),f=e.indexOf("</data>"),m=function(e,i,r,s){return function(){var o,n;o=e.select(i.id),n=o.coords.usrCoords[s],2===s?o.setPositionDirectly(t.COORDS_BY_USER,[r(),n]):o.setPositionDirectly(t.COORDS_BY_USER,[n,r()]),o.prepareUpdate().update()}},b=function(t,e,i){return function(){var r,s;r=t.select(e.id),s=i(),r.setAttribute({visible:s})}},g=function(t,e,i,r){return function(){var s,o;s=t.select(e.id),o=i(),"strokewidth"===r?s.visProp.strokewidth=o:(o=c.rgba2rgbo(o),s.visProp[r+"color"]=o[0],s.visProp[r+"opacity"]=o[1])}},v=function(t,e,i){return function(){var r=t.select(e.id);r.position=i()}},C=function(t,e,i){return function(){var r=t.select(e.id);r.setStyle(i())}};if(!(0>p)){for(;p>=0;){switch(i=e.slice(p+6,f),r=i.indexOf("="),s=i.slice(0,r),o=i.slice(r+1),r=s.indexOf("."),n=s.slice(0,r),a=this.elementsByName[d.unescapeHTML(n)],h=s.slice(r+1).replace(/\s+/g,"").toLowerCase(),o=d.createFunction(o,this,"",!0),d.exists(this.elementsByName[n])||t.debug("debug conditions: |"+n+"| undefined"),u+='el = this.objects["'+a.id+'"];\n',h){case"x":l.push(m(this,a,o,2));break;case"y":l.push(m(this,a,o,1));break;case"visible":l.push(b(this,a,o));break;case"position":l.push(v(this,a,o));break;case"stroke":l.push(g(this,a,o,"stroke"));break;case"style":l.push(C(this,a,o));break;case"strokewidth":l.push(g(this,a,o,"strokewidth"));break;case"fill":l.push(g(this,a,o,"fill"));break;case"label":break;default:t.debug("property '"+h+"' in conditions not yet implemented:"+o)}e=e.slice(f+7),p=e.indexOf("<data>"),f=e.indexOf("</data>")}this.updateConditions=function(){var t;for(t=0;l.length>t;t++)l[t]();return this.prepareUpdate().updateElements(),!0},this.updateConditions()}},updateConditions:function(){return!1},calculateSnapSizes:function(){var t=new i(e.COORDS_BY_USER,[0,0],this),r=new i(e.COORDS_BY_USER,[this.options.grid.gridX,this.options.grid.gridY],this),s=t.scrCoords[1]-r.scrCoords[1],o=t.scrCoords[2]-r.scrCoords[2];for(this.options.grid.snapSizeX=this.options.grid.gridX;Math.abs(s)>25;)this.options.grid.snapSizeX*=2,s/=2;for(this.options.grid.snapSizeY=this.options.grid.gridY;Math.abs(o)>25;)this.options.grid.snapSizeY*=2,o/=2;return this},applyZoom:function(){return this.updateCoords().calculateSnapSizes().clearTraces().fullUpdate(),this},zoomIn:function(t,e){var i=this.getBoundingBox(),r=this.attr.zoom.factorx,s=this.attr.zoom.factory,o=(i[2]-i[0])*(1-1/r),n=(i[1]-i[3])*(1-1/s),a=.5,h=.5;return"number"==typeof t&&"number"==typeof e&&(a=(t-i[0])/(i[2]-i[0]),h=(i[1]-e)/(i[1]-i[3])),this.setBoundingBox([i[0]+o*a,i[1]-n*h,i[2]-o*(1-a),i[3]+n*(1-h)],!1),this.zoomX*=r,this.zoomY*=s,this.applyZoom(),!1},zoomOut:function(t,e){var i=this.getBoundingBox(),r=this.attr.zoom.factorx,s=this.attr.zoom.factory,o=(i[2]-i[0])*(1-r),n=(i[1]-i[3])*(1-s),a=.5,h=.5;return this.zoomX<this.attr.zoom.eps||this.zoomY<this.attr.zoom.eps?!1:("number"==typeof t&&"number"==typeof e&&(a=(t-i[0])/(i[2]-i[0]),h=(i[1]-e)/(i[1]-i[3])),this.setBoundingBox([i[0]+o*a,i[1]-n*h,i[2]-o*(1-a),i[3]+n*(1-h)],!1),this.zoomX/=r,this.zoomY/=s,this.applyZoom(),!1)},zoom100:function(){var t=this.getBoundingBox(),e=.5*(t[2]-t[0])*(1-this.zoomX),i=.5*(t[1]-t[3])*(1-this.zoomY);return this.setBoundingBox([t[0]+e,t[1]-i,t[2]-e,t[3]+i],!1),this.zoomX=1,this.zoomY=1,this.applyZoom(),!1},zoomAllPoints:function(){var t,e,i,r,s,o=0,n=0,a=0,h=0,l=this.objectsList.length;for(t=0;l>t;t++)s=this.objectsList[t],d.isPoint(s)&&s.visProp.visible&&(o>s.coords.usrCoords[1]?o=s.coords.usrCoords[1]:s.coords.usrCoords[1]>n&&(n=s.coords.usrCoords[1]),s.coords.usrCoords[2]>h?h=s.coords.usrCoords[2]:a>s.coords.usrCoords[2]&&(a=s.coords.usrCoords[2]));return e=50,i=e/this.unitX,r=e/this.unitY,this.zoomX=1,this.zoomY=1,this.setBoundingBox([o-i,h+r,n+i,a-r],!0),this.applyZoom(),this},zoomElements:function(t){var e,i,r,s,o=[0,0,0,0],n=[1,-1,-1,1];if(!d.isArray(t)||0===t.length)return this;for(e=0;t.length>e;e++)if(r=this.select(t[e]),s=r.bounds(),d.isArray(s))if(d.isArray(o))for(i=0;4>i;i++)n[i]*s[i]<n[i]*o[i]&&(o[i]=s[i]);else o=s;if(d.isArray(o)){for(i=0;4>i;i++)o[i]-=n[i];this.zoomX=1,this.zoomY=1,this.setBoundingBox(o,!0)}return this},setZoom:function(t,e){var i=this.attr.zoom.factorx,r=this.attr.zoom.factory;return this.attr.zoom.factorx=t/this.zoomX,this.attr.zoom.factory=e/this.zoomY,this.zoomIn(),this.attr.zoom.factorx=i,this.attr.zoom.factory=r,this},removeObject:function(e){var i,r;if(d.isArray(e)){for(r=0;e.length>r;r++)this.removeObject(e[r]);return this}if(e=this.select(e),!d.exists(e)||d.isString(e))return this;try{for(i in e.childElements)e.childElements.hasOwnProperty(i)&&e.childElements[i].board.removeObject(e.childElements[i]);for(i in this.objects)this.objects.hasOwnProperty(i)&&d.exists(this.objects[i].childElements)&&(delete this.objects[i].childElements[e.id],delete this.objects[i].descendants[e.id]);if(e._pos>-1)for(this.objectsList.splice(e._pos,1),i=e._pos;this.objectsList.length>i;i++)this.objectsList[i]._pos--;else t.debug("object "+e.id+" not found in list.");delete this.objects[e.id],delete this.elementsByName[e.name],e.visProp&&e.visProp.trace&&e.clearTrace(),d.exists(e.remove)&&e.remove()}catch(s){t.debug(e.id+": Could not be removed: "+s)}return this.update(),this},removeAncestors:function(t){var e;for(e in t.ancestors)t.ancestors.hasOwnProperty(e)&&this.removeAncestors(t.ancestors[e]);return this.removeObject(t),this},initGeonextBoard:function(){var t,e,i;return t=this.create("point",[0,0],{id:this.id+"g00e0",name:"Ursprung",withLabel:!1,visible:!1,fixed:!0}),e=this.create("point",[1,0],{id:this.id+"gX0e0",name:"Punkt_1_0",withLabel:!1,visible:!1,fixed:!0}),i=this.create("point",[0,1],{id:this.id+"gY0e0",name:"Punkt_0_1",withLabel:!1,visible:!1,fixed:!0}),this.create("line",[t,e],{id:this.id+"gXLe0",name:"X-Achse",withLabel:!1,visible:!1}),this.create("line",[t,i],{id:this.id+"gYLe0",name:"Y-Achse",withLabel:!1,visible:!1}),this},initInfobox:function(){var t=d.copyAttributes({},this.options,"infobox");return t.id=this.id+"_infobox",this.infobox=this.create("text",[0,0,"0,0"],t),this.infobox.distanceX=-20,this.infobox.distanceY=25,this.infobox.needsUpdateSize=!1,this.infobox.dump=!1,this.renderer.hide(this.infobox),this},resizeContainer:function(t,e,i){return this.canvasWidth=parseInt(t,10),this.canvasHeight=parseInt(e,10),i||(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 t,e,i,r,s;e="<p>\n";for(t in this.objects)if(this.objects.hasOwnProperty(t)){s=0;for(i in this.objects[t].childElements)this.objects[t].childElements.hasOwnProperty(i)&&(s+=1);s>=0&&(e+="<strong>"+this.objects[t].id+":<"+"/strong> ");for(i in this.objects[t].childElements)this.objects[t].childElements.hasOwnProperty(i)&&(e+=this.objects[t].childElements[i].id+"("+this.objects[t].childElements[i].name+")"+", ");e+="<p>\n"}return e+="</p>\n",r=window.open(),r.document.open(),r.document.write(e),r.document.close(),this},showXML:function(){var t=window.open("");return t.document.open(),t.document.write("<pre>"+d.escapeHTML(this.xmlString)+"<"+"/pre>"),t.document.close(),this},prepareUpdate:function(){var t,e,i=this.objectsList.length;for(t=0;i>t;t++)e=this.objectsList[t],e.needsUpdate=e.needsRegularUpdate||this.needsFullUpdate;return this},updateElements:function(t){var e,i;for(t=this.select(t),e=0;this.objectsList.length>e;e++)i=this.objectsList[e],i.update(!d.exists(t)||i.id!==t.id);for(e in this.groups)this.groups.hasOwnProperty(e)&&this.groups[e].update(t);return this},updateRenderer:function(){var t,e,i=this.objectsList.length;if("canvas"===this.renderer.type)this.updateRendererCanvas();else for(t=0;i>t;t++)e=this.objectsList[t],e.updateRenderer();return this},updateRendererCanvas:function(){var t,e,i,r,s,o=this.objectsList.length,n=this.options.layer,a=this.options.layer.numlayers,h=Number.NEGATIVE_INFINITY;for(i=0;a>i;i++){r=Number.POSITIVE_INFINITY;for(s in n)n.hasOwnProperty(s)&&n[s]>h&&r>n[s]&&(r=n[s]);for(h=r,t=0;o>t;t++)e=this.objectsList[t],e.visProp.layer===r&&e.prepareUpdate().updateRenderer()}return this},addHook:function(t,e,i){return e=d.def(e,"update"),i=d.def(i,this),this.hooks.push([e,t]),this.on(e,t,i),this.hooks.length-1},addEvent:t.shortcut(t.Board.prototype,"on"),removeHook:function(t){return this.hooks[t]&&(this.off(this.hooks[t][0],this.hooks[t][1]),this.hooks[t]=null),this},removeEvent:t.shortcut(t.Board.prototype,"off"),updateHooks:function(){var t=Array.prototype.slice.call(arguments,0);return t[0]=d.def(t[0],"update"),this.triggerEventHandlers([t[0]],arguments),this
+},addChild:function(t){return d.exists(t)&&d.exists(t.containerObj)&&(this.dependentBoards.push(t),this.update()),this},removeChild:function(t){var e;for(e=this.dependentBoards.length-1;e>=0;e--)this.dependentBoards[e]===t&&this.dependentBoards.splice(e,1);return this},update:function(t){var e,i,r,s;if(this.inUpdate||this.isSuspendedUpdate)return this;for(this.inUpdate=!0,this.containerObj&&"vml"!==this.renderer.type&&(s=this.renderer.removeToInsertLater(this.containerObj)),this.prepareUpdate().updateElements(t).updateConditions(),this.renderer.suspendRedraw(this),this.updateRenderer(),this.renderer.unsuspendRedraw(),this.triggerEventHandlers(["update"],[]),s&&s(),i=this.dependentBoards.length,e=0;i>e;e++)r=this.dependentBoards[e],d.exists(r)&&r!==this&&(r.updateQuality=this.updateQuality,r.prepareUpdate().updateElements().updateConditions(),r.renderer.suspendRedraw(),r.updateRenderer(),r.renderer.unsuspendRedraw(),r.triggerEventHandlers(["update"],[]));return this.inUpdate=!1,this},fullUpdate:function(){return this.needsFullUpdate=!0,this.update(),this.needsFullUpdate=!1,this},addGrid:function(){return this.create("grid",[]),this},removeGrids:function(){var t;for(t=0;this.grids.length>t;t++)this.removeObject(this.grids[t]);return this.grids.length=0,this.update(),this},create:function(e,i,r){var s,o;for(e=e.toLowerCase(),d.exists(i)||(i=[]),d.exists(r)||(r={}),o=0;i.length>o;o++)"string"!=typeof i[o]||"text"===e&&2===o||(i[o]=this.select(i[o]));if("function"!=typeof t.elements[e])throw Error("JSXGraph: create: Unknown element type given: "+e);return s=t.elements[e](this,i,r),d.exists(s)?(s.prepareUpdate&&s.update&&s.updateRenderer&&s.prepareUpdate().update().updateRenderer(),s):(t.debug("JSXGraph: create: failure creating "+e),s)},createElement:t.shortcut(t.Board.prototype,"create"),clearTraces:function(){var t;for(t=0;this.objectsList.length>t;t++)this.objectsList[t].clearTrace();return this.numTraces=0,this},suspendUpdate:function(){return this.isSuspendedUpdate=!0,this},unsuspendUpdate:function(){return this.isSuspendedUpdate=!1,this.update(),this},setBoundingBox:function(t,e){var i,r,s=p.getDimensions(this.container);return d.isArray(t)?(this.plainBB=t,this.canvasWidth=parseInt(s.width,10),this.canvasHeight=parseInt(s.height,10),r=this.canvasWidth,i=this.canvasHeight,e?(this.unitX=r/(t[2]-t[0]),this.unitY=i/(t[1]-t[3]),Math.abs(this.unitX)<Math.abs(this.unitY)?this.unitY=Math.abs(this.unitX)*this.unitY/Math.abs(this.unitY):this.unitX=Math.abs(this.unitY)*this.unitX/Math.abs(this.unitX)):(this.unitX=r/(t[2]-t[0]),this.unitY=i/(t[1]-t[3])),this.moveOrigin(-this.unitX*t[0],this.unitY*t[1]),this):this},getBoundingBox:function(){var t=new i(e.COORDS_BY_SCREEN,[0,0],this),r=new i(e.COORDS_BY_SCREEN,[this.canvasWidth,this.canvasHeight],this);return[t.usrCoords[1],t.usrCoords[2],r.usrCoords[1],r.usrCoords[2]]},addAnimation:function(t){var e=this;return this.animationObjects[t.id]=t,this.animationIntervalCode||(this.animationIntervalCode=window.setInterval(function(){e.animate()},t.board.attr.animationdelay)),this},stopAllAnimation:function(){var t;for(t in this.animationObjects)this.animationObjects.hasOwnProperty(t)&&d.exists(this.animationObjects[t])&&(this.animationObjects[t]=null,delete this.animationObjects[t]);return window.clearInterval(this.animationIntervalCode),delete this.animationIntervalCode,this},animate:function(){var t,i,r,s,o,n,a,h,l=0,c=null;for(i in this.animationObjects)if(this.animationObjects.hasOwnProperty(i)&&d.exists(this.animationObjects[i])){if(l+=1,r=this.animationObjects[i],r.animationPath&&(s=d.isFunction(r.animationPath)?r.animationPath((new Date).getTime()-r.animationStart):r.animationPath.pop(),!d.exists(s)||!d.isArray(s)&&isNaN(s)?delete r.animationPath:(r.setPositionDirectly(e.COORDS_BY_USER,s),r.prepareUpdate().update().updateRenderer(),c=r)),r.animationData){a=0;for(o in r.animationData)r.animationData.hasOwnProperty(o)&&(n=r.animationData[o].pop(),d.exists(n)?(a+=1,t={},t[o]=n,r.setAttribute(t)):delete r.animationData[n]);0===a&&delete r.animationData}d.exists(r.animationData)||d.exists(r.animationPath)||(this.animationObjects[i]=null,delete this.animationObjects[i],d.exists(r.animationCallback)&&(h=r.animationCallback,r.animationCallback=null,h()))}return 0===l?(window.clearInterval(this.animationIntervalCode),delete this.animationIntervalCode):this.update(c),this},migratePoint:function(t,e,i){var r,s,o,n,a;t=this.select(t),e=this.select(e),t.label&&this.removeObject(t.label);for(s in t.childElements)if(t.childElements.hasOwnProperty(s)){r=t.childElements[s],n=!1;for(o in r)r.hasOwnProperty(o)&&r[o]===t&&(r[o]=e,n=!0);for(n&&delete t.childElements[s],a=0;r.parents.length>a;a++)r.parents[a]===t.id&&(r.parents[a]=e.id);e.addChild(r)}return t.label&&(delete e.childElements[t.label.id],delete e.descendants[t.label.id]),i&&(e.label&&this.removeObject(e.label),delete this.elementsByName[e.name],e.name=t.name),this.removeObject(t),e.createLabel(),d.exists(e.name)&&""!==e.name&&(this.elementsByName[e.name]=e),this.update(),this},emulateColorblindness:function(e){var i,r;if(d.exists(e)||(e="none"),this.currentCBDef===e)return this;for(i in this.objects)this.objects.hasOwnProperty(i)&&(r=this.objects[i],"none"!==e?("none"===this.currentCBDef&&(r.visPropOriginal={strokecolor:r.visProp.strokecolor,fillcolor:r.visProp.fillcolor,highlightstrokecolor:r.visProp.highlightstrokecolor,highlightfillcolor:r.visProp.highlightfillcolor}),r.setAttribute({strokecolor:c.rgb2cb(r.visPropOriginal.strokecolor,e),fillcolor:c.rgb2cb(r.visPropOriginal.fillcolor,e),highlightstrokecolor:c.rgb2cb(r.visPropOriginal.highlightstrokecolor,e),highlightfillcolor:c.rgb2cb(r.visPropOriginal.highlightfillcolor,e)})):d.exists(r.visPropOriginal)&&t.extend(r.visProp,r.visPropOriginal));return this.currentCBDef=e,this.update(),this},select:function(e){var i,r,s,o,n=e;if(null===n)return n;if("string"==typeof n&&""!==n)d.exists(this.objects[n])?n=this.objects[n]:d.exists(this.elementsByName[n])?n=this.elementsByName[n]:d.exists(this.groups[n])&&(n=this.groups[n]);else if("function"==typeof n||"object"==typeof n&&!t.isArray(n)&&"function"!=typeof n.setAttribute){for(i=d.filterElements(this.objectsList,e),r={},o=i.length,s=0;o>s;s++)r[i[s].id]=i[s];return new C(r)}return n},hasPoint:function(e,i){var r=e,s=i,o=this.getBoundingBox();return t.exists(e)&&t.isArray(e.usrCoords)&&(r=e.usrCoords[1],s=e.usrCoords[2]),"number"==typeof r&&"number"==typeof s&&r>o[0]&&o[2]>r&&o[1]>s&&s>o[3]?!0:!1},updateCSSTransforms:function(){var t=this.containerObj,e=t,i=t;for(this.cssTransMat=p.getCSSTransformMatrix(e),e=e.offsetParent;e;){for(this.cssTransMat=o.matMatMult(p.getCSSTransformMatrix(e),this.cssTransMat),i=i.parentNode;i!==e;)this.cssTransMat=o.matMatMult(p.getCSSTransformMatrix(e),this.cssTransMat),i=i.parentNode;e=e.offsetParent}return this.cssTransMat=o.inverse(this.cssTransMat),this},__evt__down:function(){},__evt__mousedown:function(){},__evt__touchstart:function(){},__evt__up:function(){},__evt__mouseup:function(){},__evt__touchend:function(){},__evt__move:function(){},__evt__mousemove:function(){},__evt__touchmove:function(){},__evt__hit:function(){},__evt__mousehit:function(){},__evt__update:function(){},__evt__boundingbox:function(){},__evt:function(){},createRoulette:function(t,e,i,r,o,n,h){var l=this,c=function(){var c,d=0,u=0,p=0,f=i,m=s.root(function(i){var r=t.X(f),s=t.Y(f),o=e.X(i),n=e.Y(i);return(r-o)*(r-o)+(s-n)*(s-n)},[0,2*Math.PI]),b=0,g=0,v=l.create("transform",[function(){return d}],{type:"rotate"}),C=l.create("transform",[function(){return d},function(){return t.X(f)},function(){return t.Y(f)}],{type:"rotate"}),y=l.create("transform",[function(){return u},function(){return p}],{type:"translate"}),P=function(t,e,i){var r=s.D(t.X)(e),o=s.D(t.Y)(e),n=s.D(t.X)(i),a=s.D(t.Y)(i),h=s.D(t.X)(.5*(e+i)),l=s.D(t.Y)(.5*(e+i)),c=Math.sqrt(r*r+o*o),d=Math.sqrt(n*n+a*a),u=Math.sqrt(h*h+l*l);return(c+4*u+d)*(i-e)/6},_=function(t){return c-P(e,m,t)},E=Math.PI/18,S=9*E,O=null;return this.rolling=function(){var i,n,O,T,x;b=f+o*r,c=P(t,f,b),g=s.root(_,m),i=new a(t.X(b),t.Y(b)),n=new a(e.X(g),e.Y(g)),O=new a(s.D(t.X)(b),s.D(t.Y)(b)),T=new a(s.D(e.X)(g),s.D(e.Y)(g)),x=a.C.div(O,T),d=Math.atan2(x.imaginary,x.real),x.div(a.C.abs(x)),x.mult(n),u=i.real-x.real,p=i.imaginary-x.imaginary,-E>d&&d>-S?(d=-E,C.applyOnce(h)):d>E&&S>d?(d=E,C.applyOnce(h)):(v.applyOnce(h),y.applyOnce(h),f=b,m=g),l.update()},this.start=function(){return n>0&&(O=window.setInterval(this.rolling,n)),this},this.stop=function(){return window.clearInterval(O),this},this};return new c}}),t.Board}),define("renderer/svg",["jxg","options","renderer/abstract","base/constants","utils/type","utils/env","utils/color","math/numerics"],function(t,e,i,r,s,o,n,a){return t.SVGRenderer=function(t,i){var r;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=t,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=i.width+"px",this.svgRoot.style.height=i.height+"px",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=[],r=0;e.layer.numlayers>r;r++)this.layer[r]=this.container.ownerDocument.createElementNS(this.svgNamespace,"g"),this.svgRoot.appendChild(this.layer[r]);this.dashArray=["2, 2","5, 5","10, 10","20, 20","20, 10, 10, 10","20, 5, 10, 5"]},t.SVGRenderer.prototype=new i,t.extend(t.SVGRenderer.prototype,{_createArrowHead:function(t,e){var i,r,o,n,a=t.id+"Triangle";return s.exists(e)&&(a+=e),i=this.createPrim("marker",a),i.setAttributeNS(null,"stroke",s.evaluate(t.visProp.strokecolor)),i.setAttributeNS(null,"stroke-opacity",s.evaluate(t.visProp.strokeopacity)),i.setAttributeNS(null,"fill",s.evaluate(t.visProp.strokecolor)),i.setAttributeNS(null,"fill-opacity",s.evaluate(t.visProp.strokeopacity)),i.setAttributeNS(null,"stroke-width",0),i.setAttributeNS(null,"orient","auto"),i.setAttributeNS(null,"markerUnits","strokeWidth"),o=parseInt(t.visProp.strokewidth,10),i.setAttributeNS(null,"viewBox",-o+" "+-o+" "+10*o+" "+10*o),n=Math.max(3*o,10),i.setAttributeNS(null,"markerHeight",n),i.setAttributeNS(null,"markerWidth",n),r=this.container.ownerDocument.createElementNS(this.svgNamespace,"path"),"End"===e?(i.setAttributeNS(null,"refY",5),i.setAttributeNS(null,"refX",10),r.setAttributeNS(null,"d","M 10 0 L 0 5 L 10 10 z")):(i.setAttributeNS(null,"refY",5),i.setAttributeNS(null,"refX",0),r.setAttributeNS(null,"d","M 0 0 L 10 5 L 0 10 z")),i.appendChild(r),i},_setArrowAtts:function(t,e,i){t&&(t.setAttributeNS(null,"stroke",e),t.setAttributeNS(null,"stroke-opacity",i),t.setAttributeNS(null,"fill",e),t.setAttributeNS(null,"fill-opacity",i),t.setAttributeNS(null,"stroke-width",0))},updateTicks:function(t){var e,i,r,o,n,a="",h=t.ticks.length;for(e=0;h>e;e++)i=t.ticks[e],o=i[0],n=i[1],"number"==typeof o[0]&&"number"==typeof o[1]&&(a+="M "+o[0]+" "+n[0]+" L "+o[1]+" "+n[1]+" ");r=t.rendNode,s.exists(r)||(r=this.createPrim("path",t.id),this.appendChildPrim(r,t.visProp.layer),t.rendNode=r),r.setAttributeNS(null,"stroke",t.visProp.strokecolor),r.setAttributeNS(null,"stroke-opacity",t.visProp.strokeopacity),r.setAttributeNS(null,"stroke-width",t.visProp.strokewidth),this.updatePathPrim(r,a,t.board)},displayCopyright:function(t,e){var i,r=this.createPrim("text","licenseText");r.setAttributeNS(null,"x","20px"),r.setAttributeNS(null,"y",2+e+"px"),r.setAttributeNS(null,"style","font-family:Arial,Helvetica,sans-serif; font-size:"+e+"px; fill:#356AA0; opacity:0.3;"),i=document.createTextNode(t),r.appendChild(i),this.appendChildPrim(r,0)},drawInternalText:function(t){var e=this.createPrim("text",t.id);return e.setAttributeNS(null,"class",t.visProp.cssclass),t.rendNodeText=document.createTextNode(""),e.appendChild(t.rendNodeText),this.appendChildPrim(e,t.visProp.layer),e},updateInternalText:function(t){var e,i=t.plaintext;isNaN(t.coords.scrCoords[1]+t.coords.scrCoords[2])||(e=t.coords.scrCoords[1],t.visPropOld.left!==t.visProp.anchorx+e&&(t.rendNode.setAttributeNS(null,"x",e+"px"),"left"===t.visProp.anchorx?t.rendNode.setAttributeNS(null,"text-anchor","start"):"right"===t.visProp.anchorx?t.rendNode.setAttributeNS(null,"text-anchor","end"):"middle"===t.visProp.anchorx&&t.rendNode.setAttributeNS(null,"text-anchor","middle"),t.visPropOld.left=t.visProp.anchorx+e),e=t.coords.scrCoords[2],t.visPropOld.top!==t.visProp.anchory+e&&(t.rendNode.setAttributeNS(null,"y",t.coords.scrCoords[2]+.5*this.vOffsetText+"px"),"bottom"===t.visProp.anchory?t.rendNode.setAttributeNS(null,"dominant-baseline","text-after-edge"):"top"===t.visProp.anchory?t.rendNode.setAttributeNS(null,"dominant-baseline","text-before-edge"):"middle"===t.visProp.anchory&&t.rendNode.setAttributeNS(null,"dominant-baseline","middle"),t.visPropOld.top=t.visProp.anchory+e)),t.htmlStr!==i&&(t.rendNodeText.data=i,t.htmlStr=i),this.transformImage(t,t.transformations)},updateInternalTextStyle:function(t,e,i){this.setObjectFillColor(t,e,i)},drawImage:function(t){var e=this.createPrim("image",t.id);e.setAttributeNS(null,"preserveAspectRatio","none"),this.appendChildPrim(e,t.visProp.layer),t.rendNode=e,this.updateImage(t)},transformImage:function(t,e){var i,r,s=t.rendNode,o="",n=e.length;n>0&&(r=this.joinTransforms(t,e),i=[r[1][1],r[2][1],r[1][2],r[2][2],r[1][0],r[2][0]].join(","),o+=" matrix("+i+") ",s.setAttributeNS(null,"transform",o))},updateImageURL:function(t){var e=s.evaluate(t.url);t.rendNode.setAttributeNS(this.xlinkNamespace,"xlink:href",e)},updateImageStyle:function(t,e){var i=e?t.visProp.highlightcssclass:t.visProp.cssclass;t.rendNode.setAttributeNS(null,"class",i)},appendChildPrim:function(t,i){return s.exists(i)?i>=e.layer.numlayers&&(i=e.layer.numlayers-1):i=0,this.layer[i].appendChild(t),t},createPrim:function(t,e){var i=this.container.ownerDocument.createElementNS(this.svgNamespace,t);return i.setAttributeNS(null,"id",this.container.id+"_"+e),i.style.position="absolute","path"===t&&(i.setAttributeNS(null,"stroke-linecap","butt"),i.setAttributeNS(null,"stroke-linejoin","round")),i},remove:function(t){s.exists(t)&&s.exists(t.parentNode)&&t.parentNode.removeChild(t)},makeArrows:function(t){var e;(t.visPropOld.firstarrow!==t.visProp.firstarrow||t.visPropOld.lastarrow!==t.visProp.lastarrow)&&(t.visProp.firstarrow?(e=t.rendNodeTriangleStart,s.exists(e)?this.defs.appendChild(e):(e=this._createArrowHead(t,"End"),this.defs.appendChild(e),t.rendNodeTriangleStart=e,t.rendNode.setAttributeNS(null,"marker-start","url(#"+this.container.id+"_"+t.id+"TriangleEnd)"))):(e=t.rendNodeTriangleStart,s.exists(e)&&this.remove(e)),t.visProp.lastarrow?(e=t.rendNodeTriangleEnd,s.exists(e)?this.defs.appendChild(e):(e=this._createArrowHead(t,"Start"),this.defs.appendChild(e),t.rendNodeTriangleEnd=e,t.rendNode.setAttributeNS(null,"marker-end","url(#"+this.container.id+"_"+t.id+"TriangleStart)"))):(e=t.rendNodeTriangleEnd,s.exists(e)&&this.remove(e)),t.visPropOld.firstarrow=t.visProp.firstarrow,t.visPropOld.lastarrow=t.visProp.lastarrow)},updateEllipsePrim:function(t,e,i,r,s){t.setAttributeNS(null,"cx",e),t.setAttributeNS(null,"cy",i),t.setAttributeNS(null,"rx",Math.abs(r)),t.setAttributeNS(null,"ry",Math.abs(s))},updateLinePrim:function(t,e,i,r,s){isNaN(e+i+r+s)||(t.setAttributeNS(null,"x1",e),t.setAttributeNS(null,"y1",i),t.setAttributeNS(null,"x2",r),t.setAttributeNS(null,"y2",s))},updatePathPrim:function(t,e){""===e&&(e="M 0 0"),t.setAttributeNS(null,"d",e)},updatePathStringPoint:function(t,e,i){var r="",s=t.coords.scrCoords,o=.5*e*Math.sqrt(3),n=.5*e;return"x"===i?r=" M "+(s[1]-e)+" "+(s[2]-e)+" L "+(s[1]+e)+" "+(s[2]+e)+" M "+(s[1]+e)+" "+(s[2]-e)+" L "+(s[1]-e)+" "+(s[2]+e):"+"===i?r=" M "+(s[1]-e)+" "+s[2]+" L "+(s[1]+e)+" "+s[2]+" M "+s[1]+" "+(s[2]-e)+" L "+s[1]+" "+(s[2]+e):"<>"===i?r=" M "+(s[1]-e)+" "+s[2]+" L "+s[1]+" "+(s[2]+e)+" L "+(s[1]+e)+" "+s[2]+" L "+s[1]+" "+(s[2]-e)+" Z ":"^"===i?r=" M "+s[1]+" "+(s[2]-e)+" L "+(s[1]-o)+" "+(s[2]+n)+" L "+(s[1]+o)+" "+(s[2]+n)+" Z ":"v"===i?r=" M "+s[1]+" "+(s[2]+e)+" L "+(s[1]-o)+" "+(s[2]-n)+" L "+(s[1]+o)+" "+(s[2]-n)+" Z ":">"===i?r=" M "+(s[1]+e)+" "+s[2]+" L "+(s[1]-n)+" "+(s[2]-o)+" L "+(s[1]-n)+" "+(s[2]+o)+" Z ":"<"===i&&(r=" M "+(s[1]-e)+" "+s[2]+" L "+(s[1]+n)+" "+(s[2]-o)+" L "+(s[1]+n)+" "+(s[2]+o)+" Z "),r},updatePathStringPrim:function(t){var e,i,r,s=" M ",o=" L ",n=" C ",h=s,l=5e3,c="",d="plot"!==t.visProp.curvetype;if(0>=t.numberPoints)return"";if(r=Math.min(t.points.length,t.numberPoints),1===t.bezierDegree)for(d&&t.board.options.curve.RDPsmoothing&&(t.points=a.RamerDouglasPeuker(t.points,.5)),e=0;r>e;e++)i=t.points[e].scrCoords,isNaN(i[1])||isNaN(i[2])?h=s:(i[1]>l?i[1]=l:-l>i[1]&&(i[1]=-l),i[2]>l?i[2]=l:-l>i[2]&&(i[2]=-l),c+=h+i[1]+" "+i[2],h=o);else if(3===t.bezierDegree)for(e=0;r>e;)i=t.points[e].scrCoords,isNaN(i[1])||isNaN(i[2])?h=s:(c+=h+i[1]+" "+i[2],h===n&&(e+=1,i=t.points[e].scrCoords,c+=" "+i[1]+" "+i[2],e+=1,i=t.points[e].scrCoords,c+=" "+i[1]+" "+i[2]),h=n),e+=1;return c},updatePathStringBezierPrim:function(t){var e,i,r,s,o,n,h,l=" M ",c=" C ",d=l,u=5e3,p="",f=t.visProp.strokewidth,m="plot"!==t.visProp.curvetype;if(0>=t.numberPoints)return"";for(m&&t.board.options.curve.RDPsmoothing&&(t.points=a.RamerDouglasPeuker(t.points,.5)),h=Math.min(t.points.length,t.numberPoints),i=1;3>i;i++)for(d=l,e=0;h>e;e++)s=t.points[e].scrCoords,isNaN(s[1])||isNaN(s[2])?d=l:(s[1]>u?s[1]=u:-u>s[1]&&(s[1]=-u),s[2]>u?s[2]=u:-u>s[2]&&(s[2]=-u),d===l?p+=[d,s[1]," ",s[2]].join(""):(r=2*i,p+=[d,o+.333*(s[1]-o)+f*(r*Math.random()-i)," ",n+.333*(s[2]-n)+f*(r*Math.random()-i)," ",o+.666*(s[1]-o)+f*(r*Math.random()-i)," ",n+.666*(s[2]-n)+f*(r*Math.random()-i)," ",s[1]," ",s[2]].join("")),d=c,o=s[1],n=s[2]);return p},updatePolygonPrim:function(t,e){var i,r,s="",o=e.vertices.length;for(t.setAttributeNS(null,"stroke","none"),i=0;o-1>i;i++){if(!e.vertices[i].isReal)return t.setAttributeNS(null,"points",""),void 0;r=e.vertices[i].coords.scrCoords,s=s+r[1]+","+r[2],o-2>i&&(s+=" ")}-1===s.indexOf("NaN")&&t.setAttributeNS(null,"points",s)},updateRectPrim:function(t,e,i,r,s){t.setAttributeNS(null,"x",e),t.setAttributeNS(null,"y",i),t.setAttributeNS(null,"width",r),t.setAttributeNS(null,"height",s)},setPropertyPrim:function(t,e,i){"stroked"!==e&&t.setAttributeNS(null,e,i)},show:function(t){var e;t&&t.rendNode&&(e=t.rendNode,e.setAttributeNS(null,"display","inline"),e.style.visibility="inherit")},hide:function(t){var e;t&&t.rendNode&&(e=t.rendNode,e.setAttributeNS(null,"display","none"),e.style.visibility="hidden")},setBuffering:function(t,e){t.rendNode.setAttribute("buffered-rendering",e)},setDashStyle:function(t){var e=t.visProp.dash,i=t.rendNode;t.visProp.dash>0?i.setAttributeNS(null,"stroke-dasharray",this.dashArray[e-1]):i.hasAttributeNS(null,"stroke-dasharray")&&i.removeAttributeNS(null,"stroke-dasharray")},setGradient:function(t){var e,i,r,o,n,a,h,l,c,d=t.rendNode;i=s.evaluate(t.visProp.fillopacity),i=i>0?i:0,e=s.evaluate(t.visProp.fillcolor),"linear"===t.visProp.gradient?(r=this.createPrim("linearGradient",t.id+"_gradient"),a="0%",h="100%",l="0%",c="0%",r.setAttributeNS(null,"x1",a),r.setAttributeNS(null,"x2",h),r.setAttributeNS(null,"y1",l),r.setAttributeNS(null,"y2",c),o=this.createPrim("stop",t.id+"_gradient1"),o.setAttributeNS(null,"offset","0%"),o.setAttributeNS(null,"style","stop-color:"+e+";stop-opacity:"+i),n=this.createPrim("stop",t.id+"_gradient2"),n.setAttributeNS(null,"offset","100%"),n.setAttributeNS(null,"style","stop-color:"+t.visProp.gradientsecondcolor+";stop-opacity:"+t.visProp.gradientsecondopacity),r.appendChild(o),r.appendChild(n),this.defs.appendChild(r),d.setAttributeNS(null,"style","fill:url(#"+this.container.id+"_"+t.id+"_gradient)"),t.gradNode1=o,t.gradNode2=n):"radial"===t.visProp.gradient?(r=this.createPrim("radialGradient",t.id+"_gradient"),r.setAttributeNS(null,"cx","50%"),r.setAttributeNS(null,"cy","50%"),r.setAttributeNS(null,"r","50%"),r.setAttributeNS(null,"fx",100*t.visProp.gradientpositionx+"%"),r.setAttributeNS(null,"fy",100*t.visProp.gradientpositiony+"%"),o=this.createPrim("stop",t.id+"_gradient1"),o.setAttributeNS(null,"offset","0%"),o.setAttributeNS(null,"style","stop-color:"+t.visProp.gradientsecondcolor+";stop-opacity:"+t.visProp.gradientsecondopacity),n=this.createPrim("stop",t.id+"_gradient2"),n.setAttributeNS(null,"offset","100%"),n.setAttributeNS(null,"style","stop-color:"+e+";stop-opacity:"+i),r.appendChild(o),r.appendChild(n),this.defs.appendChild(r),d.setAttributeNS(null,"style","fill:url(#"+this.container.id+"_"+t.id+"_gradient)"),t.gradNode1=o,t.gradNode2=n):d.removeAttributeNS(null,"style")},updateGradient:function(t){var e,i,r=t.gradNode1,o=t.gradNode2;s.exists(r)&&s.exists(o)&&(i=s.evaluate(t.visProp.fillopacity),i=i>0?i:0,e=s.evaluate(t.visProp.fillcolor),"linear"===t.visProp.gradient?(r.setAttributeNS(null,"style","stop-color:"+e+";stop-opacity:"+i),o.setAttributeNS(null,"style","stop-color:"+t.visProp.gradientsecondcolor+";stop-opacity:"+t.visProp.gradientsecondopacity)):"radial"===t.visProp.gradient&&(r.setAttributeNS(null,"style","stop-color:"+t.visProp.gradientsecondcolor+";stop-opacity:"+t.visProp.gradientsecondopacity),o.setAttributeNS(null,"style","stop-color:"+e+";stop-opacity:"+i)))},setObjectFillColor:function(e,i,r){var o,a,h,l,c=s.evaluate(i),d=s.evaluate(r);d=d>0?d:0,(e.visPropOld.fillcolor!==c||e.visPropOld.fillopacity!==d)&&(s.exists(c)&&c!==!1&&(9!==c.length?(a=c,l=d):(h=n.rgba2rgbo(c),a=h[0],l=d*h[1]),o=e.rendNode,"none"!==a?o.setAttributeNS(null,"fill",a):l=0,e.type===t.OBJECT_TYPE_IMAGE?o.setAttributeNS(null,"opacity",l):o.setAttributeNS(null,"fill-opacity",l),s.exists(e.visProp.gradient)&&this.updateGradient(e)),e.visPropOld.fillcolor=c,e.visPropOld.fillopacity=d)},setObjectStrokeColor:function(t,e,i){var o,a,h,l,c=s.evaluate(e),d=s.evaluate(i);d=d>0?d:0,(t.visPropOld.strokecolor!==c||t.visPropOld.strokeopacity!==d)&&(s.exists(c)&&c!==!1&&(9!==c.length?(o=c,h=d):(a=n.rgba2rgbo(c),o=a[0],h=d*a[1]),l=t.rendNode,t.type===r.OBJECT_TYPE_TEXT?"html"===t.visProp.display?(l.style.color=o,l.style.opacity=h):(l.setAttributeNS(null,"style","fill:"+o),l.setAttributeNS(null,"style","fill-opacity:"+h)):(l.setAttributeNS(null,"stroke",o),l.setAttributeNS(null,"stroke-opacity",h)),t.type===r.OBJECT_TYPE_ARROW?this._setArrowAtts(t.rendNodeTriangle,o,h,t.visProp.strokewidth):(t.elementClass===r.OBJECT_CLASS_CURVE||t.elementClass===r.OBJECT_CLASS_LINE)&&(t.visProp.firstarrow&&this._setArrowAtts(t.rendNodeTriangleStart,o,h,t.visProp.strokewidth),t.visProp.lastarrow&&this._setArrowAtts(t.rendNodeTriangleEnd,o,h,t.visProp.strokewidth))),t.visPropOld.strokecolor=c,t.visPropOld.strokeopacity=d)},setObjectStrokeWidth:function(t,e){var i,o=s.evaluate(e);isNaN(o)||t.visPropOld.strokewidth===o||(i=t.rendNode,this.setPropertyPrim(i,"stroked","true"),s.exists(o)&&(this.setPropertyPrim(i,"stroke-width",o+"px"),t.type===r.OBJECT_TYPE_ARROW?this._setArrowAtts(t.rendNodeTriangle,t.visProp.strokecolor,t.visProp.strokeopacity,o):(t.elementClass===r.OBJECT_CLASS_CURVE||t.elementClass===r.OBJECT_CLASS_LINE)&&(t.visProp.firstarrow&&this._setArrowAtts(t.rendNodeTriangleStart,t.visProp.strokecolor,t.visProp.strokeopacity,o),t.visProp.lastarrow&&this._setArrowAtts(t.rendNodeTriangleEnd,t.visProp.strokecolor,t.visProp.strokeopacity,o))),t.visPropOld.strokewidth=o)},setShadow:function(t){t.visPropOld.shadow!==t.visProp.shadow&&(s.exists(t.rendNode)&&(t.visProp.shadow?t.rendNode.setAttributeNS(null,"filter","url(#"+this.container.id+"_"+"f1)"):t.rendNode.removeAttributeNS(null,"filter")),t.visPropOld.shadow=t.visProp.shadow)},suspendRedraw:function(){},unsuspendRedraw:function(){},resize:function(t,e){this.svgRoot.style.width=parseFloat(t)+"px",this.svgRoot.style.height=parseFloat(e)+"px"},createTouchpoints:function(t){var e,i,r,s;for(this.touchpoints=[],e=0;t>e;e++)i="touchpoint1_"+e,s=this.createPrim("path",i),this.appendChildPrim(s,19),s.setAttributeNS(null,"d","M 0 0"),this.touchpoints.push(s),this.setPropertyPrim(s,"stroked","true"),this.setPropertyPrim(s,"stroke-width","1px"),s.setAttributeNS(null,"stroke","#000000"),s.setAttributeNS(null,"stroke-opacity",1),s.setAttributeNS(null,"display","none"),r="touchpoint2_"+e,s=this.createPrim("ellipse",r),this.appendChildPrim(s,19),this.updateEllipsePrim(s,0,0,0,0),this.touchpoints.push(s),this.setPropertyPrim(s,"stroked","true"),this.setPropertyPrim(s,"stroke-width","1px"),s.setAttributeNS(null,"stroke","#000000"),s.setAttributeNS(null,"stroke-opacity",1),s.setAttributeNS(null,"fill","#ffffff"),s.setAttributeNS(null,"fill-opacity",0),s.setAttributeNS(null,"display","none")},showTouchpoint:function(t){this.touchpoints&&t>=0&&this.touchpoints.length>2*t&&(this.touchpoints[2*t].setAttributeNS(null,"display","inline"),this.touchpoints[2*t+1].setAttributeNS(null,"display","inline"))},hideTouchpoint:function(t){this.touchpoints&&t>=0&&this.touchpoints.length>2*t&&(this.touchpoints[2*t].setAttributeNS(null,"display","none"),this.touchpoints[2*t+1].setAttributeNS(null,"display","none"))},updateTouchpoint:function(t,e){var i,r,s=37;this.touchpoints&&t>=0&&this.touchpoints.length>2*t&&(i=e[0],r=e[1],this.touchpoints[2*t].setAttributeNS(null,"d","M "+(i-s)+" "+r+" "+"L "+(i+s)+" "+r+" "+"M "+i+" "+(r-s)+" "+"L "+i+" "+(r+s)),this.updateEllipsePrim(this.touchpoints[2*t+1],e[0],e[1],25,25))}}),t.SVGRenderer}),define("renderer/vml",["jxg","renderer/abstract","base/constants","utils/type","utils/color","math/math","math/numerics"],function(t,e,i,r,s,o,n){return t.VMLRenderer=function(e){this.type="vml",this.container=e,this.container.style.overflow="hidden",this.container.onselectstart=function(){return!1},this.resolution=10,r.exists(t.vmlStylesheet)||(e.ownerDocument.namespaces.add("jxgvml","urn:schemas-microsoft-com:vml"),t.vmlStylesheet=this.container.ownerDocument.createStyleSheet(),t.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("<jxgvml:"+t+' class="jxgvml">')}}catch(i){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"]},t.VMLRenderer.prototype=new e,t.extend(t.VMLRenderer.prototype,{_setAttr:function(e,i,r,s){try{8===document.documentMode?e[i]=r:e.setAttribute(i,r,s)}catch(o){t.debug("_setAttr: "+i+" "+r+"<br>\n")}},updateTicks:function(t){var e,i,s,o,n,a=this.resolution,h=[];for(i=t.ticks.length,e=0;i>e;e++)s=t.ticks[e],o=s[0],n=s[1],"number"==typeof o[0]&&"number"==typeof o[1]&&h.push(" m "+Math.round(a*o[0])+", "+Math.round(a*n[0])+" l "+Math.round(a*o[1])+", "+Math.round(a*n[1])+" ");r.exists(t.rendNode)||(t.rendNode=this.createPrim("path",t.id),this.appendChildPrim(t.rendNode,t.visProp.layer)),this._setAttr(t.rendNode,"stroked","true"),this._setAttr(t.rendNode,"strokecolor",t.visProp.strokecolor,1),this._setAttr(t.rendNode,"strokeweight",t.visProp.strokewidth),this._setAttr(t.rendNodeStroke,"opacity",100*t.visProp.strokeopacity+"%"),this.updatePathPrim(t.rendNode,h,t.board)},displayCopyright:function(t,e){var i,r;i=this.createNode("textbox"),i.style.position="absolute",this._setAttr(i,"id",this.container.id+"_"+"licenseText"),i.style.left=20,i.style.top=2,i.style.fontSize=e,i.style.color="#356AA0",i.style.fontFamily="Arial,Helvetica,sans-serif",this._setAttr(i,"opacity","30%"),i.style.filter="alpha(opacity = 30)",r=document.createTextNode(t),i.appendChild(r),this.appendChildPrim(i,0)},drawInternalText:function(t){var e;return e=this.createNode("textbox"),e.style.position="absolute",t.rendNodeText=document.createTextNode(""),e.appendChild(t.rendNodeText),this.appendChildPrim(e,9),e},updateInternalText:function(t){var e=t.plaintext;isNaN(t.coords.scrCoords[1]+t.coords.scrCoords[2])||("right"===t.visProp.anchorx?(t.rendNode.style.right=Math.floor(t.board.canvasWidth-t.coords.scrCoords[1])+"px",t.rendNode.style.left="auto"):"middle"===t.visProp.anchorx?(t.rendNode.style.left=Math.floor(t.coords.scrCoords[1]-.5*t.size[0])+"px",t.rendNode.style.right="auto"):(t.rendNode.style.left=Math.floor(t.coords.scrCoords[1])+"px",t.rendNode.style.right="auto"),t.rendNode.style.top="top"===t.visProp.anchory?Math.floor(t.coords.scrCoords[2]+this.vOffsetText)+"px":"middle"===t.visProp.anchory?Math.floor(t.coords.scrCoords[2]-.5*t.size[1]+this.vOffsetText)+"px":Math.floor(t.coords.scrCoords[2]-t.size[1]+this.vOffsetText)+"px"),t.htmlStr!==e&&(t.rendNodeText.data=e,t.htmlStr=e),this.transformImage(t,t.transformations)},drawImage:function(t){var e;e=this.container.ownerDocument.createElement("img"),e.style.position="absolute",this._setAttr(e,"id",this.container.id+"_"+t.id),this.container.appendChild(e),this.appendChildPrim(e,t.visProp.layer),e.style.filter="progid:DXImageTransform.Microsoft.Matrix(M11='1.0', sizingMethod='auto expand')",t.rendNode=e,this.updateImage(t)},transformImage:function(t,e){var r,s,n,a,h,l,c,d=t.rendNode,u=[],p=e.length;if(t.type===i.OBJECT_TYPE_TEXT&&t.updateSize(),p>0){for(c=""+t.rendNode.style.filter,c.match(/DXImageTransform/)||(d.style.filter="progid:DXImageTransform.Microsoft.Matrix(M11='1.0', sizingMethod='auto expand') "+c),r=this.joinTransforms(t,e),u[0]=o.matVecMult(r,t.coords.scrCoords),u[0][1]/=u[0][0],u[0][2]/=u[0][0],u[1]=o.matVecMult(r,[1,t.coords.scrCoords[1]+t.size[0],t.coords.scrCoords[2]]),u[1][1]/=u[1][0],u[1][2]/=u[1][0],u[2]=o.matVecMult(r,[1,t.coords.scrCoords[1]+t.size[0],t.coords.scrCoords[2]-t.size[1]]),u[2][1]/=u[2][0],u[2][2]/=u[2][0],u[3]=o.matVecMult(r,[1,t.coords.scrCoords[1],t.coords.scrCoords[2]-t.size[1]]),u[3][1]/=u[3][0],u[3][2]/=u[3][0],s=u[0][1],a=u[0][1],n=u[0][2],h=u[0][2],l=1;4>l;l++)s=Math.max(s,u[l][1]),a=Math.min(a,u[l][1]),n=Math.max(n,u[l][2]),h=Math.min(h,u[l][2]);d.style.left=Math.floor(a)+"px",d.style.top=Math.floor(h)+"px",d.filters.item(0).M11=r[1][1],d.filters.item(0).M12=r[1][2],d.filters.item(0).M21=r[2][1],d.filters.item(0).M22=r[2][2]}},updateImageURL:function(t){var e=r.evaluate(t.url);this._setAttr(t.rendNode,"src",e)},appendChildPrim:function(t,e){return r.exists(e)||(e=0),t.style.zIndex=e,this.container.appendChild(t),t},appendNodesToElement:function(t,e){("shape"===e||"path"===e||"polygon"===e)&&(t.rendNodePath=this.getElementById(t.id+"_path")),t.rendNodeFill=this.getElementById(t.id+"_fill"),t.rendNodeStroke=this.getElementById(t.id+"_stroke"),t.rendNodeShadow=this.getElementById(t.id+"_shadow"),t.rendNode=this.getElementById(t.id)
+},createPrim:function(t,e){var i,r,s=this.createNode("fill"),o=this.createNode("stroke"),n=this.createNode("shadow");return this._setAttr(s,"id",this.container.id+"_"+e+"_fill"),this._setAttr(o,"id",this.container.id+"_"+e+"_stroke"),this._setAttr(n,"id",this.container.id+"_"+e+"_shadow"),"circle"===t||"ellipse"===t?(i=this.createNode("oval"),i.appendChild(s),i.appendChild(o),i.appendChild(n)):"polygon"===t||"path"===t||"shape"===t||"line"===t?(i=this.createNode("shape"),i.appendChild(s),i.appendChild(o),i.appendChild(n),r=this.createNode("path"),this._setAttr(r,"id",this.container.id+"_"+e+"_path"),i.appendChild(r)):(i=this.createNode(t),i.appendChild(s),i.appendChild(o),i.appendChild(n)),i.style.position="absolute",i.style.left="0px",i.style.top="0px",this._setAttr(i,"id",this.container.id+"_"+e),i},remove:function(t){r.exists(t)&&t.removeNode(!0)},makeArrows:function(t){var e;(t.visPropOld.firstarrow!==t.visProp.firstarrow||t.visPropOld.lastarrow!==t.visProp.lastarrow)&&(t.visProp.firstarrow?(e=t.rendNodeStroke,this._setAttr(e,"startarrow","block"),this._setAttr(e,"startarrowlength","long")):(e=t.rendNodeStroke,r.exists(e)&&this._setAttr(e,"startarrow","none")),t.visProp.lastarrow?(e=t.rendNodeStroke,this._setAttr(e,"id",this.container.id+"_"+t.id+"stroke"),this._setAttr(e,"endarrow","block"),this._setAttr(e,"endarrowlength","long")):(e=t.rendNodeStroke,r.exists(e)&&this._setAttr(e,"endarrow","none")),t.visPropOld.firstarrow=t.visProp.firstarrow,t.visPropOld.lastarrow=t.visProp.lastarrow)},updateEllipsePrim:function(t,e,i,r,s){t.style.left=Math.floor(e-r)+"px",t.style.top=Math.floor(i-s)+"px",t.style.width=Math.floor(2*Math.abs(r))+"px",t.style.height=Math.floor(2*Math.abs(s))+"px"},updateLinePrim:function(t,e,i,r,s,o){var n,a=this.resolution;isNaN(e+i+r+s)||(n=["m ",Math.floor(a*e),", ",Math.floor(a*i)," l ",Math.floor(a*r),", ",Math.floor(a*s)],this.updatePathPrim(t,n,o))},updatePathPrim:function(t,e,i){var r=i.canvasWidth,s=i.canvasHeight;0>=e.length&&(e=["m 0,0"]),t.style.width=r,t.style.height=s,this._setAttr(t,"coordsize",[Math.floor(this.resolution*r),Math.floor(this.resolution*s)].join(",")),this._setAttr(t,"path",e.join(""))},updatePathStringPoint:function(t,e,i){var r=[],s=Math.round,o=t.coords.scrCoords,n=.5*e*Math.sqrt(3),a=.5*e,h=this.resolution;return"x"===i?r.push([" m ",s(h*(o[1]-e)),", ",s(h*(o[2]-e))," l ",s(h*(o[1]+e)),", ",s(h*(o[2]+e))," m ",s(h*(o[1]+e)),", ",s(h*(o[2]-e))," l ",s(h*(o[1]-e)),", ",s(h*(o[2]+e))].join("")):"+"===i?r.push([" m ",s(h*(o[1]-e)),", ",s(h*o[2])," l ",s(h*(o[1]+e)),", ",s(h*o[2])," m ",s(h*o[1]),", ",s(h*(o[2]-e))," l ",s(h*o[1]),", ",s(h*(o[2]+e))].join("")):"<>"===i?r.push([" m ",s(h*(o[1]-e)),", ",s(h*o[2])," l ",s(h*o[1]),", ",s(h*(o[2]+e))," l ",s(h*(o[1]+e)),", ",s(h*o[2])," l ",s(h*o[1]),", ",s(h*(o[2]-e))," x e "].join("")):"^"===i?r.push([" m ",s(h*o[1]),", ",s(h*(o[2]-e))," l ",s(h*(o[1]-n)),", ",s(h*(o[2]+a))," l ",s(h*(o[1]+n)),", ",s(h*(o[2]+a))," x e "].join("")):"v"===i?r.push([" m ",s(h*o[1]),", ",s(h*(o[2]+e))," l ",s(h*(o[1]-n)),", ",s(h*(o[2]-a))," l ",s(h*(o[1]+n)),", ",s(h*(o[2]-a))," x e "].join("")):">"===i?r.push([" m ",s(h*(o[1]+e)),", ",s(h*o[2])," l ",s(h*(o[1]-a)),", ",s(h*(o[2]-n))," l ",s(h*(o[1]-a)),", ",s(h*(o[2]+n))," l ",s(h*(o[1]+e)),", ",s(h*o[2])].join("")):"<"===i&&r.push([" m ",s(h*(o[1]-e)),", ",s(h*o[2])," l ",s(h*(o[1]+a)),", ",s(h*(o[2]-n))," l ",s(h*(o[1]+a)),", ",s(h*(o[2]+n))," x e "].join("")),r},updatePathStringPrim:function(t){var e,i,r=[],s=this.resolution,o=Math.round,a=" m ",h=" l ",l=" c ",c=a,d="plot"!==t.visProp.curvetype,u=Math.min(t.numberPoints,8192);if(0>=t.numberPoints)return"";if(u=Math.min(u,t.points.length),1===t.bezierDegree)for(d&&t.board.options.curve.RDPsmoothing&&(t.points=n.RamerDouglasPeuker(t.points,1)),e=0;u>e;e++)i=t.points[e].scrCoords,isNaN(i[1])||isNaN(i[2])?c=a:(i[1]>2e4?i[1]=2e4:-2e4>i[1]&&(i[1]=-2e4),i[2]>2e4?i[2]=2e4:-2e4>i[2]&&(i[2]=-2e4),r.push([c,o(s*i[1]),", ",o(s*i[2])].join("")),c=h);else if(3===t.bezierDegree)for(e=0;u>e;)i=t.points[e].scrCoords,isNaN(i[1])||isNaN(i[2])?c=a:(r.push([c,o(s*i[1]),", ",o(s*i[2])].join("")),c===l&&(e+=1,i=t.points[e].scrCoords,r.push([" ",o(s*i[1]),", ",o(s*i[2])].join("")),e+=1,i=t.points[e].scrCoords,r.push([" ",o(s*i[1]),", ",o(s*i[2])].join(""))),c=l),e+=1;return r.push(" e"),r},updatePathStringBezierPrim:function(t){var e,i,r,s,o,a,h=[],l=t.visProp.strokewidth,c=this.resolution,d=Math.round,u=" m ",p=" c ",f=u,m="plot"!==t.visProp.curvetype,b=Math.min(t.numberPoints,8192);if(0>=t.numberPoints)return"";for(m&&t.board.options.curve.RDPsmoothing&&(t.points=n.RamerDouglasPeuker(t.points,1)),b=Math.min(b,t.points.length),i=1;3>i;i++)for(f=u,e=0;b>e;e++)s=t.points[e].scrCoords,isNaN(s[1])||isNaN(s[2])?f=u:(s[1]>2e4?s[1]=2e4:-2e4>s[1]&&(s[1]=-2e4),s[2]>2e4?s[2]=2e4:-2e4>s[2]&&(s[2]=-2e4),f===u?h.push([f,d(c*s[1])," ",d(c*s[2])].join("")):(r=2*i,h.push([f,d(c*(o+.333*(s[1]-o)+l*(r*Math.random()-i)))," ",d(c*(a+.333*(s[2]-a)+l*(r*Math.random()-i)))," ",d(c*(o+.666*(s[1]-o)+l*(r*Math.random()-i)))," ",d(c*(a+.666*(s[2]-a)+l*(r*Math.random()-i)))," ",d(c*s[1])," ",d(c*s[2])].join(""))),f=p,o=s[1],a=s[2]);return h.push(" e"),h},updatePolygonPrim:function(t,e){var i,r,s=e.vertices.length,o=this.resolution,n=[];if(this._setAttr(t,"stroked","false"),r=e.vertices[0].coords.scrCoords,!isNaN(r[1]+r[2])){for(n.push(["m ",Math.floor(o*r[1]),",",Math.floor(o*r[2])," l "].join("")),i=1;s-1>i;i++){if(!e.vertices[i].isReal)return this.updatePathPrim(t,"",e.board),void 0;if(r=e.vertices[i].coords.scrCoords,isNaN(r[1]+r[2]))return;n.push(Math.floor(o*r[1])+","+Math.floor(o*r[2])),s-2>i&&n.push(", ")}n.push(" x e"),this.updatePathPrim(t,n,e.board)}},updateRectPrim:function(t,e,i,r,s){t.style.left=Math.floor(e)+"px",t.style.top=Math.floor(i)+"px",r>=0&&(t.style.width=r+"px"),s>=0&&(t.style.height=s+"px")},setPropertyPrim:function(t,e,i){var s,o="";switch(e){case"stroke":o="strokecolor";break;case"stroke-width":o="strokeweight";break;case"stroke-dasharray":o="dashstyle"}""!==o&&(s=r.evaluate(i),this._setAttr(t,o,s))},show:function(t){t&&t.rendNode&&(t.rendNode.style.visibility="inherit")},hide:function(t){t&&t.rendNode&&(t.rendNode.style.visibility="hidden")},setDashStyle:function(t,e){var i;e.dash>=0&&(i=t.rendNodeStroke,this._setAttr(i,"dashstyle",this.dashArray[e.dash]))},setGradient:function(t){var e=t.rendNodeFill;"linear"===t.visProp.gradient?(this._setAttr(e,"type","gradient"),this._setAttr(e,"color2",t.visProp.gradientsecondcolor),this._setAttr(e,"opacity2",t.visProp.gradientsecondopacity),this._setAttr(e,"angle",t.visProp.gradientangle)):"radial"===t.visProp.gradient?(this._setAttr(e,"type","gradientradial"),this._setAttr(e,"color2",t.visProp.gradientsecondcolor),this._setAttr(e,"opacity2",t.visProp.gradientsecondopacity),this._setAttr(e,"focusposition",100*t.visProp.gradientpositionx+"%,"+100*t.visProp.gradientpositiony+"%"),this._setAttr(e,"focussize","0,0")):this._setAttr(e,"type","solid")},setObjectFillColor:function(t,e,o){var n,a,h,l,c=r.evaluate(e),d=r.evaluate(o);t.rendNode,d=d>0?d:0,(t.visPropOld.fillcolor!==c||t.visPropOld.fillopacity!==d)&&(r.exists(c)&&c!==!1&&(9!==c.length?(n=c,h=d):(a=s.rgba2rgbo(c),n=a[0],h=d*a[1]),"none"===n||n===!1?this._setAttr(t.rendNode,"filled","false"):(this._setAttr(t.rendNode,"filled","true"),this._setAttr(t.rendNode,"fillcolor",n),r.exists(h)&&t.rendNodeFill&&this._setAttr(t.rendNodeFill,"opacity",100*h+"%")),t.type===i.OBJECT_TYPE_IMAGE&&(l=""+t.rendNode.style.filter,l.match(/alpha/)?t.rendNode.style.filter=l.replace(/alpha\(opacity *= *[0-9\.]+\)/,"alpha(opacity = "+100*h+")"):t.rendNode.style.filter+=" alpha(opacity = "+100*h+")")),t.visPropOld.fillcolor=c,t.visPropOld.fillopacity=d)},setObjectStrokeColor:function(t,e,s){var o,n,a,h,l=r.evaluate(e),c=r.evaluate(s),d=t.rendNode;c=c>0?c:0,(t.visPropOld.strokecolor!==l||t.visPropOld.strokeopacity!==c)&&(r.exists(l)&&l!==!1&&(9!==l.length?(o=l,a=c):(n=e.rgba2rgbo(l),o=n[0],a=c*n[1]),t.type===i.OBJECT_TYPE_TEXT?(a=Math.round(100*a),d.style.filter=" alpha(opacity = "+a+")",d.style.color=o):(o!==!1&&(this._setAttr(d,"stroked","true"),this._setAttr(d,"strokecolor",o)),h=t.rendNodeStroke,r.exists(a)&&t.type!==i.OBJECT_TYPE_IMAGE&&this._setAttr(h,"opacity",100*a+"%"))),t.visPropOld.strokecolor=l,t.visPropOld.strokeopacity=c)},setObjectStrokeWidth:function(t,e){var i,s=r.evaluate(e);isNaN(s)||t.visPropOld.strokewidth===s||(i=t.rendNode,this.setPropertyPrim(i,"stroked","true"),r.exists(s)&&this.setPropertyPrim(i,"stroke-width",s),t.visPropOld.strokewidth=s)},setShadow:function(t){var e=t.rendNodeShadow;e&&t.visPropOld.shadow!==t.visProp.shadow&&(t.visProp.shadow?(this._setAttr(e,"On","True"),this._setAttr(e,"Offset","3pt,3pt"),this._setAttr(e,"Opacity","60%"),this._setAttr(e,"Color","#aaaaaa")):this._setAttr(e,"On","False"),t.visPropOld.shadow=t.visProp.shadow)},suspendRedraw:function(){this.container.style.display="none"},unsuspendRedraw:function(){this.container.style.display=""}}),t.VMLRenderer}),define("renderer/canvas",["jxg","renderer/abstract","base/constants","utils/env","utils/type","utils/uuid","utils/color","base/coords","math/math","math/geometry","math/numerics"],function(t,e,i,r,s,o,n,a,h,l,c){return t.CanvasRenderer=function(t,e){this.type="canvas",this.canvasRoot=null,this.suspendHandle=null,this.canvasId=o.genUUID(),this.canvasNamespace=null,r.isBrowser?(this.container=t,this.container.style.MozUserSelect="none",this.container.style.overflow="hidden",""===this.container.style.position&&(this.container.style.position="relative"),this.container.innerHTML=['<canvas id="',this.canvasId,'" width="',e.width,'px" height="',e.height,'px"><',"/canvas>"].join(""),this.canvasRoot=document.getElementById(this.canvasId),this.context=this.canvasRoot.getContext("2d")):r.isNode()&&(this.canvasId="object"==typeof module?module.require("canvas"):require("canvas"),this.canvasRoot=new this.canvasId(500,500),this.context=this.canvasRoot.getContext("2d")),this.dashArray=[[2,2],[5,5],[10,10],[20,20],[20,10,10,10],[20,5,10,5]]},t.CanvasRenderer.prototype=new e,t.extend(t.CanvasRenderer.prototype,{_drawFilledPolygon:function(t){var e,i=t.length,r=this.context;if(i>0){for(r.beginPath(),r.moveTo(t[0][0],t[0][1]),e=0;i>e;e++)e>0&&r.lineTo(t[e][0],t[e][1]);r.lineTo(t[0][0],t[0][1]),r.fill()}},_fill:function(t){var e=this.context;e.save(),this._setColor(t,"fill")&&e.fill(),e.restore()},_rotatePoint:function(t,e,i){return[e*Math.cos(t)-i*Math.sin(t),e*Math.sin(t)+i*Math.cos(t)]},_rotateShape:function(t,e){var i,r=[],s=t.length;if(0>=s)return t;for(i=0;s>i;i++)r.push(this._rotatePoint(e,t[i][0],t[i][1]));return r},_setColor:function(t,e,i){var r,o,a,h,l,c,d=!0,u=!1,p=t.visProp;return e=e||"stroke",i=i||e,s.exists(t.board)&&s.exists(t.board.highlightedObjects)||(u=!0),r=!u&&s.exists(t.board.highlightedObjects[t.id])?"highlight":"",o=s.evaluate(p[r+e+"color"]),"none"!==o&&o!==!1?(l=s.evaluate(p[r+e+"opacity"]),l=l>0?l:0,9!==o.length?(h=o,c=l):(a=n.rgba2rgbo(o),h=a[0],c=l*a[1]),this.context.globalAlpha=c,this.context[i+"Style"]=h):d=!1,"stroke"!==e||isNaN(parseFloat(p.strokewidth))||(this.context.lineWidth=parseFloat(p.strokewidth)),d},_stroke:function(t){var e=this.context;e.save(),t.visProp.dash>0?e.setLineDash&&e.setLineDash(this.dashArray[t.visProp.dash]):this.context.lineDashArray=[],this._setColor(t,"stroke")&&e.stroke(),e.restore()},_translateShape:function(t,e,i){var r,s=[],o=t.length;if(0>=o)return t;for(r=0;o>r;r++)s.push([t[r][0]+e,t[r][1]+i]);return s},drawPoint:function(t){var e=t.visProp.face,i=t.visProp.size,r=t.coords.scrCoords,s=.5*i*Math.sqrt(3),o=.5*i,n=parseFloat(t.visProp.strokewidth)/2,a=this.context;switch(e){case"cross":case"x":a.beginPath(),a.moveTo(r[1]-i,r[2]-i),a.lineTo(r[1]+i,r[2]+i),a.moveTo(r[1]+i,r[2]-i),a.lineTo(r[1]-i,r[2]+i),a.closePath(),this._stroke(t);break;case"circle":case"o":a.beginPath(),a.arc(r[1],r[2],i+1+n,0,2*Math.PI,!1),a.closePath(),this._fill(t),this._stroke(t);break;case"square":case"[]":if(0>=i)break;a.save(),this._setColor(t,"stroke","fill")&&a.fillRect(r[1]-i-n,r[2]-i-n,2*i+3*n,2*i+3*n),a.restore(),a.save(),this._setColor(t,"fill"),a.fillRect(r[1]-i+n,r[2]-i+n,2*i-n,2*i-n),a.restore();break;case"plus":case"+":a.beginPath(),a.moveTo(r[1]-i,r[2]),a.lineTo(r[1]+i,r[2]),a.moveTo(r[1],r[2]-i),a.lineTo(r[1],r[2]+i),a.closePath(),this._stroke(t);break;case"diamond":case"<>":a.beginPath(),a.moveTo(r[1]-i,r[2]),a.lineTo(r[1],r[2]+i),a.lineTo(r[1]+i,r[2]),a.lineTo(r[1],r[2]-i),a.closePath(),this._fill(t),this._stroke(t);break;case"triangleup":case"a":case"^":a.beginPath(),a.moveTo(r[1],r[2]-i),a.lineTo(r[1]-s,r[2]+o),a.lineTo(r[1]+s,r[2]+o),a.closePath(),this._fill(t),this._stroke(t);break;case"triangledown":case"v":a.beginPath(),a.moveTo(r[1],r[2]+i),a.lineTo(r[1]-s,r[2]-o),a.lineTo(r[1]+s,r[2]-o),a.closePath(),this._fill(t),this._stroke(t);break;case"triangleleft":case"<":a.beginPath(),a.moveTo(r[1]-i,r[2]),a.lineTo(r[1]+o,r[2]-s),a.lineTo(r[1]+o,r[2]+s),a.closePath(),this.fill(t),this._stroke(t);break;case"triangleright":case">":a.beginPath(),a.moveTo(r[1]+i,r[2]),a.lineTo(r[1]-o,r[2]-s),a.lineTo(r[1]-o,r[2]+s),a.closePath(),this._fill(t),this._stroke(t)}},updatePoint:function(t){this.drawPoint(t)},drawLine:function(t){var e,r,s,o,n,c,d=new a(i.COORDS_BY_USER,t.point1.coords.usrCoords,t.board),u=new a(i.COORDS_BY_USER,t.point2.coords.usrCoords,t.board),p=null;(t.visProp.firstarrow||t.visProp.lastarrow)&&(p=-4),l.calcStraight(t,d,u,p),s=o=n=c=0,e=Math.max(3*parseInt(t.visProp.strokewidth,10),10),t.visProp.lastarrow&&(r=d.distance(i.COORDS_BY_SCREEN,u),r>h.eps&&(n=(u.scrCoords[1]-d.scrCoords[1])*e/r,c=(u.scrCoords[2]-d.scrCoords[2])*e/r)),t.visProp.firstarrow&&(r=d.distance(i.COORDS_BY_SCREEN,u),r>h.eps&&(s=(u.scrCoords[1]-d.scrCoords[1])*e/r,o=(u.scrCoords[2]-d.scrCoords[2])*e/r)),this.context.beginPath(),this.context.moveTo(d.scrCoords[1]+s,d.scrCoords[2]+o),this.context.lineTo(u.scrCoords[1]-n,u.scrCoords[2]-c),this._stroke(t),this.makeArrows(t,d,u)},updateLine:function(t){this.drawLine(t)},drawTicks:function(){},updateTicks:function(t){var e,i,r,s,o=t.ticks.length,n=this.context;for(n.beginPath(),e=0;o>e;e++)i=t.ticks[e],r=i[0],s=i[1],n.moveTo(r[0],s[0]),n.lineTo(r[1],s[1]);for(e=0;o>e;e++)i=t.ticks[e].scrCoords,t.ticks[e].major&&(t.board.needsFullUpdate||t.needsRegularUpdate)&&t.labels[e]&&t.labels[e].visProp.visible&&this.updateText(t.labels[e]);this._stroke(t)},drawCurve:function(t){t.visProp.handdrawing?this.updatePathStringBezierPrim(t):this.updatePathStringPrim(t)},updateCurve:function(t){this.drawCurve(t)},drawEllipse:function(t){var e=t.center.coords.scrCoords[1],i=t.center.coords.scrCoords[2],r=t.board.unitX,s=t.board.unitY,o=2*t.Radius(),n=2*t.Radius(),a=o*r,h=n*s,l=e-a/2,c=i-h/2,d=.5522848*(a/2),u=.5522848*(h/2),p=l+a,f=c+h,m=l+a/2,b=c+h/2,g=this.context;o>0&&n>0&&!isNaN(e+i)&&(g.beginPath(),g.moveTo(l,b),g.bezierCurveTo(l,b-u,m-d,c,m,c),g.bezierCurveTo(m+d,c,p,b-u,p,b),g.bezierCurveTo(p,b+u,m+d,f,m,f),g.bezierCurveTo(m-d,f,l,b+u,l,b),g.closePath(),this._fill(t),this._stroke(t))},updateEllipse:function(t){return this.drawEllipse(t)},displayCopyright:function(t,e){var i=this.context;i.save(),i.font=e+"px Arial",i.fillStyle="#aaa",i.lineWidth=.5,i.fillText(t,10,2+e),i.restore()},drawInternalText:function(t){var e,i=this.context;return i.save(),this._setColor(t,"stroke","fill")&&!isNaN(t.coords.scrCoords[1]+t.coords.scrCoords[2])&&(t.visProp.fontsize&&("function"==typeof t.visProp.fontsize?(e=t.visProp.fontsize(),i.font=(e>0?e:0)+"px Arial"):i.font=t.visProp.fontsize+"px Arial"),this.transformImage(t,t.transformations),"left"===t.visProp.anchorx?i.textAlign="left":"right"===t.visProp.anchorx?i.textAlign="right":"middle"===t.visProp.anchorx&&(i.textAlign="center"),"bottom"===t.visProp.anchory?i.textBaseline="bottom":"top"===t.visProp.anchory?i.textBaseline="top":"middle"===t.visProp.anchory&&(i.textBaseline="middle"),i.fillText(t.plaintext,t.coords.scrCoords[1],t.coords.scrCoords[2])),i.restore(),null},updateInternalText:function(t){this.drawInternalText(t)},setObjectStrokeColor:function(t,e,r){var o,a,h,l,c=s.evaluate(e),d=s.evaluate(r);d=d>0?d:0,(t.visPropOld.strokecolor!==c||t.visPropOld.strokeopacity!==d)&&(s.exists(c)&&c!==!1&&(9!==c.length?(o=c,h=d):(a=n.rgba2rgbo(c),o=a[0],h=d*a[1]),l=t.rendNode,t.type===i.OBJECT_TYPE_TEXT&&"html"===t.visProp.display&&(l.style.color=o,l.style.opacity=h)),t.visPropOld.strokecolor=c,t.visPropOld.strokeopacity=d)},drawImage:function(t){t.rendNode=new Image,t._src="",this.updateImage(t)},updateImage:function(t){var e=this.context,i=s.evaluate(t.visProp.fillopacity),r=s.bind(function(){t.imgIsLoaded=!0,0>=t.size[0]||0>=t.size[1]||(e.save(),e.globalAlpha=i,this.transformImage(t,t.transformations),e.drawImage(t.rendNode,t.coords.scrCoords[1],t.coords.scrCoords[2]-t.size[1],t.size[0],t.size[1]),e.restore())},this);this.updateImageURL(t)?t.rendNode.onload=r:t.imgIsLoaded&&r()},transformImage:function(t,e){var i,r=e.length,s=this.context;r>0&&(i=this.joinTransforms(t,e),Math.abs(c.det(i))>=h.eps&&s.transform(i[1][1],i[2][1],i[1][2],i[2][2],i[1][0],i[2][0]))},updateImageURL:function(t){var e;return e=s.evaluate(t.url),t._src!==e?(t.imgIsLoaded=!1,t.rendNode.src=e,t._src=e,!0):!1},remove:function(t){s.exists(t)&&s.exists(t.parentNode)&&t.parentNode.removeChild(t)},makeArrows:function(t,e,r){var s,o,n,a,h,l=Math.max(3*t.visProp.strokewidth,10),c=[[-l,.5*-l],[0,0],[-l,.5*l]],d=[[l,.5*-l],[0,0],[l,.5*l]],u=this.context;if("none"!==t.visProp.strokecolor&&(t.visProp.lastarrow||t.visProp.firstarrow)){if(t.elementClass!==i.OBJECT_CLASS_LINE)return;s=e.scrCoords[1],o=e.scrCoords[2],n=r.scrCoords[1],a=r.scrCoords[2],u.save(),this._setColor(t,"stroke","fill")&&(h=Math.atan2(a-o,n-s),t.visProp.lastarrow&&this._drawFilledPolygon(this._translateShape(this._rotateShape(c,h),n,a)),t.visProp.firstarrow&&this._drawFilledPolygon(this._translateShape(this._rotateShape(d,h),s,o))),u.restore()}},updatePathStringPrim:function(t){var e,i,r,s,o,n="M",a="L",h="C",l=n,d=5e3,u="plot"!==t.visProp.curvetype,p=this.context;if(!(0>=t.numberPoints)){if(o=Math.min(t.points.length,t.numberPoints),p.beginPath(),1===t.bezierDegree)for(u&&t.board.options.curve.RDPsmoothing&&(t.points=c.RamerDouglasPeuker(t.points,.5)),e=0;o>e;e++)i=t.points[e].scrCoords,isNaN(i[1])||isNaN(i[2])?l=n:(i[1]>d?i[1]=d:-d>i[1]&&(i[1]=-d),i[2]>d?i[2]=d:-d>i[2]&&(i[2]=-d),l===n?p.moveTo(i[1],i[2]):p.lineTo(i[1],i[2]),l=a);else if(3===t.bezierDegree)for(e=0;o>e;)i=t.points[e].scrCoords,isNaN(i[1])||isNaN(i[2])?l=n:(l===n?p.moveTo(i[1],i[2]):(e+=1,r=t.points[e].scrCoords,e+=1,s=t.points[e].scrCoords,p.bezierCurveTo(i[1],i[2],r[1],r[2],s[1],s[2])),l=h),e+=1;this._fill(t),this._stroke(t)}},updatePathStringBezierPrim:function(t){var e,i,r,s,o,n,a,h="M",l="C",d=h,u=5e3,p=t.visProp.strokewidth,f="plot"!==t.visProp.curvetype,m=this.context;if(!(0>=t.numberPoints)){for(f&&t.board.options.curve.RDPsmoothing&&(t.points=c.RamerDouglasPeuker(t.points,.5)),a=Math.min(t.points.length,t.numberPoints),m.beginPath(),i=1;3>i;i++)for(d=h,e=0;a>e;e++)s=t.points[e].scrCoords,isNaN(s[1])||isNaN(s[2])?d=h:(s[1]>u?s[1]=u:-u>s[1]&&(s[1]=-u),s[2]>u?s[2]=u:-u>s[2]&&(s[2]=-u),d===h?m.moveTo(s[1],s[2]):(r=2*i,m.bezierCurveTo(o+.333*(s[1]-o)+p*(r*Math.random()-i),n+.333*(s[2]-n)+p*(r*Math.random()-i),o+.666*(s[1]-o)+p*(r*Math.random()-i),n+.666*(s[2]-n)+p*(r*Math.random()-i),s[1],s[2])),d=l,o=s[1],n=s[2]);this._fill(t),this._stroke(t)}},updatePolygonPrim:function(t,e){var i,r,s,o=e.vertices.length,n=this.context,a=!0;if(!(0>=o)){for(n.beginPath(),r=0;!e.vertices[r].isReal&&o-1>r;)r++,a=!1;for(i=e.vertices[r].coords.scrCoords,n.moveTo(i[1],i[2]),s=r;o-1>s;s++)e.vertices[s].isReal||(a=!1),i=e.vertices[s].coords.scrCoords,n.lineTo(i[1],i[2]);n.closePath(),a&&this._fill(e)}},show:function(t){s.exists(t.rendNode)&&(t.rendNode.style.visibility="inherit")},hide:function(t){s.exists(t.rendNode)&&(t.rendNode.style.visibility="hidden")},setGradient:function(t){var e,i;i=s.evaluate(t.visProp.fillopacity),i=i>0?i:0,e=s.evaluate(t.visProp.fillcolor)},setShadow:function(t){t.visPropOld.shadow!==t.visProp.shadow&&(t.visPropOld.shadow=t.visProp.shadow)},highlight:function(t){return t.type===i.OBJECT_TYPE_TEXT&&"html"===t.visProp.display?this.updateTextStyle(t,!0):(t.board.prepareUpdate(),t.board.renderer.suspendRedraw(t.board),t.board.updateRenderer(),t.board.renderer.unsuspendRedraw()),this},noHighlight:function(t){return t.type===i.OBJECT_TYPE_TEXT&&"html"===t.visProp.display?this.updateTextStyle(t,!1):(t.board.prepareUpdate(),t.board.renderer.suspendRedraw(t.board),t.board.updateRenderer(),t.board.renderer.unsuspendRedraw()),this},suspendRedraw:function(e){this.context.save(),this.context.clearRect(0,0,this.canvasRoot.width,this.canvasRoot.height),e&&e.showCopyright&&this.displayCopyright(t.licenseText,12)},unsuspendRedraw:function(){this.context.restore()},resize:function(t,e){this.container?(this.canvasRoot.style.width=parseFloat(t)+"px",this.canvasRoot.style.height=parseFloat(e)+"px",this.canvasRoot.setAttribute("width",parseFloat(t)+"px"),this.canvasRoot.setAttribute("height",parseFloat(e)+"px")):(this.canvasRoot.width=parseFloat(t),this.canvasRoot.height=parseFloat(e))},removeToInsertLater:function(){return function(){}}}),t.CanvasRenderer}),define("jsxgraph",["jxg","utils/env","utils/type","base/board","reader/file","options","renderer/svg","renderer/vml","renderer/canvas","renderer/no"],function(t,e,i,r,s,o,n,a,h,l){return t.JSXGraph={rendererType:function(){return o.renderer="no",e.supportsVML()&&(o.renderer="vml",document.onmousemove=function(){var t;return document.body&&(t=document.body.scrollLeft,t+=document.body.scrollTop),t}),e.supportsCanvas()&&(o.renderer="canvas"),e.supportsSVG()&&(o.renderer="svg"),e.isNode()&&e.supportsCanvas()&&(o.renderer="canvas"),(e.isNode()||"no"===o.renderer)&&(o.text.display="internal",o.infobox.display="internal"),o.renderer}(),initRenderer:function(t,e){var i,r;if("object"==typeof document&&null!==t)for(i=document.getElementById(t);i.firstChild;)i.removeChild(i.firstChild);else i=t;return r="svg"===o.renderer?new n(i,e):"vml"===o.renderer?new a(i):"canvas"===o.renderer?new h(i,e):new l},initBoard:function(s,n){var a,h,l,c,d,u,p,f,m,b,g,v;return f=e.getDimensions(s),n=n||{},b=i.copyAttributes(n,o,"board"),b.zoom=i.copyAttributes(b,o,"board","zoom"),b.pan=i.copyAttributes(b,o,"board","pan"),b.unitx||b.unity?(a=i.def(b.originx,150),h=i.def(b.originy,150),l=i.def(b.unitx,50),c=i.def(b.unity,50)):(m=b.boundingbox,u=parseInt(f.width,10),p=parseInt(f.height,10),b.keepaspectratio?(l=u/(m[2]-m[0]),c=p/(m[1]-m[3]),Math.abs(l)<Math.abs(c)?c=Math.abs(l)*c/Math.abs(c):l=Math.abs(c)*l/Math.abs(l)):(l=u/(m[2]-m[0]),c=p/(m[1]-m[3])),a=-l*m[0],h=c*m[1]),d=this.initRenderer(s,f),v=new r(s,d,"",[a,h],b.zoomfactor*b.zoomx,b.zoomfactor*b.zoomy,l,c,f.width,f.height,b),t.boards[v.id]=v,t.boards[v.id]=v,v.resizeContainer(f.width,f.height,!0),v.suspendUpdate(),v.initInfobox(),b.axis&&(g="object"==typeof b.axis?b.axis:{ticks:{drawZero:!0}},v.defaultAxes={},v.defaultAxes.x=v.create("axis",[[0,0],[1,0]],g),v.defaultAxes.y=v.create("axis",[[0,0],[0,1]],g)),b.grid&&v.create("grid",[],"object"==typeof b.grid?b.grid:{}),b.shownavigation&&v.renderer.drawZoomBar(v),v.unsuspendUpdate(),v},loadBoardFromFile:function(n,a,h,l,c){var d,u,p,f;return f=e.getDimensions(n),u=this.initRenderer(n,f),l=l||{},d=i.copyAttributes(l,o,"board"),d.zoom=i.copyAttributes(l,o,"board","zoom"),d.pan=i.copyAttributes(l,o,"board","pan"),p=new r(n,u,"",[150,150],1,1,50,50,f.width,f.height,d),p.initInfobox(),p.resizeContainer(f.width,f.height,!0),s.parseFileContent(a,p,h,!0,c),p.attr.shownavigation&&p.renderer.drawZoomBar(p),t.boards[p.id]=p,p},loadBoardFromString:function(n,a,h,l,c){var d,u,p,f;return p=e.getDimensions(n),u=this.initRenderer(n,p),l=l||{},d=i.copyAttributes(l,o,"board"),d.zoom=i.copyAttributes(l,o,"board","zoom"),d.pan=i.copyAttributes(l,o,"board","pan"),f=new r(n,u,"",[150,150],1,1,50,50,p.width,p.height,d),f.initInfobox(),f.resizeContainer(p.width,p.height,!0),s.parseString(a,f,h,!0,c),f.attr.shownavigation&&f.renderer.drawZoomBar(f),t.boards[f.id]=f,f},freeBoard:function(e){var i;"string"==typeof e&&(e=t.boards[e]),e.removeEventHandlers(),e.suspendUpdate();for(i in e.objects)e.objects.hasOwnProperty(i)&&e.objects[i].remove();for(;e.containerObj.firstChild;)e.containerObj.removeChild(e.containerObj.firstChild);for(i in e.objects)e.objects.hasOwnProperty(i)&&delete e.objects[i];delete e.renderer,e.jc.creator.clearCache(),delete e.jc,delete t.boards[e.id]},registerElement:function(e,i){t.registerElement(e,i)},unregisterElement:function(){throw Error("Unimplemented")}},e.isBrowser&&"object"==typeof window&&"object"==typeof document&&e.addEvent(window,"load",function(){var e,r,s,o,n,a,h,l,c,d,u,p,f=document.getElementsByTagName("script"),m=function(e,i,r){var s=t.JSXGraph.initBoard(n,{boundingbox:r,keepaspectratio:!0,grid:u,axis:d,showReload:!0});if(i.toLowerCase().indexOf("script")>-1)s.construct(e);else try{s.jc.parse(e)}catch(o){t.debug(o)}return s},b=function(e,i,r,s){return function(){var o;t.JSXGraph.freeBoard(e),o=m(i,r,s),o.reload=b(o,i,r,s)}};for(r=0;f.length>r;r++)if(e=f[r].getAttribute("type",!1),i.exists(e)&&("text/jessiescript"===e.toLowerCase()||"jessiescript"===e.toLowerCase()||"text/jessiecode"===e.toLowerCase()||"jessiecode"===e.toLowerCase())){if(h=f[r].getAttribute("width",!1)||"500px",l=f[r].getAttribute("height",!1)||"500px",c=f[r].getAttribute("boundingbox",!1)||"-5, 5, 5, -5",n=f[r].getAttribute("container",!1),c=c.split(","),4!==c.length)c=[-5,5,5,-5];else for(s=0;c.length>s;s++)c[s]=parseFloat(c[s]);if(d=i.str2Bool(f[r].getAttribute("axis",!1)||"false"),u=i.str2Bool(f[r].getAttribute("grid",!1)||"false"),i.exists(n))o=document.getElementById(n);else{n="jessiescript_autgen_jxg_"+r,o=document.createElement("div"),o.setAttribute("id",n),o.setAttribute("style","width:"+h+"; height:"+l+"; float:left"),o.setAttribute("class","jxgbox");try{document.body.insertBefore(o,f[r])}catch(g){"object"==typeof jQuery&&jQuery(o).insertBefore(f[r])}}document.getElementById(n)?(p=f[r].innerHTML,p=p.replace(/<!\[CDATA\[/g,"").replace(/\]\]>/g,""),f[r].innerHTML=p,a=m(p,e,c),a.reload=b(a,p,e,c)):t.debug("JSXGraph: Apparently the div injection failed. Can't create a board, sorry.")}},window),t.JSXGraph}),define("base/group",["jxg","base/constants","base/element","math/math","utils/type"],function(t,e,i,r,s){return t.Group=function(t,i,r,o){var n,a,h,l;for(this.board=t,this.objects={},n=this.board.numObjects,this.board.numObjects+=1,this.id=""!==i&&s.exists(i)?i:this.board.id+"Group"+n,this.board.groups[this.id]=this,this.type=e.OBJECT_TYPE_POINT,this.elementClass=e.OBJECT_CLASS_POINT,this.name=""!==r&&s.exists(r)?r:"group_"+this.board.generateName(this),delete this.type,this.coords={},a=s.isArray(o)?o:Array.prototype.slice.call(arguments,3),h=0;a.length>h;h++)l=this.board.select(a[h]),l.visProp.fixed||l.type!==e.OBJECT_TYPE_POINT&&l.type!==e.OBJECT_TYPE_GLIDER||(0!==l.group.length?this.addGroup(l.group[l.group.length-1]):this.addPoint(l));this.methodMap={ungroup:"ungroup",add:"addPoint",addPoint:"addPoint",addPoints:"addPoints",addGroup:"addGroup",remove:"removePoint",removePoint:"removePoint",setAttribute:"setAttribute",setProperty:"setAttribute"}},t.extend(t.Group.prototype,{ungroup:function(){var t;for(t in this.objects)this.objects.hasOwnProperty(t)&&(s.isArray(this.objects[t].point.group)&&this.objects[t].point.group[this.objects[t].point.group.length-1]===this&&this.objects[t].point.group.pop(),this.removePoint(this.objects[t].point))},update:function(t){var i,o,n,a,h=null;for(i in this.objects)if(this.objects.hasOwnProperty(i)&&(h=this.objects[i].point,h.coords.distance(e.COORDS_BY_USER,this.coords[i])>r.eps)){o=[h.coords.usrCoords[1]-this.coords[h.id].usrCoords[1],h.coords.usrCoords[2]-this.coords[h.id].usrCoords[2]],n=h;break}if(s.exists(n)){for(i in this.objects)this.objects.hasOwnProperty(i)&&(s.exists(this.board.objects[i])?(h=this.objects[i].point,h.id!==n.id&&h.coords.setCoordinates(e.COORDS_BY_USER,[this.coords[i].usrCoords[1]+o[0],this.coords[i].usrCoords[2]+o[1]])):delete this.objects[i],this.coords[h.id]={usrCoords:[h.coords.usrCoords[0],h.coords.usrCoords[1],h.coords.usrCoords[2]]});for(i in this.objects)if(this.objects.hasOwnProperty(i))for(a in this.objects[i].descendants)this.objects[i].descendants.hasOwnProperty(a)&&(this.objects[i].descendants.needsUpdate=this.objects[i].descendants.needsRegularUpdate||this.board.needsFullUpdate);this.board.updateElements(t)}return this},addPoint:function(t){this.objects[t.id]={point:t},this.coords[t.id]={usrCoords:[t.coords.usrCoords[0],t.coords.usrCoords[1],t.coords.usrCoords[2]]}},addPoints:function(t){var e;for(e=0;t.length>e;e++)this.addPoint(t[e])},addGroup:function(t){var e;for(e in t.objects)t.objects.hasOwnProperty(e)&&this.addPoint(t.objects[e].point)},removePoint:function(t){delete this.objects[t.id]},setProperty:t.shortcut(t.Group.prototype,"setAttribute"),setAttribute:function(){var t;for(t in this.objects)this.objects.hasOwnProperty(t)&&this.objects[t].point.setAttribute.apply(this.objects[t].point,arguments)}}),t.createGroup=function(e,i,r){var s,o=new t.Group(e,r.id,r.name,i);for(o.elType="group",o.parents=[],s=0;i.length>s;s++)o.parents.push(i[s].id);return o},t.registerElement("group",t.createGroup),{Group:t.Group,createGroup:t.createGroup}}),define("element/conic",["jxg","base/constants","base/coords","math/math","math/numerics","math/geometry","utils/type","base/point","base/curve"],function(t,e,i,r,s,o,n){return t.createEllipse=function(t,r,s){var o,a,h,l,c,d,u,p=[],f=n.copyAttributes(s,t.options,"conic","foci"),m=n.copyAttributes(s,t.options,"conic");for(d=0;2>d;d++)if(r[d].length>1)p[d]=t.create("point",r[d],f);else if(n.isPoint(r[d]))p[d]=t.select(r[d]);else if("function"==typeof r[d]&&r[d]().elementClass===e.OBJECT_CLASS_POINT)p[d]=r[d]();else{if(!n.isString(r[d]))throw Error("JSXGraph: Can't create Ellipse with parent types '"+typeof r[0]+"' and '"+typeof r[1]+"'."+"\nPossible parent types: [point,point,point], [point,point,number|function]");p[d]=t.select(r[d])}if(n.isNumber(r[2]))c=n.createFunction(r[2],t);else if("function"==typeof r[2]&&n.isNumber(r[2]()))c=r[2];else{if(n.isPoint(r[2]))l=t.select(r[2]);else if(r[2].length>1)l=t.create("point",r[2],f);else if("function"==typeof r[2]&&r[2]().elementClass===e.OBJECT_CLASS_POINT)l=r[2]();else{if(!n.isString(r[2]))throw Error("JSXGraph: Can't create Ellipse with parent types '"+typeof r[0]+"' and '"+typeof r[1]+"' and '"+typeof r[2]+"'."+"\nPossible parent types: [point,point,point], [point,point,number|function]");l=t.select(r[2])}c=function(){return l.Dist(p[0])+l.Dist(p[1])}}for(n.exists(r[4])||(r[4]=2*Math.PI),n.exists(r[3])||(r[3]=0),h=t.create("point",[function(){return.5*(p[0].X()+p[1].X())},function(){return.5*(p[0].Y()+p[1].Y())}],f),a=t.create("curve",[function(){return 0},function(){return 0},r[3],r[4]],m),a.majorAxis=c,u=a.hasPoint,o=function(t,e){var i,r,s,o,n,h,l,d,u;e||(i=c(),r=i*i,s=p[0].X(),o=p[0].Y(),n=p[1].X(),h=p[1].Y(),l=s-n,d=o-h,u=(r-s*s-o*o+n*n+h*h)/(2*i),a.quadraticform=[[u*u-n*n-h*h,u*l/i+n,u*d/i+h],[u*l/i+n,l*l/r-1,l*d/r],[u*d/i+h,l*d/r,d*d/r-1]])},a.X=function(t,e){var i=c(),r=p[1].Dist(p[0]),s=.5*(r*r-i*i)/(r*Math.cos(t)-i),n=Math.atan2(p[1].Y()-p[0].Y(),p[1].X()-p[0].X());return e||o(t,e),p[0].X()+Math.cos(n+t)*s},a.Y=function(t){var e=c(),i=p[1].Dist(p[0]),r=.5*(i*i-e*e)/(i*Math.cos(t)-e),s=Math.atan2(p[1].Y()-p[0].Y(),p[1].X()-p[0].X());return p[0].Y()+Math.sin(s+t)*r},a.midpoint=h,a.type=e.OBJECT_TYPE_CONIC,a.hasPoint=function(t,r){var s,o,n,a,h;return this.visProp.hasinnerpoints?(s=p[0].coords,o=p[1].coords,n=this.majorAxis(),a=new i(e.COORDS_BY_SCREEN,[t,r],this.board),h=a.distance(e.COORDS_BY_USER,s)+a.distance(e.COORDS_BY_USER,o),n>=h):u.apply(this,arguments)},h.addChild(a),d=0;2>d;d++)n.isPoint(p[d])&&p[d].addChild(a);for(n.isPoint(l)&&l.addChild(a),a.parents=[],d=0;r.length>d;d++)r[d].id&&a.parents.push(r[d].id);return a
+},t.createHyperbola=function(t,i,r){var s,o,a,h,l,c,d=[],u=n.copyAttributes(r,t.options,"conic","foci"),p=n.copyAttributes(r,t.options,"conic");for(c=0;2>c;c++)if(i[c].length>1)d[c]=t.create("point",i[c],u);else if(n.isPoint(i[c]))d[c]=t.select(i[c]);else if("function"==typeof i[c]&&i[c]().elementClass===e.OBJECT_CLASS_POINT)d[c]=i[c]();else{if(!n.isString(i[c]))throw Error("JSXGraph: Can't create Hyperbola with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"'."+"\nPossible parent types: [point,point,point], [point,point,number|function]");d[c]=t.select(i[c])}if(n.isNumber(i[2]))l=n.createFunction(i[2],t);else if("function"==typeof i[2]&&n.isNumber(i[2]()))l=i[2];else{if(n.isPoint(i[2]))h=t.select(i[2]);else if(i[2].length>1)h=t.create("point",i[2],u);else if("function"==typeof i[2]&&i[2]().elementClass===e.OBJECT_CLASS_POINT)h=i[2]();else{if(!n.isString(i[2]))throw Error("JSXGraph: Can't create Hyperbola with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"' and '"+typeof i[2]+"'."+"\nPossible parent types: [point,point,point], [point,point,number|function]");h=t.select(i[2])}l=function(){return h.Dist(d[0])-h.Dist(d[1])}}for(n.exists(i[4])||(i[4]=1.0001*Math.PI),n.exists(i[3])||(i[3]=-1.0001*Math.PI),a=t.create("point",[function(){return.5*(d[0].X()+d[1].X())},function(){return.5*(d[0].Y()+d[1].Y())}],u),o=t.create("curve",[function(){return 0},function(){return 0},i[3],i[4]],p),o.majorAxis=l,s=function(t,e){var i,r,s,n,a,h,c,u,p;e||(i=l(),r=i*i,s=d[0].X(),n=d[0].Y(),a=d[1].X(),h=d[1].Y(),c=s-a,u=n-h,p=(r-s*s-n*n+a*a+h*h)/(2*i),o.quadraticform=[[p*p-a*a-h*h,p*c/i+a,p*u/i+h],[p*c/i+a,c*c/r-1,c*u/r],[p*u/i+h,c*u/r,u*u/r-1]])},o.X=function(t,e){var i=this.majorAxis(),r=d[1].Dist(d[0]),o=.5*(r*r-i*i)/(r*Math.cos(t)+i),n=Math.atan2(d[1].Y()-d[0].Y(),d[1].X()-d[0].X());return e||s(t,e),d[0].X()+Math.cos(n+t)*o},o.Y=function(t){var e=this.majorAxis(),i=d[1].Dist(d[0]),r=.5*(i*i-e*e)/(i*Math.cos(t)+e),s=Math.atan2(d[1].Y()-d[0].Y(),d[1].X()-d[0].X());return d[0].Y()+Math.sin(s+t)*r},o.midpoint=a,o.type=e.OBJECT_TYPE_CONIC,a.addChild(o),c=0;2>c;c++)n.isPoint(d[c])&&d[c].addChild(o);for(n.isPoint(h)&&h.addChild(o),o.parents=[],c=0;i.length>c;c++)i[c].id&&o.parents.push(i[c].id);return o},t.createParabola=function(t,i,s){var a,h,l,c,d=i[0],u=i[1],p=n.copyAttributes(s,t.options,"conic","foci"),f=n.copyAttributes(s,t.options,"conic");if(i[0].length>1)d=t.create("point",i[0],p);else if(n.isPoint(i[0]))d=t.select(i[0]);else if("function"==typeof i[0]&&i[0]().elementClass===e.OBJECT_CLASS_POINT)d=i[0]();else{if(!n.isString(i[0]))throw Error("JSXGraph: Can't create Parabola with parent types '"+typeof i[0]+"' and '"+typeof i[1]+"'."+"\nPossible parent types: [point,line]");d=t.select(i[0])}for(n.exists(i[3])||(i[3]=10),n.exists(i[2])||(i[2]=-10),l=t.create("point",[function(){var e=[0,u.stdform[1],u.stdform[2]];return e=r.crossProduct(e,d.coords.usrCoords),o.meetLineLine(e,u.stdform,0,t).usrCoords}],p),h=t.create("curve",[function(){return 0},function(){return 0},i[2],i[3]],f),a=function(t,e){var i,r,s,o,n,a;e||(i=u.stdform[1],r=u.stdform[2],s=u.stdform[0],o=i*i+r*r,n=d.X(),a=d.Y(),h.quadraticform=[[s*s-o*(n*n+a*a),s*i+o*n,s*r+o*a],[s*i+o*n,-r*r,i*r],[s*r+o*a,i*r,-i*i]])},h.X=function(t,e){var i,r,s=u.getAngle(),n=o.distPointLine(d.coords.usrCoords,u.stdform),h=u.point1.coords.usrCoords,l=u.point2.coords.usrCoords,c=d.coords.usrCoords;return r=(l[1]-h[1])*(c[2]-h[2])-(l[2]-h[2])*(c[1]-h[1])>=0?1:-1,i=r*n/(1-Math.sin(t)),e||a(t,e),d.X()+Math.cos(t+s)*i},h.Y=function(t){var e,i,r=u.getAngle(),s=o.distPointLine(d.coords.usrCoords,u.stdform),n=u.point1.coords.usrCoords,a=u.point2.coords.usrCoords,h=d.coords.usrCoords;return i=(a[1]-n[1])*(h[2]-n[2])-(a[2]-n[2])*(h[1]-n[1])>=0?1:-1,e=i*s/(1-Math.sin(t)),d.Y()+Math.sin(t+r)*e},h.type=e.OBJECT_TYPE_CONIC,l.addChild(h),n.isPoint(d)&&d.addChild(h),u.addChild(h),h.parents=[],c=0;i.length>c;c++)i[c].id&&h.parents.push(i[c].id);return h},t.createConic=function(i,o,a){var h,l,c,d,u,p,f,m,b,g,v,C,y,P,_=[[1,0,0],[0,1,0],[0,0,1]],E=[[1,0,0],[0,1,0],[0,0,1]],S=[],O=[],T=n.copyAttributes(a,i.options,"conic","foci"),x=n.copyAttributes(a,i.options,"conic");if(5===o.length)P=!0;else{if(6!==o.length)throw Error("JSXGraph: Can't create generic Conic with "+o.length+" parameters.");P=!1}if(P)for(C=0;5>C;C++)if(o[C].length>1)S[C]=i.create("point",o[C],T);else if(n.isPoint(o[C]))S[C]=i.select(o[C]);else if("function"==typeof o[C]&&o[C]().elementClass===e.OBJECT_CLASS_POINT)S[C]=o[C]();else{if(!n.isString(o[C]))throw Error("JSXGraph: Can't create Conic section with parent types '"+typeof o[C]+"'."+"\nPossible parent types: [point,point,point,point,point], [a00,a11,a22,a01,a02,a12]");S[C]=i.select(o[C])}else y=[[0,0,0],[0,0,0],[0,0,0]],y[0][0]=n.isFunction(o[2])?function(){return o[2]()}:function(){return o[2]},y[0][1]=n.isFunction(o[4])?function(){return o[4]()}:function(){return o[4]},y[0][2]=n.isFunction(o[5])?function(){return o[5]()}:function(){return o[5]},y[1][1]=n.isFunction(o[0])?function(){return o[0]()}:function(){return o[0]},y[1][2]=n.isFunction(o[3])?function(){return o[3]()}:function(){return o[3]},y[2][2]=n.isFunction(o[1])?function(){return o[1]()}:function(){return o[1]};if(u=function(t){var e,i;for(e=0;3>e;e++)for(i=e;3>i;i++)t[e][i]+=t[i][e];for(e=0;3>e;e++)for(i=0;e>i;i++)t[e][i]=t[i][e];return t},d=function(t,e){var i,r,s=[[0,0,0],[0,0,0],[0,0,0]];for(i=0;3>i;i++)for(r=0;3>r;r++)s[i][r]=t[i]*e[r];return u(s)},c=function(t,e,i){var s,o,n,a,h,l=[[0,0,0],[0,0,0],[0,0,0]];for(h=r.matVecMult(e,i),n=r.innerProduct(i,h),h=r.matVecMult(t,i),a=r.innerProduct(i,h),s=0;3>s;s++)for(o=0;3>o;o++)l[s][o]=n*t[s][o]-a*e[s][o];return l},l=i.create("curve",[function(){return 0},function(){return 0},0,2*Math.PI],x),h=function(e,i){var o,n,a,h;if(!i){if(P){for(o=0;5>o;o++)O[o]=S[o].coords.usrCoords;g=d(r.crossProduct(O[0],O[1]),r.crossProduct(O[2],O[3])),v=d(r.crossProduct(O[0],O[2]),r.crossProduct(O[1],O[3])),E=c(g,v,O[4])}else for(o=0;3>o;o++)for(n=o;3>n;n++)E[o][n]=y[o][n](),n>o&&(E[n][o]=E[o][n]);for(l.quadraticform=E,p=s.Jacobi(E),0>p[0][0][0]&&(p[0][0][0]*=-1,p[0][1][1]*=-1,p[0][2][2]*=-1),o=0;3>o;o++){for(a=0,n=0;3>n;n++)a+=p[1][n][o]*p[1][n][o];a=Math.sqrt(a)}_=p[1],b=Math.sqrt(Math.abs(p[0][0][0])),f=Math.sqrt(Math.abs(p[0][1][1])),m=Math.sqrt(Math.abs(p[0][2][2]))}return 0>=p[0][1][1]&&0>=p[0][2][2]?h=r.matVecMult(_,[1/b,Math.cos(e)/f,Math.sin(e)/m]):0>=p[0][1][1]&&p[0][2][2]>0?h=r.matVecMult(_,[Math.cos(e)/b,1/f,Math.sin(e)/m]):0>p[0][2][2]&&(h=r.matVecMult(_,[Math.sin(e)/b,Math.cos(e)/f,1/m])),t.exists(h)?(h[1]/=h[0],h[2]/=h[0],h[0]=1):h=[1,0/0,0/0],h},l.X=function(t,e){return h(t,e)[1]},l.Y=function(t,e){return h(t,e)[2]},l.midpoint=i.create("point",[function(){var t=l.quadraticform;return[t[1][1]*t[2][2]-t[1][2]*t[1][2],t[1][2]*t[0][2]-t[2][2]*t[0][1],t[0][1]*t[1][2]-t[1][1]*t[0][2]]}],T),l.type=e.OBJECT_TYPE_CONIC,P){for(C=0;5>C;C++)n.isPoint(S[C])&&S[C].addChild(l);for(l.parents=[],C=0;o.length>C;C++)o[C].id&&l.parents.push(o[C].id)}return l.addChild(l.midpoint),l},t.registerElement("ellipse",t.createEllipse),t.registerElement("hyperbola",t.createHyperbola),t.registerElement("parabola",t.createParabola),t.registerElement("conic",t.createConic),{createEllipse:t.createEllipse,createHyperbola:t.createHyperbola,createParabola:t.createParabola,createConic:t.createConic}}),define("base/polygon",["jxg","base/constants","base/coords","math/statistics","utils/type","base/element","base/line","base/transformation"],function(t,e,i,r,s,o){return t.Polygon=function(i,r,o){this.constructor(i,o,e.OBJECT_TYPE_POLYGON,e.OBJECT_CLASS_AREA);var n,a,h,l,c,d=s.copyAttributes(o,i.options,"polygon","borders");for(this.withLines=o.withlines,this.attr_line=d,this.vertices=[],n=0;r.length>n;n++)a=this.board.select(r[n]),this.vertices[n]=a;if(this.vertices[this.vertices.length-1]!==this.vertices[0]&&this.vertices.push(this.vertices[0]),this.borders=[],this.withLines)for(l=this.vertices.length-1,c=0;l>c;c++)n=(c+1)%l,d.id=d.ids&&d.ids[n],d.strokecolor=s.isArray(d.colors)&&d.colors[n%d.colors.length]||d.strokecolor,d.visible=s.exists(o.borders.visible)?o.borders.visible:o.visible,d.strokecolor===!1&&(d.strokecolor="none"),h=i.create("segment",[this.vertices[n],this.vertices[n+1]],d),h.dump=!1,this.borders[n]=h,h.parentPolygon=this;for(this.id=this.board.setId(this,"Py"),n=0;this.vertices.length-1>n;n++)a=this.board.select(this.vertices[n]),a.addChild(this);this.board.renderer.drawPolygon(this),this.board.finalizeAdding(this),this.elType="polygon",this.createLabel(),this.methodMap=t.deepCopy(this.methodMap,{borders:"borders",vertices:"vertices",A:"Area",Area:"Area",addPoints:"addPoints",insertPoints:"insertPoints",removePoints:"removePoints"})},t.Polygon.prototype=new o,t.extend(t.Polygon.prototype,{hasPoint:function(t,e){var i,r,s,o=!1;if(this.visProp.hasinnerpoints)for(s=this.vertices.length,i=0,r=s-2;s-1>i;r=i++)this.vertices[i].coords.scrCoords[2]>e!=this.vertices[r].coords.scrCoords[2]>e&&(this.vertices[r].coords.scrCoords[1]-this.vertices[i].coords.scrCoords[1])*(e-this.vertices[i].coords.scrCoords[2])/(this.vertices[r].coords.scrCoords[2]-this.vertices[i].coords.scrCoords[2])+this.vertices[i].coords.scrCoords[1]>t&&(o=!o);else for(s=this.borders.length,i=0;s>i;i++)if(this.borders[i].hasPoint(t,e)){o=!0;break}return o},updateRenderer:function(){this.needsUpdate&&(this.board.renderer.updatePolygon(this),this.needsUpdate=!1),this.hasLabel&&this.label.visProp.visible&&(this.label.update(),this.board.renderer.updateText(this.label))},getTextAnchor:function(){var t,r=this.vertices[0].X(),s=this.vertices[0].Y(),o=r,n=s;for(t=0;this.vertices.length>t;t++)r>this.vertices[t].X()&&(r=this.vertices[t].X()),this.vertices[t].X()>o&&(o=this.vertices[t].X()),this.vertices[t].Y()>s&&(s=this.vertices[t].Y()),n>this.vertices[t].Y()&&(n=this.vertices[t].Y());return new i(e.COORDS_BY_USER,[.5*(r+o),.5*(s+n)],this.board)},getLabelAnchor:t.shortcut(t.Polygon.prototype,"getTextAnchor"),cloneToBackground:function(){var t,e={};return e.id=this.id+"T"+this.numTraces,this.numTraces++,e.vertices=this.vertices,e.visProp=s.deepCopy(this.visProp,this.visProp.traceattributes,!0),e.visProp.layer=this.board.options.layer.trace,e.board=this.board,s.clearVisPropOld(e),t=this.board.renderer.enhancedRendering,this.board.renderer.enhancedRendering=!0,this.board.renderer.drawPolygon(e),this.board.renderer.enhancedRendering=t,this.traces[e.id]=e.rendNode,this},hideElement:function(t){var e;if(this.visProp.visible=!1,this.board.renderer.hide(this),!t)for(e=0;this.borders.length>e;e++)this.borders[e].hideElement();this.hasLabel&&s.exists(this.label)&&(this.label.hiddenByParent=!0,this.label.visProp.visible&&this.board.renderer.hide(this.label))},showElement:function(t){var e;if(this.visProp.visible=!0,this.board.renderer.show(this),!t)for(e=0;this.borders.length>e;e++)this.borders[e].showElement(),this.borders[e].updateRenderer();this.hasLabel&&s.exists(this.label)&&this.label.visProp.visible&&this.board.renderer.show(this.label)},Area:function(){var t,e=0;for(t=0;this.vertices.length-1>t;t++)e+=this.vertices[t].X()*this.vertices[t+1].Y()-this.vertices[t+1].X()*this.vertices[t].Y();return e/=2,Math.abs(e)},remove:function(){var t;for(t=0;this.borders.length>t;t++)this.board.removeObject(this.borders[t]);o.prototype.remove.call(this)},findPoint:function(t){var e;if(!s.isPoint(t))return-1;for(e=0;this.vertices.length>e;e++)if(this.vertices[e].id===t.id)return e;return-1},addPoints:function(){var t=Array.prototype.slice.call(arguments);return this.insertPoints.apply(this,[this.vertices.length-2].concat(t))},insertPoints:function(t){var e,i,r=[];if(0===arguments.length)return this;if(0>t||t>this.vertices.length-2)return this;for(e=1;arguments.length>e;e++)s.isPoint(arguments[e])&&r.push(arguments[e]);if(i=this.vertices.slice(0,t+1).concat(r),this.vertices=i.concat(this.vertices.slice(t+1)),this.withLines){for(i=this.borders.slice(0,t),this.board.removeObject(this.borders[t]),e=0;r.length>e;e++)i.push(this.board.create("segment",[this.vertices[t+e],this.vertices[t+e+1]],this.attr_line));i.push(this.board.create("segment",[this.vertices[t+r.length],this.vertices[t+r.length+1]],this.attr_line)),this.borders=i.concat(this.borders.slice(t))}return this.board.update(),this},removePoints:function(){var t,e,i,r=[],o=[],n=[],a=[];for(this.vertices=this.vertices.slice(0,this.vertices.length-1),t=0;arguments.length>t;t++)s.isPoint(arguments[t])&&(i=this.findPoint(arguments[t])),s.isNumber(i)&&i>-1&&this.vertices.length>i&&-1===s.indexOf(n,i)&&n.push(i);for(n=n.sort(),r=this.vertices.slice(),o=this.borders.slice(),this.withLines&&a.push([n[n.length-1]]),t=n.length-1;t>-1;t--)r[n[t]]=-1,this.withLines&&n[t]-1>n[t-1]&&(a[a.length-1][1]=n[t],a.push([n[t-1]]));for(this.withLines&&(a[a.length-1][1]=n[0]),this.vertices=[],t=0;r.length>t;t++)s.isPoint(r[t])&&this.vertices.push(r[t]);if(this.vertices[this.vertices.length-1].id!==this.vertices[0].id&&this.vertices.push(this.vertices[0]),this.withLines){for(t=0;a.length>t;t++){for(e=a[t][1]-1;a[t][0]+1>e;e++)0>e?(e=0,this.board.removeObject(this.borders[o.length-1]),o[o.length-1]=-1):e>o.length-1&&(e=o.length-1),this.board.removeObject(this.borders[e]),o[e]=-1;0!==a[t][1]&&a[t][0]!==r.length-1&&(o[a[t][0]-1]=this.board.create("segment",[r[Math.max(a[t][1]-1,0)],r[Math.min(a[t][0]+1,this.vertices.length-1)]],this.attr_line))}for(this.borders=[],t=0;o.length>t;t++)-1!==o[t]&&this.borders.push(o[t]);(5===a[0][1]||0===a[a.length-1][1])&&this.borders.push(this.board.create("segment",[this.vertices[0],this.vertices[this.vertices.length-2]],this.attr_line))}return this.board.update(),this},getParents:function(){var t,e=[];for(t=0;this.vertices.length>t;t++)e.push(this.vertices[t].id);return e},getAttributes:function(){var t,e=o.prototype.getAttributes.call(this);if(this.withLines)for(e.lines=e.lines||{},e.lines.ids=[],e.lines.colors=[],t=0;this.borders.length>t;t++)e.lines.ids.push(this.borders[t].id),e.lines.colors.push(this.borders[t].visProp.strokecolor);return e},snapToGrid:function(){var t;for(t=0;this.vertices.length>t;t++)this.vertices[t].snapToGrid()},setPositionDirectly:function(t,e,s){var o,n,a,h,l=new i(t,e,this.board),c=new i(t,s,this.board);for(h=this.vertices.length-1,a=0;h>a;a++)if(!this.vertices[a].draggable())return this;return o=r.subtract(l.usrCoords,c.usrCoords),n=this.board.create("transform",o.slice(1),{type:"translate"}),n.applyOnce(this.vertices.slice(0,-1)),this}}),t.createPolygon=function(e,i,r){var o,n,a=s.copyAttributes(r,e.options,"polygon");for(n=0;i.length>n;n++)if(i[n]=e.select(i[n]),!s.isPoint(i[n]))throw Error("JSXGraph: Can't create polygon with parent types other than 'point'.");return o=new t.Polygon(e,i,a),o.isDraggable=!0,o},t.createRegularPolygon=function(t,i,r){var o,n,a,h,l,c,d,u=[];if(s.isNumber(i[i.length-1])&&3!==i.length)throw Error("JSXGraph: A regular polygon needs two points and a number as input.");if(l=i.length,a=i[l-1],!s.isNumber(a)&&!s.isPoint(t.select(a))||3>a)throw Error("JSXGraph: The third parameter has to be number greater than 2 or a point.");for(s.isPoint(t.select(a))?(a=l,c=!0):(l--,c=!1),n=0;l>n;n++)if(i[n]=t.select(i[n]),!s.isPoint(i[n]))throw Error("JSXGraph: Can't create regular polygon if the first two parameters aren't points.");for(u[0]=i[0],u[1]=i[1],d=s.copyAttributes(r,t.options,"polygon","vertices"),n=2;a>n;n++)h=t.create("transform",[Math.PI*(2-(a-2)/a),u[n-1]],{type:"rotate"}),c?(u[n]=i[n],u[n].addTransform(i[n-2],h)):(s.isArray(d.ids)&&d.ids.length>=a-2&&(d.id=d.ids[n-2]),u[n]=t.create("point",[u[n-2],h],d),u[n].type=e.OBJECT_TYPE_CAS,u[n].isDraggable=!0,u[n].visProp.fixed=!1);return d=s.copyAttributes(r,t.options,"polygon"),o=t.create("polygon",u,d),o.elType="regularpolygon",o},t.registerElement("polygon",t.createPolygon),t.registerElement("regularpolygon",t.createRegularPolygon),{Polygon:t.Polygon,createPolygon:t.createPolygon,createRegularPolygon:t.createRegularPolygon}}),define("element/arc",["jxg","math/geometry","math/math","base/coords","base/circle","utils/type","base/constants","base/curve","element/composition"],function(t,e,i,r,s,o,n){return t.createArc=function(a,h,l){var c,d,u;if(3>h.length||h[0].elementClass!==n.OBJECT_CLASS_POINT||h[1].elementClass!==n.OBJECT_CLASS_POINT||h[2].elementClass!==n.OBJECT_CLASS_POINT||h[3]&&h[3].elementClass!==n.OBJECT_CLASS_POINT)throw Error("JSXGraph: Can't create Arc with parent types '"+typeof h[0]+"' and '"+typeof h[1]+"' and '"+typeof h[2]+"'."+"\nPossible parent types: [point,point,point]");for(d=o.copyAttributes(l,a.options,"arc"),c=a.create("curve",[[0],[0]],d),c.elType="arc",c.parents=[],u=0;h.length>u;u++)h[u].id&&c.parents.push(h[u].id);return c.type=n.OBJECT_TYPE_ARC,c.center=a.select(h[0]),c.radiuspoint=a.select(h[1]),c.point2=c.radiuspoint,c.anglepoint=a.select(h[2]),c.point3=c.anglepoint,c.center.addChild(c),c.radiuspoint.addChild(c),c.anglepoint.addChild(c),c.useDirection=d.usedirection,c.updateDataArray=function(){var t,r,s,o,n,a,l,c,d,u,p,f,m,b,g,v,C,y,P,_,E,S=1,O=.5*Math.PI,T=this.radiuspoint,x=this.center,w=this.anglepoint,A=x.X(),k=x.Y(),M=x.Z();for(n=e.rad(T,x,w),("minor"===this.visProp.type&&n>Math.PI||"major"===this.visProp.type&&Math.PI>n)&&(n=2*Math.PI-n,S=-1),this.useDirection&&(c=h[1].coords.usrCoords,d=h[3].coords.usrCoords,u=h[2].coords.usrCoords,l=(c[1]-u[1])*(c[2]-d[2])-(c[2]-u[2])*(c[1]-d[1]),0>l?(this.radiuspoint=h[1],this.anglepoint=h[2]):(this.radiuspoint=h[2],this.anglepoint=h[1])),p=[T.Z(),T.X(),T.Y()],b=p.slice(0),E=x.Dist(T),A/=M,k/=M,this.dataX=[p[1]/p[0]],this.dataY=[p[2]/p[0]];n>i.eps;)n>=O?(t=O,n-=O):(t=n,n=0),r=Math.cos(S*t),s=Math.sin(S*t),o=[[1,0,0],[A*(1-r)+k*s,r,-s],[k*(1-r)-A*s,s,r]],a=i.matVecMult(o,p),b=[a[0]/a[0],a[1]/a[0],a[2]/a[0]],v=p[1]-A,C=p[2]-k,y=b[1]-A,P=b[2]-k,_=Math.sqrt((v+y)*(v+y)+(C+P)*(C+P)),g=Math.abs(P-C)>i.eps?8*((v+y)*(E/_-.5)/(P-C))/3:8*((C+P)*(E/_-.5)/(v-y))/3,f=[1,p[1]-g*C,p[2]+g*v],m=[1,b[1]+g*P,b[2]-g*y],this.dataX=this.dataX.concat([f[1],m[1],b[1]]),this.dataY=this.dataY.concat([f[2],m[2],b[2]]),p=b.slice(0);this.bezierDegree=3,this.updateStdform(),this.updateQuadraticform()},c.Radius=function(){return this.radiuspoint.Dist(this.center)},c.getRadius=function(){return this.Radius()},c.hasPoint=function(t,s){var o,a,h,l,c,d,u,p,f=this.board.options.precision.hasPoint/this.board.unitX,m=this.Radius();return a=new r(n.COORDS_BY_SCREEN,[t,s],this.board),this.transformations.length>0&&(this.updateTransformMatrix(),u=i.inverse(this.transformMat),p=i.matVecMult(u,a.usrCoords),a=new r(n.COORDS_BY_USER,p,this.board)),o=this.center.coords.distance(n.COORDS_BY_USER,a),h=f>Math.abs(o-m),h&&(l=e.rad(this.radiuspoint,this.center,a.usrCoords.slice(1)),c=0,d=e.rad(this.radiuspoint,this.center,this.anglepoint),("minor"===this.visProp.type&&d>Math.PI||"major"===this.visProp.type&&Math.PI>d)&&(c=d,d=2*Math.PI),(c>l||l>d)&&(h=!1)),h},c.hasPointSector=function(t,i){var s,o,a,h=new r(n.COORDS_BY_SCREEN,[t,i],this.board),l=this.Radius(),c=this.center.coords.distance(n.COORDS_BY_USER,h),d=l>c;return d&&(s=e.rad(this.radiuspoint,this.center,h.usrCoords.slice(1)),o=0,a=e.rad(this.radiuspoint,this.center,this.anglepoint),("minor"===this.visProp.type&&a>Math.PI||"major"===this.visProp.type&&Math.PI>a)&&(o=a,a=2*Math.PI),(o>s||s>a)&&(d=!1)),d},c.getTextAnchor=function(){return this.center.coords},c.getLabelAnchor=function(){var t,i,s,a,h=e.rad(this.radiuspoint,this.center,this.anglepoint),l=10/this.board.unitX,c=10/this.board.unitY,d=this.point2.coords.usrCoords,u=this.center.coords.usrCoords,p=d[1]-u[1],f=d[2]-u[2];return o.exists(this.label)&&(this.label.relativeCoords=new r(n.COORDS_BY_SCREEN,[0,0],this.board)),("minor"===this.visProp.type&&h>Math.PI||"major"===this.visProp.type&&Math.PI>h)&&(h=-(2*Math.PI-h)),t=new r(n.COORDS_BY_USER,[u[1]+Math.cos(.5*h)*p-Math.sin(.5*h)*f,u[2]+Math.sin(.5*h)*p+Math.cos(.5*h)*f],this.board),i=t.usrCoords[1]-u[1],s=t.usrCoords[2]-u[2],a=Math.sqrt(i*i+s*s),i=i*(a+l)/a,s=s*(a+c)/a,new r(n.COORDS_BY_USER,[u[1]+i,u[2]+s],this.board)},c.updateQuadraticform=s.Circle.prototype.updateQuadraticform,c.updateStdform=s.Circle.prototype.updateStdform,c.methodMap=t.deepCopy(c.methodMap,{getRadius:"getRadius",radius:"Radius",center:"center",radiuspoint:"radiuspoint",anglepoint:"anglepoint"}),c.prepareUpdate().update(),c},t.registerElement("arc",t.createArc),t.createSemicircle=function(t,e,i){var r,s,n;if(!o.isPoint(e[0])||!o.isPoint(e[1]))throw Error("JSXGraph: Can't create Semicircle with parent types '"+typeof e[0]+"' and '"+typeof e[1]+"'."+"\nPossible parent types: [point,point]");return n=o.copyAttributes(i,t.options,"semicircle","midpoint"),s=t.create("midpoint",[e[0],e[1]],n),s.dump=!1,n=o.copyAttributes(i,t.options,"semicircle"),r=t.create("arc",[s,e[1],e[0]],n),r.elType="semicircle",r.parents=[e[0].id,e[1].id],r.subs={midpoint:s},r.midpoint=r.center=s,r},t.registerElement("semicircle",t.createSemicircle),t.createCircumcircleArc=function(t,e,i){var r,s,n;if(!(o.isPoint(e[0])&&o.isPoint(e[1])&&o.isPoint(e[2])))throw Error("JSXGraph: create Circumcircle Arc with parent types '"+typeof e[0]+"' and '"+typeof e[1]+"' and '"+typeof e[2]+"'."+"\nPossible parent types: [point,point,point]");return n=o.copyAttributes(i,t.options,"circumcirclearc","center"),s=t.create("circumcenter",[e[0],e[1],e[2]],n),s.dump=!1,n=o.copyAttributes(i,t.options,"circumcirclearc"),n.usedirection=!0,r=t.create("arc",[s,e[0],e[2],e[1]],n),r.elType="circumcirclearc",r.parents=[e[0].id,e[1].id,e[2].id],r.subs={center:s},r.center=s,r},t.registerElement("circumcirclearc",t.createCircumcircleArc),t.createMinorArc=function(e,i,r){return r.type="minor",t.createArc(e,i,r)},t.registerElement("minorarc",t.createMinorArc),t.createMajorArc=function(e,i,r){return r.type="major",t.createArc(e,i,r)},t.registerElement("majorarc",t.createMajorArc),{createArc:t.createArc,createSemicircle:t.createSemicircle,createCircumcircleArc:t.createCircumcircleArc,createMinorArc:t.createMinorArc,createMajorArc:t.createMajorArc}}),define("element/sector",["jxg","math/geometry","math/math","base/coords","base/constants","utils/type","base/point","base/curve","base/transformation","element/composition"],function(t,e,i,r,s,o){return t.createSector=function(n,a,h){var l,c,d,u=["center","radiuspoint","anglepoint"];if(!(o.isPoint(a[0])&&o.isPoint(a[1])&&o.isPoint(a[2])))try{for(c=0;a.length>c;c++)o.isPoint(a[c])||(d=o.copyAttributes(h,n.options,"sector",u[c]),a[c]=n.create("point",a[c],d))}catch(p){throw Error("JSXGraph: Can't create Sector with parent types '"+typeof a[0]+"' and '"+typeof a[1]+"' and '"+typeof a[2]+"'.")}return d=o.copyAttributes(h,n.options,"sector"),l=n.create("curve",[[0],[0]],d),l.type=s.OBJECT_TYPE_SECTOR,l.elType="sector",l.parents=[a[0].id,a[1].id,a[2].id],l.point1=n.select(a[0]),l.center=l.point1,l.point2=n.select(a[1]),l.radiuspoint=l.point2,l.point3=n.select(a[2]),l.anglepoint=l.point3,l.point1.addChild(l),l.point2.addChild(l),l.point3.addChild(l),l.useDirection=h.usedirection,l.methodMap=t.deepCopy(l.methodMap,{center:"center",radiuspoint:"radiuspoint",anglepoint:"anglepoint",radius:"getRadius",getRadius:"getRadius"}),l.updateDataArray=function(){var t,r,s,o,n,h,l,c,d,u,p,f,m,b,g,v,C,y,P,_,E=this.point2,S=this.point1,O=this.point3,T=e.rad(E,S,O),x=S.X(),w=S.Y(),A=S.Z(),k=.5*Math.PI;if(!E.isReal||!S.isReal||!O.isReal)return this.dataX=[0/0],this.dataY=[0/0],void 0;for(this.useDirection&&(l=a[1].coords.usrCoords,c=a[3].coords.usrCoords,d=a[2].coords.usrCoords,h=(l[1]-d[1])*(l[2]-c[2])-(l[2]-d[2])*(l[1]-c[1]),0>h?(this.point2=a[1],this.point3=a[2]):(this.point2=a[2],this.point3=a[1])),_=S.Dist(E),u=[E.Z(),E.X(),E.Y()],u[1]/=u[0],u[2]/=u[0],u[0]/=u[0],m=u.slice(0),x/=A,w/=A,this.dataX=[x,x+.333*(u[1]-x),x+.666*(u[1]-x),u[1]],this.dataY=[w,w+.333*(u[2]-w),w+.666*(u[2]-w),u[2]];T>i.eps;)T>=k?(r=k,T-=k):(r=T,T=0),s=Math.cos(r),o=Math.sin(r),n=[[1,0,0],[x*(1-s)+w*o,s,-o],[w*(1-s)-x*o,o,s]],t=i.matVecMult(n,u),m=[t[0]/t[0],t[1]/t[0],t[2]/t[0]],g=u[1]-x,v=u[2]-w,C=m[1]-x,y=m[2]-w,P=Math.sqrt((g+C)*(g+C)+(v+y)*(v+y)),b=Math.abs(y-v)>i.eps?8*((g+C)*(_/P-.5)/(y-v))/3:8*((v+y)*(_/P-.5)/(g-C))/3,p=[1,u[1]-b*v,u[2]+b*g],f=[1,m[1]+b*y,m[2]-b*C],this.dataX=this.dataX.concat([p[1],f[1],m[1]]),this.dataY=this.dataY.concat([p[2],f[2],m[2]]),u=m.slice(0);this.dataX=this.dataX.concat([m[1]+.333*(x-m[1]),m[1]+.666*(x-m[1]),x]),this.dataY=this.dataY.concat([m[2]+.333*(w-m[2]),m[2]+.666*(w-m[2]),w]),this.bezierDegree=3},l.Radius=function(){return this.point2.Dist(this.point1)},l.getRadius=function(){return this.Radius()},l.hasPoint=function(t,i){var o,n,a,h=this.board.options.precision.hasPoint/this.board.unitX,l=new r(s.COORDS_BY_SCREEN,[t,i],this.board),c=this.Radius(),d=this.center.coords.distance(s.COORDS_BY_USER,l),u=h>Math.abs(d-c);return u&&(o=e.rad(this.point2,this.center,l.usrCoords.slice(1)),n=0,a=e.rad(this.point2,this.center,this.point3),(n>o||o>a)&&(u=!1)),u},l.hasPointSector=function(t,i){var o,n=new r(s.COORDS_BY_SCREEN,[t,i],this.board),a=this.Radius(),h=this.point1.coords.distance(s.COORDS_BY_USER,n),l=a>h;return l&&(o=e.rad(this.point2,this.point1,n.usrCoords.slice(1)),o>e.rad(this.point2,this.point1,this.point3)&&(l=!1)),l},l.getTextAnchor=function(){return this.point1.coords},l.getLabelAnchor=function(){var t,i,n,a,h=e.rad(this.point2,this.point1,this.point3),l=13/this.board.unitX,c=13/this.board.unitY,d=this.point2.coords.usrCoords,u=this.point1.coords.usrCoords,p=d[1]-u[1],f=d[2]-u[2];return o.exists(this.label)&&(this.label.relativeCoords=new r(s.COORDS_BY_SCREEN,[0,0],this.board)),t=new r(s.COORDS_BY_USER,[u[1]+Math.cos(.5*h)*p-Math.sin(.5*h)*f,u[2]+Math.sin(.5*h)*p+Math.cos(.5*h)*f],this.board),i=t.usrCoords[1]-u[1],n=t.usrCoords[2]-u[2],a=Math.sqrt(i*i+n*n),i=i*(a+l)/a,n=n*(a+c)/a,new r(s.COORDS_BY_USER,[u[1]+i,u[2]+n],this.board)},l.prepareUpdate().update(),l},t.registerElement("sector",t.createSector),t.createCircumcircleSector=function(t,e,i){var r,s,n;if(!(o.isPoint(e[0])&&o.isPoint(e[1])&&o.isPoint(e[2])))throw Error("JSXGraph: Can't create circumcircle sector with parent types '"+typeof e[0]+"' and '"+typeof e[1]+"' and '"+typeof e[2]+"'.");return n=o.copyAttributes(i,t.options,"circumcirclesector","center"),s=t.create("circumcenter",[e[0],e[1],e[2]],n),s.dump=!1,n=o.copyAttributes(i,t.options,"circumcirclesector"),r=t.create("sector",[s,e[0],e[2],e[1]],n),r.elType="circumcirclesector",r.parents=[e[0].id,e[1].id,e[2].id],r.center=s,r.subs={center:s},r},t.registerElement("circumcirclesector",t.createCircumcircleSector),t.createAngle=function(t,n,a){var h,l,c,d,u,p,f,m;if(!(o.isPoint(n[0])&&o.isPoint(n[1])&&o.isPoint(n[2])))throw Error("JSXGraph: Can't create angle with parent types '"+typeof n[0]+"' and '"+typeof n[1]+"' and '"+typeof n[2]+"'.");for(u=o.copyAttributes(a,t.options,"angle"),d=u.name,o.exists(d)&&""!==d||(d=t.generateName({type:s.OBJECT_TYPE_ANGLE}),u.name=d),p=o.copyAttributes(a,t.options,"angle","radiuspoint"),l=t.create("point",[0,1,0],p),l.dump=!1,p=o.copyAttributes(a,t.options,"angle","pointsquare"),c=t.create("point",[0,1,1],p),c.dump=!1,h=t.create("sector",[n[1],l,n[2]],u),h.elType="angle",h.parents=[n[0].id,n[1].id,n[2].id],h.subs={point:l,pointsquare:c},h.updateDataArraySquare=function(){var t,e,r,s,o=n[1];t=i.crossProduct(c.coords.usrCoords,o.coords.usrCoords),e=[-l.X()*t[1]-l.Y()*t[2],l.Z()*t[1],l.Z()*t[2]],t=i.crossProduct(l.coords.usrCoords,o.coords.usrCoords),r=[-c.X()*t[1]-c.Y()*t[2],c.Z()*t[1],c.Z()*t[2]],s=i.crossProduct(e,r),s[1]/=s[0],s[2]/=s[0],this.dataX=[o.X(),l.X(),s[1],c.X(),o.X()],this.dataY=[o.Y(),l.Y(),s[2],c.Y(),o.Y()],this.bezierDegree=1},h.updateDataArrayNone=function(){this.dataX=[0/0],this.dataY=[0/0],this.bezierDegree=1},h.updateDataArraySector=h.updateDataArray,h.updateDataArray=function(){var t=this.visProp.type,i=e.trueAngle(n[0],n[1],n[2]);Math.abs(i-90)<this.visProp.orthosensitivity&&(t=this.visProp.orthotype),"none"===t?this.updateDataArrayNone():"square"===t?this.updateDataArraySquare():"sector"===t?this.updateDataArraySector():"sectordot"===t&&(this.updateDataArraySector(),this.dot.visProp.visible||this.dot.setAttribute({visible:!0})),(!this.visProp.visible||"sectordot"!==t&&this.dot.visProp.visible)&&this.dot.setAttribute({visible:!1})},l.addConstraint([function(){var t=n[0],e=n[1],i=o.evaluate(h.visProp.radius),r=e.Dist(t);return[e.X()+(t.X()-e.X())*i/r,e.Y()+(t.Y()-e.Y())*i/r]}]),c.addConstraint([function(){var t=n[2],e=n[1],i=o.evaluate(h.visProp.radius),r=e.Dist(t);return[e.X()+(t.X()-e.X())*i/r,e.Y()+(t.Y()-e.Y())*i/r]}]),h.radiuspoint=l,h.point=l,h.pointsquare=c,m=o.copyAttributes(a,t.options,"angle","dot"),h.dot=t.create("point",[function(){if(o.exists(h.dot)&&!h.dot.visProp.visible)return[0,0];var t=l.coords.usrCoords,r=.5*e.rad(n[0],n[1],n[2]),s=n[1].X(),a=n[1].Y(),c=[[1,0,0],[s-.5*s*Math.cos(r)+.5*a*Math.sin(r),.5*Math.cos(r),.5*-Math.sin(r)],[a-.5*s*Math.sin(r)-.5*a*Math.cos(r),.5*Math.sin(r),.5*Math.cos(r)]];return i.matVecMult(c,t)}],m),h.dot.dump=!1,h.subs.dot=h.dot,f=0;3>f;f++)t.select(n[f]).addChild(l),t.select(n[f]).addChild(h.dot);return h.type=s.OBJECT_TYPE_ANGLE,t.select(n[0]).addChild(h),h.rot=t.create("transform",[function(){return.5*e.rad(h.point2,h.point1,h.point3)},h.point1],{type:"rotate"}),h.getLabelAnchor=function(){var t,e,n,a,h=12,l=12,c=this.point1.coords.usrCoords;return o.exists(this.label)&&(this.label.relativeCoords=new r(s.COORDS_BY_SCREEN,[0,0],this.board)),o.exists(this.label.visProp.fontSize)&&(h=this.label.visProp.fontSize,l=this.label.visProp.fontSize),h/=this.board.unitX,l/=this.board.unitY,this.rot.update(),a=i.matVecMult(this.rot.matrix,this.point2.coords.usrCoords),t=a[1]-c[1],e=a[2]-c[2],n=Math.sqrt(t*t+e*e),t=t*(n+h)/n,e=e*(n+l)/n,new r(s.COORDS_BY_USER,[c[1]+t,c[2]+e],this.board)},h.Value=function(){return e.rad(this.point2,this.point1,this.point3)},h.setAngle=function(t){var e,i=this.anglepoint,r=this.radiuspoint;return i.draggable()&&(e=this.board.create("transform",[t,this.center],{type:"rotate"}),i.addTransform(r,e),i.isDraggable=!1,i.parents=[r]),this},h.free=function(){var t=this.anglepoint;return t.transformations.length>0&&(t.transformations.pop(),t.isDraggable=!0,t.parents=[]),this},h.methodMap=o.deepCopy(h.methodMap,{Value:"Value",setAngle:"setAngle",free:"free"}),h},t.registerElement("angle",t.createAngle),{createSector:t.createSector,createCircumcircleSector:t.createCircumcircleSector,createAngle:t.createAngle}}),define("element/locus",["jxg","math/symbolic","utils/type","base/constants","base/curve"],function(t,e,i,r){return t.createLocus=function(t,s,o){var n,a;if(!i.isArray(s)||1!==s.length||s[0].elementClass!==r.OBJECT_CLASS_POINT)throw Error("JSXGraph: Can't create locus with parent of type other than point.\nPossible parent types: [point]");return a=s[0],n=t.create("curve",[[null],[null]],o),n.dontCallServer=!1,n.elType="locus",n.parents=[a.id],n.updateDataArray=function(){var i,r,s;n.board.mode>0||(i=e.generatePolynomials(t,a,!0).join("|"),i!==n.spe&&(n.spe=i,r=function(t,e,i,r){n.dataX=t,n.dataY=e,n.eq=i,n.ctime=r,n.generatePolynomial=function(t){return function(e){var i,r="("+e.symbolic.x+")",s="("+e.symbolic.y+")",o=[];for(i=0;t.length>i;i++)o[i]=t[i].replace(/\*\*/g,"^").replace(/x/g,r).replace(/y/g,s);return o}}(i)},s=e.geometricLocusByGroebnerBase(t,a,r),r(s.datax,s.datay,s.polynomial,s.exectime)))},n},t.registerElement("locus",t.createLocus),{createLocus:t.createLocus}}),define("base/image",["jxg","base/constants","base/coords","base/element","math/math","math/statistics","utils/type"],function(t,e,i,r,s,o,n){return t.Image=function(r,s,o,a,h){this.constructor(r,h,e.OBJECT_TYPE_IMAGE,e.OBJECT_CLASS_OTHER),this.initialCoords=new i(e.COORDS_BY_USER,o,this.board),n.isFunction(o[0])||n.isFunction(o[1])||(this.isDraggable=!0),this.X=n.createFunction(o[0],this.board,""),this.Y=n.createFunction(o[1],this.board,""),this.Z=n.createFunction(1,this.board,""),this.W=n.createFunction(a[0],this.board,""),this.H=n.createFunction(a[1],this.board,""),this.coords=new i(e.COORDS_BY_USER,[this.X(),this.Y()],this.board),this.usrSize=[this.W(),this.H()],this.size=[Math.abs(this.usrSize[0]*r.unitX),Math.abs(this.usrSize[1]*r.unitY)],this.url=s,this.elType="image",this.span=[[this.Z(),this.X(),this.Y()],[this.Z(),this.W(),0],[this.Z(),0,this.H()]],this.parent=r.select(h.anchor),this.id=this.board.setId(this,"Im"),this.board.renderer.drawImage(this),this.visProp.visible||this.board.renderer.hide(this),this.methodMap=t.deepCopy(this.methodMap,{addTransformation:"addTransform",trans:"addTransform"})
+},t.Image.prototype=new r,t.extend(t.Image.prototype,{hasPoint:function(t,r){var o,n,a,h,l,c,d,u=this.transformations.length;return 0===u?(o=t-this.coords.scrCoords[1],n=this.coords.scrCoords[2]-r,a=this.board.options.precision.hasPoint,o>=-a&&a>=o-this.size[0]&&n>=-a&&a>=n-this.size[1]):(h=new i(e.COORDS_BY_SCREEN,[t,r],this.board),h=h.usrCoords,l=[h[0]-this.span[0][0],h[1]-this.span[0][1],h[2]-this.span[0][2]],d=s.innerProduct,c=d(l,this.span[1]),c>=0&&d(this.span[1],this.span[1])>=c&&(c=d(l,this.span[2]),c>=0&&d(this.span[2],this.span[2])>=c)?!0:!1)},update:function(){return this.needsUpdate&&(this.visProp.frozen||this.updateCoords(),this.usrSize=[this.W(),this.H()],this.size=[Math.abs(this.usrSize[0]*this.board.unitX),Math.abs(this.usrSize[1]*this.board.unitY)],this.updateTransform(),this.updateSpan()),this},updateRenderer:function(){return this.needsUpdate&&(this.board.renderer.updateImage(this),this.needsUpdate=!1),this},updateTransform:function(){var t,e=this.transformations.length;if(e>0)for(t=0;e>t;t++)this.transformations[t].update();return this},updateCoords:function(){this.coords.setCoordinates(e.COORDS_BY_USER,[this.X(),this.Y()])},updateSize:function(){this.coords.setCoordinates(e.COORDS_BY_USER,[this.W(),this.H()])},updateSpan:function(){var t,e,i=this.transformations.length,r=[];if(0===i)this.span=[[this.Z(),this.X(),this.Y()],[this.Z(),this.W(),0],[this.Z(),0,this.H()]];else{for(r[0]=[this.Z(),this.X(),this.Y()],r[1]=[this.Z(),this.X()+this.W(),this.Y()],r[2]=[this.Z(),this.X(),this.Y()+this.H()],t=0;i>t;t++)for(e=0;3>e;e++)r[e]=s.matVecMult(this.transformations[t].matrix,r[e]);for(e=0;3>e;e++)r[e][1]/=r[e][0],r[e][2]/=r[e][0],r[e][0]/=r[e][0];for(e=1;3>e;e++)r[e][0]-=r[0][0],r[e][1]-=r[0][1],r[e][2]-=r[0][2];this.span=r}return this},addTransform:function(t){var e;if(n.isArray(t))for(e=0;t.length>e;e++)this.transformations.push(t[e]);else this.transformations.push(t)},setPositionDirectly:function(t,e,r){var s,a=new i(t,e,this.board),h=new i(t,r,this.board),l=[this.Z(),this.X(),this.Y()];return s=o.subtract(a.usrCoords,h.usrCoords),this.X=n.createFunction(l[1]+s[1],this.board,""),this.Y=n.createFunction(l[2]+s[2],this.board,""),this}}),t.createImage=function(e,i,r){var s,o;return s=n.copyAttributes(r,e.options,"image"),o=new t.Image(e,i[0],i[1],i[2],s),0!==n.evaluate(s.rotate)&&o.addRotation(n.evaluate(s.rotate)),o},t.registerElement("image",t.createImage),{Image:t.Image,createImage:t.createImage}}),define("element/slider",["jxg","math/math","base/constants","utils/type","base/point","base/group","base/line","base/ticks","base/text"],function(t,e,i,r,s){return t.createSlider=function(t,o,n){var a,h,l,c,d,u,p,f,m,b,g,v,C,y,P,_,E,S,O,T,x,w;return a=o[0],h=o[1],l=o[2][0],c=o[2][1],d=o[2][2],u=d-l,x=r.copyAttributes(n,t.options,"slider"),O=x.withticks,S=x.withlabel,T=x.snapwidth,w=x.precision,x=r.copyAttributes(n,t.options,"slider","point1"),p=t.create("point",a,x),x=r.copyAttributes(n,t.options,"slider","point2"),f=t.create("point",h,x),t.create("group",[p,f]),x=r.copyAttributes(n,t.options,"slider","baseline"),m=t.create("segment",[p,f],x),m.updateStdform(),O&&(x=r.copyAttributes(n,t.options,"slider","ticks"),b=2,g=t.create("ticks",[m,f.Dist(p)/b,function(t){var r=p.Dist(f),s=p.coords.distance(i.COORDS_BY_USER,t);return e.eps>r?0:s/r*u+l}],x)),v=a[0]+(h[0]-a[0])*(c-l)/(d-l),C=a[1]+(h[1]-a[1])*(c-l)/(d-l),x=r.copyAttributes(n,t.options,"slider"),x.withLabel=!1,y=t.create("glider",[v,C,m],x),y.setAttribute({snapwidth:T}),x=r.copyAttributes(n,t.options,"slider","highline"),P=t.create("segment",[p,y],x),y.Value=function(){var t=this._smax-this._smin;return-1===y.visProp.snapwidth?this.position*t+this._smin:Math.round((this.position*t+this._smin)/this.visProp.snapwidth)*this.visProp.snapwidth},y.methodMap=r.deepCopy(y.methodMap,{Value:"Value",smax:"_smax",smin:"_smin"}),y._smax=d,y._smin=l,S&&(_=n.name&&""!==n.name?n.name+" = ":"",x=r.copyAttributes(n,t.options,"slider","label"),E=t.create("text",[function(){return.05*(f.X()-p.X())+f.X()},function(){return.05*(f.Y()-p.Y())+f.Y()},function(){return _+y.Value().toFixed(w)}],x),y.label=E),y.point1=p,y.point2=f,y.baseline=m,y.highline=P,O&&(y.ticks=g),y.remove=function(){S&&t.removeObject(E),t.removeObject(P),t.removeObject(m),t.removeObject(f),t.removeObject(p),s.Point.prototype.remove.call(y)},p.dump=!1,f.dump=!1,m.dump=!1,P.dump=!1,y.elType="slider",y.parents=o,y.subs={point1:p,point2:f,baseLine:m,highLine:P},O&&(g.dump=!1,y.subs.ticks=g),y},t.registerElement("slider",t.createSlider),{createSlider:t.createSlider}}),define("element/measure",["jxg","utils/type","base/element","base/point","base/line","base/ticks"],function(t,e,i){return t.createTapemeasure=function(r,s,o){var n,a,h,l,c,d,u,p,f,m,b;return n=s[0],a=s[1],h=e.copyAttributes(o,r.options,"tapemeasure"),l=h.withticks,c=h.withlabel,d=h.precision,h=e.copyAttributes(o,r.options,"tapemeasure","point1"),p=r.create("point",n,h),h=e.copyAttributes(o,r.options,"tapemeasure","point2"),f=r.create("point",a,h),h=e.copyAttributes(o,r.options,"tapemeasure"),c&&(h.withlabel=!0),u=r.create("segment",[p,f],h),c&&(m=o.name&&""!==o.name?o.name+" = ":"",u.label.setText(function(){return m+p.Dist(f).toFixed(d)})),l&&(h=e.copyAttributes(o,r.options,"tapemeasure","ticks"),b=r.create("ticks",[u,.1],h)),u.remove=function(){l&&u.removeTicks(b),r.removeObject(f),r.removeObject(p),i.prototype.remove.call(this)},u.Value=function(){return p.Dist(f)},p.dump=!1,f.dump=!1,u.elType="tapemeasure",u.parents=s,u.subs={point1:p,point2:f},l&&(b.dump=!1),u.methodMap=t.deepCopy(u.methodMap,{Value:"Value"}),u},t.registerElement("tapemeasure",t.createTapemeasure),{createTapemeasure:t.createTapemeasure}}),define("parser/datasource",["jxg","utils/type"],function(t,e){return t.DataSource=function(){return this.data=[],this.columnHeaders=[],this.rowHeaders=[],this},t.extend(t.DataSource.prototype,{loadFromArray:function(t,i,r){var s,o,n;if(e.isArray(i)&&(this.columnHeaders=i,i=!1),e.isArray(r)&&(this.rowHeaders=r,r=!1),this.data=[],i&&(this.columnHeaders=[]),r&&(this.rowHeaders=[]),e.exists(t)){for(this.data=[],s=0;t.length>s;s++)for(this.data[s]=[],o=0;t[s].length>o;o++)n=t[s][o],this.data[s][o]=""+parseFloat(n)===n?parseFloat(n):"-"!==n?n:0/0;if(i&&(this.columnHeaders=this.data[0].slice(1),this.data=this.data.slice(1)),r)for(this.rowHeaders=[],s=0;this.data.length>s;s++)this.rowHeaders.push(this.data[s][0]),this.data[s]=this.data[s].slice(1)}return this},loadFromTable:function(t,i,r){var s,o,n,a,h;if(e.isArray(i)&&(this.columnHeaders=i,i=!1),e.isArray(r)&&(this.rowHeaders=r,r=!1),this.data=[],i&&(this.columnHeaders=[]),r&&(this.rowHeaders=[]),t=document.getElementById(t),e.exists(t)){for(s=t.getElementsByTagName("tr"),this.data=[],o=0;s.length>o;o++)for(a=s[o].getElementsByTagName("td"),this.data[o]=[],n=0;a.length>n;n++)h=a[n].innerHTML,this.data[o][n]=""+parseFloat(h)===h?parseFloat(h):"-"!==h?h:0/0;if(i&&(this.columnHeaders=this.data[0].slice(1),this.data=this.data.slice(1)),r)for(this.rowHeaders=[],o=0;this.data.length>o;o++)this.rowHeaders.push(this.data[o][0]),this.data[o]=this.data[o].slice(1)}return this},addColumn:function(){throw Error("not implemented")},addRow:function(){throw Error("not implemented")},getColumn:function(t){var e,i=[];if("string"==typeof t)for(e=0;this.columnHeaders.length>e;e++)if(t===this.columnHeaders[e]){t=e;break}for(e=0;this.data.length>e;e++)this.data[e].length>t&&(i[e]=parseFloat(this.data[e][t]));return i},getRow:function(t){var e,i;if("string"==typeof t)for(i=0;this.rowHeaders.length>i;i++)if(t===this.rowHeaders[i]){t=i;break}for(e=[],i=0;this.data[t].length>i;i++)e[i]=this.data[t][i];return e}}),t.DataSource}),define("base/chart",["jxg","math/numerics","math/statistics","base/constants","base/coords","base/element","parser/datasource","utils/color","utils/type","utils/env","base/curve","base/point","base/text","base/polygon","element/sector","base/transformation","base/line","base/circle"],function(t,e,i,r,s,o,n,a,h,l){return t.Chart=function(t,e,i){this.constructor(t,i);var r,s,o,n,a,l;if(!h.isArray(e)||0===e.length)throw Error("JSXGraph: Can't create a chart without data");if(this.elements=[],h.isNumber(e[0]))for(s=e,r=[],o=0;s.length>o;o++)r[o]=o+1;else if(1===e.length&&h.isArray(e[0]))for(s=e[0],r=[],l=h.evaluate(s).length,o=0;l>o;o++)r[o]=o+1;else 2===e.length&&(l=Math.min(e[0].length,e[1].length),r=e[0].slice(0,l),s=e[1].slice(0,l));if(h.isArray(s)&&0===s.length)throw Error("JSXGraph: Can't create charts without data.");for(a=i.chartstyle.replace(/ /g,"").split(","),o=0;a.length>o;o++){switch(a[o]){case"bar":n=this.drawBar(t,r,s,i);break;case"line":n=this.drawLine(t,r,s,i);break;case"fit":n=this.drawFit(t,r,s,i);break;case"spline":n=this.drawSpline(t,r,s,i);break;case"pie":n=this.drawPie(t,s,i);break;case"point":n=this.drawPoints(t,r,s,i);break;case"radar":n=this.drawRadar(t,e,i)}this.elements.push(n)}return this.id=this.board.setId(this,"Chart"),this.elements},t.Chart.prototype=new o,t.extend(t.Chart.prototype,{drawLine:function(t,e,i,r){return r.fillcolor="none",r.highlightfillcolor="none",t.create("curve",[e,i],r)},drawSpline:function(t,e,i,r){return r.fillColor="none",r.highlightfillcolor="none",t.create("spline",[e,i],r)},drawFit:function(t,i,r,s){var o=s.degree;return o=Math.max(parseInt(o,10),1)||1,s.fillcolor="none",s.highlightfillcolor="none",t.create("functiongraph",[e.regressionPolynomial(o,i,r)],s)},drawBar:function(t,e,i,r){var s,o,n,a,l,c,d,u,p,f,m,b,g=[],v=[],C=function(t,i){return function(){return e[t]()-i*c}},y={fixed:!0,withLabel:!1,visible:!1,name:""};if(h.exists(r.fillopacity)||(r.fillopacity=.6),r&&r.width)c=r.width;else{if(1>=e.length)c=1;else for(c=e[1]-e[0],s=1;e.length-1>s;s++)c=c>e[s+1]-e[s]?e[s+1]-e[s]:c;c*=.8}for(n=r.fillcolor,b=h.copyAttributes(r,t.options,"chart","label"),a=parseFloat(b.fontsize),s=0;e.length>s;s++)h.isFunction(e[s])?(d=C(s,-.5),u=C(s,0),p=C(s,.5)):(d=e[s]-.5*c,u=e[s],p=e[s]+.5*c),f=i[s],"horizontal"===r.dir?(v[0]=t.create("point",[0,d],y),v[1]=t.create("point",[f,d],y),v[2]=t.create("point",[f,p],y),v[3]=t.create("point",[0,p],y),h.exists(r.labels)&&h.exists(r.labels[s])&&(o=(""+r.labels[s]).length,o=2*o*a/t.unitX,f>=0?f+=.5*a/t.unitX:f-=a*o/t.unitX,u-=.2*a/t.unitY,l=t.create("text",""+[f,u,r.labels[s]],b))):(v[0]=t.create("point",[d,0],y),v[1]=t.create("point",[d,f],y),v[2]=t.create("point",[p,f],y),v[3]=t.create("point",[p,0],y),h.exists(r.labels)&&h.exists(r.labels[s])&&(o=(""+r.labels[s]).length,o=.6*o*a/t.unitX,f>=0?f+=.5*a/t.unitY:f-=a/t.unitY,l=t.create("text",[u-.5*o,f,""+r.labels[s]],b))),r.withlines=!1,h.isArray(r.colors)&&(m=r.colors,r.fillcolor=m[s%m.length]),g[s]=t.create("polygon",v,r),h.exists(r.labels)&&h.exists(r.labels[s])&&(g[s].text=l);return g},drawPoints:function(t,e,i,r){var s,o=[],n=r.infoboxarray;for(r.fixed=!0,r.name="",s=0;e.length>s;s++)r.infoboxtext=n?n[s%n.length]:!1,o[s]=t.create("point",[e[s],i[s]],r);return o},drawPie:function(t,e,o){var n,a,l=[],c=[],d=(i.sum(e),o.colors),u=o.highlightcolors,p=o.labels,f=o.radius||4,m=f,b=o.center||[0,0],g=b[0],v=b[1],C=function(t,i,r){return function(){var s,o,n,a=0;for(o=0;t>=o;o++)a+=parseFloat(h.evaluate(e[o]));for(s=a,o=t+1;e.length>o;o++)s+=parseFloat(h.evaluate(e[o]));return n=0!==s?2*Math.PI*a/s:0,m()*Math[i](n)+r}},y=function(t,e){var i=-this.point1.coords.usrCoords[1]+this.point2.coords.usrCoords[1],o=-this.point1.coords.usrCoords[2]+this.point2.coords.usrCoords[2];h.exists(this.label)&&(this.label.rendNode.style.fontSize=e*this.label.visProp.fontsize+"px",this.label.prepareUpdate().update().updateRenderer()),this.point2.coords=new s(r.COORDS_BY_USER,[this.point1.coords.usrCoords[1]+i*t,this.point1.coords.usrCoords[2]+o*t],this.board),this.prepareUpdate().update().updateRenderer()},P=function(){this.highlighted||(this.highlighted=!0,this.board.renderer.highlight(this),y.call(this,1.1,2))},_=function(){this.highlighted&&(this.highlighted=!1,this.board.renderer.noHighlight(this),y.call(this,.9090909,1))},E={fixed:!0,withLabel:!1,visible:!1,name:""};if(!h.isArray(p))for(p=[],n=0;e.length>n;n++)p[n]="";for(h.isFunction(f)||(m=function(){return f}),o.highlightonsector=o.highlightonsector||!1,o.straightfirst=!1,o.straightlast=!1,a=t.create("point",[g,v],E),l[0]=t.create("point",[function(){return m()+g},function(){return v}],E),n=0;e.length>n;n++)l[n+1]=t.create("point",[C(n,"cos",g),C(n,"sin",v)],E),o.name=p[n],o.withlabel=""!==o.name,o.fillcolor=d&&d[n%d.length],o.labelcolor=d&&d[n%d.length],o.highlightfillcolor=u&&u[n%u.length],c[n]=t.create("sector",[a,l[n],l[n+1]],o),o.highlightonsector&&(c[n].hasPoint=c[n].hasPointSector),o.highlightbysize&&(c[n].highlight=P,c[n].noHighlight=_);return{sectors:c,points:l,midpoint:a}},drawRadar:function(e,i,o){var n,a,l,c,d,u,p,f,m,b,g,v,C,y,P,_,E,S,O,T,x,w,A,k,M,N,R,L,Y,B,j,D,I,X,J,G,U,F,z,$,H,V,q,W,Z,Q=i.length,K=function(){var t,e,i,o,n=this.visProp.label.offset.slice(0);return t=this.point1.X(),e=this.point2.X(),i=this.point1.Y(),o=this.point2.Y(),t>e&&(n[0]=-n[0]),i>o&&(n[1]=-n[1]),this.setLabelRelativeCoords(n),new s(r.COORDS_BY_USER,[this.point2.X(),this.point2.Y()],this.board)},te=function(t,i){var r,s,o;return r=e.create("transform",[-(P[i]-C[i]),0],{type:"translate"}),s=e.create("transform",[T/(_[i]+y[i]-(P[i]-C[i])),1],{type:"scale"}),r.melt(s),o=e.create("transform",[t],{type:"rotate"}),r.melt(o),r};if(0>=Q)return t.debug("No data"),void 0;if(l=o.paramarray,!h.exists(l))return t.debug("Need paramArray attribute"),void 0;if(c=l.length,1>=c)return t.debug("Need more than 1 param"),void 0;for(n=0;Q>n;n++)if(c!==i[n].length)return t.debug("Use data length equal to number of params ("+i[n].length+" != "+c+")"),void 0;for(d=[],u=[],a=0;c>a;a++)d[a]=i[0][a],u[a]=d[a];for(n=1;Q>n;n++)for(a=0;c>a;a++)i[n][a]>d[a]&&(d[a]=i[n][a]),i[n][a]<u[a]&&(u[a]=i[n][a]);for(p=[],f=[],n=0;Q>n;n++)p[n]="",f[n]=[];for(m=[],b=[],g=o.startshiftratio||0,v=o.endshiftratio||0,n=0;c>n;n++)m[n]=(d[n]-u[n])*g,b[n]=(d[n]-u[n])*v;if(C=o.startshiftarray||m,y=o.endshiftarray||b,P=o.startarray||u,h.exists(o.start))for(n=0;c>n;n++)P[n]=o.start;if(_=o.endarray||d,h.exists(o.end))for(n=0;c>n;n++)_[n]=o.end;if(C.length!==c)return t.debug("Start shifts length is not equal to number of parameters"),void 0;if(y.length!==c)return t.debug("End shifts length is not equal to number of parameters"),void 0;if(P.length!==c)return t.debug("Starts length is not equal to number of parameters"),void 0;if(_.length!==c)return t.debug("Ends length is not equal to number of parameters"),void 0;for(E=o.labelarray||p,S=o.colors,O=o.highlightcolors,T=o.radius||10,W=o.strokewidth||1,h.exists(o.highlightonsector)||(o.highlightonsector=!1),x={name:o.name,id:o.id,strokewidth:W,polystrokewidth:o.polystrokewidth||W,strokecolor:o.strokecolor||"black",straightfirst:!1,straightlast:!1,fillcolor:o.fillColor||"#FFFF88",fillopacity:o.fillOpacity||.4,highlightfillcolor:o.highlightFillColor||"#FF7400",highlightstrokecolor:o.highlightStrokeColor||"black",gradient:o.gradient||"none"},w=o.center||[0,0],A=w[0],k=w[1],M=e.create("point",[A,k],{name:"",fixed:!0,withlabel:!1,visible:!1}),N=Math.PI/2-Math.PI/c,N=o.startangle||0,R=N,L=[],Y=[],n=0;c>n;n++)for(R+=2*Math.PI/c,j=T*Math.cos(R)+A,D=T*Math.sin(R)+k,L[n]=e.create("point",[j,D],{name:"",fixed:!0,withlabel:!1,visible:!1}),Y[n]=e.create("line",[M,L[n]],{name:l[n],strokeColor:x.strokecolor,strokeWidth:x.strokewidth,strokeOpacity:1,straightFirst:!1,straightLast:!1,withLabel:!0,highlightStrokeColor:x.highlightstrokecolor}),Y[n].getLabelAnchor=K,B=te(R,n),a=0;i.length>a;a++)Z=i[a][n],f[a][n]=e.create("point",[Z,0],{name:"",fixed:!0,withlabel:!1,visible:!1}),f[a][n].addTransform(f[a][n],B);for(I=[],n=0;Q>n;n++)for(x.labelcolor=S&&S[n%S.length],x.strokecolor=S&&S[n%S.length],x.fillcolor=S&&S[n%S.length],I[n]=e.create("polygon",f[n],{withLines:!0,withLabel:!1,fillColor:x.fillcolor,fillOpacity:x.fillopacity,highlightFillColor:x.highlightfillcolor}),a=0;c>a;a++)I[n].borders[a].setAttribute("strokecolor:"+S[n%S.length]),I[n].borders[a].setAttribute("strokewidth:"+x.polystrokewidth);switch(X=o.legendposition||"none"){case"right":G=o.legendleftoffset||2,U=o.legendtopoffset||1,this.legend=e.create("legend",[A+T+G,k+T-U],{labels:E,colors:S});break;case"none":break;default:t.debug("Unknown legend position")}if(J=[],o.showcircles){for(F=[],n=0;6>n;n++)F[n]=20*n;if(F[0]="0",z=o.circlelabelarray||F,$=z.length,2>$)return t.debug("Too less circles"),void 0;for(H=[],V=N+Math.PI/c,B=te(V,0),x.fillcolor="none",x.highlightfillcolor="none",x.strokecolor=o.strokecolor||"black",x.strokewidth=o.circlestrokewidth||.5,x.layer=0,q=(_[0]-P[0])/($-1),n=0;$>n;n++)H[n]=e.create("point",[P[0]+n*q,0],{name:z[n],size:0,fixed:!0,withLabel:!0,visible:!0}),H[n].addTransform(H[n],B),J[n]=e.create("circle",[M,H[n]],x)}return this.rendNode=I[0].rendNode,{circles:J,lines:Y,points:f,midpoint:M,polygons:I}},updateRenderer:function(){return this},update:function(){return this.needsUpdate&&this.updateDataArray(),this},updateDataArray:function(){}}),t.createChart=function(e,i,r){var s,o,c,d,u,p,f,m,b,g,v,C,y,P,_,E,S=[],O=l.isBrowser?document.getElementById(i[0]):null;if(1===i.length&&"string"==typeof i[0]){if(h.exists(O)){if(b=h.copyAttributes(r,e.options,"chart"),O=(new n).loadFromTable(i[0],b.withheaders,b.withheaders),s=O.data,u=O.columnHeaders,o=O.rowHeaders,g=b.width,v=b.name,C=b.strokecolor,y=b.fillcolor,P=b.highlightstrokecolor,_=b.highlightfillcolor,e.suspendUpdate(),E=s.length,m=[],b.rows&&h.isArray(b.rows)){for(c=0;E>c;c++)for(d=0;b.rows.length>d;d++)if(b.rows[d]===c||b.withheaders&&b.rows[d]===o[c]){m.push(s[c]);break}}else m=s;for(E=m.length,c=0;E>c;c++){if(f=[],b.chartstyle&&-1!==b.chartstyle.indexOf("bar")){for(p=g?g:.8,f.push(1-p/2+(c+.5)*p/E),d=1;m[c].length>d;d++)f.push(f[d-1]+1);b.width=p/E}v&&v.length===E?b.name=v[c]:b.withheaders&&(b.name=u[c]),b.strokecolor=C&&C.length===E?C[c]:a.hsv2rgb(360*((c+1)/E),.9,.6),b.fillcolor=y&&y.length===E?y[c]:a.hsv2rgb(360*((c+1)/E),.9,1),b.highlightstrokecolor=P&&P.length===E?P[c]:a.hsv2rgb(360*((c+1)/E),.9,1),b.highlightfillcolor=_&&_.length===E?_[c]:a.hsv2rgb(360*((c+1)/E),.9,.6),b.chartstyle&&-1!==b.chartstyle.indexOf("bar")?S.push(new t.Chart(e,[f,m[c]],b)):S.push(new t.Chart(e,[m[c]],b))}e.unsuspendUpdate()}return S}return b=h.copyAttributes(r,e.options,"chart"),new t.Chart(e,i,b)},t.registerElement("chart",t.createChart),t.Legend=function(t,e,i){var o;if(this.constructor(),o=h.copyAttributes(i,t.options,"legend"),this.board=t,this.coords=new s(r.COORDS_BY_USER,e,this.board),this.myAtts={},this.label_array=o.labelarray||o.labels,this.color_array=o.colorarray||o.colors,this.lines=[],this.myAtts.strokewidth=o.strokewidth||5,this.myAtts.straightfirst=!1,this.myAtts.straightlast=!1,this.myAtts.withlabel=!0,this.myAtts.fixed=!0,this.style=o.legendstyle||o.style,"vertical"!==this.style)throw Error("JSXGraph: Unknown legend style: "+this.style);this.drawVerticalLegend(t,o)},t.Legend.prototype=new o,t.Legend.prototype.drawVerticalLegend=function(t,e){var i,o=e.linelength||1,n=(e.rowheight||20)/this.board.unitY,a=function(){return this.setLabelRelativeCoords(this.visProp.label.offset),new s(r.COORDS_BY_USER,[this.point2.X(),this.point2.Y()],this.board)};for(i=0;this.label_array.length>i;i++)this.myAtts.strokecolor=this.color_array[i],this.myAtts.highlightstrokecolor=this.color_array[i],this.myAtts.name=this.label_array[i],this.myAtts.label={offset:[10,0],strokeColor:this.color_array[i],strokeWidth:this.myAtts.strokewidth},this.lines[i]=t.create("line",[[this.coords.usrCoords[1],this.coords.usrCoords[2]-i*n],[this.coords.usrCoords[1]+o,this.coords.usrCoords[2]-i*n]],this.myAtts),this.lines[i].getLabelAnchor=a},t.createLegend=function(e,i,r){var s=[0,0];return h.exists(i)&&2===i.length&&(s=i),new t.Legend(e,s,r)},t.registerElement("legend",t.createLegend),{Chart:t.Chart,Legend:t.Legend,createChart:t.createChart,createLegend:t.createLegend}}),define("base/turtle",["jxg","base/constants","base/element","utils/type","base/curve","base/point","base/line","base/transformation"],function(t,e,i,r){return t.Turtle=function(t,i,s){var o,n,a;return this.constructor(t,s,e.OBJECT_TYPE_TURTLE,e.OBJECT_CLASS_OTHER),this.turtleIsHidden=!1,this.board=t,this.visProp.curveType="plot",this._attributes=r.copyAttributes(this.visProp,t.options,"turtle"),delete this._attributes.id,o=0,n=0,a=90,0!==i.length&&(3===i.length?(o=i[0],n=i[1],a=i[2]):2===i.length?r.isArray(i[0])?(o=i[0][0],n=i[0][1],a=i[1]):(o=i[0],n=i[1]):(o=i[0][0],n=i[0][1])),this.init(o,n,a),this.methodMap=r.deepCopy(this.methodMap,{forward:"forward",fd:"forward",back:"back",bk:"back",right:"right",rt:"right",left:"left",lt:"left",penUp:"penUp",pu:"penUp",penDown:"penDown",pd:"penDown",clearScreen:"clearScreen",cs:"clearScreen",clean:"clean",setPos:"setPos",home:"home",hideTurtle:"hideTurtle",ht:"hideTurtle",showTurtle:"showTurtle",st:"showTurtle",penSize:"setPenSize",penColor:"setPenColor",pushTurtle:"pushTurtle",push:"pushTurtle",popTurtle:"popTurtle",pop:"popTurtle",lookTo:"lookTo",pos:"pos",moveTo:"moveTo",X:"X",Y:"Y"}),this},t.Turtle.prototype=new i,t.extend(t.Turtle.prototype,{init:function(t,e,i){var r={fixed:!0,name:"",visible:!1,withLabel:!1};this.arrowLen=20/Math.sqrt(this.board.unitX*this.board.unitX+this.board.unitY*this.board.unitY),this.pos=[t,e],this.isPenDown=!0,this.dir=90,this.stack=[],this.objects=[],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,r),this.objects.push(this.turtle),this.turtle2=this.board.create("point",[this.pos[0],this.pos[1]+this.arrowLen],r),this.objects.push(this.turtle2),this.visProp.arrow.lastArrow=!0,this.visProp.arrow.straightFirst=!1,this.visProp.arrow.straightLast=!1,this.arrow=this.board.create("line",[this.turtle,this.turtle2],this.visProp.arrow),this.objects.push(this.arrow),this.right(90-i),this.board.update()},forward:function(t){if(0===t)return this;var e,i=t*Math.cos(this.dir*Math.PI/180),r=t*Math.sin(this.dir*Math.PI/180);return this.turtleIsHidden||(e=this.board.create("transform",[i,r],{type:"translate"}),e.applyOnce(this.turtle),e.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]+=i,this.pos[1]+=r,this.isPenDown&&(this.curve.dataX.push(this.pos[0]),this.curve.dataY.push(this.pos[1])),this.board.update(),this},back:function(t){return this.forward(-t)},right:function(t){if(this.dir-=t,this.dir%=360,!this.turtleIsHidden){var e=this.board.create("transform",[-t*Math.PI/180,this.turtle],{type:"rotate"});e.applyOnce(this.turtle2)}return this.board.update(),this},left:function(t){return this.right(-t)},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(){var t,i;for(t=0;this.objects.length>t;t++)i=this.objects[t],i.type===e.OBJECT_TYPE_CURVE&&(this.board.removeObject(i),this.objects.splice(t,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(){var t,e,i=this.objects.length;for(t=0;i>t;t++)e=this.objects[t],this.board.removeObject(e);return this.init(0,0,90),this},setPos:function(t,i){var s;return this.pos=r.isArray(t)?t:[t,i],this.turtleIsHidden||(this.turtle.setPositionDirectly(e.COORDS_BY_USER,[t,i]),this.turtle2.setPositionDirectly(e.COORDS_BY_USER,[t,i+this.arrowLen]),s=this.board.create("transform",[-(this.dir-90)*Math.PI/180,this.turtle],{type:"rotate"}),s.applyOnce(this.turtle2)),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(t){return this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this.copyAttr("strokeWidth",t)),this.objects.push(this.curve),this},setPenColor:function(t){return this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this.copyAttr("strokeColor",t)),this.objects.push(this.curve),this},setHighlightPenColor:function(t){return this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this.copyAttr("highlightStrokeColor",t)),this.objects.push(this.curve),this},setAttribute:function(t){var i,s,o,n=this.objects.length;for(i=0;n>i;i++)s=this.objects[i],s.type===e.OBJECT_TYPE_CURVE&&s.setAttribute(t);return o=this.visProp.id,this.visProp=r.deepCopy(this.curve.visProp),this.visProp.id=o,this._attributes=r.deepCopy(this.visProp),delete this._attributes.id,this},copyAttr:function(t,e){return this._attributes[t.toLowerCase()]=e,this._attributes},showTurtle:function(){return this.turtleIsHidden=!1,this.arrow.setAttribute({visible:!0}),this.visProp.arrow.visible=!1,this.setPos(this.pos[0],this.pos[1]),this.board.update(),this},hideTurtle:function(){return this.turtleIsHidden=!0,this.arrow.setAttribute({visible:!1}),this.visProp.arrow.visible=!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 t=this.stack.pop();return this.pos[0]=t[0],this.pos[1]=t[1],this.dir=t[2],this.setPos(this.pos[0],this.pos[1]),this},lookTo:function(t){var e,i,s,o,n;return r.isArray(t)?(e=this.pos[0],i=this.pos[1],s=t[0],o=t[1],n=Math.atan2(o-i,s-e),this.right(this.dir-180*n/Math.PI)):r.isNumber(t)&&this.right(this.dir-t),this},moveTo:function(t){var e,i,s;return r.isArray(t)&&(e=t[0]-this.pos[0],i=t[1]-this.pos[1],this.turtleIsHidden||(s=this.board.create("transform",[e,i],{type:"translate"}),s.applyOnce(this.turtle),s.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]=t[0],this.pos[1]=t[1],this.isPenDown&&(this.curve.dataX.push(this.pos[0]),this.curve.dataY.push(this.pos[1])),this.board.update()),this},fd:function(t){return this.forward(t)},bk:function(t){return this.back(t)},lt:function(t){return this.left(t)},rt:function(t){return this.right(t)},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()},evalAt:function(t,i){var r,s,o,n,a=this.objects.length;for(r=0,s=0;a>r;r++)if(o=this.objects[r],o.elementClass===e.OBJECT_CLASS_CURVE){if(t>=s&&s+o.numberPoints>t)return n=t-s,o[i](n);s+=o.numberPoints}return this[i]()},X:function(t){return r.exists(t)?this.evalAt(t,"X"):this.pos[0]},Y:function(t){return r.exists(t)?this.evalAt(t,"Y"):this.pos[1]},Z:function(){return 1},minX:function(){return 0},maxX:function(){var t,i,r=this.objects.length,s=0;for(t=0;r>t;t++)i=this.objects[t],i.elementClass===e.OBJECT_CLASS_CURVE&&(s+=this.objects[t].numberPoints);return s},hasPoint:function(t,i){var r,s;for(r=0;this.objects.length>r;r++)if(s=this.objects[r],s.type===e.OBJECT_TYPE_CURVE&&s.hasPoint(t,i))return!0;return!1}}),t.createTurtle=function(e,i,s){var o;return i=i||[],o=r.copyAttributes(s,e.options,"turtle"),new t.Turtle(e,i,o)},t.registerElement("turtle",t.createTurtle),{Turtle:t.Turtle,createTurtle:t.createTurtle}}),define("utils/dump",["jxg","utils/type"],function(t,e){return t.Dump={addMarkers:function(t,i,r){var s,o,n;e.isArray(i)||(i=[i]),e.isArray(r)||(r=[r]),o=Math.min(i.length,r.length),i.length=o,r.length=o;for(s in t.objects)if(t.objects.hasOwnProperty(s))for(n=0;o>n;n++)t.objects[s][i[n]]=r[n]},deleteMarkers:function(t,i){var r,s,o;e.isArray(i)||(i=[i]),s=i.length,i.length=s;for(r in t.objects)if(t.objects.hasOwnProperty(r))for(o=0;s>o;o++)delete t.objects[r][i[o]]},str:function(t){return"string"==typeof t&&"function"!==t.substr(0,7)&&(t="'"+t+"'"),t},minimizeObject:function(t){var i,r,s,o={},n=e.deepCopy(t),a=[];for(s=1;arguments.length>s;s++)a.push(arguments[s]);for(s=a.length;s>0;s--)o=e.deepCopy(o,a[s-1],!0);for(i in o)o.hasOwnProperty(i)&&(r=i.toLowerCase(),"object"!=typeof o[i]&&o[i]===n[r]&&delete n[r]);return n},prepareAttributes:function(e,i){var r,s;r=this.minimizeObject(i.getAttributes(),t.Options[i.elType]);for(s in i.subs)i.subs.hasOwnProperty(s)&&(r[s]=this.minimizeObject(i.subs[s].getAttributes(),t.Options[i.elType][s],t.Options[i.subs[s].elType]),r[s].id=i.subs[s].id,r[s].name=i.subs[s].name);return r.id=i.id,r.name=i.name,r},dump:function(t){var e,i,r,s,o=[],n=[],a=[],h=t.objectsList.length;for(this.addMarkers(t,"dumped",!1),n.push({obj:"$board",method:"setBoundingBox",params:[t.getBoundingBox(),!0]}),e=0;h>e;e++)if(i=t.objectsList[e],r={},!i.dumped&&i.dump){for(r.type=i.getType(),r.parents=i.getParents(),"point"===r.type&&1===r.parents[0]&&(r.parents=r.parents.slice(1)),s=0;r.parents.length>s;s++)"string"==typeof r.parents[s]&&(r.parents[s]="'"+r.parents[s]+"'");r.attributes=this.prepareAttributes(t,i),"glider"===r.type&&i.onPolygon&&o.push({obj:i.id,prop:"onPolygon",val:!0}),a.push(r)}return this.deleteMarkers(t,"dumped"),{elements:a,props:o,methods:n}},arrayToParamStr:function(t,e){var i,r=[];for(i=0;t.length>i;i++)r.push(e.call(this,t[i]));return r.join(", ")},toJSAN:function(t){var i,r,s;switch(typeof t){case"object":if(t){if(r=[],e.isArray(t)){for(i=0;t.length>i;i++)r.push(this.toJSAN(t[i]));return"["+r.join(",")+"]"}for(s in t)t.hasOwnProperty(s)&&r.push(s+": "+this.toJSAN(t[s]));return"<<"+r.join(", ")+">> "}return"null";case"string":return"'"+t.replace(/(["'])/g,"\\$1")+"'";case"number":case"boolean":return""+t;case"null":return"null"}},toJessie:function(t){var e,i,r=this.dump(t),s=[];for(i=r.elements,e=0;i.length>e;e++)i[e].attributes.name.length>0&&s.push("// "+i[e].attributes.name),s.push("s"+e+" = "+i[e].type+"("+i[e].parents.join(", ")+") "+this.toJSAN(i[e].attributes).replace(/\n/,"\\n")+";"),s.push("");for(e=0;r.methods.length>e;e++)s.push(r.methods[e].obj+"."+r.methods[e].method+"("+this.arrayToParamStr(r.methods[e].params,this.toJSAN)+");"),s.push("");for(e=0;r.props.length>e;e++)s.push(r.props[e].obj+"."+r.props[e].prop+" = "+this.toJSAN(r.props[e].val)+";"),s.push("");return s.join("\n")},toJavaScript:function(t){var i,r,s=this.dump(t),o=[];for(r=s.elements,i=0;r.length>i;i++)o.push('board.create("'+r[i].type+'", ['+r[i].parents.join(", ")+"], "+e.toJSON(r[i].attributes)+");");for(i=0;s.methods.length>i;i++)o.push(s.methods[i].obj+"."+s.methods[i].method+"("+this.arrayToParamStr(s.methods[i].params,e.toJSON)+");"),o.push("");for(i=0;s.props.length>i;i++)o.push(s.props[i].obj+"."+s.props[i].prop+" = "+e.toJSON(s.props[i].val)+";"),o.push("");return o.join("\n")}},t.Dump}),define("element/slopetriangle",["jxg","options","utils/type","base/constants","base/line","base/polygon","base/point","base/element"],function(t,e,i,r,s,o){return e.slopetriangle={fillColor:"red",fillOpacity:.4,glider:{},baseline:{visible:!1,withLabel:!1,name:""},basepoint:{visible:!1,withLabel:!1,name:""},toppoint:{visible:!1,withLabel:!1,name:""}},t.createSlopeTriangle=function(e,s,n){var a,h,l,c,d,u,p,f;if(s[0].type===r.OBJECT_TYPE_TANGENT)return h=s[0],l=h.glider,f=i.copyAttributes(n,e.options,"slopetriangle","basepoint"),p=e.create("point",[function(){return[l.X()+1,l.Y()]}],f),f=i.copyAttributes(n,e.options,"slopetriangle","baseline"),u=e.create("line",[l,p],f),f=i.copyAttributes(n,e.options,"slopetriangle","glider"),c=e.create("glider",[l.X()+1,l.Y(),u],f),f=i.copyAttributes(n,e.options,"slopetriangle","toppoint"),d=e.create("point",[function(){return[c.X(),c.Y()+(c.X()-l.X())*h.getSlope()]}],f),f=i.copyAttributes(n,e.options,"slopetriangle"),a=e.create("polygon",[l,c,d],f),a.Value=function(){return h.getSlope()},a.tangent=h,a.glider=c,a.basepoint=p,a.baseline=u,a.toppoint=d,window.toppoint=d,a.methodMap=t.deepCopy(a.methodMap,{tangent:"tangent",glider:"glider",basepoint:"basepoint",baseline:"baseline",toppoint:"toppoint",Value:"Value",V:"Value"}),a.remove=function(){o.Polygon.prototype.remove.call(this),e.removeObject(d),e.removeObject(c),e.removeObject(u),e.removeObject(p)
+},a;throw Error("JSXGraph: Can't create slope triangle with parent types '"+typeof s[0]+"'.")},t.registerElement("slopetriangle",t.createSlopeTriangle),{createSlopeTriangle:t.createSlopeTriangle}}),define("../build/core.deps.js",["jxg","utils/env","base/constants","utils/type","utils/xml","utils/event","utils/expect","math/math","math/numerics","math/statistics","math/symbolic","math/geometry","math/poly","math/complex","renderer/abstract","renderer/no","reader/file","parser/geonext","base/board","options","jsxgraph","base/element","base/coords","base/point","base/line","base/group","base/circle","element/conic","base/polygon","base/curve","element/arc","element/sector","base/composition","element/composition","element/locus","base/text","base/image","element/slider","element/measure","base/chart","base/transformation","base/turtle","utils/color","base/ticks","utils/zip","utils/base64","utils/uuid","utils/encoding","server/server","element/locus","parser/datasource","parser/jessiecode","utils/dump","renderer/svg","renderer/vml","renderer/canvas","renderer/no","element/slopetriangle"],function(t,e){return e.isBrowser?window.JXG=t:e.isNode()&&"object"==typeof module?module.exports=t:e.isWebWorker()&&(self.JXG=t),t}),require("../build/core.deps.js")})(); \ No newline at end of file
diff --git a/Sketchometry.activity/js/sk.js b/Sketchometry.activity/js/sk.js
new file mode 100644
index 0000000..3236374
--- /dev/null
+++ b/Sketchometry.activity/js/sk.js
@@ -0,0 +1 @@
+function Point(t,e){this.X=t;this.Y=e}function Rectangle(t,e,n,r){this.X=t;this.Y=e;this.Width=n;this.Height=r}function Template(t,e,n){this.Name=t;this.Points=Resample(n,NumPoints);var r=IndicativeAngle(this.Points);this.Points=RotateBy(this.Points,-r);this.Points=ScaleDimTo(this.Points,SquareSize,OneDThreshold);if(e)this.Points=RotateBy(this.Points,+r);this.Points=TranslateTo(this.Points,Origin);this.StartUnitVector=CalcStartUnitVector(this.Points,StartAngleIndex);this.Vector=Vectorize(this.Points,e)}function Multistroke(t,e,n){this.Name=t;this.NumStrokes=n.length;var r=new Array;for(var i=0;i<n.length;i++)r[i]=i;var a=new Array;HeapPermute(n.length,r,a);this.Templates=new Array;var o=MakeUnistrokes(n,a);for(var s=0;s<o.length;s++)this.Templates[s]=new Template(t,e,o[s])}function Result(t,e){this.Name=t;this.Score=e}var NumMultistrokes=16;var NumPoints=96;var SquareSize=250;var OneDThreshold=.25;var Origin=new Point(0,0);var Diagonal=Math.sqrt(SquareSize*SquareSize+SquareSize*SquareSize);var HalfDiagonal=.5*Diagonal;var AngleRange=Deg2Rad(45);var AnglePrecision=Deg2Rad(2);var Phi=.5*(-1+Math.sqrt(5));var StartAngleIndex=NumPoints/8;var AngleSimilarityThreshold=Deg2Rad(30);function NDollarRecognizer(t){this.Multistrokes=new Array;this.Recognize=function(t,e,n,r,i,a,o){var s;if(i)s=JxgCombineStrokes(t);else s=CombineStrokes(t);s=Resample(s,NumPoints);var h=IndicativeAngle(s);s=RotateBy(s,-h);s=ScaleDimTo(s,SquareSize,OneDThreshold);if(e)s=RotateBy(s,+h);s=TranslateTo(s,Origin);var l=CalcStartUnitVector(s,StartAngleIndex);var u=Vectorize(s,e);var v=+Infinity;var g=-1;for(var f=0;f<this.Multistrokes.length;f++){if(!n||t.length==this.Multistrokes[f].NumStrokes){for(var c=0;c<this.Multistrokes[f].Templates.length;c++){var M,P;if(typeof a!=="undefined"){P=false;for(M=0;M<a.length;M++){if(this.Multistrokes[f].Name===a[M]){P=true;break}}if(P)continue}if(typeof o!=="undefined"){P=true;for(M=0;M<o.length;M++){if(this.Multistrokes[f].Name===o[M]){P=false;break}}if(P)continue}if(AngleBetweenUnitVectors(l,this.Multistrokes[f].Templates[c].StartUnitVector)<=AngleSimilarityThreshold){var m;if(r){m=OptimalCosineDistance(this.Multistrokes[f].Templates[c].Vector,u)}else{m=DistanceAtBestAngle(s,this.Multistrokes[f].Templates[c],-AngleRange,+AngleRange,AnglePrecision)}if(m<v){v=m;g=f}}}}}return g==-1?new Result("No match.",0):new Result(this.Multistrokes[g].Name,r?1/v:1-v/HalfDiagonal)};this.AddMultistroke=function(t,e,n){this.Multistrokes[this.Multistrokes.length]=new Multistroke(t,e,n);var r=0;for(var i=0;i<this.Multistrokes.length;i++){if(this.Multistrokes[i].Name==t)r++}return r};this.DeleteUserMultistrokes=function(){this.Multistrokes.length=NumMultistrokes;return NumMultistrokes}}function HeapPermute(t,e,n){if(t==1){n[n.length]=e.slice()}else{for(var r=0;r<t;r++){HeapPermute(t-1,e,n);if(t%2==1){var i=e[0];e[0]=e[t-1];e[t-1]=i}else{var i=e[r];e[r]=e[t-1];e[t-1]=i}}}}function MakeUnistrokes(t,e){var n=new Array;for(var r=0;r<e.length;r++){for(var i=0;i<Math.pow(2,e[r].length);i++){var a=new Array;for(var o=0;o<e[r].length;o++){var s;if((i>>o&1)==1){s=t[e[r][o]].slice().reverse()}else{s=t[e[r][o]].slice()}for(var h=0;h<s.length;h++){a[a.length]=s[h]}}n[n.length]=a}}return n}function CombineStrokes(t){var e=new Array;for(var n=0;n<t.length;n++){for(var r=0;r<t[n].length;r++){e[e.length]=new Point(t[n][r].X,t[n][r].Y)}}return e}function JxgCombineStrokes(t){var e=[];for(var n=0;n<t.length;n++)for(var r=0;r<t[n].length;r++)e[e.length]=new Point(t[n][r].scrCoords[1],t[n][r].scrCoords[2]);return e}function Resample(t,e){var n=PathLength(t)/(e-1);var r=0;var i=new Array(t[0]);for(var a=1;a<t.length;a++){var o=Distance(t[a-1],t[a]);if(r+o>=n){var s=t[a-1].X+(n-r)/o*(t[a].X-t[a-1].X);var h=t[a-1].Y+(n-r)/o*(t[a].Y-t[a-1].Y);var l=new Point(s,h);i[i.length]=l;t.splice(a,0,l);r=0}else r+=o}if(i.length==e-1){i[i.length]=new Point(t[t.length-1].X,t[t.length-1].Y)}return i}function IndicativeAngle(t){var e=Centroid(t);return Math.atan2(e.Y-t[0].Y,e.X-t[0].X)}function RotateBy(t,e){var n=Centroid(t);var r=Math.cos(e);var i=Math.sin(e);var a=new Array;for(var o=0;o<t.length;o++){var s=(t[o].X-n.X)*r-(t[o].Y-n.Y)*i+n.X;var h=(t[o].X-n.X)*i+(t[o].Y-n.Y)*r+n.Y;a[a.length]=new Point(s,h)}return a}function ScaleDimTo(t,e,n){var r=BoundingBox(t);var i=Math.min(r.Width/r.Height,r.Height/r.Width)<=n;var a=new Array;for(var o=0;o<t.length;o++){var s=i?t[o].X*(e/Math.max(r.Width,r.Height)):t[o].X*(e/r.Width);var h=i?t[o].Y*(e/Math.max(r.Width,r.Height)):t[o].Y*(e/r.Height);a[a.length]=new Point(s,h)}return a}function TranslateTo(t,e){var n=Centroid(t);var r=new Array;for(var i=0;i<t.length;i++){var a=t[i].X+e.X-n.X;var o=t[i].Y+e.Y-n.Y;r[r.length]=new Point(a,o)}return r}function Vectorize(t,e){var n;var r=1;var i=0;if(e){var a=Math.atan2(t[0].Y,t[0].X);var o=Math.PI/4*Math.floor((a+Math.PI/8)/(Math.PI/4));r=Math.cos(o-a);i=Math.sin(o-a)}var s=0;var h=new Array;for(n=0;n<t.length;n++){var l=t[n].X*r-t[n].Y*i;var u=t[n].Y*r+t[n].X*i;h[h.length]=l;h[h.length]=u;s+=l*l+u*u}var v=Math.sqrt(s);for(n=0;n<h.length;n++)h[n]/=v;return h}function OptimalCosineDistance(t,e){var n=0;var r=0;for(var i=0;i<t.length;i+=2){n+=t[i]*e[i]+t[i+1]*e[i+1];r+=t[i]*e[i+1]-t[i+1]*e[i]}var a=Math.atan(r/n);return Math.acos(n*Math.cos(a)+r*Math.sin(a))}function DistanceAtBestAngle(t,e,n,r,i){var a=Phi*n+(1-Phi)*r;var o=DistanceAtAngle(t,e,a);var s=(1-Phi)*n+Phi*r;var h=DistanceAtAngle(t,e,s);while(Math.abs(r-n)>i){if(o<h){r=s;s=a;h=o;a=Phi*n+(1-Phi)*r;o=DistanceAtAngle(t,e,a)}else{n=a;a=s;o=h;s=(1-Phi)*n+Phi*r;h=DistanceAtAngle(t,e,s)}}return Math.min(o,h)}function DistanceAtAngle(t,e,n){var r=RotateBy(t,n);return PathDistance(r,e.Points)}function Centroid(t){var e=0,n=0;for(var r=0;r<t.length;r++){e+=t[r].X;n+=t[r].Y}e/=t.length;n/=t.length;return new Point(e,n)}function BoundingBox(t){var e=+Infinity,n=-Infinity,r=+Infinity,i=-Infinity;for(var a=0;a<t.length;a++){if(t[a].X<e)e=t[a].X;if(t[a].X>n)n=t[a].X;if(t[a].Y<r)r=t[a].Y;if(t[a].Y>i)i=t[a].Y}return new Rectangle(e,r,n-e,i-r)}function PathDistance(t,e){var n=0;for(var r=0;r<t.length;r++)n+=Distance(t[r],e[r]);return n/t.length}function PathLength(t){var e=0;for(var n=1;n<t.length;n++)e+=Distance(t[n-1],t[n]);return e}function Distance(t,e){var n=e.X-t.X;var r=e.Y-t.Y;return Math.sqrt(n*n+r*r)}function CalcStartUnitVector(t,e){var n=new Point(t[e].X-t[0].X,t[e].Y-t[0].Y);var r=Math.sqrt(n.X*n.X+n.Y*n.Y);return new Point(n.X/r,n.Y/r)}function AngleBetweenUnitVectors(t,e){var n=t.X*e.X+t.Y*e.Y;if(n<-1||n>+1)n=Round(n,5);return Math.acos(n)}function Round(t,e){e=Math.pow(10,e);return Math.round(t*e)/e}function Deg2Rad(t){return t*Math.PI/180}function Rad2Deg(t){return t*180/Math.PI} \ No newline at end of file
diff --git a/Sketchometry.activity/js/sketch.js b/Sketchometry.activity/js/sketch.js
new file mode 100644
index 0000000..bae9ed5
--- /dev/null
+++ b/Sketchometry.activity/js/sketch.js
@@ -0,0 +1,24 @@
+var GUI = { release: true };
+
+(function () {
+
+ if (typeof console !== 'undefined') {
+ console.$log = console.log;
+ } else {
+ window.console = {};
+ }
+
+ console.log = function () { };
+
+ //JXG.debug = function () {};
+})();(function(){if($.browser.msie){return}var e=window.applicationCache;if(typeof e=="undefined"){}e.on=e.addEventListener;var t=function(e){console.log("appCacheEvent: "+e.type+" -- "+(new Date).toISOString());if(!("progress"===e.type||"downloading"===e.type||"checking"===e.type||"noupdate"===e.type||"cached"===e.type)){if("updateready"==e.type){if(!GUI.release){GUI.alert("new version available, updating")}window.location.reload()}if("error"===e.type&&!GUI.release){if(navigator.onLine)GUI.alert("appcache error!");else console.log("appcache error!")}}};e.on("checking",t,false);e.on("error",t,false);e.on("noupdate",t,false);e.on("downloading",t,false);e.on("progress",t,false);e.on("updateready",t,false);e.on("cached",t,false)})();var ND={strokes:[{name:"bisector",nbr:1,data:new Array(new Array([231,231],[231,232],[231,233],[232,234],[233,235],[242,260],[243,263],[244,266],[244,268],[244,271],[246,273],[246,276],[248,278],[248,280],[249,282],[250,286],[250,289],[251,291],[251,294],[252,297],[254,302],[254,305],[255,308],[256,310],[257,313],[258,319],[258,320],[259,321],[260,323],[260,324],[261,326],[262,328],[262,329],[262,330],[262,332],[263,334],[263,335],[263,336],[263,337],[264,337],[264,338],[264,339],[265,339],[265,341],[265,342],[265,343],[265,344],[265,345],[266,345],[266,347],[266,350],[266,351],[267,351],[267,353],[267,354],[267,353],[267,352],[267,351],[268,350],[269,346],[273,336],[274,334],[275,331],[278,325],[280,323],[283,316],[284,314],[285,312],[286,310],[288,306],[290,301],[292,298],[293,297],[293,296],[293,295],[294,293],[295,291],[295,290],[296,289],[296,288],[298,284],[299,280],[300,279],[300,278],[300,277],[302,274],[302,273],[302,274],[304,277],[305,279],[309,287],[310,289],[313,296],[315,302],[317,307],[326,329],[328,335],[329,338],[331,340],[333,346],[335,351],[335,352],[335,353],[336,353],[336,354],[337,356],[337,356],[337,355],[337,352],[339,347],[339,343],[340,338],[340,335],[342,326],[343,317],[345,309],[345,304],[346,302],[346,299],[347,297],[348,290],[349,286],[349,281],[350,279],[351,274],[351,272],[352,268],[353,263],[353,261],[355,257],[357,252],[359,248],[360,245],[361,243],[361,242],[363,238],[363,237],[365,234],[365,233],[366,231],[368,227],[368,226],[369,225],[369,224],[370,224]))},{name:"bisector",nbr:1,data:new Array(new Array([501,375],[519,373],[522,373],[523,373],[525,373],[529,373],[533,373],[537,373],[539,373],[541,373],[546,373],[548,373],[551,373],[558,373],[561,373],[564,373],[566,373],[571,373],[575,373],[583,373],[586,373],[589,373],[596,373],[597,373],[599,373],[603,372],[605,372],[607,372],[609,371],[612,371],[617,371],[619,371],[621,371],[624,371],[626,371],[629,371],[632,371],[634,371],[636,371],[639,371],[642,371],[645,371],[652,371],[655,371],[658,371],[661,371],[663,371],[667,371],[668,371],[669,371],[670,371],[671,371],[673,371],[676,371],[678,371],[682,372],[685,372],[687,372],[687,373],[689,373],[695,374],[711,375],[710,375],[663,353],[591,306],[589,302],[587,300],[585,298],[582,296],[581,294],[579,292],[577,291],[575,289],[573,286],[572,285],[571,283],[570,282],[569,281],[566,280],[565,278],[564,276],[561,273],[561,271],[560,270],[559,269],[557,267],[556,266],[556,265],[555,265],[554,264],[554,263],[555,264],[557,265],[609,304],[610,305],[612,306],[613,307],[617,309],[619,311],[621,313],[623,314],[625,316],[629,319],[631,320],[633,321],[634,322],[636,324],[641,327],[643,329],[645,330],[647,331],[648,333],[653,335],[654,335],[655,336],[656,336],[658,336],[661,339],[663,341],[665,341],[666,343],[668,344],[672,347],[674,349],[677,350],[679,352],[681,354],[683,355],[685,356],[686,358],[690,361],[694,362],[697,363],[698,364],[702,366],[704,366],[706,367],[711,369],[715,370],[717,371],[718,372],[722,374],[724,374],[725,375],[726,375],[727,375],[727,374],[719,322],[718,319],[718,318],[718,316],[718,315],[718,313],[717,312],[717,309],[717,308],[716,304],[716,302],[715,298],[715,296],[715,295],[714,293],[714,291],[714,289],[713,286],[713,284],[712,281],[712,280],[712,279],[712,278],[712,276],[711,273],[711,271],[710,268],[710,265],[710,264],[709,262],[709,261],[709,258],[709,256],[709,252],[709,250],[709,249],[709,248],[709,247],[709,245],[709,243],[709,239],[709,236],[709,234],[709,230],[709,227],[709,224],[709,223],[709,220],[709,219],[709,218],[709,217],[709,216],[708,197]))},{name:"bisector",nbr:1,data:new Array(new Array([261,174],[261,175],[261,177],[261,180],[262,186],[263,191],[263,196],[265,204],[267,210],[270,224],[273,241],[275,249],[279,266],[282,274],[285,284],[285,293],[290,311],[293,318],[296,326],[299,341],[301,349],[306,357],[306,363],[310,374],[311,381],[314,384],[316,391],[317,392],[318,395],[318,396],[318,397],[319,399],[320,400],[320,401],[320,402],[320,403],[320,402],[322,399],[325,389],[327,383],[329,376],[331,370],[333,362],[336,357],[337,351],[341,342],[342,338],[342,336],[345,332],[345,330],[347,327],[347,326],[348,326],[349,324],[350,324],[350,325],[350,326],[350,327],[351,331],[351,334],[351,335],[351,338],[351,340],[351,341],[351,342],[350,342],[350,343],[350,344],[349,344],[349,345],[348,347],[348,348],[347,350],[347,351],[347,352],[346,355],[346,356],[346,357],[345,359],[345,361],[345,362],[345,363],[345,365],[344,368],[344,369],[344,370],[343,372],[343,373],[343,376],[342,378],[342,379],[342,380],[342,382],[342,383],[342,384],[342,385],[342,386],[342,388],[342,389],[341,389],[341,390],[341,391],[340,392],[340,392],[340,392],[340,393],[340,394],[340,393],[342,393],[351,385],[358,378],[389,352],[401,342],[433,312],[443,302],[458,285],[464,279],[469,271],[473,262],[480,254],[493,241],[497,240],[505,233],[508,231],[512,227],[515,226],[516,223],[527,217],[528,216],[529,216],[531,216],[532,216]))},{name:"bisector",nbr:1,data:new Array(new Array([143,233],[144,233],[144,235],[149,240],[153,244],[157,248],[163,251],[170,257],[177,262],[185,270],[192,276],[200,282],[223,300],[248,317],[271,328],[289,341],[297,348],[311,356],[324,365],[329,370],[336,373],[351,382],[356,383],[365,388],[373,392],[377,393],[381,396],[385,398],[393,401],[396,403],[397,403],[398,403],[399,404],[401,405],[402,405],[403,407],[404,408],[405,406],[405,404],[404,402],[404,392],[402,385],[402,379],[402,365],[402,359],[402,352],[402,345],[402,332],[402,326],[402,321],[402,316],[402,305],[402,302],[402,299],[402,296],[402,294],[402,293],[402,294],[402,295],[402,299],[402,302],[402,304],[402,305],[403,310],[403,312],[403,314],[403,317],[403,319],[403,321],[403,323],[403,326],[403,328],[403,332],[403,334],[403,337],[403,338],[403,340],[404,344],[404,346],[405,348],[405,349],[405,351],[405,353],[405,354],[405,355],[405,359],[405,360],[406,361],[406,363],[406,367],[406,368],[407,370],[407,372],[409,376],[410,377],[410,379],[411,381],[411,382],[413,386],[413,388],[414,389],[414,390],[414,391],[414,392],[414,392],[415,393],[414,394],[414,395],[414,396],[414,397],[416,399],[416,400],[417,402],[417,403],[418,403],[418,404],[420,405],[420,406],[420,407],[421,405],[423,403],[427,399],[429,387],[432,380],[438,370],[443,361],[450,352],[465,333],[473,321],[482,309],[492,297],[512,275],[520,265],[527,253],[535,245],[554,220],[560,214],[570,201],[573,195],[578,189],[582,185],[583,181],[586,178],[587,175],[588,174],[589,172],[591,171],[592,170],[594,166],[596,163],[597,162],[596,161],[597,160],[598,160],[599,159],[600,158],[601,157],[602,157]))},{name:"circle",nbr:1,data:new Array(new Array([399,167],[399,167],[398,165],[397,164],[395,162],[393,160],[391,159],[388,156],[385,155],[385,155],[383,154],[379,152],[375,152],[365,149],[362,149],[355,147],[350,147],[335,147],[324,147],[319,147],[312,146],[306,146],[294,147],[287,148],[274,150],[258,151],[250,153],[238,157],[230,157],[225,159],[216,163],[211,165],[207,170],[195,182],[190,187],[180,200],[175,207],[169,227],[166,232],[166,239],[168,271],[168,282],[172,293],[174,303],[175,314],[177,322],[185,340],[196,356],[202,363],[217,378],[223,384],[234,390],[245,397],[255,405],[280,417],[305,425],[317,427],[345,430],[354,430],[363,430],[381,430],[390,430],[414,428],[425,427],[435,422],[449,414],[456,407],[478,387],[485,377],[493,356],[495,343],[496,312],[496,301],[496,290],[496,281],[492,262],[490,253],[486,238],[484,232],[474,217],[469,212],[457,202],[450,196],[444,191],[431,182],[425,177],[422,173],[419,172],[418,172],[416,170],[415,170],[414,167],[412,167],[409,164],[408,163],[405,161],[404,161]))},{name:"circle",nbr:1,data:new Array(new Array([384,109],[382,108],[380,108],[379,107],[376,106],[370,104],[367,103],[359,103],[354,103],[346,103],[341,103],[333,103],[328,103],[316,103],[304,103],[300,105],[293,105],[286,108],[283,110],[280,112],[276,117],[271,122],[261,132],[250,143],[245,150],[234,162],[230,167],[229,178],[227,183],[225,196],[225,204],[225,212],[225,228],[225,237],[225,245],[230,262],[239,277],[244,284],[250,289],[257,299],[263,302],[266,304],[271,306],[282,309],[288,311],[311,314],[319,316],[335,316],[344,316],[359,316],[365,316],[372,316],[374,317],[375,317],[378,317],[382,317],[384,316],[388,313],[392,313],[395,312],[396,311],[400,307],[402,306],[405,305],[406,303],[408,302],[408,301],[408,300],[409,300],[409,299],[410,298],[412,297],[413,297],[414,297],[415,297],[415,295]))},{name:"circle",nbr:1,data:new Array(new Array([440,127],[440,126],[440,125],[439,124],[438,123],[434,122],[433,122],[429,119],[428,119],[425,117],[423,117],[419,116],[416,115],[411,114],[409,114],[404,112],[401,112],[395,111],[390,111],[387,111],[385,111],[382,111],[377,111],[375,111],[371,111],[369,111],[363,111],[361,111],[357,112],[355,113],[353,114],[345,117],[341,119],[327,122],[322,127],[314,133],[310,137],[308,137],[303,140],[299,143],[298,146],[296,147],[294,153],[293,156],[291,158],[289,163],[288,166],[286,170],[285,172],[285,175],[282,182],[282,187],[282,198],[282,204],[282,219],[282,228],[282,244],[285,257],[285,260],[287,263],[295,277],[299,282],[315,296],[320,300],[325,303],[330,307],[344,312],[349,314],[363,318],[368,322],[370,322],[376,323],[382,324],[448,323],[452,322],[462,318],[468,313],[471,310],[478,303],[480,300],[487,292],[490,288],[494,285],[496,282],[501,271],[503,267],[510,248],[510,245],[511,240],[511,235],[512,233],[512,223],[512,219],[512,217],[512,214],[512,212],[512,207],[511,204],[511,202],[510,200],[509,197],[509,197],[506,191],[505,189],[503,185],[501,183],[501,182],[496,177],[496,177],[494,175],[493,173],[490,170],[488,168],[479,157],[477,154],[475,152],[470,147],[469,144],[467,143],[465,142],[463,140],[460,137],[457,135],[456,134],[456,133],[455,132],[454,132],[453,131],[451,130],[450,129],[449,129]))},{name:"circle",nbr:1,data:new Array(new Array([445,106],[444,104],[443,103],[442,101],[440,99],[432,92],[427,88],[409,77],[393,70],[375,63],[365,62],[315,56],[306,56],[298,56],[278,56],[245,56],[235,56],[227,58],[213,67],[205,72],[198,77],[184,91],[176,97],[164,111],[158,118],[146,132],[140,142],[128,157],[122,164],[114,185],[112,197],[109,221],[109,237],[109,249],[109,262],[109,287],[113,308],[119,319],[125,328],[130,337],[145,356],[153,365],[160,374],[180,389],[191,393],[213,397],[227,399],[275,399],[290,399],[348,399],[400,392],[415,386],[427,380],[436,374],[455,354],[468,332],[474,322],[480,307],[485,297],[491,286],[493,264],[495,253],[495,232],[495,221],[493,199],[491,190],[489,181],[482,164],[480,155],[469,138],[463,131],[457,124],[446,109],[440,102],[431,92],[430,89],[423,82],[419,77],[405,62],[400,56],[393,51],[391,51]))},{name:"circle2points",nbr:1,data:new Array(new Array([364,211],[365,211],[366,211],[368,211],[376,211],[384,211],[395,212],[401,212],[409,212],[416,212],[422,212],[429,212],[434,212],[439,212],[445,212],[449,212],[454,212],[457,212],[462,212],[466,212],[470,212],[474,213],[479,213],[483,213],[489,213],[495,213],[503,213],[511,213],[518,213],[524,213],[532,213],[539,213],[545,213],[552,212],[561,211],[567,210],[573,209],[578,209],[584,208],[589,208],[592,207],[595,207],[598,207],[601,207],[603,207],[607,207],[609,207],[612,207],[613,207],[616,207],[617,206],[618,206],[611,234],[609,240],[607,243],[606,246],[605,249],[603,252],[602,255],[601,258],[599,260],[597,263],[595,266],[594,269],[591,274],[589,278],[587,281],[585,284],[583,287],[580,290],[578,292],[575,294],[573,296],[569,299],[567,301],[564,303],[561,305],[558,307],[554,309],[552,310],[549,311],[546,313],[543,313],[540,314],[537,316],[535,317],[531,319],[527,320],[524,321],[521,322],[518,323],[514,324],[511,325],[505,327],[499,328],[496,328],[493,329],[489,329],[485,330],[481,331],[476,332],[474,332],[469,333],[465,334],[461,335],[458,335],[455,335],[454,335]))},{name:"circle2points",nbr:1,data:new Array(new Array([658,224],[657,224],[656,224],[655,224],[644,223],[638,223],[631,223],[625,223],[618,223],[611,223],[605,223],[599,223],[592,223],[585,223],[578,223],[571,223],[563,223],[555,223],[546,222],[540,222],[531,221],[522,221],[516,221],[507,221],[499,221],[491,221],[485,221],[478,221],[471,221],[463,220],[457,220],[450,220],[444,220],[439,220],[435,220],[430,220],[425,220],[419,220],[414,220],[411,220],[408,220],[406,220],[404,220],[402,220],[402,219],[401,219],[399,219],[398,219],[397,219],[397,220],[397,223],[397,226],[397,228],[397,230],[397,231],[397,232],[397,233],[397,235],[397,236],[397,237],[397,238],[397,239],[397,240],[397,242],[397,243],[397,246],[397,248],[397,251],[397,254],[398,256],[399,259],[400,262],[401,264],[401,267],[402,269],[403,272],[404,275],[404,278],[405,280],[406,283],[407,285],[408,288],[410,291],[411,294],[413,298],[415,301],[417,305],[419,311],[422,315],[424,319],[427,322],[429,325],[432,328],[434,331],[437,334],[439,337],[442,340],[445,343],[448,345],[452,349],[455,351],[459,354],[462,357],[466,360],[469,362],[474,365],[478,368],[482,370],[488,373],[494,376],[499,379],[505,381],[511,383],[516,384],[519,385],[523,386],[526,388],[529,389],[533,390],[535,390],[539,391],[542,391],[543,391],[544,391],[545,391],[546,391],[548,391],[549,391],[552,391],[553,391],[555,391],[556,391]))},{name:"line",nbr:1,data:new Array(new Array([0,0],[100,0]))},{name:"line",nbr:1,data:new Array(new Array([12,347],[119,347]))},{name:"midpoint",nbr:1,data:new Array(new Array([88,230],[89,230],[90,230],[93,230],[93,230],[95,230],[98,230],[100,230],[102,230],[103,231],[105,231],[107,231],[108,231],[110,231],[111,231],[114,231],[117,231],[121,231],[123,231],[126,232],[129,232],[133,232],[136,232],[139,232],[145,232],[150,232],[156,232],[159,232],[161,233],[165,234],[168,234],[171,234],[174,234],[179,234],[184,234],[189,234],[194,234],[198,234],[201,234],[204,233],[210,233],[213,233],[219,232],[226,231],[232,231],[237,231],[245,231],[252,231],[256,231],[261,231],[265,231],[271,231],[276,231],[281,231],[285,231],[287,233],[291,236],[293,239],[295,243],[295,247],[296,250],[296,254],[295,257],[294,259],[291,261],[288,262],[282,262],[273,262],[256,255],[255,249],[253,244],[253,239],[257,233],[262,228],[270,225],[280,224],[289,224],[294,226],[300,230],[303,235],[303,240],[304,245],[304,247],[301,249],[295,252],[279,252],[270,252],[265,249],[261,245],[261,241],[261,237],[261,235],[264,231],[273,229],[282,229],[287,230],[290,231],[297,233],[304,235],[306,235],[309,236],[316,240],[321,241],[323,242],[325,243],[328,243],[333,246],[340,247],[346,247],[351,247],[360,248],[366,248],[372,248],[377,248],[387,248],[391,248],[395,247],[401,247],[407,247],[412,247],[416,247],[421,247],[426,246],[432,246],[435,246],[441,245],[449,245],[453,245],[456,245],[460,244],[463,244],[465,244],[465,244],[466,244],[467,244],[468,244],[470,244],[472,244],[474,244],[477,244],[482,244]))},{name:"midpoint",nbr:1,data:new Array(new Array([43,471],[57,474],[58,475],[78,482],[85,485],[95,487],[102,489],[111,490],[120,490],[129,492],[142,492],[153,492],[162,492],[173,492],[189,492],[205,494],[224,495],[243,497],[260,503],[270,511],[270,518],[265,524],[256,525],[249,525],[243,521],[239,512],[240,502],[243,496],[252,489],[261,484],[270,483],[280,485],[309,494],[319,496],[328,497],[335,496],[343,496],[350,497],[359,498],[377,499],[387,500],[395,500],[400,501],[405,500],[411,501],[416,501],[420,501],[425,502],[429,502],[432,502],[436,503],[440,504],[444,505],[447,506],[450,506],[453,507],[455,507],[456,507],[458,507],[459,508],[459,507],[462,509],[462,509],[463,509],[465,509],[467,509],[467,508],[469,507],[470,508],[472,507],[473,507],[474,505],[476,504],[477,503],[480,501],[482,500],[483,499],[486,497],[487,495],[489,495],[492,493],[492,492],[494,491]))},{name:"midpoint",nbr:1,data:new Array(new Array([147,121],[148,121],[149,121],[150,121],[161,121],[169,122],[175,122],[181,122],[186,123],[191,123],[196,124],[201,124],[207,124],[212,124],[217,124],[220,124],[224,124],[231,124],[236,124],[239,124],[245,123],[251,120],[255,117],[258,114],[261,110],[263,107],[265,104],[266,102],[266,98],[266,95],[264,91],[261,88],[258,88],[253,87],[247,87],[242,87],[238,87],[234,88],[233,90],[231,91],[230,92],[228,94],[226,96],[225,98],[223,100],[223,102],[222,105],[222,107],[222,109],[223,112],[224,115],[225,117],[227,118],[228,120],[229,120],[231,121],[233,122],[234,123],[237,123],[240,123],[242,124],[246,124],[250,124],[252,124],[257,124],[260,123],[262,123],[265,122],[267,122],[269,121],[271,121],[273,121],[276,120],[280,120],[282,120],[285,120],[286,120],[287,120],[289,120],[291,120],[292,121],[294,121],[295,121],[298,121],[300,121],[302,121],[305,121],[309,121],[312,121],[314,121],[315,121],[316,121],[319,121],[321,121],[322,121],[323,121],[326,121],[327,121],[328,122],[334,122],[337,123]))},{name:"normal",nbr:1,data:new Array(new Array([304,255],[304,256],[304,261],[304,264],[304,266],[304,287],[304,291],[304,294],[304,295],[304,297],[304,301],[303,302],[303,304],[303,306],[303,308],[303,315],[303,318],[303,323],[304,327],[304,328],[304,333],[304,334],[304,335],[304,338],[304,339],[304,342],[304,343],[304,344],[304,345],[304,346],[305,368],[305,370],[305,371],[305,373],[305,374],[305,375],[305,376],[305,377],[305,378],[305,379],[305,381],[306,381],[307,381],[309,380],[316,379],[330,378],[334,378],[338,378],[340,378],[341,378],[344,378],[371,378],[373,378],[376,378],[380,378],[392,378],[394,378],[395,378],[396,378]))},{name:"normal",nbr:1,data:new Array(new Array([300,35],[300,36],[300,38],[300,43],[300,45],[302,71],[302,77],[302,79],[302,81],[302,84],[304,95],[304,98],[304,100],[304,104],[304,105],[304,115],[304,118],[304,119],[304,121],[304,122],[304,127],[304,128],[305,129],[305,130],[305,132],[306,138],[306,140],[306,141],[306,142],[306,143],[306,148],[306,150],[306,153],[306,154],[306,155],[306,161],[306,162],[305,162],[303,162],[301,162],[294,163],[291,163],[288,163],[284,163],[282,163],[271,163],[269,163],[268,163],[266,163],[261,163],[251,165],[249,166],[248,166],[247,166],[244,166],[241,167],[240,167],[239,167],[237,167],[236,168],[234,168],[232,168],[227,168],[225,168],[225,167],[219,165],[216,165],[216,164],[213,163],[208,163]))},{name:"normal",nbr:1,data:new Array(new Array([247,60],[247,61],[247,62],[247,62],[246,65],[246,67],[246,69],[246,71],[247,73],[247,74],[247,87],[247,89],[247,90],[247,92],[247,94],[247,95],[247,96],[247,98],[247,100],[247,102],[247,105],[248,107],[245,107],[245,111],[245,114],[245,117],[245,119],[246,121],[246,123],[246,125],[246,127],[246,128],[246,130],[247,132],[247,134],[247,136],[247,139],[247,140],[247,143],[247,147],[247,150],[247,153],[247,158],[247,161],[247,162],[247,165],[247,168],[247,171],[246,173],[246,177],[246,181],[246,185],[246,190],[246,194],[246,200],[246,205],[246,210],[246,215],[246,219],[246,226],[247,232],[247,239],[250,246],[250,250],[250,254],[250,258],[250,260],[250,262],[250,263],[250,265],[250,271],[250,273],[250,276],[250,278],[250,280],[250,282],[250,283],[250,285],[251,288],[252,291],[252,292],[252,293],[252,294],[252,296],[252,298],[252,299],[251,301],[251,303],[251,304],[250,306],[250,308],[250,311],[250,313],[250,315],[250,318],[250,320],[249,323],[249,326],[249,329],[248,332],[248,335],[248,337],[248,341],[248,343],[248,346],[248,349],[248,351],[248,353],[248,357],[248,359],[248,361],[248,363],[247,366],[247,368],[247,370],[247,371],[246,373],[246,375],[246,377],[246,379],[246,380],[245,381],[245,382],[245,384],[244,384],[244,386],[244,387],[243,389],[243,391],[243,392],[243,394],[243,397],[242,407],[242,409],[242,411],[241,412],[241,413],[241,414],[241,417],[241,418],[241,420],[241,422],[241,425],[241,426],[241,428],[241,429],[241,431],[241,433],[241,435],[241,436],[241,436],[241,439],[241,441],[241,443],[241,446],[241,447],[241,449],[241,452],[242,454],[242,456],[242,458],[242,460],[242,462],[242,465],[242,468],[242,469],[242,471],[242,473],[242,475],[242,477],[242,478],[243,480],[243,480],[242,481],[242,483],[242,484],[242,485],[242,486],[242,487],[242,488],[242,490],[242,491],[241,491],[241,492],[241,493],[241,494],[241,495],[241,496],[241,497],[242,498],[243,499],[244,500],[245,500],[247,501],[249,501],[250,502],[252,502],[254,503],[256,503],[258,503],[260,504],[262,504],[263,504],[264,504],[265,504],[266,504],[267,504],[268,504],[269,505],[270,505],[271,505],[273,505],[274,505],[276,506],[277,506],[281,506],[283,506],[285,506],[288,506],[291,506],[294,506],[297,507],[300,507],[303,507],[306,507],[309,507],[311,507],[313,507],[316,507],[318,507],[320,507],[323,507],[326,507],[329,507],[338,507],[340,507],[344,507],[347,507],[351,507],[355,507],[360,507],[366,508],[369,508],[373,510],[376,510],[380,511],[384,511],[385,511],[388,511],[397,513],[398,513],[401,513],[403,513],[405,513],[407,514],[409,514],[411,514],[414,514],[416,515],[419,516],[421,516],[423,516],[425,516],[427,516],[428,516],[430,516],[432,516],[434,516],[435,516],[437,516],[438,516],[439,516],[441,516],[443,517],[445,517],[447,517],[450,517],[452,517],[455,517],[458,517],[460,517],[462,517],[465,517],[468,517],[471,517],[473,517],[475,517],[478,517],[481,517],[483,516],[485,516],[487,516],[489,516],[492,516],[493,516],[494,516],[496,516],[497,516],[499,516],[501,516],[503,516],[505,516],[508,516],[511,516],[514,516],[516,516],[518,516],[521,516],[523,516],[525,516],[527,516],[528,516],[530,516],[531,515],[533,515],[535,515],[537,515],[538,515],[540,515],[542,515],[545,515],[547,515],[549,515],[550,515],[553,515],[555,515],[557,515],[559,515],[561,515],[563,515],[564,515],[565,515],[567,515],[569,515],[570,515],[571,515],[573,515],[575,515],[576,515],[578,515],[579,515],[580,514],[582,514],[582,514],[583,513],[584,513],[585,513],[586,513],[587,513],[588,513]))},{name:"parallel",nbr:1,data:new Array(new Array([487,142],[559,142],[561,142],[564,142],[567,142],[570,142],[574,143],[579,143],[582,143],[585,143],[591,143],[597,143],[600,143],[602,143],[604,143],[606,143],[609,143],[611,143],[614,143],[620,143],[623,143],[625,143],[627,143],[629,143],[630,143],[631,142],[632,142],[632,143],[593,179],[588,183],[585,185],[583,187],[580,190],[577,192],[574,195],[571,197],[568,199],[565,202],[562,204],[559,207],[557,209],[555,211],[553,213],[551,215],[550,217],[548,219],[547,221],[546,224],[545,226],[544,229],[543,232],[541,234],[540,237],[538,239],[538,241],[537,243],[537,245],[536,247],[535,248],[535,250],[534,252],[533,254],[532,255],[532,257],[531,259],[530,261],[529,263],[527,265],[526,267],[525,270],[523,272],[521,274],[519,276],[517,278],[516,279],[515,279],[514,280],[513,281],[512,281],[512,282],[511,282],[511,283],[511,284],[511,285],[510,285],[509,286],[509,287],[507,289],[506,290],[507,290],[598,284],[601,283],[602,283],[603,283],[604,282],[605,282],[606,282],[607,282],[608,282],[610,282],[612,282],[614,282],[615,282],[616,282],[617,282],[632,284],[634,285],[635,285],[637,285],[640,286],[641,286],[643,286],[644,286],[644,287]))},{name:"parallel",nbr:1,data:new Array(new Array([450,377],[451,377],[452,377],[453,377],[456,376],[470,373],[481,372],[495,372],[503,372],[519,372],[529,372],[537,372],[545,372],[561,372],[569,372],[576,372],[589,372],[596,372],[608,372],[614,372],[620,372],[625,372],[628,372],[634,372],[637,372],[640,372],[642,371],[423,295],[421,295],[422,294],[649,286],[651,286],[652,286]))},{name:"parallel",nbr:1,data:new Array(new Array([286,103],[287,103],[288,103],[290,103],[292,103],[300,103],[310,105],[316,106],[328,108],[345,110],[358,112],[374,112],[391,112],[404,112],[416,112],[422,112],[424,112],[425,112],[426,112],[429,112],[430,112],[429,119],[428,126],[427,134],[426,143],[426,155],[426,164],[425,176],[425,185],[425,196],[425,206],[425,213],[425,216],[425,223],[425,227],[425,232],[425,241],[425,244],[425,246],[426,246],[432,246],[440,246],[461,246],[500,246],[524,246],[544,246],[566,246],[584,248],[602,248],[609,249],[610,249],[624,249],[634,249],[647,249],[659,249],[665,249],[666,249],[675,249],[680,249]))},{name:"parallel",nbr:1,data:new Array(new Array([664,213],[664,214],[667,216],[669,218],[672,221],[675,224],[677,227],[679,230],[682,232],[684,234],[687,236],[689,238],[690,241],[693,244],[695,246],[696,249],[698,250],[701,254],[702,255],[704,256],[705,257],[706,259],[707,260],[708,261],[709,262],[710,263],[711,264],[712,266],[712,267],[712,266],[863,99],[873,90],[878,86],[883,84],[885,82],[886,82],[1013,174],[1014,174],[1014,175]))},{name:"quadrilateral",nbr:1,data:new Array(new Array([457,274],[459,251],[459,243],[459,234],[455,157],[455,156],[693,147],[730,152],[734,261],[730,343],[729,343],[511,358],[503,359],[498,360],[495,361],[491,361],[485,362],[478,363],[474,364],[467,364],[463,364],[461,364],[456,315],[456,308],[456,303],[456,296],[456,291],[456,284],[456,278],[456,275]))},{name:"quadrilateral",nbr:1,data:new Array(new Array([387,189],[388,189],[389,189],[390,188],[398,184],[407,179],[415,176],[424,172],[432,168],[442,163],[451,160],[460,155],[472,150],[487,143],[498,137],[514,129],[527,123],[541,115],[560,105],[579,94],[599,86],[617,78],[633,70],[645,63],[653,60],[661,56],[665,55],[667,54],[668,54],[672,60],[678,70],[683,77],[690,87],[696,96],[705,108],[719,127],[732,145],[746,164],[759,179],[772,194],[783,206],[795,219],[805,227],[811,233],[816,236],[818,237],[819,238],[818,238],[810,241],[801,243],[791,247],[782,251],[771,255],[757,260],[741,265],[721,274],[700,283],[679,294],[652,307],[625,321],[596,332],[558,347],[519,363],[491,375],[464,388],[434,403],[411,415],[384,428],[356,440],[335,448],[311,457],[295,462],[280,467],[269,470],[247,471],[250,464],[257,449],[262,441],[265,434],[270,422],[275,413],[282,398],[287,382],[297,362],[303,348],[312,333],[320,322],[326,312],[329,304],[333,296],[336,288],[339,279],[343,270],[346,263],[349,258],[351,253],[352,250],[354,245],[356,241],[358,237],[360,234],[361,231],[363,226],[364,220],[365,214],[366,211],[367,209],[367,207],[368,206],[368,205],[371,200],[373,196],[375,194],[376,191],[377,190],[378,188],[379,187],[380,187],[381,186]))},{name:"quadrilateral",nbr:1,data:new Array(new Array([489,275],[489,274],[489,273],[491,271],[508,251],[524,233],[537,220],[554,202],[569,186],[586,170],[604,152],[622,134],[642,114],[654,102],[665,92],[672,86],[676,82],[678,79],[680,77],[681,76],[681,75],[681,73],[682,72],[682,69],[683,67],[683,66],[684,66],[685,66],[692,74],[701,82],[714,91],[729,101],[748,112],[773,125],[799,135],[837,148],[861,156],[903,165],[937,169],[969,172],[996,173],[1024,174],[1040,175],[1052,175],[1057,176],[1060,176],[1060,177],[1053,181],[1040,189],[1024,201],[1012,209],[998,219],[983,228],[965,241],[944,254],[921,270],[891,291],[861,313],[832,333],[803,354],[779,371],[756,387],[730,405],[712,417],[695,428],[683,436],[672,442],[665,446],[660,448],[658,450],[657,450],[657,451],[656,451],[655,451],[654,451],[653,451],[651,451],[649,451],[646,451],[640,447],[632,443],[623,438],[611,431],[597,422],[584,412],[571,404],[560,395],[549,385],[536,373],[522,363],[507,353],[491,344],[479,337],[467,330],[456,323],[447,318],[440,314],[436,313],[432,311],[429,310],[427,309],[426,309],[426,308]))},{name:"quadrilateral",nbr:1,data:new Array(new Array([479,269],[479,268],[479,267],[479,264],[479,252],[478,245],[477,232],[474,221],[470,203],[465,190],[461,176],[456,164],[453,153],[448,141],[446,133],[443,126],[441,120],[440,115],[438,111],[436,106],[435,102],[434,100],[434,98],[434,96],[434,95],[434,94],[434,93],[435,93],[437,94],[444,95],[454,96],[467,97],[487,97],[505,97],[534,97],[567,97],[598,97],[633,95],[679,90],[713,87],[753,85],[787,83],[812,82],[834,80],[844,80],[851,78],[854,78],[854,79],[854,92],[853,117],[853,151],[852,185],[852,212],[852,241],[852,262],[852,285],[854,297],[855,307],[856,312],[857,313],[856,313],[847,307],[837,304],[823,299],[803,295],[778,291],[751,288],[722,286],[690,285],[647,281],[612,277],[573,273],[547,272],[522,271],[497,270],[470,269],[451,268],[436,268],[423,267],[416,267],[413,266],[412,266]))},{name:"quadrilateral",nbr:1,data:new Array(new Array([436,331],[436,330],[434,330],[434,329],[429,328],[424,326],[420,324],[413,322],[408,321],[397,318],[387,315],[377,312],[366,309],[349,304],[334,300],[318,296],[305,291],[287,287],[273,283],[259,280],[251,277],[243,276],[234,275],[229,274],[223,273],[220,272],[217,272],[215,272],[214,272],[212,272],[211,272],[210,272],[209,272],[209,271],[214,268],[218,264],[222,262],[231,256],[241,249],[255,239],[267,230],[285,215],[311,194],[333,175],[358,147],[375,125],[389,106],[400,88],[411,70],[418,59],[423,52],[428,46],[432,41],[434,38],[435,36],[437,35],[437,34],[438,34],[442,34],[447,36],[455,41],[468,45],[481,50],[502,57],[533,66],[564,70],[611,71],[662,71],[720,68],[780,67],[816,66],[839,66],[850,66],[855,66],[854,66],[846,71],[827,83],[810,94],[791,105],[776,115],[755,128],[733,139],[713,151],[698,160],[679,170],[665,180],[647,192],[633,202],[616,214],[597,226],[585,234],[570,243],[558,249],[550,255],[540,261],[532,266],[527,269],[520,274],[513,278],[506,283],[500,286],[495,289],[491,292],[488,294],[484,296],[481,298],[477,300],[473,302],[469,305],[466,307],[464,309],[462,310],[460,312],[458,313],[456,315],[454,316],[452,318],[450,320],[448,321],[445,324],[443,325],[442,326],[442,327],[441,327],[440,328],[440,329],[439,329],[438,329],[437,331],[435,332],[433,333],[433,334]))},{name:"quadrilateral",nbr:1,data:new Array(new Array([82,200],[81,200],[81,203],[81,204],[82,209],[83,214],[84,216],[85,223],[85,228],[85,234],[85,242],[85,249],[85,261],[85,269],[87,275],[87,282],[87,296],[87,303],[87,315],[87,326],[87,331],[89,335],[89,338],[91,346],[91,349],[92,355],[92,356],[91,356],[91,357],[92,357],[94,357],[96,357],[102,357],[107,357],[110,357],[131,356],[137,356],[144,356],[151,356],[177,354],[186,354],[195,354],[204,354],[223,354],[232,354],[240,352],[259,351],[268,349],[286,349],[296,348],[306,348],[315,348],[334,348],[341,348],[351,348],[359,348],[374,348],[382,348],[389,348],[399,346],[408,344],[424,342],[431,342],[446,340],[453,340],[459,340],[471,340],[476,340],[482,340],[487,340],[497,340],[503,340],[507,342],[513,342],[523,344],[527,344],[540,344],[546,344],[554,344],[557,344],[562,344],[565,344],[567,344],[571,344],[571,344],[572,344],[573,344],[574,342],[575,341],[575,339],[576,337],[577,336],[578,333],[579,330],[580,328],[582,324],[582,321],[582,318],[582,316],[583,310],[583,308],[584,305],[584,301],[584,299],[585,296],[585,294],[585,289],[585,287],[585,280],[585,276],[585,272],[585,271],[585,268],[585,264],[585,261],[585,260],[585,257],[585,252],[585,249],[585,248],[585,241],[585,238],[584,236],[585,232],[586,228],[586,227],[587,225],[587,223],[587,222],[587,221],[588,218],[588,217],[588,215],[588,214],[588,213],[588,211],[588,210],[589,209],[589,207],[589,206],[589,205],[589,205],[589,204],[589,203],[589,202],[589,201],[589,200],[588,200],[585,200],[582,200],[580,200],[571,200],[565,200],[557,200],[539,201],[531,201],[522,201],[513,203],[495,205],[486,206],[477,207],[460,207],[452,207],[444,207],[421,207],[414,207],[398,207],[391,207],[384,207],[376,207],[362,209],[354,209],[347,209],[332,209],[325,209],[318,209],[310,209],[296,209],[279,209],[270,211],[263,211],[255,211],[248,211],[235,211],[230,213],[224,213],[213,213],[208,214],[205,214],[197,214],[194,214],[190,214],[184,214],[180,215],[175,215],[173,215],[170,215],[165,215],[163,215],[160,215],[158,215],[154,215],[153,215],[152,215],[150,215],[146,215],[145,215],[143,215],[142,215],[140,215],[138,215],[136,215],[132,215],[131,215],[130,215],[122,215],[120,215],[117,215],[116,215],[115,215],[114,215],[111,215],[109,215],[108,215],[107,215],[103,215],[101,215],[100,215],[98,215],[96,216]))},{name:"quadrilateral",nbr:1,data:new Array(new Array([215,148],[215,150],[215,151],[215,153],[215,160],[215,163],[213,168],[211,180],[211,187],[211,196],[211,203],[211,222],[211,232],[210,242],[211,258],[211,267],[213,276],[213,297],[213,304],[215,322],[215,327],[216,337],[216,341],[216,344],[217,352],[217,353],[216,353],[216,352],[216,352],[217,352],[218,352],[222,351],[225,351],[247,351],[270,351],[302,351],[318,351],[348,351],[360,351],[371,351],[382,351],[402,351],[406,350],[406,349],[406,347],[405,345],[405,344],[405,342],[405,337],[405,334],[405,324],[405,317],[405,289],[405,280],[405,250],[405,240],[403,212],[403,204],[401,187],[401,182],[403,169],[402,168],[402,167],[402,166],[402,163],[402,162],[402,159],[401,158],[401,157],[401,156],[400,155],[400,154],[400,153],[400,152],[398,152],[396,152],[391,153],[390,153],[384,153],[381,153],[378,153],[374,153],[355,154],[346,154],[318,154],[309,154],[282,154],[275,154],[257,154],[254,154],[249,154],[247,154],[245,154],[244,154],[240,154],[238,154],[234,154],[233,153],[228,153],[226,153]))},{name:"quadrilateral",nbr:1,data:new Array(new Array([277,141],[277,142],[277,142],[277,144],[277,150],[276,152],[276,157],[276,171],[275,187],[273,197],[275,328],[275,336],[275,343],[273,349],[273,354],[272,361],[272,364],[272,365],[272,366],[272,367],[272,367],[271,368],[271,372],[271,372],[271,373],[273,372],[275,372],[278,372],[287,372],[293,371],[300,371],[310,371],[334,369],[347,369],[365,369],[396,369],[412,369],[426,367],[464,367],[473,367],[497,367],[500,367],[501,367],[502,367],[503,367],[503,366],[503,364],[503,362],[503,359],[503,353],[503,350],[503,345],[503,337],[503,328],[503,307],[503,297],[503,261],[503,249],[501,215],[500,204],[498,175],[496,167],[496,152],[496,150],[496,145],[496,143],[496,140],[496,139],[496,137],[496,136],[497,134],[495,134],[494,134],[492,135],[491,136],[486,136],[485,137],[482,137],[472,137],[462,138],[450,138],[442,138],[435,138],[418,138],[408,138],[399,138],[378,138],[368,138],[357,138],[329,138],[320,138],[300,138],[293,138],[291,139],[290,139],[290,139],[285,139],[284,138],[281,138],[275,138],[273,138],[272,138],[270,138],[269,138]))},{name:"quadrilateral",nbr:1,data:new Array(new Array([298,110],[298,111],[295,112],[295,113],[286,119],[281,124],[275,129],[260,142],[242,157],[223,172],[212,179],[205,187],[191,198],[185,202],[182,203],[178,205],[177,205],[178,206],[179,207],[180,208],[192,218],[202,232],[215,244],[222,251],[238,268],[245,277],[252,286],[266,304],[274,312],[281,322],[289,329],[304,344],[311,352],[317,359],[329,371],[333,375],[336,379],[340,382],[341,382],[345,383],[345,384],[346,383],[348,382],[350,380],[355,378],[367,369],[375,364],[418,340],[430,331],[471,307],[482,301],[506,288],[514,288],[523,278],[523,277],[525,277],[525,276],[525,275],[525,274],[525,273],[525,272],[525,272],[525,271],[525,270],[525,268],[525,267],[524,265],[522,263],[520,261],[519,258],[515,252],[513,247],[510,242],[506,236],[500,223],[495,217],[490,209],[475,184],[469,176],[465,169],[457,154],[453,149],[450,142],[437,125],[434,121],[425,114],[424,112],[421,111],[421,110],[420,110],[417,108],[415,108],[415,107],[413,107],[412,107],[409,105],[405,102],[404,102],[403,101],[401,99],[401,98],[400,97],[399,97],[398,95],[397,93],[396,92],[395,92],[395,90],[395,89],[393,87],[390,85],[390,84],[390,84],[388,82],[388,82],[387,81],[387,80],[385,78],[385,77],[384,77],[383,77],[382,76],[382,75],[381,74],[380,74],[380,73],[380,73],[380,72],[380,72],[379,72],[379,71],[378,71],[376,69],[376,68],[376,67],[375,67],[375,67],[375,66],[375,65],[374,65],[373,65],[371,65],[369,66],[367,67],[365,67],[364,67],[360,67],[355,69],[353,71],[350,72],[346,73],[343,75],[342,77],[340,77],[340,77],[339,77],[339,78],[338,78],[337,79],[336,80],[335,80],[334,81],[334,82],[333,83],[332,83],[329,87],[327,88],[324,89],[323,90],[323,92],[322,92],[322,93],[321,94],[320,96],[320,96],[320,97],[319,98],[318,98],[318,99],[318,100],[316,101],[315,101],[314,101],[312,102],[311,102],[310,102],[310,102],[310,102],[309,103],[308,103]))},{name:"reflection",nbr:1,data:new Array(new Array([357,286],[390,266],[396,261],[397,260],[401,256],[404,254],[411,249],[416,245],[421,239],[474,187],[516,154],[522,150],[528,145],[534,141],[539,138],[543,135],[552,129],[560,124],[570,119],[576,117],[584,114],[589,112],[589,111],[540,111],[537,111],[536,111],[501,117],[501,118],[565,109],[566,109],[569,109],[572,109],[575,109],[578,109],[581,109],[583,109],[588,109],[593,109],[596,109],[596,110],[578,136],[578,138],[577,139],[576,139],[575,140],[575,141],[574,142],[574,143],[574,144],[574,145],[573,145],[573,146],[573,147],[573,148],[572,149],[572,150],[571,151],[571,152],[570,152],[570,153],[570,154],[570,155],[570,156],[570,157],[570,159],[566,169],[566,170],[565,172],[565,173],[564,174],[562,177]))},{name:"reflection",nbr:1,data:new Array(new Array([375,308],[409,284],[410,283],[411,282],[415,280],[419,276],[427,270],[434,266],[436,264],[440,261],[441,260],[446,257],[450,254],[451,253],[457,248],[461,245],[463,244],[467,241],[473,239],[477,238],[482,235],[488,232],[493,230],[498,227],[502,225],[509,222],[512,220],[514,219],[516,219],[520,217],[522,216],[528,213],[529,213],[532,212],[535,211],[540,210],[543,209],[543,208],[513,206],[507,206],[508,206],[533,204],[536,204],[542,203],[544,204],[540,223],[540,224],[540,225],[540,226],[540,230],[540,231],[540,233],[540,234],[535,235]))},{name:"reflection",nbr:1,data:new Array(new Array([372,160],[373,160],[374,160],[376,160],[382,160],[388,160],[390,160],[393,160],[400,160],[405,160],[408,160],[412,159],[415,159],[418,159],[421,158],[425,158],[428,158],[431,158],[434,158],[436,158],[438,158],[441,158],[443,158],[445,157],[447,157],[449,156],[452,156],[454,156],[455,156],[458,156],[459,156],[460,156],[462,156],[464,156],[467,156],[468,156],[470,156],[473,156],[475,156],[477,156],[480,155],[482,155],[484,155],[486,155],[488,155],[490,155],[492,154],[494,154],[496,154],[498,154],[500,154],[502,154],[504,154],[506,154],[508,154],[509,154],[511,154],[514,154],[515,154],[517,154],[519,154],[521,154],[522,154],[524,154],[525,154],[527,154],[529,154],[531,154],[532,154],[534,154],[535,154],[537,154],[538,154],[540,154],[542,154],[543,154],[545,154],[546,154],[547,154],[548,154],[549,154],[551,154],[552,154],[554,154],[555,154],[556,154],[558,154],[560,154],[562,154],[563,154],[565,154],[566,154],[568,154],[569,154],[571,154],[572,154],[573,154],[575,154],[576,154],[577,154],[579,154],[581,153],[583,153],[585,153],[586,153],[587,153],[588,153],[589,153],[590,153],[591,153],[592,153],[593,153],[594,153],[595,153],[597,153],[598,153],[599,153],[600,153],[601,153],[602,153],[601,153],[600,153],[599,152],[597,152],[595,151],[594,150],[591,149],[588,148],[586,148],[585,147],[583,147],[580,146],[578,145],[577,145],[574,144],[572,143],[571,143],[569,142],[568,142],[566,141],[565,141],[563,141],[562,141],[561,140],[560,139],[559,139],[558,138],[557,138],[555,138],[554,137],[553,137],[551,136],[550,136],[548,135],[547,135],[546,135],[544,134],[543,134],[542,134],[541,133],[540,132],[538,132],[537,132],[536,131],[535,131],[534,130],[533,129],[532,129],[531,129],[530,128],[529,128],[528,127],[527,127],[526,127],[525,126],[524,125],[523,125],[522,124],[521,124],[520,124],[519,123],[518,122],[513,120],[512,120],[511,119],[510,118],[509,118],[508,118],[507,118],[506,117],[505,117],[504,117],[504,116],[503,116],[502,115],[501,115],[500,115],[499,115],[499,114],[498,114],[497,114],[498,114],[501,116],[504,118],[507,119],[510,120],[513,121],[515,121],[517,122],[519,123],[522,124],[524,124],[526,125],[528,126],[531,127],[532,127],[534,128],[536,129],[537,129],[539,130],[540,131],[542,131],[543,132],[545,133],[546,133],[547,133],[548,134],[550,134],[551,135],[552,135],[553,136],[554,136],[556,137],[557,137],[559,138],[560,138],[561,139],[563,139],[564,140],[565,140],[566,141],[568,141],[568,142],[570,142],[571,143],[572,143],[573,144],[574,144],[575,144],[576,145],[577,146],[578,147],[580,147],[581,148],[582,148],[584,148],[584,149],[585,150],[586,150],[587,150],[588,150],[589,151],[590,151],[591,151],[592,151],[592,152],[593,152],[594,152],[595,152],[595,153],[596,153],[597,154],[599,154],[600,155],[602,155],[603,156],[604,156],[605,157],[603,157],[601,158],[600,158],[599,158],[597,158],[596,159],[594,159],[593,160],[592,161],[590,161],[587,162],[586,162],[583,163],[580,164],[577,165],[575,165],[573,166],[570,167],[567,168],[564,169],[562,169],[560,170],[558,171],[556,172],[553,172],[551,173],[548,173],[546,175],[544,175],[542,176],[540,177],[537,178],[535,179],[533,179],[530,181],[527,182],[524,183],[522,183],[520,185],[518,185],[517,186],[514,186],[512,187],[511,187],[510,188],[509,188],[508,189],[506,189],[506,190],[504,190],[502,191],[501,192],[500,192],[499,193],[498,193],[497,193],[496,194],[496,195],[495,195]))},{name:"reflection",nbr:1,data:new Array(new Array([289,356],[289,355],[289,354],[289,353],[289,352],[289,351],[289,349],[289,348],[289,347],[290,345],[289,340],[289,338],[289,333],[289,327],[289,324],[289,321],[289,318],[289,315],[289,314],[290,310],[290,307],[290,304],[290,298],[290,293],[290,288],[290,279],[290,273],[290,269],[292,259],[292,254],[292,250],[292,247],[292,238],[292,235],[292,230],[292,226],[292,221],[292,210],[292,205],[292,200],[292,195],[291,190],[292,189],[291,185],[291,184],[292,184],[292,182],[292,180],[292,179],[292,178],[292,174],[292,173],[293,172],[292,170],[293,164],[293,163],[293,162],[293,161],[294,161],[294,162],[294,164],[296,168],[296,171],[298,172],[299,175],[305,183],[307,184],[311,189],[313,191],[315,192],[315,194],[316,194],[317,195],[317,196],[318,196],[318,197],[318,195],[317,191],[317,189],[315,187],[315,186],[314,183],[313,180],[312,178],[310,174],[309,172],[307,171],[307,169],[306,167],[306,166],[304,166],[304,165],[303,165],[302,164],[301,164],[299,163],[298,162],[297,161],[296,161],[295,161],[295,160]))},{name:"tangent",nbr:1,data:new Array(new Array([352,253],[352,252],[352,251],[352,250],[354,244],[355,239],[356,236],[356,233],[356,229],[356,226],[356,221],[357,218],[357,215],[357,212],[357,208],[357,204],[357,199],[357,194],[356,192],[356,188],[356,184],[355,170],[355,164],[355,159],[355,154],[355,152],[355,150],[354,146],[354,143],[354,139],[354,137],[354,132],[354,130],[351,130],[345,128],[332,126],[318,124],[305,123],[300,123],[294,123],[287,123],[281,123],[277,123],[272,123],[269,123],[259,123],[257,124],[255,124],[254,124],[255,124],[258,124],[263,122],[271,122],[284,122],[292,122],[300,122],[312,122],[335,122],[344,122],[349,122],[356,122],[364,122],[369,122],[377,122],[382,122],[388,122],[395,122],[401,122],[410,122],[418,122],[424,122],[433,122],[443,122],[450,122],[457,122],[463,122],[470,122],[474,122]))},{name:"tangent",nbr:1,data:new Array(new Array([771,207],[771,206],[775,200],[780,193],[788,182],[794,174],[800,167],[806,158],[810,146],[813,134],[816,123],[817,120],[821,114],[823,110],[825,107],[825,106],[826,106],[827,104],[829,102],[832,98],[833,97],[834,95],[835,93],[836,93],[837,91],[840,86],[840,85],[836,83],[808,73],[753,57],[732,48],[727,45],[727,45],[734,47],[762,59],[792,70],[828,86],[883,107],[935,127],[981,145],[992,150],[1011,153],[1031,161],[1046,166]))},{name:"tangent",nbr:1,data:new Array(new Array([492,232],[493,233],[493,235],[494,237],[495,239],[495,241],[496,245],[497,248],[498,250],[498,252],[498,253],[498,254],[499,256],[499,258],[499,260],[499,262],[499,268],[499,273],[499,276],[499,279],[499,282],[499,285],[499,288],[499,290],[499,293],[499,295],[499,297],[499,301],[499,304],[499,307],[498,311],[498,314],[498,317],[498,320],[498,323],[498,325],[497,328],[497,332],[497,335],[497,339],[497,343],[496,346],[496,349],[496,354],[494,362],[494,365],[494,368],[494,371],[493,376],[493,378],[493,382],[493,384],[493,385],[493,387],[493,388],[493,390],[494,392],[494,393],[495,394],[495,396],[495,397],[495,400],[495,401],[495,402],[495,403],[491,403],[486,403],[467,403],[452,404],[413,404],[379,402],[364,402],[333,400],[322,398],[302,394],[294,392],[279,390],[272,390],[262,390],[260,390],[256,390],[250,392],[234,394],[210,398],[181,402],[152,406],[135,409],[134,409],[144,411],[159,414],[183,416],[196,416],[229,418],[262,418],[280,418],[297,418],[329,418],[344,418],[373,418],[395,418],[407,418],[420,420],[433,420],[445,420],[456,420],[467,420],[479,420],[490,420],[501,420],[512,420],[521,420],[528,420],[533,420],[540,420],[546,420],[551,420],[558,420],[565,420],[572,418],[581,416],[590,416],[599,416],[609,416],[627,414],[636,414],[656,414],[678,413],[688,413],[699,413],[725,411],[738,411],[759,411],[772,411],[800,411],[814,411],[842,411],[856,411],[881,409],[890,409],[904,409],[910,409],[916,409],[918,409],[922,409],[923,409],[926,409],[927,409],[928,409],[928,410]))},{name:"triangle",nbr:1,data:new Array(new Array([66,236],[66,235],[84,214],[87,210],[94,201],[106,183],[114,175],[119,168],[126,162],[130,156],[135,148],[138,145],[144,137],[150,129],[155,123],[161,117],[166,112],[172,103],[176,94],[183,88],[189,80],[195,74],[203,69],[207,62],[214,55],[217,48],[218,46],[218,45],[219,45],[220,45],[221,45],[225,47],[227,50],[231,57],[235,63],[239,68],[247,80],[250,87],[253,92],[257,99],[262,111],[267,120],[272,128],[282,141],[287,148],[293,160],[296,165],[302,174],[306,181],[311,191],[314,197],[320,209],[323,215],[328,223],[329,227],[335,236],[339,241],[347,255],[352,262],[356,271],[358,274],[359,275],[359,276],[360,276],[358,276],[355,276],[348,276],[332,273],[321,272],[317,272],[313,272],[311,271],[309,270],[301,269],[286,264],[279,263],[265,262],[246,261],[236,261],[222,261],[214,260],[207,259],[197,258],[193,258],[185,256],[175,255],[169,255],[159,254],[155,254],[148,254],[145,254],[139,253],[128,253],[116,253],[113,253],[109,253],[108,253],[107,253],[105,253],[100,252],[97,251],[93,251],[90,249],[85,248],[83,247],[79,245],[77,245],[76,245],[74,245],[60,242],[60,241],[60,240]))},{name:"triangle",nbr:1,data:new Array(new Array([107,39],[107,45],[100,87],[97,105],[97,109],[96,114],[95,122],[95,131],[95,137],[95,143],[94,147],[94,155],[93,164],[93,172],[91,178],[91,183],[91,184],[91,185],[92,185],[115,185],[120,185],[126,185],[130,185],[134,185],[140,185],[147,185],[161,185],[165,185],[168,185],[173,185],[180,187],[188,187],[193,187],[201,188],[205,189],[208,189],[213,191],[222,193],[225,193],[227,193],[233,193],[236,193],[241,193],[243,193],[248,193],[249,193],[250,193],[249,193],[248,192],[243,188],[240,186],[236,183],[229,176],[222,170],[210,158],[207,156],[206,156],[205,155],[202,152],[194,149],[181,139],[141,108],[135,98],[132,94],[131,92],[129,90],[127,88],[121,81],[119,78],[116,72],[115,69],[110,62],[109,61],[108,58],[106,57],[106,56],[106,55],[105,54],[104,54],[104,53],[104,52]))},{name:"triangle",nbr:1,data:new Array(new Array([335,111],[347,96],[357,86],[360,82],[362,79],[365,75],[368,72],[370,69],[371,67],[373,64],[375,61],[378,58],[378,57],[379,55],[380,53],[381,52],[383,51],[384,51],[385,51],[386,52],[388,53],[391,55],[394,58],[397,60],[400,64],[402,66],[405,70],[407,74],[411,79],[414,85],[416,89],[418,94],[419,98],[422,104],[423,109],[426,114],[428,121],[429,125],[431,131],[432,135],[433,138],[435,143],[436,147],[438,151],[439,156],[442,160],[442,166],[443,170],[444,174],[445,177],[446,180],[447,182],[448,184],[448,185],[449,187],[450,188],[450,190],[451,192],[452,193],[453,194],[452,194],[449,195],[447,194],[444,194],[442,194],[438,194],[432,193],[425,192],[419,192],[415,191],[408,191],[382,189],[373,189],[367,189],[363,188],[358,188],[355,188],[350,188],[347,188],[344,188],[341,188],[337,188],[335,188],[332,187],[328,187],[326,187],[322,187],[317,186],[315,186],[309,185],[304,185],[300,184],[296,183],[294,183],[294,182],[293,180],[294,179],[295,175],[297,172],[299,169],[302,164],[304,161],[306,158],[309,154],[310,152],[312,150],[313,150],[314,148],[316,146],[317,144],[319,143],[320,141],[322,139],[323,137],[325,135],[327,134],[328,132],[330,130],[331,129],[332,128],[332,126],[333,125],[335,123],[336,122],[338,120],[339,119],[341,118],[342,117],[343,114],[344,113],[345,113],[346,112],[346,110],[347,109],[348,108],[349,107],[350,106],[350,105],[351,104],[352,104],[352,103],[354,102],[355,101],[355,100],[355,99],[356,98],[357,98],[358,97],[359,96],[360,96]))},{name:"triangle",nbr:1,data:new Array(new Array([134,204],[135,204],[137,202],[138,201],[147,194],[151,190],[154,187],[160,182],[165,178],[169,174],[172,170],[177,165],[180,161],[185,156],[188,151],[190,147],[193,142],[196,139],[200,133],[202,131],[206,125],[209,121],[212,118],[215,114],[217,111],[219,108],[222,105],[224,102],[226,100],[229,97],[231,95],[233,92],[235,91],[238,87],[239,85],[241,82],[242,81],[244,78],[246,75],[248,74],[248,72],[250,71],[250,70],[251,69],[252,68],[252,67],[253,67],[254,67],[255,68],[256,70],[256,71],[258,73],[260,75],[261,77],[263,79],[264,81],[265,83],[267,85],[268,88],[271,90],[273,94],[275,97],[278,101],[280,105],[284,110],[287,116],[292,123],[296,130],[299,136],[304,144],[309,150],[315,161],[318,167],[324,179],[328,187],[333,198],[338,207],[342,220],[348,234],[354,248],[360,262],[365,276],[371,291],[377,308],[383,323],[390,343],[395,358],[400,371],[407,389],[411,400],[416,415],[420,425],[424,436],[427,447],[430,455],[433,463],[434,469],[436,476],[438,481],[440,487],[441,492],[442,495],[443,498],[443,500],[444,501],[444,502],[444,501],[444,500],[442,499],[441,497],[440,496],[438,494],[437,493],[434,491],[433,489],[430,487],[428,484],[425,483],[421,479],[417,475],[413,472],[409,469],[405,464],[401,461],[397,457],[391,452],[387,448],[380,442],[375,437],[370,432],[365,426],[357,419],[351,414],[342,404],[334,397],[326,390],[314,380],[306,373],[297,365],[290,359],[283,353],[276,347],[269,341],[261,334],[254,328],[248,323],[241,317],[235,312],[229,307],[223,301],[217,297],[212,292],[207,286],[203,283],[198,278],[192,273],[187,269],[184,264],[179,260],[175,256],[170,250],[166,246],[163,242],[159,238],[156,235],[153,231],[151,228],[147,225],[145,222],[142,218],[140,215],[137,213],[135,210],[134,208],[132,207],[131,205],[129,203],[128,201],[126,200],[125,198],[124,197],[124,196],[123,196]))},{name:"triangle",nbr:1,data:new Array(new Array([351,239],[352,239],[353,239],[354,239],[357,241],[367,247],[371,250],[377,253],[383,255],[388,258],[395,261],[398,263],[401,265],[405,267],[409,269],[414,270],[418,272],[422,273],[425,275],[429,278],[433,280],[437,283],[440,285],[444,287],[448,290],[454,292],[460,295],[465,297],[468,299],[473,301],[478,303],[482,305],[487,308],[491,309],[497,311],[500,313],[504,314],[508,316],[511,317],[515,319],[520,320],[525,322],[531,325],[536,326],[542,328],[548,330],[554,332],[559,334],[564,335],[568,337],[573,338],[578,339],[582,340],[587,340],[591,340],[594,340],[603,340],[604,340],[605,340],[611,339],[622,335],[635,330],[649,326],[664,322],[679,319],[694,316],[709,313],[726,310],[740,308],[753,305],[768,303],[781,301],[794,298],[809,297],[821,295],[833,294],[845,292],[855,291],[867,290],[879,289],[891,288],[905,286],[917,286],[930,285],[943,283],[955,283],[967,281],[976,281],[986,280],[1027,278],[1035,278],[1043,277],[1052,276],[1058,276],[1066,276],[1072,275],[1080,274],[1090,274],[1099,274],[1107,273],[1117,273],[1125,273],[1134,273],[1140,272],[1145,271],[1150,271],[1157,269],[1160,269],[1163,268],[1167,267],[1169,266],[1167,266],[1155,267],[1140,267],[1121,267],[1105,268],[1087,269],[1065,270],[1038,270],[1014,270],[995,270],[974,271],[956,272],[936,272],[913,272],[895,272],[875,272],[856,272],[833,272],[810,273],[788,273],[769,273],[752,273],[734,273],[719,272],[703,272],[689,272],[675,272],[664,272],[652,272],[638,271],[624,271],[611,270],[599,269],[583,268],[570,267],[558,266],[545,265],[535,265],[527,264],[517,264],[507,262],[498,262],[489,261],[480,261],[472,260],[466,259],[459,258],[449,257],[440,255],[432,252],[425,251],[419,249],[410,248],[404,247],[397,247],[388,247],[382,247],[377,247],[375,247],[370,247],[366,247],[364,247],[363,247]))},{name:"triangle",nbr:1,data:new Array(new Array([333,179],[334,179],[335,179],[336,179],[342,176],[345,175],[349,173],[353,171],[358,169],[364,165],[374,162],[384,157],[393,153],[400,150],[413,145],[430,136],[444,129],[462,121],[480,113],[498,105],[518,95],[536,86],[554,78],[575,67],[597,57],[611,50],[620,45],[626,42],[632,39],[633,38],[635,37],[636,37],[641,41],[644,47],[648,50],[655,58],[662,68],[671,80],[685,100],[701,124],[717,147],[729,166],[746,192],[768,226],[787,256],[806,285],[821,312],[836,336],[846,358],[853,371],[860,386],[863,395],[865,400],[866,402],[867,404],[868,404],[868,405],[867,405],[862,404],[855,402],[848,400],[839,397],[829,393],[813,389],[797,384],[781,379],[759,372],[741,366],[721,360],[696,352],[675,345],[647,336],[626,329],[605,322],[581,315],[563,310],[546,306],[528,301],[510,297],[498,293],[480,288],[467,284],[451,278],[438,274],[423,269],[410,264],[397,261],[387,258],[374,253],[364,250],[356,247],[347,244],[340,242],[333,240],[329,238],[325,237],[322,236],[318,235],[310,232],[304,230],[297,228],[292,226],[289,225],[285,224],[281,223],[278,223],[276,222],[274,221],[273,221],[271,221],[269,220],[267,219],[264,219],[263,217],[262,217],[261,217],[260,217],[259,216],[257,216],[256,216],[255,216],[256,215],[264,211],[272,208],[280,205],[287,203],[294,200],[301,197],[306,195],[314,191],[322,189],[328,185],[334,183],[339,180],[344,179],[348,177],[352,174],[355,173],[358,172],[362,170],[366,167],[369,166],[374,163],[377,161],[381,159],[384,157],[386,156],[387,155]))},{name:"triangle",nbr:1,data:new Array(new Array([184,219],[184,220],[185,220],[187,221],[194,225],[199,226],[202,226],[207,228],[211,229],[223,233],[229,235],[232,236],[235,237],[238,239],[241,240],[246,242],[249,242],[253,244],[256,245],[259,246],[262,247],[266,249],[268,250],[273,251],[276,253],[281,254],[286,256],[290,258],[294,259],[298,260],[302,262],[307,264],[312,266],[316,267],[323,271],[328,274],[334,277],[340,280],[349,283],[355,286],[364,290],[372,293],[380,296],[387,299],[393,302],[398,304],[403,306],[407,308],[414,310],[419,313],[426,316],[434,319],[440,321],[446,323],[453,327],[462,331],[469,335],[477,339],[487,343],[497,346],[506,350],[513,353],[519,357],[528,363],[540,369],[552,375],[564,381],[575,386],[587,393],[598,398],[608,403],[615,407],[620,410],[626,412],[632,415],[637,417],[642,420],[646,422],[651,424],[656,426],[660,427],[669,429],[671,430],[672,430],[673,430],[674,430],[676,431],[679,431],[683,433],[683,432],[676,426],[668,419],[658,411],[646,402],[633,393],[619,385],[604,376],[588,368],[572,362],[560,355],[550,349],[539,342],[528,335],[518,330],[509,324],[502,319],[495,313],[488,307],[479,300],[472,293],[465,286],[459,280],[453,275],[448,269],[444,264],[439,259],[434,255],[430,250],[425,245],[419,239],[413,233],[406,226],[401,221],[398,218],[396,216],[393,213],[392,211],[390,210],[389,208],[386,205],[385,202],[384,202],[383,202],[364,204],[344,207],[318,212],[290,216],[267,221],[251,223],[239,225],[228,228],[219,230],[211,232],[206,232],[204,232],[203,232],[201,233],[198,234],[196,234],[195,234]))}]};
+JXG.extend(JXG,{Draw:{areEqual:function(e,t){if(JXG.isArray(e)){if(JXG.isArray(t))return JXG.Draw.areEqualArrays(e,t);else return false}if(JXG.isArray(t))return false;if(JXG.isObject(e)){if(JXG.isObject(t))return JXG.Draw.areEqualObjects(e,t);else return false}if(JXG.isObject(t))return false;return e===t},areEqualArrays:function(e,t){if(e.length!=t.length)return false;for(var o=0;o<e.length;o++)if(!JXG.Draw.areEqual(e[o],t[o]))return false;return true},areEqualObjects:function(e,t){for(var o in e)if(e.hasOwnProperty(o))if(!JXG.Draw.areEqual(e[o],t[o]))return false;for(var r in t)if(t.hasOwnProperty(r))if(!JXG.Draw.areEqual(t[r],e[r]))return false;return true},dist:function(e,t){var o=[],r=[];if(e.coords!=null){o.push(e.coords.usrCoords[1]);o.push(e.coords.usrCoords[2])}else if(e.usrCoords!=null){o.push(e.usrCoords[1]);o.push(e.usrCoords[2])}else console.log("inconsistency in dist");if(t.coords!=null){r.push(t.coords.usrCoords[1]);r.push(t.coords.usrCoords[2])}else if(t.usrCoords!=null){r.push(t.usrCoords[1]);r.push(t.usrCoords[2])}else console.log("inconsistency in dist");return(o[0]-r[0])*(o[0]-r[0])+(o[1]-r[1])*(o[1]-r[1])},findHittedObjs:function(e,t,o,r,s,i,n,a){var l,d=o.options.precision.hasPoint,c,u=[],G=[];if(typeof a=="undefined")a=false;o.options.precision.hasPoint=r;for(var f in o.objects){if(o.objects.hasOwnProperty(f)){l=o.objects[f];if(l.visProp.priv&&l.visProp.priv===true)continue;if(typeof i!="undefined"&&GUI.collectionContains(i,l.type))continue;if(l.hasPoint&&(l.visProp.visible||a)&&GUI.collectionContains(s,l.elementClass)){if(r===0||l.hasPoint(e,t)){u.push(l);if(typeof n!="undefined"&&n!=0&&n==u.length)break}}}}o.options.precision.hasPoint=d;for(c=0;c<u.length;c++){if(u[c].id.search("Label")!=-1)u[c]=GUI.board.objects[u[c].id.replace(/Label.*/,"")];if(JXG.exists(u[c])&&GUI.collectionContains(s,u[c].elementClass)&&!GUI.collectionContains(i,u[c].type))G.push(u[c])}u=JXG.uniqueArray(G);return u},findHittedObjsBySegment:function(e,t,o,r,s,i,n,a){var l,d,c,u=[];if(typeof a=="undefined")l=Infinity;else l=a;if(t>o){d=-1}else d=1;if(t>=e.length)t=e.length-1;if(o>=e.length)o=e.length-1;c=t;do{u=u.concat(JXG.Draw.findHittedObjs(e[c].scrCoords[1],e[c].scrCoords[2],r,s,i,n));c+=d}while(u.length<l&&d*c<d*o);return JXG.uniqueArray(u)},countContainedPoints:function(e,t,o,r){var s=0,i=r.options.precision.hasPoint;r.options.precision.hasPoint=o;if(t.hasPoint){for(var n=0;n<e.length;n++)if(t.hasPoint(e[n].scrCoords[1],e[n].scrCoords[2]))s++}r.options.precision.hasPoint=i;return s},findPointNextTo:function(e,t,o){var r,s,i,n,a=Infinity,l=null;if(JXG.exists(e.coords))s=e.coords;else s=e;for(r=0;r<t.length;r++){if(t[r].coords!=null)i=t[r].coords;else i=t[r];n=(s.scrCoords[1]-i.scrCoords[1])*(s.scrCoords[1]-i.scrCoords[1])+(s.scrCoords[2]-i.scrCoords[2])*(s.scrCoords[2]-i.scrCoords[2]);if(n<a&&(n<o||o===0)){a=n;l=t[r]}}return l},shortStraw:function(e,t,o){var r,s,i=e.slice(0),n=[],a=[],l=[],d=[],c=3,u=.95,G=1,f=false;if(typeof o!="undefined")f=o===true;var I=function(e){var t=e.length,o,r,s=Number.POSITIVE_INFINITY,i=[s,s,-s,-s],n,a,l;for(r=0;r<t;r++){e[r].catchIdx=r;o=e[r].scrCoords;if(o[1]<i[0]){i[0]=o[1]}if(o[1]>i[2]){i[2]=o[1]}if(o[2]<i[1]){i[1]=o[2]}if(o[2]>i[3]){i[3]=o[2]}}n=i[2]-i[0];a=i[3]-i[1];l=Math.sqrt(n*n+a*a);return l/40};var p=function(e,t,o){var r=0,s,i,a,l,d;if(f){for(s=0;s<e.length;s++){o.create("point",e[s].usrCoords,{fixed:true,withLabel:false,size:1,color:"blue"})}}n.push(e[0]);for(s=1;s<e.length;s++){i=e[s-1].distance(JXG.COORDS_BY_SCREEN,e[s]);if(r+i>=t){a=e[s-1].scrCoords[1]+(t-r)*(e[s].scrCoords[1]-e[s-1].scrCoords[1])/i;l=e[s-1].scrCoords[2]+(t-r)*(e[s].scrCoords[2]-e[s-1].scrCoords[2])/i;d=new JXG.Coords(JXG.COORDS_BY_SCREEN,[a,l],o);d.catchIdx=e[s].catchIdx;n.push(d);e.splice(s,0,d);r=0}else{r+=i}}n.push(e[e.length-1]);if(f){for(s=0;s<n.length;s++){o.create("point",n[s].usrCoords,{fixed:true,withLabel:false,size:1,color:"red"})}}};var g=function(e,t){var o=e.length,r,s,i,n;a.push(0);for(r=c;r<o-c;r++){d[r]=e[r-c].distance(JXG.COORDS_BY_SCREEN,e[r+c])}s=JXG.Math.Statistics.median(d)*u;for(r=c;r<o-c;r++){if(d[r]<s){i=Number.POSITIVE_INFINITY;n=r;while(r<o-c&&d[r]<s){if(d[r]<i){i=d[r];n=r}r++}a.push(n)}}a.push(o-1);U(e,t)};var U=function(e,t){var o,r,s,i,n,l=0,d=e.length,c,u;do{o=true;for(r=1;r<a.length;r++){s=a[r-1];i=a[r];if(!b(e,s,i,G)){n=h(s,i);if(n>s&&n<i){a.splice(r,0,n);o=false;if(f&&false){t.create("point",e[a[r]].usrCoords,{fixed:true,withLabel:false,size:4,color:"blue"})}}l++;if(l>=d){return}}}}while(!o);for(r=1;r<a.length-1;r++){s=a[r-1];i=a[r+1];if(b(e,s,i,G)){a.splice(r,1);r--}}c=a.length;if(c>2){u=e[a[0]].distance(JXG.COORDS_BY_SCREEN,e[a[c-1]]);if(u<30){a.pop()}}};var b=function(e,t,o,r){var s=e[t].distance(JXG.COORDS_BY_SCREEN,e[o]),i,n=0;for(i=t;i<o-1;i++){n+=e[i].distance(JXG.COORDS_BY_SCREEN,e[i+1])}return s>n*r};var h=function(e,t){var o=Math.floor((t-e)/4),r=Number.POSITIVE_INFINITY,s,i;for(i=e+o;i<t-o;i++){if(d[i]<r){r=d[i];s=i}}return s};r=I(i);p(i,r,t);g(n,t);for(s=0;s<a.length;s++){l.push(n[a[s]])}if(f){for(s=0;s<l.length;s++){t.create("point",l[s].usrCoords,{fixed:true,name:s,withLabel:true,size:6,label:{offsets:[-10,-10]},strokeColor:"blue",fillColor:"none"})}}return l},findCorners:function(e,t,o){return JXG.Draw.shortStraw(e,t,o)},bestRightAngleCorner:function(e,t,o){var r=Infinity,s=e.length,i,n,a,l=Math.PI;if(s<4){return 1}n=1;for(a=1;a<s-1;a++){i=JXG.Math.Geometry.rad(t.usrCoords.slice(1),e[a].usrCoords.slice(1),o.usrCoords.slice(1));i+=2*l-l*.5;i=Math.min(Math.abs(i%l),Math.abs(i%l-l));if(i<r){r=i;n=a}}return n},removeLine:function(e,t){for(var o in e.ancestors)if(e.ancestors.hasOwnProperty(o))t.removeObject(e.ancestors[o]);t.removeObject(e)},visualize:function(e,t){var o,r=t.length;if(t[0]!=t[r-1])e.create("line",[[t[r-1].usrCoords[1],t[r-1].usrCoords[2]],[t[0].usrCoords[1],t[0].usrCoords[2]]],{straightFirst:false,straightLast:false});for(o=0;o<r-1;o++)e.create("line",[[t[o].usrCoords[1],t[o].usrCoords[2]],[t[o+1].usrCoords[1],t[o+1].usrCoords[2]]],{straightFirst:false,straightLast:false})},pointAlreadyExists:function(e,t){var o,r,s;for(o in e.objects){if(e.objects.hasOwnProperty(o)){s=true;if(e.objects[o].elementClass==JXG.OBJECT_CLASS_POINT&&e.objects[o]!=t){for(r in e.objects[o].ancestors)if(e.objects[o].ancestors.hasOwnProperty(r)){if(!GUI.collectionContains(t.ancestors,e.objects[o].ancestors[r])){s=false;break}}if(s){for(r in t.ancestors)if(t.ancestors.hasOwnProperty(r)){if(!GUI.collectionContains(e.objects[o].ancestors,t.ancestors[r])){s=false;break}}}if(s&&e.objects[o].visProp.priv){s=false}if(s){s=Math.abs(t.coords.usrCoords[1]-e.objects[o].coords.usrCoords[1])+Math.abs(t.coords.usrCoords[2]-e.objects[o].coords.usrCoords[2])<.1}if(s){return e.objects[o]}}}}return null},sortXY:function(e){var t,o,r;for(o=0;o<e.length;o++){for(r=o+1;r<e.length;r++){if(e[r].usrCoords[1]<e[o].usrCoords[1]||e[r].usrCoords[1]==e[o].usrCoords[1]&&e[r].usrCoords[2]<e[o].usrCoords[2]){t=e[r];e[r]=e[o];e[o]=t}}}},convexHull:function(e,t,o){var r=function(e,t,o){return(t.usrCoords[1]-e.usrCoords[1])*(o.usrCoords[2]-e.usrCoords[2])-(t.usrCoords[2]-e.usrCoords[2])*(o.usrCoords[1]-e.usrCoords[1])};var s,i,n=0,a=[];JXG.Draw.sortXY(t);for(s=0;s<t.length;s++){while(n>=2&&r(a[n-2],a[n-1],t[s])<=0)n--;a[n++]=t[s]}for(s=t.length-2,i=n+1;s>=0;s--){while(n>=i&&r(a[n-2],a[n-1],t[s])<=0)n--;a[n++]=t[s]}a.length=n;if(typeof o!="undefined"&&o)JXG.Draw.visualize(e,a);return a},buildTupels:function(e,t,o){var r,s,i,n,a=[],l=[];if(t===0||e.length<t)return l;if(t==1){for(s=0;s<e.length;s++)l.push([e[s]]);return l}if(typeof o=="undefined")o=true;for(s=0;s<e.length;s++){n=[];if(o)r=s+1;else r=0;for(i=r;i<e.length;i++){if(i==s)continue;n.push(e[i])}a=JXG.Draw.buildTupels(n,t-1,o);for(i=0;i<a.length;i++){JXG.Draw.sortXY(a[i].push(e[s]));l.push(a[i]);if(l.length>2)return JXG.uniqueArray(l)}}return JXG.uniqueArray(l)},findMaxAreaPoints:function(e,t,o){var r,s,i,n,a=-1,l=-Infinity,d=t.length;var c=[],u=[],G=[],f;for(r=0;r<d;r++)if(typeof t[r].elementClass!="undefined")c.push(t[r]);else u.push(t[r]);while(c.length>o)c.pop();if(c.length==o)return{req:c,status:true};if(u.length<o-c.length){console.log("too few optional points!");console.log("k: "+o);console.log("n: "+d);console.log("optional: "+u.length);console.log("required: "+c.length);return{req:c,status:false}}if(u.length>o-c.length){console.log("too much optional points!");f=JXG.Draw.buildTupels(u,o-c.length,true);for(r=0;r<f.length;r++){G=[];for(s=0;s<f[r].length;s++)G[s]=e.create("point",[f[r][s].usrCoords[1],f[r][s].usrCoords[2]],{visible:false});G.push(G[0]);n=e.create("polygon",G,{visible:false});e.removeObject(n);for(s=0;s<G.length;s++)e.removeObject(G[s]);i=n.Area();if(i>=l){l=i;a=r}}if(a!=-1)for(r=0;r<f[a].length;r++)c.push(f[a][r]);else{console.log("Tupels: "+f.length);console.log("k: "+o);console.log("n: "+d);console.log("optional: "+u.length);console.log("required: "+c.length);console.log("max area error");return{req:[],status:false}}}else{for(r=0;r<u.length;r++)c.push(u[r])}return{req:c,status:true}},fitPoints:function(e,t){var o,r,s=[];if(t.length===0)return e;for(o=0;o<t.length;o++){r=JXG.Draw.findPointNextTo(t[o],e,0);if(r==null){console.log("inconsistency in fitPoints: data.len is smaller than ref.len");break}else{JXG.removeElementFromArray(e,r);s.push(t[o])}}for(o=0;o<e.length;o++)s.push(e[o]);return s},glideInterCombinedMigMove:function(e,t,o,r,s,i,n){var a,l,d,c,u,G,f={},I=[];if(JXG.Options.device=="tablet"||JXG.Options.device=="msie"){l=GUI.board.touches[0].targets[0].Xstart[0];d=GUI.board.touches[0].targets[0].Ystart[0];c=JXG.deepCopy(GUI.board.touches[0].obj.coords.usrCoords)}else{l=GUI.board.mouse.targets[0].Xstart[0];d=GUI.board.mouse.targets[0].Ystart[0];c=JXG.deepCopy(GUI.board.mouse.obj.coords.usrCoords)}GUI.board.mouse=GUI.board.touches=null;u={type:JXG.GENTYPE_MOVEMENT,src_ids:[o],dest_sub_ids:[],dest_id:0,args:{obj_type:JXG.OBJECT_TYPE_POINT,xstart:l,ystart:d,coords:[{usrCoords:c}]}};I.push(u);if(s){if(GUI.board.objects[r].type!=JXG.OBJECT_TYPE_GLIDER){f.type=JXG.GENTYPE_GLIDER;f.src_ids=[r];f.dest_sub_ids=[];f.args={undoIsEmpty:true,usrCoords:[1,e,t]};a=f.dest_id=JXG.SketchReader.id();I.push(f)}else a=r}else{f.type=JXG.GENTYPE_INTERSECTION;f.src_ids=[i[n[0][1][1]].id,i[n[0][1][2]].id];f.dest_id=n[0][1][0].id;f.args={choice:n[0][1][3],fillColor:"#ffffff",undoIsEmpty:true};a=f.dest_id;I.push(f);GUI.board.removeObject(GUI.board.objects[a])}G={type:JXG.GENTYPE_MIGRATE,args:{migrateToGlider:true,usrCoords:JXG.deepCopy(GUI.ctx_curr_coords.usrCoords),orig_name:GUI.board.objects[o].name,fillColor:JXG.Options.point.fillColor,strokeColor:JXG.Options.point.strokeColor},src_ids:u.src_ids,dest_sub_ids:[],dest_id:a};I.push(G);JXG.Draw.recordStepMeta({type:JXG.GENTYPE_COMBINED,src_ids:G.src_ids,dest_sub_ids:[],dest_id:G.dest_id,args:{steps:I}},true);return a},gliderDialog:function(e,t,o,r,s,i){GUI.createSelectDialogCtx(o,function(o){if(r){if(i){JXG.Draw.glideInterCombinedMigMove(e,t,s,o,true,[],[])}else{var n=JXG.Draw.drawGlider(o,e,t);JXG.Draw.recordStepMeta({type:JXG.GENTYPE_MIGRATE,src_ids:[s],dest_sub_ids:[],dest_id:n},true)}GUI.removeActionEvent(true)}else{JXG.Draw.drawGlider(o,e,t)}GUI.showPanel(false,0);GUI.selection=[];GUI.delight();GUI.removeToolEvents(true)},GUI.ctxPosProps);GUI.selection=[]},touchIssDialogHandler:function(e){var t,o;for(t=0;t<GUI.intersect_obj.length;t++){o="sel_"+GUI.intersect_obj[t][0]+GUI.intersect_obj[t][1]+ +GUI.intersect_obj[t][2];if(GUI.isTouchInElementsBounds(e,o)){if(t!=GUI.int_click){if(GUI.int_click!=-1){$("#sel_"+GUI.intersect_obj[GUI.int_click][0]+GUI.intersect_obj[GUI.int_click][1]+GUI.intersect_obj[GUI.int_click][2]).removeClass("proplight_active");GUI.iss_delight()}GUI.int_click=t;$("#sel_"+GUI.intersect_obj[t][0]+GUI.intersect_obj[t][1]+GUI.intersect_obj[t][2]).addClass("proplight_active");GUI.iss_highlight(GUI.intersect_obj[t][0],GUI.intersect_obj[t][1],GUI.intersect_obj[t][2])}break}else{$(o).removeClass("proplight_active")}}if(e&&e.preventDefault)e.preventDefault();else window.event.returnValue=false},intersectionDialog:function(e,t,o,r,s,i){var n,a,l,d,c;if(s){GUI.disableConstDragMode();c=GUI.Lang.std.ablateOnIntersection+"<br><br>"}else c=GUI.Lang.std.selectIntersection+"<br><br>";GUI.intersect_obj=[];for(n=0;n<r.length;n++){if(r[n][1][0].coords.usrCoords[0]!==0){a=o[r[n][1][1]];l=o[r[n][1][2]];d="sel_"+a.id+l.id+r[n][1][3];c+='<a href="#" tabindex="'+GUI.intersect_obj.length+'" id="'+d+'" class="block proplight">';c+=GUI.resolveObjectType(a);if(a.visProp.withlabel&&a.label.visProp.visible)c+=" "+a.name;c+=" &#8745; "+GUI.resolveObjectType(l);if(l.visProp.withlabel&&l.label.visProp.visible)c+=" "+l.name;c+="</a>";GUI.intersect_obj.push([a.id,l.id,r[n][1][3]])}GUI.board.removeObject(r[n][1][0])}GUI.showPanelHTML(c,GUI.ctxPosProps,false);GUI.int_click=-1;if(JXG.Options.device=="tablet"||JXG.Options.device=="msie"&&GUI.isRealMSTouchDevice()){$("#ctxPanel").bind(GUI.down_event,JXG.Draw.touchIssDialogHandler);$("#ctxPanel").bind(GUI.move_event,JXG.Draw.touchIssDialogHandler);$("#ctxPanel").bind(GUI.up_event,function(){GUI.contextUnbindHandlers();if(s)JXG.Draw.glideInterCombinedMigMove(e,t,i,0,false,o,r);else JXG.Draw.drawIntersection(GUI.intersect_obj[GUI.int_click][0],GUI.intersect_obj[GUI.int_click][1],GUI.intersect_obj[GUI.int_click][2]);GUI.iss_delight();GUI.removeActionEvent(true)})}else{for(n=0;n<GUI.intersect_obj.length;n++){d=$("#sel_"+GUI.intersect_obj[n][0]+GUI.intersect_obj[n][1]+GUI.intersect_obj[n][2]);d.bind(GUI.out_event,function(e){$("#"+e.currentTarget.id).removeClass("proplight_active");GUI.iss_delight()});d.bind(GUI.over_event,function(e){var t=$("#"+e.currentTarget.id).attr("tabindex");$("#"+e.currentTarget.id).addClass("proplight_active");GUI.iss_highlight(GUI.intersect_obj[t][0],GUI.intersect_obj[t][1],GUI.intersect_obj[t][2])});d.bind(GUI.click_event,function(n){var a=$("#"+n.currentTarget.id).attr("tabindex");if(s)JXG.Draw.glideInterCombinedMigMove(e,t,i,0,false,o,r);else JXG.Draw.drawIntersection(GUI.intersect_obj[a][0],GUI.intersect_obj[a][1],GUI.intersect_obj[a][2]);$("#"+n.currentTarget.id).removeClass("proplight_active");GUI.removeActionEvent(true);GUI.iss_delight()})}}},drawPoint:function(e,t,o,r,s){var i,n,a,l,d=[],c=[],u=[JXG.OBJECT_TYPE_TEXT,JXG.OBJECT_TYPE_POLYGON],G={src_ids:[],dest_sub_ids:[],dest_id:0,args:{}};if(o){l=o;for(i=0;i<l.length;i++)if(l[i].elementClass==JXG.OBJECT_CLASS_POINT)d.push(l[i]);if(d.length>0)l=d;if(l.length==1&&l[0].elementClass==JXG.OBJECT_CLASS_POINT)return l[0].id}else{if(typeof t[0]=="undefined"||typeof t[0].scrCoords=="undefined")return G.dest_id;l=JXG.Draw.findHittedObjs(t[0].scrCoords[1],t[0].scrCoords[2],e,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_CIRCLE,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_CURVE,JXG.OBJECT_CLASS_AREA,JXG.OBJECT_CLASS_OTHER],u);for(i=0;i<l.length;i++){if(l[i].elementClass==JXG.OBJECT_CLASS_POINT){JXG.removeElementFromArray(l,l[i]);i--}}}if(l.length<=1){G.dest_id=JXG.SketchReader.id();G.args.usrCoords=JXG.deepCopy(t[0].usrCoords);if(l.length!==0){G.type=JXG.GENTYPE_GLIDER;G.src_ids=[l[0].id]}else G.type=JXG.GENTYPE_POINT;if(r)return G;else this.recordStepMeta(G,true)}else{var f,I,p,g,U=[],b=false,h=2*JXG.Options.sensitive_area/(e.unitX+e.unitY);if(JXG.Options.device=="tablet"||JXG.Options.device=="msie")h*=2;e.suspendUpdate();for(i=0;i<l.length;i++){for(n=i+1;n<l.length;n++){p=e.create("intersection",[l[i],l[n],0],{id:JXG.SketchReader.id(),fillColor:"#ffffff"});g=e.create("intersection",[l[i],l[n],1],{id:JXG.SketchReader.id(),fillColor:"#ffffff"});U.push([p,i,n,0]);if(p.coords.usrCoords[0]==g.coords.usrCoords[0]&&p.coords.usrCoords[1]==g.coords.usrCoords[1]&&p.coords.usrCoords[2]==g.coords.usrCoords[2])e.removeObject(g);else U.push([g,i,n,1])}}a=e.create("point",t[0].usrCoords);I=U[0][0].nameHTML;f=U[0][0].name;for(i=0;i<U.length;i++){if(a.Dist(U[i][0])<h&&JXG.Draw.pointAlreadyExists(e,U[i][0])==null){c.push([i,U[i]]);JXG.removeElementFromArray(U,U[i]);i--}}e.removeObject(a);for(i=0;i<U.length;i++)e.removeObject(U[i][0]);e.unsuspendUpdate();if(c.length===0||c.length>1){b=true}else{if(c[0][0]!==0){c[0][1][0].nameHTML=I;c[0][1][0].setAttribute({name:f});c[0][1][0].label.setText(f)}if(s){return JXG.Draw.glideInterCombinedMigMove(t[0].usrCoords[1],t[0].usrCoords[2],r,l[0].id,false,l,c)}else{G.type=JXG.GENTYPE_INTERSECTION;G.src_ids=[l[c[0][1][1]].id,l[c[0][1][2]].id];G.dest_id=c[0][1][0].id;G.args.choice=c[0][1][3];G.args.fillColor="#ffffff";this.recordStepMeta(G,false)}}if(GUI&&b){if(c.length>0)JXG.Draw.intersectionDialog(t[0].usrCoords[1],t[0].usrCoords[2],l,c,o,r);else JXG.Draw.gliderDialog(t[0].usrCoords[1],t[0].usrCoords[2],l,o,r,s);if(o)return-1}}return G.dest_id},drawGlider:function(e,t,o){var r={};r.type=JXG.GENTYPE_GLIDER;r.src_ids=[e];r.dest_sub_ids=[];r.dest_id=JXG.SketchReader.id();r.args={usrCoords:[1,t,o]};this.recordStepMeta(r,true);return r.dest_id},drawIntersection:function(e,t,o){var r={};r.type=JXG.GENTYPE_INTERSECTION;r.src_ids=[e,t];r.args={};r.args.choice=o;r.args.fillColor="#ffffff";r.dest_sub_ids=[];r.dest_id=JXG.SketchReader.id();this.recordStepMeta(r,true);return r.dest_id},drawMidPoint:function(e){if(e.length>=2){var t={type:JXG.GENTYPE_MID,args:{fillColor:"#ffffff"},src_ids:[e[0].id,e[e.length-1].id],dest_sub_ids:[],dest_id:JXG.SketchReader.id()};this.recordStepMeta(t,true);return t.dest_id}else return 0},drawReflection:function(e,t,o){var r,s,i,n=0,a=0,l,d,c,u,G={};u=JXG.Draw.findPointNextTo(t[0],o,0);c=JXG.Draw.findHittedObjsBySegment(t,t.length,t.length-t.length/3,e,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_CIRCLE,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_CURVE,JXG.OBJECT_CLASS_AREA,JXG.OBJECT_CLASS_OTHER],[JXG.OBJECT_TYPE_TICKS,JXG.OBJECT_TYPE_TEXT]);for(r=0;r<c.length;r++){if(c[r].elementClass==JXG.OBJECT_CLASS_LINE){if((s=JXG.Draw.countContainedPoints(t,c[r],JXG.Options.sensitive_area,e))>n){if(c[r].hasPoint(u.coords.scrCoords[1],u.coords.scrCoords[2])){continue}n=s;l=r}}else if(c[r].elementClass==JXG.OBJECT_CLASS_POINT){if((i=JXG.Draw.countContainedPoints(t,c[r],JXG.Options.sensitive_area,e))>a){a=i;d=r}}}if(a===0){if(n===0){return}else r=l}else r=d;if(o.length===0||o.length==1&&c[r].elementClass==JXG.OBJECT_CLASS_POINT)return;G.args={};G.dest_sub_ids=[];G.src_ids=[u.id,c[r].id];G.dest_id=JXG.SketchReader.id();G.args.fillColor="#ffffff";if(c[r].elementClass==JXG.OBJECT_CLASS_LINE)G.type=JXG.GENTYPE_REFLECTION;else G.type=JXG.GENTYPE_MIRRORPOINT;this.recordStepMeta(G,true)},drawTangent:function(e,t){var o,r,s=JXG.Draw.findCorners(t,e),i,n,a,l,d,c,u;if(s.length<4){return}i=e.create("line",[[s[0].usrCoords[1],s[0].usrCoords[2]],[s[1].usrCoords[1],s[1].usrCoords[2]]]);n=e.create("line",[[s[s.length-2].usrCoords[1],s[s.length-2].usrCoords[2]],[s[s.length-1].usrCoords[1],s[s.length-1].usrCoords[2]]]);for(o in s){if(s.hasOwnProperty(o))e.removeObject(s[o])}a=e.create("intersection",[i,n,0]);l=a.coords.usrCoords[1];d=a.coords.usrCoords[2];JXG.Draw.removeLine(i,e);JXG.Draw.removeLine(n,e);e.removeObject(a);c=JXG.Draw.findHittedObjsBySegment(t,0,t.length,e,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_CIRCLE,JXG.OBJECT_CLASS_CURVE],[],1);var G={};G.type=JXG.GENTYPE_TANGENT;G.args={};G.src_ids=[];G.dest_sub_ids=[];if(c.length>0){G.src_ids=[c[0].id];u=JXG.Draw.findHittedObjsBySegment(t,0,t.length,e,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_POINT],[JXG.OBJECT_TYPE_POINT,JXG.OBJECT_TYPE_AXISPOINT,JXG.OBJECT_TYPE_CAS,JXG.OBJECT_TYPE_INTERSECTION]);if(u.length===0){a=e.create("point",[l,d]);a.setAttribute({fillColor:e.options.glider.fillColor});if(c[0].type==JXG.OBJECT_TYPE_CURVE)r=JXG.Math.Geometry.projectPointToCurve(a,c[0],e);else r=JXG.Math.Geometry.projectPointToCircle(a,c[0],e);e.removeObject(a);G.args.create_point=true;G.args.usrCoords=JXG.deepCopy(r.usrCoords);G.args.fillColor=e.options.glider.fillColor;var f=JXG.SketchReader.id();G.dest_sub_ids=[JXG.SketchReader.id(),JXG.SketchReader.id(),f]}else{G.args.create_point=false;var I,p=-1,g=Infinity;for(o=0;o<u.length;o++){if(c[0].type==JXG.OBJECT_TYPE_CURVE)r=JXG.Math.Geometry.projectPointToCurve(u[o],c[0],e);else r=JXG.Math.Geometry.projectPointToCircle(u[o],c[0],e);I=(r.usrCoords[1]-u[o].coords.usrCoords[1])*(r.usrCoords[1]-u[o].coords.usrCoords[1]);I+=(r.usrCoords[2]-u[o].coords.usrCoords[2])*(r.usrCoords[2]-u[o].coords.usrCoords[2]);if(I<g){p=o;g=I}}if(p>=0){G.src_ids=[u[p].id];G.dest_sub_ids=[JXG.SketchReader.id(),JXG.SketchReader.id()]}else return}G.dest_id=JXG.SketchReader.id();this.recordStepMeta(G,true)}},drawParallel:function(e,t){var o,r,s,i,n,a=[],l,d,c,u,G,f,I,p=0,g=0;var U={};U.args={};U.src_ids=[];U.dest_sub_ids=[];s=JXG.Draw.findHittedObjsBySegment(t,0,t.length/3,e,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_CIRCLE,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_CURVE,JXG.OBJECT_CLASS_AREA,JXG.OBJECT_CLASS_OTHER],[]);i=JXG.Draw.findHittedObjsBySegment(t,t.length,t.length-t.length/3,e,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_CIRCLE,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_CURVE,JXG.OBJECT_CLASS_AREA,JXG.OBJECT_CLASS_OTHER],[]);for(o=0;o<s.length;o++){if(s[o].elementClass==JXG.OBJECT_CLASS_LINE){if((u=JXG.Draw.countContainedPoints(t,s[o],JXG.Options.sensitive_area,e))>p){p=u;d=o}}}for(r=0;r<i.length;r++){if(i[r].elementClass==JXG.OBJECT_CLASS_LINE){if((u=JXG.Draw.countContainedPoints(t,i[r],JXG.Options.sensitive_area,e))>g){g=u;c=r}}}if(g>p){s=i;o=c;G=true}else if(p>0){o=d;G=false}else return;n=JXG.Draw.findHittedObjsBySegment(t,0,t.length,e,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_CIRCLE,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_CURVE,JXG.OBJECT_CLASS_AREA,JXG.OBJECT_CLASS_OTHER],[]);for(r=0;r<n.length;r++)if(n[r].elementClass==JXG.OBJECT_CLASS_POINT)a.push(n[r]);if(a.length>0){if(G)I=a[0].id;else I=a[a.length-1].id;l=JXG.Math.Geometry.projectPointToLine(e.objects[I],s[o],e);if(Math.abs(l.usrCoords[1]-e.objects[I].coords.usrCoords[1])<JXG.Math.eps&&Math.abs(l.usrCoords[2]-e.objects[I].coords.usrCoords[2])<JXG.Math.eps)a=[]}U.type=JXG.GENTYPE_PARALLEL;if(a.length===0){if(G)f=t[0];else f=t[t.length-1];I=JXG.SketchReader.id();U.args.usrCoords=JXG.deepCopy(f.usrCoords);U.args.create_point=true;U.src_ids=[s[o].id];U.dest_sub_ids=[JXG.SketchReader.id(),I]}else{U.args.create_point=false;U.src_ids=[s[o].id,I];U.dest_sub_ids=[JXG.SketchReader.id()]}U.dest_id=JXG.SketchReader.id();this.recordStepMeta(U,true)},drawBisector:function(e,t,o){var r={};r.args={};r.args.create_point=false;if(o.length==3){r.type=JXG.GENTYPE_BISECTOR;r.src_ids=[o[0].id,o[2].id,o[1].id];r.dest_sub_ids=[JXG.SketchReader.id()];r.dest_id=JXG.SketchReader.id()}else{var s,i,n,a;var l,d,c,u,G,f=1e5;var I=JXG.Draw.findCorners(t,e);n=JXG.Draw.findHittedObjsBySegment(t,0,t.length/3,e,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_LINE],[JXG.OBJECT_TYPE_TEXT],1);a=JXG.Draw.findHittedObjsBySegment(t,t.length,t.length-t.length/3,e,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_LINE],[JXG.OBJECT_TYPE_TEXT],1);for(s=0;s<n.length;s++)if(n[s].elementClass==JXG.OBJECT_CLASS_LINE)break;for(i=0;i<a.length;i++)if(a[i].elementClass==JXG.OBJECT_CLASS_LINE)break;if(s<n.length&&i<a.length&&n[s]!=a[i]){if(I.length<4){return}r.type=JXG.GENTYPE_BISECTOR;r.args.create_point=true;r.args.fillColor=e.options.intersection.fillColor;c=e.create("intersection",[n[s],a[s]],{visible:false});u=I[2].usrCoords.slice(0);G=c.coords.usrCoords;u[0]=G[0];u[1]=f*(u[1]-G[1])+G[1];u[2]=f*(u[2]-G[2])+G[2];r.args.usrCoords=u.slice(0);l=this.pointAlreadyExists(e,c);e.removeObject(c);r.src_ids=[n[s].id,a[s].id];r.dest_sub_ids=[JXG.SketchReader.id(),JXG.SketchReader.id(),JXG.SketchReader.id()];if(l===null){r.args.create_intersection=true;r.dest_sub_ids[3]=JXG.SketchReader.id()}else{r.args.create_intersection=false;d=JXG.deepCopy(l.id);r.src_ids[2]=d}r.dest_id=JXG.SketchReader.id()}else return}this.recordStepMeta(r,true)},drawNormal:function(e,t,o){var r,s,i,n=0,a,l=[JXG.OBJECT_TYPE_POLYGON],d,c,u,G,f,I={};a=JXG.Draw.findHittedObjsBySegment(t,0,t.length,e,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_CIRCLE,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_CURVE,JXG.OBJECT_CLASS_AREA,JXG.OBJECT_CLASS_OTHER],l);for(r=0;r<a.length;r++){if(a[r].elementClass==JXG.OBJECT_CLASS_LINE){if((i=JXG.Draw.countContainedPoints(t,a[r],JXG.Options.sensitive_area,e))>n){n=i;s=r}}}if(n===0)return;I.args={};I.dest_sub_ids=[];I.dest_id=0;I.type=JXG.GENTYPE_NORMAL;I.src_ids=[a[s].id];d=JXG.Draw.findCorners(t,e);if(d.length<3||t.length<5)return;u=null;for(r=0;r<o.length;r++){G=o[r].coords.scrCoords;if(!a[s].hasPoint(G[1],G[2])){u=o[r];break}}f=this.bestRightAngleCorner(d,t[0],t[t.length-1]);if(u===null){u=JXG.Draw.findPointNextTo(d[f],o,32*JXG.Options.sensitive_area)}if(u===null){I.args.create_point=true;I.args.usrCoords=JXG.deepCopy(d[f].usrCoords);c=JXG.SketchReader.id();I.dest_sub_ids=[JXG.SketchReader.id(),c]}else{I.args.create_point=false;if(u.coords.distance(JXG.COORDS_BY_SCREEN,t[0])<=30||u.coords.distance(JXG.COORDS_BY_SCREEN,t[t.length-1])<=30)I.type=JXG.GENTYPE_PERPSEGMENT;I.src_ids.push(u.id);I.dest_sub_ids=[JXG.SketchReader.id()]}I.dest_id=JXG.SketchReader.id();this.recordStepMeta(I,true)},drawLine:function(e,t){var o=null,r=null,s={};s.type=JXG.GENTYPE_LINE;s.args={};s.src_ids=[];s.dest_sub_ids=[];s.dest_id=0;s.args.create_point1=s.args.create_point2=false;s.args.first=s.args.last=true;if(t.length>0){o=JXG.Draw.findPointNextTo(e[0],t,GUI.rayFactor*JXG.Options.sensitive_area);if(o!=null){t=JXG.removeElementFromArray(t,o);s.args.first=false}r=JXG.Draw.findPointNextTo(e[e.length-1],t,GUI.rayFactor*JXG.Options.sensitive_area);if(r!=null){t=JXG.removeElementFromArray(t,r);s.args.last=false}if(o==null){if(t.length>0){o=t[0];t=JXG.removeElementFromArray(t,o)}else{o=e[0].usrCoords}}if(r==null){if(t.length>0){r=t[t.length-1]}else{r=e[e.length-1].usrCoords}}}else{o=e[0].usrCoords;r=e[e.length-1].usrCoords}s.src_ids=[];s.dest_sub_ids=[];if(!o.coords&&!r.coords){s.args.create_point1=s.args.create_point2=true;s.args.p1=[o[1]-1e5*(r[1]-o[1]),o[2]-1e5*(r[2]-o[2])];s.args.p2=[0,r[1]-o[1],r[2]-o[2]];s.dest_sub_ids=[JXG.SketchReader.id(),JXG.SketchReader.id()]}else{if(!o.coords){s.args.p1=[0,o[1]-r.coords.usrCoords[1],o[2]-r.coords.usrCoords[2]];s.args.create_point1=true;s.dest_sub_ids.push(JXG.SketchReader.id());s.args.p2=[r[1],r[2]];s.src_ids.push(r.id)}else{s.args.p1=[o[1],o[2]];s.src_ids.push(o.id);if(!r.coords){s.args.p2=[0,r[1]-o.coords.usrCoords[1],r[2]-o.coords.usrCoords[2]];s.args.create_point2=true;s.dest_sub_ids.push(JXG.SketchReader.id())}else{s.args.p2=[r[1],r[2]];s.src_ids.push(r.id)}}}s.dest_id=JXG.SketchReader.id();this.recordStepMeta(s,true)},drawPolygon:function(e){var t={type:JXG.GENTYPE_POLYGON,src_ids:[],args:{},dest_sub_ids:[],dest_id:JXG.SketchReader.id()};for(var o=0;o<e.length;o++){t.src_ids.push(e[o].id);t.dest_sub_ids.push(JXG.SketchReader.id())}this.recordStepMeta(t,true)},drawCircle2Points:function(e,t,o){var r,s=null,i=null;if(o.length>0){s=JXG.Draw.findPointNextTo(t[0],o,0)}r=JXG.Draw.findCorners(t,e);if(o.length==1&&s!=null&&JXG.Draw.dist(s,r[1])<JXG.Draw.dist(s,t[0])){s=null}if(s!=null){o=JXG.removeElementFromArray(o,s)}else{s=t[0].usrCoords}if(o.length>0){i=JXG.Draw.findPointNextTo(r[1],o,0)}if(i==null)i=t[t.length-1].usrCoords;var n={};n.args={};n.src_ids=[];n.dest_sub_ids=[];n.dest_id=0;n.type=JXG.GENTYPE_CIRCLE2POINTS;n.args.create_two_points=n.args.create_point=n.args.create_by_radius=false;if(!s.coords){if(i==null||!i.coords){n.args.create_two_points=true;n.args.x1=s[1];n.args.y1=s[2];n.args.x2=i[1];n.args.y2=i[2];n.dest_sub_ids=[JXG.SketchReader.id(),JXG.SketchReader.id()]}else{n.args.create_point=true;n.args.x=s[1];n.args.y=s[2];n.dest_sub_ids=[JXG.SketchReader.id()];n.src_ids.push(i.id)}}else{if(i==null||!i.coords){n.args.create_by_radius=true;n.args.r=(i[1]-s.coords.usrCoords[1])*(i[1]-s.coords.usrCoords[1]);n.args.r+=(i[2]-s.coords.usrCoords[2])*(i[2]-s.coords.usrCoords[2]);n.args.r=Math.sqrt(n.args.r);n.src_ids.push(s.id)}else{n.src_ids.push(s.id);n.src_ids.push(i.id)}}n.dest_id=JXG.SketchReader.id();this.recordStepMeta(n,true)},drawCircle:function(e,t){var o,r=[],s=[],i,n,a,l,d,c,u;var G={};G.type=JXG.GENTYPE_CIRCLE;G.src_ids=[];G.dest_sub_ids=[];G.dest_id=0;G.args={create_by_radius:false};G.dest_sub_ids=[JXG.SketchReader.id()];G.dest_id=JXG.SketchReader.id();if(t.length<=1){for(o=0;o<e.length;o++){r.push([e[o].usrCoords[1],e[o].usrCoords[2],1]);s.push(r[o][0]*r[o][0]+r[o][1]*r[o][1])}i=JXG.Math.transpose(r);n=JXG.Math.matMatMult(i,r);a=JXG.Math.matVecMult(i,s);l=JXG.Math.Numerics.Gauss(n,a);d=l[0]*.5;c=l[1]*.5;if(t.length===1){var f=[1,d,c];G.args.create_point=true;G.args.usrCoords=JXG.deepCopy(f);G.src_ids=[t[0].id]}else{u=Math.sqrt(l[2]+d*d+c*c);G.args.create_by_radius=true;G.args.x=d;G.args.y=c;G.args.r=u}}else if(t.length==2){G.args={};G.type=JXG.GENTYPE_CIRCLE2POINTS;G.src_ids=[t[0].id,t[1].id]}else if(t.length==3){JXG.Draw.drawOutcircle(t);return}else{JXG.Draw.drawPolygon(t);return}this.recordStepMeta(G,true)},drawOutcircle:function(e){var t={};t.type=JXG.GENTYPE_CIRCLE;t.args={};t.args.create_by_radius=false;t.dest_sub_ids=[JXG.SketchReader.id()];t.dest_id=JXG.SketchReader.id();t.src_ids=[e[0].id,e[1].id,e[2].id];this.recordStepMeta(t,true)},drawTriangle:function(e,t,o){var r,s,i,n,a,l,d,c=[],u=[];if(o.length>3){JXG.Draw.drawQuadrilateral(t,o);return}n=JXG.Draw.convexHull(e,JXG.Draw.findCorners(t,e),false);n.pop();d=JXG.uniqueArray(JXG.Draw.fitPoints(n,o));l=JXG.Draw.findMaxAreaPoints(e,d,3);if(!l.status)return;d=l.req;while(d.length>0){i=-1;for(r=0;r<d.length;r++){if(d[r].catchIdx<i||i==-1){i=d[r].catchIdx;s=r}else if(d[r].catchIdx==i&&d[r].elementClass==JXG.OBJECT_CLASS_POINT)s=r}c.push(d[s]);d.splice(s,1)}for(r=0;r<c.length;r++){if(c[r].elementClass==JXG.OBJECT_CLASS_POINT){u.push(c[r])}else{u.push(e.create("point",c[r].usrCoords,{id:JXG.SketchReader.id(),snaptogrid:JXG.Options.elements.snapToGrid,snaptopoints:JXG.Options.elements.snapToPoints}))}}a=e.create("polygon",[u[0],u[1],u[2]],{borders:{ids:[JXG.SketchReader.id(),JXG.SketchReader.id(),JXG.SketchReader.id()],name:""},id:JXG.SketchReader.id(),name:"",fillOpacity:JXG.Options.opacityLevel,hasInnerPoints:JXG.Options.polygon.hasInnerPoints,scalable:true,snaptogrid:JXG.Options.elements.snapToGrid,snaptopoints:JXG.Options.elements.snapToPoints});var G={};G.type=JXG.GENTYPE_TRIANGLE;G.args={};G.src_ids=[];G.dest_sub_ids=[];G.args.create_point=[false,false,false];G.args.coords=[];G.src_ids=[];G.dest_sub_ids=[];G.dest_id=a.id;for(r=0;r<a.vertices.length-1;r++){if(!GUI.collectionContains(c,a.vertices[r])){G.args.create_point[r]=true;G.args.coords.push({usrCoords:JXG.deepCopy(a.vertices[r].coords.usrCoords)});G.dest_sub_ids.push(a.vertices[r].id)}else{G.args.coords.push([]);G.dest_sub_ids.push(0);G.src_ids.push(a.vertices[r].id)}}for(r=0;r<a.borders.length;r++)G.dest_sub_ids.push(a.borders[r].id);this.recordStepMeta(G,false)},drawQuadrilateral:function(e,t,o){var r={};r.type=JXG.GENTYPE_QUADRILATERAL;r.args={};r.src_ids=[];r.dest_sub_ids=[];r.dest_id=0;if(o.length==4){r.args.create_point=[false,false,false,false];r.args.coords=[];r.src_ids=[];for(s=0;s<4;s++){r.args.coords.push([]);r.src_ids.push(o[s].id)}r.dest_sub_ids=[0,0,0,0,JXG.SketchReader.id(),JXG.SketchReader.id(),JXG.SketchReader.id(),JXG.SketchReader.id()];r.dest_id=JXG.SketchReader.id();this.recordStepMeta(r,true)}else if(o.length>4){JXG.Draw.drawPolygon(o)}else{var s,i,n,a,l,d,c,u=[],G=[];a=JXG.Draw.convexHull(e,JXG.Draw.findCorners(t,e));a.pop();c=JXG.uniqueArray(JXG.Draw.fitPoints(a,o));d=JXG.Draw.findMaxAreaPoints(e,c,4);if(!d.status)return;c=d.req;while(c.length>0){i=-1;for(s=0;s<c.length;s++){if(c[s].catchIdx<i||i==-1){i=c[s].catchIdx;n=s}else if(c[s].catchIdx==i&&c[s].elementClass==JXG.OBJECT_CLASS_POINT)n=s}u.push(c[n]);c.splice(n,1)}for(s=0;s<u.length;s++){if(u[s].elementClass==JXG.OBJECT_CLASS_POINT)G[s]=u[s];else G[s]=e.create("point",u[s].usrCoords,{id:JXG.SketchReader.id(),snaptogrid:JXG.Options.elements.snapToGrid,snaptopoints:JXG.Options.elements.snapToPoints})
+}l=e.create("polygon",[G[0],G[1],G[2],G[3]],{borders:{ids:[JXG.SketchReader.id(),JXG.SketchReader.id(),JXG.SketchReader.id(),JXG.SketchReader.id()],name:""},id:JXG.SketchReader.id(),name:"",fillOpacity:JXG.Options.opacityLevel,hasInnerPoints:JXG.Options.polygon.hasInnerPoints,scalable:true,snaptogrid:JXG.Options.elements.snapToGrid,snaptopoints:JXG.Options.elements.snapToPoints});r.args.create_point=[false,false,false,false];r.args.coords=[];r.src_ids=[];r.dest_sub_ids=[];r.dest_id=l.id;for(s=0;s<l.vertices.length-1;s++){if(!GUI.collectionContains(u,l.vertices[s])){r.args.create_point[s]=true;r.args.coords.push({usrCoords:JXG.deepCopy(l.vertices[s].coords.usrCoords)});r.dest_sub_ids.push(l.vertices[s].id);r.src_ids.push(l.vertices[s].id)}else{r.args.coords.push([]);r.dest_sub_ids.push(0);r.src_ids.push(l.vertices[s].id)}}for(s=0;s<l.borders.length;s++)r.dest_sub_ids.push(l.borders[s].id);this.recordStepMeta(r,false)}},drawRuler:function(e,t){var o,r;o=new JXG.Coords(JXG.COORDS_BY_USER,[e[0],e[1]],GUI.board);o=new JXG.Coords(JXG.COORDS_BY_SCREEN,[o.scrCoords[1]+62,o.scrCoords[2]],GUI.board);r=[o.usrCoords[1],e[1]];this.recordStepMeta({type:JXG.GENTYPE_RULER,args:{p1:e,p2:r,label:t},src_ids:[],dest_sub_ids:[JXG.SketchReader.id(),JXG.SketchReader.id()],dest_id:JXG.SketchReader.id()},true)},drawRegularPolygon:function(e){var t,o={type:JXG.GENTYPE_REGULARPOLYGON,args:{corners:JXG.Options.lastRegPolCorners},dest_sub_ids:[],src_ids:[e[0].id,e[1].id]};for(t=0;t<JXG.Options.lastRegPolCorners;t++)o.dest_sub_ids.push(JXG.SketchReader.id());for(t=0;t<JXG.Options.lastRegPolCorners-2;t++)o.dest_sub_ids.push(JXG.SketchReader.id());o.dest_id=JXG.SketchReader.id();this.recordStepMeta(o,true)},drawCircleSector:function(e){this.recordStepMeta({type:JXG.GENTYPE_SECTOR,src_ids:e,dest_sub_ids:[],dest_id:JXG.SketchReader.id()},true)},drawAngleSector:function(e){var t=JXG.SketchReader.id(),o=JXG.SketchReader.id(),r=JXG.SketchReader.id(),s=JXG.SketchReader.id();this.recordStepMeta({type:JXG.GENTYPE_ANGLE,src_ids:e,dest_sub_ids:[t,o,r],dest_id:s},true)},drawSlider:function(e){this.recordStepMeta({type:JXG.GENTYPE_SLIDER,dest_sub_ids:[JXG.SketchReader.id(),JXG.SketchReader.id(),JXG.SketchReader.id(),JXG.SketchReader.id(),JXG.SketchReader.id()],dest_id:JXG.SketchReader.id(),args:{x1:e[0].usrCoords[1],y1:e[0].usrCoords[2],x2:e[0].usrCoords[1]+3,y2:e[0].usrCoords[2],start:JXG.Options.lastSliderStart,ini:JXG.Options.lastSliderIni,end:JXG.Options.lastSliderEnd}},true)},drawText:function(e,t,o){var r=JXG.SketchReader.id();if(typeof t=="undefined")t="'Text'";if(typeof o=="undefined")o=[];this.recordStepMeta({type:JXG.GENTYPE_TEXT,src_ids:o,dest_sub_ids:[],dest_id:r,args:{x:e.usrCoords[1],y:e.usrCoords[2],str:t}},true);return r}}});var GUI=GUI||{};JXG.extend(GUI,{Options:{finderEnabled:false,multiConstructEnabled:false},appId:"jsxgui",appName:"Sketchometry",version:"0.4.5",debug:false,langId:0,offline:false,ctxPosHide:126,ctxPosDelete:62,ctxPosProps:2,highlightSize:18,highlightColor:"#000000",plotColors:["black","red","blue","green","yellow","brown"],plotColor:0,zoomLevel:0,opacityHidden:.2,strokeHidden:2,incrementValue:10,rayFactor:128,context_time_limit:1800,finder_time_limit:2e3,init:{boundingbox:[-10,10,10,-10],keepaspectratio:false,zoom:{wheel:false},axis:false,grid:false,showNavigation:false,showCopyright:false,showInfobox:false,registerEvents:false},action:"standard",transition:"flip",axisVisible:false,gridVisible:false,snapToGrid:false,snapToPoints:false,didToolbarScroll:false,navZoomVisible:false,board:null,firstInit:true,firstResize:true,down_event:"",up_event:"",move_event:"",out_event:"",over_event:"",click_event:"",tap_event:"",toolType:[],toolFunc:{},transformation:{},navHandlersRegistered:false,showBlured:false,mouseDown:false,showHidden:false,mode:null,constModeSwitch:true,modeBeforeConstSwitch:null,modeBeforeToolSwitch:null,modeBeforeGallerySwitch:null,draftcurve:[],shadowCopyStep:"",intersect_obj:[],select_obj:[],highlightedObjs:[],highlightedObjsAblate:{},mirrorCenterId:0,rectSelect:[],selection:[],id_cnt:1,unredo:-1,intervalTimer:0,ctx_down_coords:null,ctx_curr_coords:null,ctx_timer:0,step_log:[],step_del_exclude:[],restore_state:[],dialog:{transform:null,pol:null,slider:null,sect:null,navzoom:null,confirm:null},lastFxInput:"",lastCopyPos:{},dialogLastPos:{navzoom:[600,105]},boardText:null,nd_recognizer:new NDollarRecognizer(false),nd_mstrokestr:"",id:function(){return"GUI"+GUI.id_cnt++ +""},recordStep:function(e,t,o,r){var s,i;if(GUI.unredo>=0&&JXG.Draw.areEqualObjects(GUI.step_log[GUI.unredo],e))return false;if(typeof r=="undefined")r=false;GUI.step_log.splice(GUI.unredo+1,GUI.step_log.length-(GUI.unredo+1));for(s=0;s<GUI.restore_state.length;s++)if(GUI.restore_state[s].step>GUI.unredo)break;GUI.restore_state.splice(s);GUI.unredo=GUI.step_log.length-1;if(e.type>50)i=GUI.generateJCode(e,GUI.board);else i=JXG.SketchReader.generateJCode(e,GUI.board,GUI.step_log);if(i[0]==""&&i[1]==""){return false}GUI.triggerEventHandlers(["step"],[e,i[0]]);if(t){if(e.type==JXG.GENTYPE_JCODE)GUI.executeJCode(i,false,r);else GUI.executeJCode(i,true,r)}else GUI.greenLog(i[0]);GUI.step_log.push(e);GUI.unredo++;if(e.type===JXG.GENTYPE_DELETE){for(s=0;s<e.args.steps.length;s++){GUI.step_del_exclude.push(e.args.steps[s])}}if(GUI.unredo>1&&GUI.step_log[GUI.unredo].type!==JXG.GENTYPE_JCODE){GUI.enableUndo(true)}else{GUI.enableUndo(false)}GUI.enableRedo(false);GUI.enableMakeSnapshot(false);GUI.enablePrevSnapshot(GUI.restore_state.length>0);GUI.enableNextSnapshot(false);GUI.contextUpdate();if(GUI.currentConstruction&&!o){GUI.saveConstruction(GUI.currentConstruction,true)}return true},initSketchBoard:function(e){GUI.board=JXG.JSXGraph.initBoard(e,GUI.init);if(GUI.Settings.get("cursor")){GUI.board.renderer.createTouchpoints(2);GUI.board.renderer.showTouchpoint(0)}if(GUI.firstInit){if(JXG.supportsPointerEvents()){GUI.down_event="MSPointerDown";GUI.up_event="MSPointerUp";GUI.move_event="MSPointerMove";GUI.out_event="MSPointerOut";GUI.over_event="MSPointerOver";GUI.click_event="MSPointerUp";GUI.tap_event="MSPointerDown";JXG.Options.device="msie"}else if(JXG.isTouchDevice()){GUI.down_event="touchstart";GUI.up_event="touchend";GUI.move_event="touchmove";GUI.out_event="touchleave";GUI.over_event="touchenter";GUI.click_event="touchend";GUI.tap_event="touchstart";JXG.Options.device="tablet"}else{GUI.down_event="mousedown";GUI.up_event="mouseup";GUI.move_event="mousemove";GUI.out_event="mouseout";GUI.over_event="mouseover";GUI.click_event="click";GUI.tap_event="click";JXG.Options.device="pc"}GUI.initControls();GUI.switchToolbarPos(GUI.Settings.get("layouttop"));GUI.enableConstDragMode();$("div").disableSelection();$("[id^=key-]").disableSelection();GUI.navZoomHtml=$("#property-navigation").html();$("#property-navigation").html("");if(JXG.Options.device!="tablet")$("#toolbar-overflow").css("height",200);if(JXG.Options.device=="pc"){GUI.getId("point-size-field").setAttribute("type","text");GUI.getId("color-field").setAttribute("type","text");GUI.getId("image-size-field").setAttribute("type","text")}else if(JXG.Options.device=="tablet")$("#inputWindow").addClass("not-displayed");else{JXG.addEvent(GUI.getId("mainWindow"),"selectstart",function(e){if(e&&e.preventDefault)e.preventDefault()},GUI);JXG.addEvent(GUI.getId("mainWindow"),"contextmenu",function(e){if(e&&e.preventDefault)e.preventDefault()},GUI);JXG.addEvent(GUI.getId("mainWindow"),"MSHoldVisual",function(e){if(e&&e.preventDefault)e.preventDefault()},GUI)}GUI.firstInit=false}JXG.Options.elements.snapToPoints=false;JXG.Options.elements.snapToGrid=false},freeBoard:function(){var e="";if(typeof GUI.board!="undefined"&&GUI.board!=null){e=GUI.board.containerObj.id;JXG.JSXGraph.freeBoard(GUI.board);GUI.board=null}return e},newBoard:function(e,t,o){var r;GUI.id_cnt=1;GUI.unredo=-1;GUI.step_log=[];GUI.step_del_exclude=[];GUI.selection=[];GUI.restore_state=[];GUI.transformation={};GUI.axisVisible=false;GUI.gridVisible=false;GUI.plotColor=0;GUI.showBlured=false;GUI.showHidden=false;GUI.mousedown=false;GUI.initSketchBoard(GUI.freeBoard());if($("#control-boardprop").hasClass("button-selected"))GUI.activateBoardControls();GUI.hideAllActions();GUI.deselectAllToolButtonsAndRemoveActions();if($("#control-tools-box").hasClass("button-selected"))GUI.activateToolControls();$(".info").remove();GUI.removeActionEvent(true);$("#board-axis-visible").removeClass("button-selected");$("#board-axis-visible-box").removeClass("button-selected");GUI.init.boundingbox=GUI.board.getBoundingBox();$("#axis-scale-x").val(1);$("#axis-scale-y").val(1);$("#axis-scale-x").keyup(function(){GUI.scaleAxis()});$("#axis-scale-y").keyup(function(){GUI.scaleAxis()});$("#grid-scale-x").val(1);$("#grid-scale-y").val(1);$("#grid-scale-x").keyup(function(){GUI.scaleGrid(false)});$("#grid-scale-y").keyup(function(){GUI.scaleGrid(true)});GUI.board.options.grid.snapToGrid=false;GUI.board.options.grid.snapToPoints=false;GUI.board.options.point.snapToPoints=false;GUI.board.options.point.attractorDistance=.5;$("#grid-visible").removeClass("button-selected");$("#grid-visible-box").removeClass("button-selected");$("#grid-snap-to-grid").removeClass("button-selected");$("#grid-snap-to-grid-box").removeClass("button-selected");$("#grid-snap-to-point").removeClass("button-selected");$("#grid-snap-to-point-box").removeClass("button-selected");GUI.zoomLevel=0;if(localStorage&&(r=localStorage.getItem("jsxgui:meta:dialogLastPos"))!=null)GUI.dialogLastPos=JSON.parse(r);$("#board-navzoom-box").removeClass("button-selected");$("#board-navzoom").removeClass("button-selected");if(GUI.mode==null){if(GUI.modeBeforeGallerySwitch!=null){GUI.switchMode(GUI.modeBeforeGallerySwitch,true);GUI.modeBeforeGallerySwitch=null}else if(GUI.modeBeforeToolSwitch!=null){GUI.switchMode(GUI.modeBeforeToolSwitch,true);GUI.modeBeforeToolSwitch=null}else GUI.switchMode("CD",true)}GUI.enableConstDragMode();GUI.resizeBoard();GUI.resizeToolbar();GUI.switchHandling(GUI.Settings.get("leftright"));GUI.setLanguage(GUI.Settings.get("language"));GUI.addTooltips();if(e){GUI.recordStep({type:JXG.GENTYPE_AXIS,src_ids:[],dest_sub_ids:["GUIOO","GUIE1","GUIE2","GUIx","GUIy"],args:{visible:false,coords:[{usrCoords:[1,0,0]},{usrCoords:[1,1,0]},{usrCoords:[1,0,1]}],name:["OO","E1","E2","x","y"],priv:[true,true,true,false,false]}},true,o);GUI.recordStep({type:JXG.GENTYPE_TRUNCATE},true,o)}GUI.enableUndo(false);GUI.enableRedo(false);GUI.enableMakeSnapshot(false);GUI.enablePrevSnapshot(false);GUI.enableNextSnapshot(false);GUI.showBoard(t)},clearBoard:function(){GUI.confirm(GUI.Lang.std.clear_reassure,false,function(){GUI.newBoard(true,false,false)})},resetBoard:function(e){if(typeof e!="undefined")GUI.board.mode=e;else if(GUI.mode=="CD"||GUI.mode=="D")GUI.board.mode=GUI.board.BOARD_MODE_DRAG;else GUI.board.mode=GUI.board.BOARD_MODE_NONE;GUI.board.touches=[];GUI.board.downObjects=[];GUI.board.mouse=[]},indicateScroll:function(e){var t,o;t=parseInt($("#toolbar-overflow").css("width"));o=parseInt($("#toolbar-panel").css("width"));if(o>t){if(e==0)$(".triangle-left").addClass("hidden");else $(".triangle-left").removeClass("hidden");console.log("to "+e);console.log("tp "+(o-t));if(e==o+1-t||e==o-t)$(".triangle-right").addClass("hidden");else $(".triangle-right").removeClass("hidden")}},resizeToolbar:function(){var e,t,o,r,s,i;o=$("#control-unredo-group").outerWidth();r=$("#control-gallery-group").outerWidth();s=window.innerWidth-(o+r);$("#toolbar-overflow").css("width",s+"px");r=0;e=508;t=872;if(s<=e&&$("#caption-tools").hasClass("not-displayed")){$("#control-actions-group").removeClass("fright")}else if(s>e&&$("#caption-tools").hasClass("not-displayed")||s>t&&!$("#caption-tools").hasClass("not-displayed")){r=Math.max(r,parseInt($("#toolbar-panel").css("min-width"))-s);$("#control-actions-group").addClass("fright")}else $("#control-actions-group").addClass("fright");if($("#caption-tools").hasClass("not-displayed")){o=parseInt($("#toolbar-panel").css("min-width"));i=Math.max(o-r,e)}else{i=t+4}$("#toolbar-panel").css("min-width",i+"px");$("#status-box").css("left",parseInt(($("#mainWindow").width()-$("#status").width())/2));if(i>s){$(".triangle-right").removeClass("hidden");$(".triangle-left").removeClass("hidden")}else{$(".triangle-right").addClass("hidden");$(".triangle-left").addClass("hidden")}},resizeBoard:function(){var e,t,o,r,s,i,n,a,l,d;if(GUI.board==null||typeof GUI.board=="undefined"){return}s=parseInt($("#content").css("padding-left"))+parseInt($("#content").css("padding-right"))+parseInt($("#content").css("border-left-width"))+parseInt($("#content").css("border-right-width"));i=$("#content").outerHeight()-$("#content").height();i+=$("#toolbar").outerHeight();t=window.innerWidth-s;o=window.innerHeight-i;GUI.board.resizeContainer(t,o);n=GUI.board.getBoundingBox();for(e=0;e<n.length;e++){if(isNaN(n[e])){GUI.firstResize=true;break}}if(GUI.firstResize){a=GUI.init.boundingbox[0];l=GUI.init.boundingbox[2]}else{a=n[0];l=n[2];d=n[1]}r=(l-a)*o/t;if(GUI.firstResize){GUI.board.setBoundingBox([a,r/2,l,-r/2],true);GUI.firstResize=false}else{GUI.board.setBoundingBox([a,d,l,d-r],true)}},switchToolbarPos:function(e){if(e=="top"){$("#content").css("top",$("#toolbar").outerHeight());$("#toolbar").css("bottom","");$("#toolbar").css("top","0px");$("#ctxPanel").css("bottom","");$("#ctxPanel").css("top",$("#toolbar").outerHeight());$("#keyboardPanel").css("bottom","");$("#keyboardPanel").css("top",$("#toolbar").outerHeight()+5);$("#status-box").css("bottom","");$("#status-box").css("top",parseInt(($("#toolbar").height()-$("#status").outerHeight())/2))}else{$("#content").css("top","0px");$("#toolbar").css("top","");$("#toolbar").css("bottom","0px");GUI.contextPanelReposition();$("#keyboardPanel").css("top","");$("#keyboardPanel").css("bottom",$("#toolbar").outerHeight()+5);$("#status-box").css("top","");$("#status-box").css("bottom",parseInt(($("#toolbar").height()-$("#status").outerHeight())/2))}},switchHandling:function(e){var t;if(!$("#ctxPanel").hasClass("not-displayed"))t=$("#ctxPanel").outerWidth();else t=0;$("#content").css("margin-left","");$("#content").css("margin-right","");$("#ctxPanel").css("left","");$("#ctxPanel").css("right","");$("#keyboardPanel").css("left","");$("#keyboardPanel").css("right","");if(e=="left"){$("#content").css("margin-left",t);$("#kb-input-panel").removeClass("fright");$("#kb-input-panel").addClass("fleft");$("#keyboardPanel").css("right","10px");$("#control-undo-box").addClass("hmirrored");$("#control-redo-box").addClass("hmirrored");$("#control-drag-box").addClass("hmirrored");$("#control-construct-box").addClass("hmirrored");$("#control-actions-function-box").addClass("hmirrored");$("#control-tools-box").addClass("hmirrored");$("#caption-tools > .tools").addClass("hmirrored");$("#control-actions-hide-box").addClass("hmirrored");$("#control-actions-del-box").addClass("hmirrored");$("#control-boardprop-box").addClass("hmirrored");$("#control-gallery-box").addClass("hmirrored");$("#tool-exe").addClass("hmirrored");$("#toolbar").addClass("hmirrored")}else if(e=="right"){$("#content").css("margin-right",t);$("#kb-input-panel").removeClass("fleft");$("#kb-input-panel").addClass("fright");$("#keyboardPanel").css("left","10px");$("#control-undo-box").removeClass("hmirrored");$("#control-redo-box").removeClass("hmirrored");$("#control-drag-box").removeClass("hmirrored");$("#control-construct-box").removeClass("hmirrored");$("#control-actions-function-box").removeClass("hmirrored");$("#control-tools-box").removeClass("hmirrored");$("#caption-tools > .tools").removeClass("hmirrored");$("#control-actions-hide-box").removeClass("hmirrored");$("#control-actions-del-box").removeClass("hmirrored");$("#control-boardprop-box").removeClass("hmirrored");$("#control-gallery-box").removeClass("hmirrored");$("#tool-exe").removeClass("hmirrored");$("#toolbar").removeClass("hmirrored")}},switchMode:function(e,t){var o,r,s,i,n=GUI.mode;if(GUI.mode=="C"){GUI.removeNavHandlers();GUI.removeConstructEvents()}else if(GUI.mode=="CD"){GUI.removeConstructHooks();GUI.removeBoardHandlers()}else if(GUI.mode=="D"){GUI.removeBoardHandlers()}o=$("#control-construct");s=$("#control-construct-box");r=$("#control-drag");i=$("#control-drag-box");if(e==null){if(GUI.board){GUI.board.mode=GUI.board.BOARD_MODE_NONE;GUI.deleteDraftcurves()}}if(e===-1){if(o.hasClass("button-selected")&&r.hasClass("button-selected")){GUI.mode="CD"}else if(o.hasClass("button-selected")){GUI.mode="C"}else if(r.hasClass("button-selected")){GUI.mode="D"}else GUI.mode=null}else GUI.mode=e;if(e!=-1&&t){o.removeClass("button-selected");s.removeClass("button-selected");r.removeClass("button-selected");i.removeClass("button-selected")}if(GUI.mode=="D"){GUI.addBoardHandlers();if(e!=-1&&t){r.addClass("button-selected");i.addClass("button-selected")}}else if(GUI.mode=="C"){GUI.addConstructEvents();GUI.addNavHandlers();if(e!=-1&&t){o.addClass("button-selected");s.addClass("button-selected")}}else if(GUI.mode=="CD"){GUI.addBoardHandlers();GUI.addConstructHooks();if(e!=-1&&t){o.addClass("button-selected");s.addClass("button-selected");r.addClass("button-selected");i.addClass("button-selected")}}console.log("old mode: "+n+", new mode: "+GUI.mode)},showHiddenUnRedoUpdate:function(e){var t,o,r;if(GUI.showHidden){if(e.type==JXG.GENTYPE_DELETE){for(o=0;o<e.args.steps.length;o++){r=GUI.step_log[e.args.steps[o]];for(t=0;t<r.src_ids.length;t++)if(GUI.board.objects[r.src_ids[t]])GUI.showHiddenObject(GUI.board.objects[r.src_ids[t]])}}else if(e.type==JXG.GENTYPE_CTX_VISIBILITY){for(t=0;t<e.src_ids.length;t++)if(GUI.board.objects[e.src_ids[t]])GUI.showHiddenObject(GUI.board.objects[e.src_ids[t]])}}},undo:function(){var e,t,o;while(GUI.unredo>1&&GUI.step_log[GUI.unredo].type!=JXG.GENTYPE_JCODE){t=GUI.step_log[GUI.unredo];while(t.type==0&&GUI.unredo>=1){GUI.unredo--;t=GUI.step_log[GUI.unredo]}if(GUI.unredo<1)break;if(t.type==JXG.GENTYPE_DELETE){for(e=0;e<t.args.steps.length;e++)JXG.removeElementFromArray(GUI.step_del_exclude,t.args.steps[e])}if(t.type>50)o=GUI.generateJCode(t,GUI.board);else o=JXG.SketchReader.generateJCode(t,GUI.board,GUI.step_log);if(o[2]!==""){try{GUI.revertJCode(o,true)}catch(r){console.log(r);console.log("error executing revert for step "+GUI.unredo)}GUI.contextUpdate();GUI.enableRedo(true);GUI.unredo--}else{var s,i,n,a;s=GUI.id_cnt;a=GUI.step_log;n=GUI.restore_state;i=GUI.unredo;GUI.newBoard(false,false,true);GUI.id_cnt=s;GUI.step_log=a;GUI.restore_state=n;GUI.unredo=1;if(GUI.step_log[GUI.unredo].type>50)o=GUI.generateJCode(GUI.step_log[GUI.unredo],GUI.board);else o=JXG.SketchReader.generateJCode(GUI.step_log[GUI.unredo],GUI.board,GUI.step_log);try{GUI.executeJCode(o,true)}catch(r){console.log(r);console.log("error executing step "+GUI.unredo+"(general undo)")}while(GUI.unredo!=i-1)GUI.redo()}break}GUI.showHiddenUnRedoUpdate(t);if(GUI.unredo<=1||GUI.step_log[GUI.unredo].type==JXG.GENTYPE_JCODE)GUI.enableUndo(false);GUI.updateSnapshotControls();GUI.board.update()},redo:function(){var e,t,o;while(!(GUI.unredo==GUI.step_log.length-1)){GUI.unredo++;t=GUI.step_log[GUI.unredo];while(t.type==0&&!(GUI.unredo==GUI.step_log.length-1)){GUI.unredo++;t=GUI.step_log[GUI.unredo]}if(t.type==JXG.GENTYPE_DELETE){for(e=0;e<t.dest_sub_ids.length;e++){if(GUI.contextShowsProps()==t.dest_sub_ids[e]){GUI.contextEdit(0);break}}for(e=0;e<t.args.steps.length;e++)GUI.step_del_exclude.push(t.args.steps[e])}if(t.type!=0){if(t.type>50)o=GUI.generateJCode(t,GUI.board);else o=JXG.SketchReader.generateJCode(t,GUI.board,GUI.step_log);try{GUI.executeJCode(o,true)}catch(r){console.log(r);console.log("error executing step "+GUI.unredo+"(redo)")}GUI.contextUpdate()}GUI.showHiddenUnRedoUpdate(t);if(GUI.unredo>1&&GUI.step_log[GUI.unredo].type!=JXG.SketchReader.GENTYPE_JCODE)GUI.enableUndo(true);else GUI.enableUndo(false);break}if(GUI.unredo==GUI.step_log.length-1)GUI.enableRedo(false);GUI.updateSnapshotControls();GUI.board.update()},enableUndo:function(e){if(e){$("#control-undo-box").removeClass("button-disabled")}else{$("#control-undo-box").addClass("button-disabled")}},enableRedo:function(e){if(e){$("#control-redo-box").removeClass("button-disabled")}else{$("#control-redo-box").addClass("button-disabled")}},enableMakeSnapshot:function(e){if(e){$("#btn_togglemark").css("border-top","solid 1px yellow");$("#btn_togglemark").css("border-bottom","solid 1px yellow")}else{$("#btn_togglemark").css("border-top","solid 1px black");$("#btn_togglemark").css("border-bottom","solid 1px black")}},enablePrevSnapshot:function(e){if(e){$("#btn_prevmark").css("border-top","solid 1px yellow");$("#btn_prevmark").css("border-bottom","solid 1px yellow")}else{$("#btn_prevmark").css("border-top","solid 1px black");$("#btn_prevmark").css("border-bottom","solid 1px black")}},enableNextSnapshot:function(e){if(e){$("#btn_nextmark").css("border-top","solid 1px yellow");$("#btn_nextmark").css("border-bottom","solid 1px yellow")}else{$("#btn_nextmark").css("border-top","solid 1px black");$("#btn_nextmark").css("border-bottom","solid 1px black")}},showBoard:function(e){GUI.board.moveOrigin(GUI.board.canvasWidth/2,GUI.board.canvasHeight/2);if(typeof e=="undefined"||!e)$("div#mainWindow").removeClass("hidden")},showStatusPanel:function(e,t,o){GUI.boardText='<div id="statusTextBox" class="center inline">'+e+"</div>";$("#menu").addClass("not-displayed");$("#tool-exe").html(GUI.boardText);$("#tool-stage").removeClass("not-displayed");if(typeof o=="function"){$("#tool-exe").bind(GUI.click_event,function(){GUI.hideStatusPanel(o)})}$("#statusTextBox").unbind();$("#statusTextBox").bind(GUI.click_event,function(e){e.preventDefault();e.stopPropagation()});if(t)window.setTimeout(GUI.hideStatusPanel,t)},hideToolStage:function(e){if(typeof e=="function")e();$("#tool-stage").addClass("not-displayed");$("#menu").removeClass("not-displayed");if(document.activeElement&&document.activeElement.blur&&document.activeElement.tagName.toString().toLowerCase()!="body"){document.activeElement.blur()}GUI.resizeToolbar()},hideStatusPanel:function(e){if(GUI.boardText!=null){$("#tool-exe").children().unbind();$("#tool-exe").unbind();GUI.boardText=null;if(JXG.Options.device=="msie")window.setTimeout(function(){GUI.hideToolStage(e)},100);else GUI.hideToolStage(e)}},showPanel:function(e,t){var o=GUI.Settings.get("leftright").toLowerCase();if(e){$("#ctxPanel").css(o,t+"px");$("#ctxPanel").removeClass("not-displayed")}else{$("#ctxProps").addClass("not-displayed");$("#ctxObjects").addClass("not-displayed");$("#ctxObjectsExtra").addClass("not-displayed");$("#ctxPanel").addClass("not-displayed");GUI.Kbd.hideKeyboardPanel();if(JXG.Options.device!="msie")document.activeElement.blur()}$("#control-boardprop").removeClass("button-selected");$("#control-boardprop-box").removeClass("button-selected")},showPropertyPanel:function(e,t){if(e=="board"){$("#ctxProps").addClass("not-displayed");$("#ctxBoard").removeClass("not-displayed");$("#ctxObjectsExtra").addClass("not-displayed");$("#ctxObjects").addClass("not-displayed")}else if(e=="props"){$("#ctxProps").removeClass("not-displayed");$("#ctxBoard").addClass("not-displayed");$("#ctxObjectsExtra").addClass("not-displayed");$("#ctxObjects").addClass("not-displayed")}else{$("#ctxProps").addClass("not-displayed");$("#ctxBoard").addClass("not-displayed");if(t)$("#ctxObjectsExtra").removeClass("not-displayed");else $("#ctxObjectsExtra").addClass("not-displayed");$("#ctxObjects").removeClass("not-displayed")}},showObjectsBlured:function(e){var t,o=GUI.board.objects;if(!GUI.showBlured){if(!e)return;GUI.board.suspendUpdate();for(t in o)if(o.hasOwnProperty(t)){if(!GUI.isStandardObj(o[t]))continue;if(typeof o[t].guiVisProp=="undefined")o[t].guiVisProp={};o[t].guiVisProp.fillOpacity=o[t].getAttribute("fillOpacity");o[t].guiVisProp.strokeOpacity=o[t].getAttribute("strokeOpacity");if(!o[t].guiVisProp.visible){o[t].setAttribute({fillOpacity:o[t].guiVisProp.fillOpacity/4});o[t].setAttribute({strokeOpacity:o[t].guiVisProp.strokeOpacity/4})}}}else{if(e)return;GUI.board.suspendUpdate();for(t in o){if(o.hasOwnProperty(t)){if(!GUI.isStandardObj(o[t]))continue;if(o[t].guiVisProp){o[t].setAttribute({fillOpacity:o[t].guiVisProp.fillOpacity});o[t].setAttribute({strokeOpacity:o[t].guiVisProp.strokeOpacity})}}}}GUI.board.unsuspendUpdate();GUI.showBlured=!GUI.showBlured},showHiddenObject:function(e){if(!GUI.isStandardObj(e)||e.type==JXG.OBJECT_TYPE_AXIS||e.type==JXG.OBJECT_TYPE_GRID)return;if(!e.guiVisProp){e.guiVisProp={};e.guiVisProp.fillOpacity=e.getAttribute("fillOpacity");e.guiVisProp.strokeOpacity=e.getAttribute("strokeOpacity");e.guiVisProp.strokewidth=e.getAttribute("strokewidth")}e.guiVisProp.visible=e.getAttribute("visible");if(!GUI.isStandardObj(e)||e.type==JXG.OBJECT_TYPE_AXIS||e.type==JXG.OBJECT_TYPE_GRID)return;if(!e.guiVisProp.visible){e.setAttribute({visible:true});e.setAttribute({fillOpacity:GUI.opacityHidden});e.setAttribute({strokeOpacity:GUI.opacityHidden})}else{e.setAttribute({fillOpacity:e.guiVisProp.fillOpacity});e.setAttribute({strokeOpacity:e.guiVisProp.strokeOpacity})}if(e.guiVisProp.strokewidth==0)e.setAttribute({strokewidth:GUI.strokeHidden});if(e.type==JXG.OBJECT_TYPE_POLYGON)e.visProp.hasinnerpoints=true},showHiddenObjects:function(){var e,t=GUI.board.objects;GUI.board.suspendUpdate();if(!GUI.showHidden){for(e in t)if(t.hasOwnProperty(e))GUI.showHiddenObject(t[e])}else{for(e in t){if(t.hasOwnProperty(e)){if(!GUI.isStandardObj(t[e])||t[e].type==JXG.OBJECT_TYPE_AXIS||t[e].type==JXG.OBJECT_TYPE_GRID)continue;if(t[e].guiVisProp){t[e].setAttribute({visible:t[e].guiVisProp.visible});t[e].setAttribute({fillOpacity:t[e].guiVisProp.fillOpacity});t[e].setAttribute({strokeOpacity:t[e].guiVisProp.strokeOpacity});t[e].setAttribute({strokewidth:t[e].guiVisProp.strokewidth});delete t[e].guiVisProp}if(t[e].type==JXG.OBJECT_TYPE_POLYGON)t[e].visProp.hasinnerpoints=false}}}GUI.board.unsuspendUpdate();GUI.showHidden=!GUI.showHidden},toggleConstruct:function(){if($("#control-construct").hasClass("button-selected")){$("#control-construct").removeClass("button-selected");$("#control-construct-box").removeClass("button-selected")}else{$("#control-construct").addClass("button-selected");$("#control-construct-box").addClass("button-selected")}console.log("-- const toggled --");GUI.switchMode(-1,true)},toggleDrag:function(){if($("#control-drag").hasClass("button-selected")){$("#control-drag").removeClass("button-selected");$("#control-drag-box").removeClass("button-selected")}else{$("#control-drag").addClass("button-selected");$("#control-drag-box").addClass("button-selected")}console.log("-- drag toggled --");GUI.switchMode(-1,true)},scaleAxis:function(){GUI.firstResize=true;GUI.resizeBoard();var e=GUI.board.getBoundingBox();e[0]*=Math.max(GUI.getId("axis-scale-x").value,JXG.Options.precision.epsilon);e[1]*=Math.max(GUI.getId("axis-scale-y").value,JXG.Options.precision.epsilon);e[2]*=Math.max(GUI.getId("axis-scale-x").value,JXG.Options.precision.epsilon);e[3]*=Math.max(GUI.getId("axis-scale-y").value,JXG.Options.precision.epsilon);GUI.board.setBoundingBox(e);GUI.firstResize=false},scaleGrid:function(e){var t,o;if(e){t=GUI.getId("grid-scale-y").value;o=Math.max(1,t);if(t!=o)$("#grid-scale-y").val(o);GUI.board.objects["GUIy"].defaultTicks.setAttribute({scale:o})}else{t=GUI.getId("grid-scale-x").value;o=Math.max(1,t);if(t!=o)$("#grid-scale-x").val(o);GUI.board.objects["GUIx"].defaultTicks.setAttribute({scale:o})}},toggleAxis:function(){if(GUI.axisVisible){GUI.board.objects["GUIx"].setAttribute({visible:false});GUI.board.objects["GUIy"].setAttribute({visible:false});GUI.getId("axis-scale-x").disabled="disabled";GUI.getId("axis-scale-y").disabled="disabled";$("#board-axis-visible").removeClass("button-selected");$("#board-axis-visible-box").removeClass("button-selected");if(GUI.gridVisible){GUI.gridVisible=false;GUI.toggleGrid()}}else{GUI.board.objects["GUIx"].setAttribute({visible:true});GUI.board.objects["GUIx"].defaultTicks.setAttribute({drawLabels:true,withlabel:true});GUI.board.objects["GUIy"].setAttribute({visible:true});GUI.board.objects["GUIy"].defaultTicks.setAttribute({drawLabels:true,withlabel:true});GUI.getId("axis-scale-x").removeAttribute("disabled");GUI.getId("axis-scale-y").removeAttribute("disabled");$("#board-axis-visible").addClass("button-selected");$("#board-axis-visible-box").addClass("button-selected")}GUI.axisVisible=!GUI.axisVisible},toggleGrid:function(){if(GUI.gridVisible){if(GUI.board.objects["GUIx"].visProp.visible)GUI.board.objects["GUIx"].defaultTicks.setAttribute({minorHeight:0,majorHeight:10,insertTicks:true});else GUI.board.objects["GUIx"].defaultTicks.setAttribute({minorHeight:0,majorHeight:1,insertTicks:true});if(GUI.board.objects["GUIy"].visProp.visible)GUI.board.objects["GUIy"].defaultTicks.setAttribute({minorHeight:0,majorHeight:10,insertTicks:true});else GUI.board.objects["GUIy"].defaultTicks.setAttribute({minorHeight:0,majorHeight:1,insertTicks:true});GUI.getId("grid-scale-x").disabled="disabled";GUI.getId("grid-scale-y").disabled="disabled";$("#grid-visible").removeClass("button-selected");$("#grid-visible-box").removeClass("button-selected")}else{GUI.board.objects["GUIx"].defaultTicks.setAttribute({ticksDistance:1,insertTicks:false,majorHeight:-1,minorHeight:0,scale:1,visible:true,drawLabels:GUI.board.objects["GUIx"].visProp.visible});GUI.board.objects["GUIy"].defaultTicks.setAttribute({ticksDistance:1,insertTicks:false,majorHeight:-1,minorHeight:0,scale:1,visible:true,drawLabels:GUI.board.objects["GUIy"].visProp.visible});GUI.getId("grid-scale-x").removeAttribute("disabled");GUI.getId("grid-scale-y").removeAttribute("disabled");$("#grid-visible").addClass("button-selected");$("#grid-visible-box").addClass("button-selected")}GUI.gridVisible=!GUI.gridVisible},toggleSnapToGrid:function(){var e,t=JXG.Options.elements.snapToGrid;for(e in GUI.board.objects)if(GUI.board.objects[e].visProp.priv==false&&GUI.board.objects[e].type!=JXG.OBJECT_TYPE_GLIDER)GUI.board.objects[e].visProp.snaptogrid=!t;if(t){$("#grid-snap-to-grid").removeClass("button-selected");$("#grid-snap-to-grid-box").removeClass("button-selected")}else{$("#grid-snap-to-grid").addClass("button-selected");$("#grid-snap-to-grid-box").addClass("button-selected")}JXG.Options.elements.snapToGrid=!JXG.Options.elements.snapToGrid},toggleSnapToPoint:function(){var e,t=JXG.Options.elements.snapToPoints;for(e in GUI.board.objects){if(GUI.board.objects[e].visProp.priv==false&&GUI.board.objects[e].elementClass==JXG.OBJECT_CLASS_POINT)GUI.board.objects[e].visProp.snaptopoints=!t}if(t){$("#grid-snap-to-point").removeClass("button-selected");$("#grid-snap-to-point-box").removeClass("button-selected")}else{$("#grid-snap-to-point").addClass("button-selected");$("#grid-snap-to-point-box").addClass("button-selected")}JXG.Options.elements.snapToPoints=!JXG.Options.elements.snapToPoints},updateNdollarStr:function(e){GUI.nd_mstrokestr="";GUI.nd_mstrokestr+="{ name: 'XYZ', nbr: 1, data: new Array(\n new Array(";for(var t=0;t<e.length;t++){GUI.nd_mstrokestr+="["+e[t].scrCoords[1]+","+e[t].scrCoords[2]+"]";if(t<e.length-1)GUI.nd_mstrokestr+=","}GUI.nd_mstrokestr+=")\n) };"},updateSnapshotControls:function(){GUI.enableMakeSnapshot(false);GUI.enablePrevSnapshot(false);GUI.enableNextSnapshot(false);for(var e=0;e<GUI.restore_state.length;e++){if(GUI.unredo==GUI.restore_state[e].step)GUI.enableMakeSnapshot(true);if(GUI.unredo>GUI.restore_state[e].step)GUI.enablePrevSnapshot(true);if(GUI.unredo<GUI.restore_state[e].step)GUI.enableNextSnapshot(true)}},watchGallery:function(){if(typeof GUI.currentConstruction==="undefined")GUI.currentConstruction=GUI.Gallery.createStorageItem(GUI.Lang.std.untitled+"-"+(GUI.fileCounter+1));GUI.saveConstruction(GUI.currentConstruction,false);$("div#mainWindow").addClass("hidden");var e=GUI.navZoomVisible;for(var t in GUI.dialog)if(GUI.dialog.hasOwnProperty(t))if(GUI.dialog[t]!=null)GUI.dialog[t].removeDialog();GUI.navZoomVisible=e;GUI.modeBeforeGallerySwitch=GUI.mode;GUI.switchMode(null,true);GUI.Gallery.switchGallery()},deactivatePropToolAction:function(){if($("#control-boardprop").hasClass("button-selected"))GUI.activateBoardControls();
+GUI.deselectAllToolButtonsAndRemoveActions();if(GUI.action!="standard")GUI[GUI.action+"Action"]()},activateToolControls:function(){if(!$("#control-tools").hasClass("button-selected")){if(GUI.action!="standard")GUI[GUI.action+"Action"]();$("#control-tools").addClass("button-selected");$("#control-tools-box").addClass("button-selected");$("#caption-tools").removeClass("not-displayed")}else{$("#control-tools").removeClass("button-selected");$("#control-tools-box").removeClass("button-selected");$("#caption-tools").addClass("not-displayed");if(!$("#keyboardPanel").hasClass("not-displayed")){$("#keyboardPanel").addClass("not-displayed")}GUI.deselectAllToolButtonsAndRemoveActions()}GUI.resizeToolbar()},activateActionControls:function(){if(!$("#control-actions").hasClass("button-selected")){$("#control-actions").addClass("button-selected");$("#caption-actions").removeClass("not-displayed")}else{$("#control-actions").removeClass("button-selected");$("#caption-actions").addClass("not-displayed");if(GUI.dialog["transform"]!=null)GUI.dialog["transform"].removeDialog();GUI.removeActionEvent(true)}},activateBoardControls:function(){if(!$("#control-boardprop").hasClass("button-selected")){if(GUI.action!="standard")GUI.removeActionEvent(true);GUI.deselectAllToolButtonsAndRemoveActions();GUI.showPropertyPanel("board",false);GUI.showPanel(true,GUI.ctxPosProps);$("#control-boardprop").addClass("button-selected");$("#control-boardprop-box").addClass("button-selected");GUI.showStatusPanel(GUI.Lang.std.prop_instruct,0,function(){GUI.deselectAllToolButtonsAndRemoveActions();GUI.showPanel(false,0)});GUI.addToolEvent(GUI.down_event,GUI.callOnClick,GUI.contextMenu)}else{$("#control-boardprop").removeClass("button-selected");$("#control-boardprop-box").removeClass("button-selected");GUI.removeActionEvent(true)}},activateConstDragMode:function(){if(!$("#control-mode").hasClass("button-selected")){GUI.deactivatePropToolAction()}},addTooltips:function(){$("#actions-mirror").attr("title",GUI.Lang.std.mirror_objects);$("#actions-copy").attr("title",GUI.Lang.std.copy_objects);$("#actions-ablate").attr("title",GUI.Lang.std.ablate_objects);$("#actions-transform").attr("title",GUI.Lang.std.transform_objects);$("#angle-button-rightangle-box").attr("title",GUI.Lang.std.right_angle);$("#angle-radius-label").attr("title",GUI.Lang.std.radius);$("#angle-radius-field").attr("title",GUI.Lang.std.radius);$("#angle-related-measure-box").attr("title",GUI.Lang.std.measure);$("#board-axis-visible").attr("title",GUI.Lang.std.axis_visibility);$("#board-clear-all").attr("title",GUI.Lang.std.board_clear_all);$("#board-clear-traces").attr("title",GUI.Lang.std.clear_traces);$("#circle-radius-label").attr("title",GUI.Lang.std.radius);$("#circle-radius").attr("title",GUI.Lang.std.radius);$("#color-field-minus").attr("title",GUI.Lang.std.minus);$("#color-field-plus").attr("title",GUI.Lang.std.plus);$("#image-size-minus").attr("title",GUI.Lang.std.minus);$("#image-size-plus").attr("title",GUI.Lang.std.plus);$("#color-field-label").attr("title",GUI.Lang.std.stroke_width+" / "+GUI.Lang.std.element_opacity+" / "+GUI.Lang.std.text_size);$("#color-field").attr("title",GUI.Lang.std.stroke_width+" / "+GUI.Lang.std.element_opacity+" / "+GUI.Lang.std.text_size);$("#color-box").attr("title",GUI.Lang.std.colors);$("#color-tab-stroke").attr("title",GUI.Lang.std.stroke_settings);$("#color-tab-fill").attr("title",GUI.Lang.std.fill_settings);$("#color-tab-label").attr("title",GUI.Lang.std.label_settings);$("#control-undo-box").attr("title",GUI.Lang.std.control_undo);$("#control-redo-box").attr("title",GUI.Lang.std.control_redo);$("#control-drag-box").attr("title",GUI.Lang.std.drag_mode);$("#control-construct-box").attr("title",GUI.Lang.std.construct_mode);$("#control-tools-box").attr("title",GUI.Lang.std.tools);$("#control-actions-box").attr("title",GUI.Lang.std.actions);$("#control-actions-hide-box").attr("title",GUI.Lang.std.hide_objects);$("#control-actions-del-box").attr("title",GUI.Lang.std.del_objects);$("#control-boardprop-box").attr("title",GUI.Lang.std.navtoolprop);$("#control-gallery-box").attr("title",GUI.Lang.std.gallery);$("#grid-snap-to-grid").attr("title",GUI.Lang.std.snap_to_grid);$("#grid-snap-to-point").attr("title",GUI.Lang.std.snap_to_point);$("#grid-visible-box").attr("title",GUI.Lang.std.grid_visible);$("#textInput").attr("title",GUI.Lang.std.identifier);$("#label-visible").attr("title",GUI.Lang.std.label_visible);$("#line-button-first").attr("title",GUI.Lang.std.line_segment);$("#line-button-last").attr("title",GUI.Lang.std.line_segment);$("#line-button-arrow-first").attr("title",GUI.Lang.std.arrow);$("#line-button-arrow-last").attr("title",GUI.Lang.std.arrow);$("#line-related-measure-box").attr("title",GUI.Lang.std.measure);$("#line-related-midpoint").attr("title",GUI.Lang.std.midpoint);$("#measure-box").attr("title",GUI.Lang.std.measure);$("#nav-up").attr("title",GUI.Lang.std.move_up);$("#nav-down").attr("title",GUI.Lang.std.move_down);$("#nav-left").attr("title",GUI.Lang.std.move_left);$("#nav-right").attr("title",GUI.Lang.std.move_right);$("#nav-center").attr("title",GUI.Lang.std.center);$("#nav-zoom-in").attr("title",GUI.Lang.std.zoom_in);$("#nav-zoom-out").attr("title",GUI.Lang.std.zoom_out);$("#nav-zoom-100").attr("title",GUI.Lang.std.zoom_100);$("#key-curve").attr("title",GUI.Lang.std.graphlist);$("#key-hwr").attr("title",GUI.Lang.std.hwr);$("#key-slide").attr("title",GUI.Lang.std.slidelist);$("#key-left").attr("title",GUI.Lang.std.left);$("#key-shift").attr("title",GUI.Lang.std.shift);$("#key-right").attr("title",GUI.Lang.std.right);$("#key-go").attr("title",GUI.Lang.std.ok_return);$("#key-backspace").attr("title",GUI.Lang.std.backspace);$("#key-clear").attr("title",GUI.Lang.std.delete_all);$("#btn-hwr-recognize").attr("title",GUI.Lang.std.recognize);$("#btn-hwr-clear").attr("title",GUI.Lang.std.clear);$("#point-coord").attr("title",GUI.Lang.std.coords);$("#point-glider-button-glider").attr("title",GUI.Lang.std.glider);$("#point-glider-button-free").attr("title",GUI.Lang.std.freePoint);$("#point-size").attr("title",GUI.Lang.std.element_size);$("#point-size-plus").attr("title",GUI.Lang.std.plus);$("#point-size-minus").attr("title",GUI.Lang.std.minus);$("#point-style").attr("title",GUI.Lang.std.point_face);$("#status-fix-box").attr("title",GUI.Lang.std.status_fix);$("#status-trace-box").attr("title",GUI.Lang.std.trace);$("#sector-related-measure-box").attr("title",GUI.Lang.std.measure);$("#tools-slider").attr("title",GUI.Lang.std.slide);$("#tools-anglesector").attr("title",GUI.Lang.std.angle_sector);$("#tools-circlesector").attr("title",GUI.Lang.std.circle_sector);$("#control-actions-function").attr("title",GUI.Lang.std.function_plot);$("#tools-polygon").attr("title",GUI.Lang.std.poly);$("#tools-regpolygon").attr("title",GUI.Lang.std.regular+" "+GUI.Lang.std.poly);$("#tools-text").attr("title",GUI.Lang.std.text_element);$("#angle-button-right-angle-label").html(GUI.Lang.std.right_angle);$("#angle-radius-field-label").html(GUI.Lang.std.radius);$("#angle-related-measure-label").html(GUI.Lang.std.measure);$("#axis-scale-group-label").html(GUI.Lang.std.axis_scale);$("#grid-scale-group-label").html(GUI.Lang.std.axis_scale);$("#board-axis-visible-label").html(GUI.Lang.std.axis_visibility);$("#board-clear-all-label").html(GUI.Lang.std.board_clear_all);$("#board-clear-traces-label").html(GUI.Lang.std.clear_traces);$("#board-navzoom-label").html(GUI.Lang.std.nav);$("#label-sticky-label").html(GUI.Lang.std.stickyLabel);$("#circle-radius-field-label").html(GUI.Lang.std.radius);$("#control-actions-hide-label").html(GUI.Lang.std.hide);$("#control-actions-measure-label").html(GUI.Lang.std.measure);$("#control-actions-del-label").html(GUI.Lang.std.del);$("#control-boardprop-label").html(GUI.Lang.std.control_boardprop);$("#control-construct-label").html(GUI.Lang.std.control_construct);$("#control-drag-label").html(GUI.Lang.std.control_drag);$("#control-gallery-label").html(GUI.Lang.std.gallery);$("#control-redo-label").html(GUI.Lang.std.control_redo);$("#control-tools-label").html(GUI.Lang.std.control_tools);$("#control-undo-label").html(GUI.Lang.std.control_undo);$("#grid-snap-to-grid-label").html(GUI.Lang.std.grid_snap_to_grid);$("#grid-snap-to-point-label").html(GUI.Lang.std.grid_snap_to_point);$("#grid-visible-label").html(GUI.Lang.std.grid_visible);$("#textInput-label").html(GUI.Lang.identifier);$("#line-button-label").html(GUI.Lang.std.line_button);$("#line-button-arrow-label").html(GUI.Lang.std.arrow);$("#line-related-measure-label").html(GUI.Lang.std.measure);$("#measure-label").html(GUI.Lang.std.measure);$("#btn-hwr-recognize").html(GUI.Lang.std.recognize);$("#btn-hwr-clear").html(GUI.Lang.std.clear);$("#point-coord-label").html(GUI.Lang.std.point_coord);$("#point-size-field-label").html(GUI.Lang.std.element_size);$("#point-style-label").html(GUI.Lang.std.point_style);$("#recognition_line").html(GUI.Lang.std.line);$("#recognition_segment").html(GUI.Lang.std.line_segment);$("#recognition_ray").html(GUI.Lang.std.ray);$("#recognition_midpoint").html(GUI.Lang.std.midpoint);$("#recognition_circle").html(GUI.Lang.std.circle);$("#recognition_circle2points").html(GUI.Lang.std.circle2points);$("#recognition_triangle").html(GUI.Lang.std.triangle);$("#recognition_normal").html(GUI.Lang.std.normal);$("#recognition_reflection").html(GUI.Lang.std.reflect);$("#recognition_tangent").html(GUI.Lang.std.tangent);$("#recognition_parallel").html(GUI.Lang.std.parallel);$("#recognition_polygon").html(GUI.Lang.std.poly);$("#recognition_sector").html(GUI.Lang.std.sect);$("#recognition_bisector").html(GUI.Lang.std.bisector);$("#recognition_quadrilateral").html(GUI.Lang.std.quadrilateral);$("#recognition_perpendicularBisector").html(GUI.Lang.std.perpendicularBisector);$("#sector-related-measure-label").html(GUI.Lang.std.measure);$("#slider-interval-label").html(GUI.Lang.std.valueRange);$("#sliderpoints-label").html(GUI.Lang.std.startEnd);$("#status-fix-label").html(GUI.Lang.std.status_fix);$("#status-trace-label").html(GUI.Lang.std.trace);$("#tools-slider-label").html(GUI.Lang.std.slide);$("#tools-anglesector-label").html(GUI.Lang.std.angle_element);$("#tools-circlesector-label").html(GUI.Lang.std.sect);$("#control-actions-function-label").html(GUI.Lang.std.tools_function);$("#tools-ruler-label").html(GUI.Lang.std.ruler);$("#tools-regpolygon-label").html(GUI.Lang.std.tools_regpolygon);$("#tools-text-label").html(GUI.Lang.std.text_element)},disableConstDragMode:function(){$("#control-mode").addClass("button-disabled");$("#control-drag-box").unbind();$("#control-construct-box").unbind();$("#control-mode").bind(GUI.click_event,function(){if(!GUI.didToolbarScroll)GUI.activateConstDragMode()})},enableConstDragMode:function(){$("#control-mode").removeClass("button-disabled");$("#control-drag-box").bind(GUI.click_event,function(e){if(e&&!e.handled){e.handled=true;if(!GUI.didToolbarScroll)GUI.toggleDrag()}});$("#control-construct-box").bind(GUI.click_event,function(e){if(e&&!e.handled){e.handled=true;if(!GUI.didToolbarScroll)GUI.toggleConstruct()}});$("#control-mode").unbind()},zoom100:function(){while(GUI.zoomLevel<0)$("#nav-zoom-in").trigger(GUI.tap_event);while(GUI.zoomLevel>0)$("#nav-zoom-out").trigger(GUI.tap_event)},zoomIn:function(){if(GUI.zoomLevel>=11)return;GUI.zoomLevel++;GUI.board.zoomIn()},zoomOut:function(){if(GUI.zoomLevel<=-11)return;GUI.zoomLevel--;GUI.board.zoomOut()},initControls:function(){$(document).on("keydown",GUI.keyHandler);JXG.addEvent(document,GUI.up_event,GUI.timerHandler,GUI);JXG.addEvent(GUI.board.containerObj,GUI.move_event,GUI.magMove,GUI);JXG.addEvent(GUI.board.containerObj,GUI.up_event,function(e){window.setTimeout(function(){GUI.magMove(e)},300)},GUI);JXG.addEvent(GUI.getId("toolbar-overflow"),"mousewheel",function(e){var t=GUI.getId("toolbar-overflow");t.scrollLeft-=e.wheelDelta*5;GUI.indicateScroll(t.scrollLeft)},GUI);JXG.addEvent(GUI.getId("toolbar-overflow"),"DOMMouseScroll",function(e){var t=GUI.getId("toolbar-overflow");t.scrollLeft-=e.detail*5;GUI.indicateScroll(t.scrollLeft)},GUI);JXG.addEvent(GUI.getId("toolbar-overflow"),"scroll",function(){GUI.indicateScroll(GUI.getId("toolbar-overflow").scrollLeft)},GUI);if(JXG.Options.device=="tablet"){$("#toolbar").bind(GUI.move_event,function(){GUI.didToolbarScroll=true});$("#toolbar").bind(GUI.up_event,function(){GUI.didToolbarScroll=false})}$("#control-undo-box").bind(GUI.tap_event,GUI.undo);$("#control-redo-box").bind(GUI.tap_event,GUI.redo);$("#control-actions-function-box").bind(GUI.click_event,function(){if(!GUI.didToolbarScroll)GUI.plotAction()});$("#control-tools-box").bind(GUI.click_event,function(){if(!GUI.didToolbarScroll)GUI.activateToolControls()});$("#control-actions-box").bind(GUI.click_event,function(){if(!GUI.didToolbarScroll)GUI.activateActionControls()});$("#actions-ablate").bind(GUI.click_event,function(){if(!GUI.didToolbarScroll)GUI.ablateAction()});$("#actions-transform").bind(GUI.click_event,function(){if(!GUI.didToolbarScroll)GUI.transfAction()});$("#tools-slider-box").bind(GUI.click_event,function(){if(!GUI.didToolbarScroll)GUI.slider()});$("#tools-regpolygon-box").bind(GUI.click_event,function(){if(!GUI.didToolbarScroll)GUI.polygon()});$("#tools-anglesector-box").bind(GUI.click_event,function(){if(!GUI.didToolbarScroll)GUI.sector("angle")});$("#tools-circlesector-box").bind(GUI.click_event,function(){if(!GUI.didToolbarScroll)GUI.sector("circle")});$("#tools-ruler-box").bind(GUI.click_event,function(){if(!GUI.didToolbarScroll)GUI.ruler()});$("#tools-text-box").bind(GUI.click_event,function(){if(!GUI.didToolbarScroll)GUI.text()});$("#control-actions-hide-box").bind(GUI.click_event,function(){if(!GUI.didToolbarScroll)GUI.hideAction()});$("#control-actions-del-box").bind(GUI.click_event,function(){if(!GUI.didToolbarScroll)GUI.delAction()});$("#control-actions-measure-box").bind(GUI.click_event,function(){if(!GUI.didToolbarScroll)GUI.measureAction()});$("#control-boardprop-box").bind(GUI.click_event,function(){if(!GUI.didToolbarScroll)GUI.activateBoardControls()});$("#control-gallery-box").bind(GUI.tap_event,function(){GUI.watchGallery()});$("#grid-visible-box").bind(GUI.tap_event,function(){GUI.toggleGrid()});$("#grid-snap-to-grid-box").bind(GUI.tap_event,function(){GUI.toggleSnapToGrid()});$("#grid-snap-to-point-box").bind(GUI.tap_event,function(){GUI.toggleSnapToPoint()});$("#board-axis-visible-box").on(GUI.tap_event,function(){GUI.toggleAxis()});$("#board-clear-all-box").on(GUI.tap_event,function(){GUI.clearBoard()});$("#board-clear-traces-box").on(GUI.tap_event,function(){GUI.board.clearTraces()});$("#board-navzoom-box").on(GUI.tap_event,function(){if(GUI.dialog["navzoom"]!=null)GUI.dialog["navzoom"].removeDialog();else{new GUI.Dialog("navzoom",GUI.navZoomHtml,"",[0,0],[0,0],0,function(){$("#board-navzoom-box").removeClass("button-selected");$("#board-navzoom").removeClass("button-selected");GUI.navZoomVisible=false});$("#nav-left").bind(GUI.tap_event,function(){GUI.board.clickLeftArrow()});$("#nav-right").bind(GUI.tap_event,function(){GUI.board.clickRightArrow()});$("#nav-up").bind(GUI.tap_event,function(){GUI.board.clickDownArrow()});$("#nav-down").bind(GUI.tap_event,function(){GUI.board.clickUpArrow()});$("#nav-zoom-100").bind(GUI.tap_event,function(){GUI.zoom100()});$("#nav-zoom-in").bind(GUI.tap_event,function(){GUI.zoomIn()});$("#nav-zoom-out").bind(GUI.tap_event,function(){GUI.zoomOut()});$("#nav-center").bind(GUI.tap_event,function(){GUI.board.moveOrigin(GUI.board.canvasWidth/2,GUI.board.canvasHeight/2)});$("#board-navzoom-box").addClass("button-selected");$("#board-navzoom").addClass("button-selected");GUI.navZoomVisible=true}});$("#files").bind("change",function(e){GUI.imageUploadHandler(e)});$("#key-left").bind(GUI.click_event,function(){GUI.Kbd.left()});$("#key-shift").bind(GUI.click_event,function(){GUI.Kbd.shift()});$("#key-right").bind(GUI.click_event,function(){GUI.Kbd.right()});$("#key-backspace").bind(GUI.click_event,function(){GUI.Kbd.deleteLast()});$("#key-clear").bind(GUI.click_event,function(){GUI.Kbd.deleteLast(true)});$("#keyc-a").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("a"))});$("#keyc-b").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("b"))});$("#keyc-c").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("c"))});$("#keyc-d").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("d"))});$("#keyc-e").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("e"))});$("#keyc-f").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("f"))});$("#keyc-g").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("g"))});$("#keyc-h").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("h"))});$("#keyc-i").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("i"))});$("#keyc-j").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("j"))});$("#keyc-k").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("k"))});$("#keyc-l").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("l"))});$("#keyc-m").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("m"))});$("#keyc-n").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("n"))});$("#keyc-o").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("o"))});$("#keyc-p").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("p"))});$("#keyc-q").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("q"))});$("#keyc-r").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("r"))});$("#keyc-s").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("s"))});$("#keyc-t").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("t"))});$("#keyc-u").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("u"))});$("#keyc-v").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("v"))});$("#keyc-w").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("w"))});$("#keyc-x").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("x"))});$("#keyc-y").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("y"))});$("#keyc-z").bind(GUI.click_event,function(){GUI.Kbd.insertString(GUI.Kbd.shiftCase("z"))});$("#key-squote").bind(GUI.click_event,function(){GUI.Kbd.insertString("'")});$("#key-sin").bind(GUI.click_event,function(){GUI.Kbd.insertString("sin(x)")});$("#key-cos").bind(GUI.click_event,function(){GUI.Kbd.insertString("cos(x)")});$("#key-tan").bind(GUI.click_event,function(){GUI.Kbd.insertString("tan(x)")});$("#key-exp").bind(GUI.click_event,function(){GUI.Kbd.insertString("exp(x)")});$("#key-log").bind(GUI.click_event,function(){GUI.Kbd.insertString("log(x)")});$("#key-pow").bind(GUI.click_event,function(){GUI.Kbd.insertString("pow(2,x)")});$("#key-abs").bind(GUI.click_event,function(){GUI.Kbd.insertString("abs(x)")});$("#key-sqrt").bind(GUI.click_event,function(){GUI.Kbd.insertString("sqrt(x)")});$("#key-X").bind(GUI.click_event,function(){GUI.Kbd.insertString("X()")});$("#key-Y").bind(GUI.click_event,function(){GUI.Kbd.insertString("Y()")});$("#key-0").bind(GUI.click_event,function(){GUI.Kbd.insertString("0")});$("#key-1").bind(GUI.click_event,function(){GUI.Kbd.insertString("1")});$("#key-2").bind(GUI.click_event,function(){GUI.Kbd.insertString("2")});$("#key-3").bind(GUI.click_event,function(){GUI.Kbd.insertString("3")});$("#key-4").bind(GUI.click_event,function(){GUI.Kbd.insertString("4")});$("#key-5").bind(GUI.click_event,function(){GUI.Kbd.insertString("5")});$("#key-6").bind(GUI.click_event,function(){GUI.Kbd.insertString("6")});$("#key-7").bind(GUI.click_event,function(){GUI.Kbd.insertString("7")});$("#key-8").bind(GUI.click_event,function(){GUI.Kbd.insertString("8")});$("#key-9").bind(GUI.click_event,function(){GUI.Kbd.insertString("9")});$("#key-inf").bind(GUI.click_event,function(){GUI.Kbd.insertString("INFINITY")});$("#key-pi").bind(GUI.click_event,function(){GUI.Kbd.insertString("PI")});$("#key-eu").bind(GUI.click_event,function(){GUI.Kbd.insertString("EULER")});$("#key-dot").bind(GUI.click_event,function(){GUI.Kbd.insertString(".")});$("#key-comma").bind(GUI.click_event,function(){GUI.Kbd.insertString(",")});$("#key-space").bind(GUI.click_event,function(){GUI.Kbd.insertString(" ")});$("#key-argx").bind(GUI.click_event,function(){GUI.Kbd.insertString("x")});$("#key-div").bind(GUI.click_event,function(){GUI.Kbd.insertString("/")});$("#key-mult").bind(GUI.click_event,function(){GUI.Kbd.insertString("*")});$("#key-circ").bind(GUI.click_event,function(){GUI.Kbd.insertString("^")});$("#key-plus").bind(GUI.click_event,function(){GUI.Kbd.insertString("+")});$("#key-minus").bind(GUI.click_event,function(){GUI.Kbd.insertString("-")});$("#key-percent").bind(GUI.click_event,function(){GUI.Kbd.insertString("%")});$("#key-left-bracket").bind(GUI.click_event,function(){GUI.Kbd.insertString("(")});$("#key-right-bracket").bind(GUI.click_event,function(){GUI.Kbd.insertString(")")});$("#key-left-tbracket").bind(GUI.click_event,function(){GUI.Kbd.insertString("[")});$("#key-right-tbracket").bind(GUI.click_event,function(){GUI.Kbd.insertString("]")});$("#key-left-cbracket").bind(GUI.click_event,function(){GUI.Kbd.insertString("{")});$("#key-right-cbracket").bind(GUI.click_event,function(){GUI.Kbd.insertString("}")});$("#key-int").bind(GUI.click_event,function(){GUI.Kbd.insertString("integrate()")});$("#key-diff").bind(GUI.click_event,function(){GUI.Kbd.insertString("differentiate()")});$("#key-dist").bind(GUI.click_event,function(){GUI.Kbd.insertString("dist()")});$("#key-go").bind(GUI.click_event,function(){GUI.Kbd.close()});$("#key-slide").bind(GUI.click_event,function(){GUI.Kbd.sliderPanel()});$("#key-curve").bind(GUI.click_event,function(){GUI.Kbd.curvePanel()});$("#key-hwr").bind(GUI.click_event,function(){GUI.Kbd.hwrPanel()});$("#btn-hwr-clear").bind(GUI.click_event,function(){GUI.clearStrokes()});$("#btn-hwr-recognize").bind(GUI.click_event,function(){GUI.recognizeHwr();GUI.clearStrokes()});var e=GUI.getId("hwrCanvas"),t=GUI.getId("kb-textbox");JXG.addEvent(e,GUI.down_event,JXGHWR.downEvent,JXGHWR);JXG.addEvent(e,GUI.move_event,JXGHWR.moveEvent,JXGHWR);JXG.addEvent(document,GUI.up_event,JXGHWR.upEvent,JXGHWR);JXGHWR.init(e,t);JXGHWR.loadStrokes();GUI.switchHandling(GUI.Settings.get("leftright"))}});function init_jsx_gui(e){console.log("init_jsx_gui called");if(GUI.firstInit){console.log("first Init");$("body").css("overflow-y","auto");$("#content").css("position","absolute");$("#content").css("top",$("#toolbar").outerHeight());$("#content").css("padding","0px");$("[id^=key-]").css("cursor","default");window.onresize=function(){GUI.resizeToolbar();GUI.resizeBoard()};GUI.detectDefaultLanguage();GUI.Settings.load();GUI.Settings.set("language",GUI.Settings.get("language"));GUI.Settings.set("magnify",GUI.Settings.get("magnify"));GUI.insertStrokes(GUI.nd_recognizer.Multistrokes);GUI.initSketchBoard(e)}GUI.resizeToolbar()}(function(){JXG.SketchReader.generateJCodeMeta=function(){return GUI.generateJCode.apply(GUI,arguments)};JXG.SketchReader.id=function(){return GUI.id()};JXG.Draw.recordStepMeta=function(){return GUI.recordStep.apply(GUI,arguments)};JXG.EventEmitter.eventify(GUI)})();GUI.Lang={};GUI.Lang.Map=[["de","en","fr","es","pt"],["Deutsch","English","Français","Español","Português"]];GUI.Lang.de=0;GUI.Lang.en=1;GUI.Lang.fr=2;GUI.Lang.es=3;GUI.Lang.pt=4;GUI.Lang.strings={ablateOnIntersection:["Abtragen auf","Copy on:","Copier vers","Copiar en","Copiar em"],ablate_objects:["Objekte abtragen","Copy objects","Copier les objets","Copiar objetos","Copiar objetos"],ablation_instruct:["Klicke auf das Objekt (Kreis / Strecke), das abgetragen werden soll.","Click on the object (circle / line segment) you want to copy.","Cliquer sur l&#39objet à copier(cercle/droite/segment).","Clic en objeto (círculo, línea, segmento) que desea copiar","Clique no objeto (círculo / reta /segmento) que você deseja copiar."],actions:["Aktions-Menü","Actions menu","Menu des actions","Menú de acciones","Menu de ações"],anglesector_selection:["Markiere: Punkt - Scheitel - Punkt","Mark: Point - Vertex - Point","Marquer les 3 points qui définissent le secteur angulaire","Marcar tres puntos para definir sector angular","Marque três pontos para definir o setor angular."],angle_button_rightangle:["Rechter Winkel","Right angle","Angle droit","Ángulo recto","Ângulo reto"],angle_element:["Winkel","Angle","Angle","Ángulo","Ângulo"],angle_measure:["Winkel messen","Measure angle","Mesurer angle","Medir ángulo","Medida de ângulo"],angle_sector:["Winkelsektor","Angle sector","Secteur angulaire","Sector angular","Setor angular"],arrow:["Pfeilspitzen","Arrow heads","Flèches","Cabeza de flechas","Tipos de setas"],axis:["Achse","Axis","Axe","Eje","Eixo"],axispoint:["Achsenpunkt","Axis point","Point de l&#39axe","Punto en eje","Ponto do eixo"],axis_scale:["Skalierung","Scale","Échelle","Escala","Escala"],axis_visibility:["Achsen","Axes","Axes","Ejes","Eixos"],back:["Zurück","Back","Retour","Volver","Voltar"],backspace:["Backspace","Backspace","","",""],bisector:["Winkelhalbierende","Angular bisector","Bissectrice","Bisectriz","Bissetriz"],board_clear_all:["Alles löschen","Remove all","Tout effacer","Eliminar todo","Remover tudo"],bottom:["Unten","Bottom","Bas","Abajo","Embaixo"],cancel:["Abbrechen","Cancel","Annule","Cancelar","Cancelar"],cantoverwrite:["Datei kann nicht überschrieben werden!","File already exists and can not be overwritten!","Le fichier existe déjà et ne peut pas être écraser !","Archivo existente y no puede volver a grabarse","O arquivo já existe e não pode ser sobrescrito."],cas:["Punkt","Point","Point","Punto","Ponto"],center:["Zentrieren","Center","Centrer","Centro","Centro"],chooseformat:["Sie müssen mindestens ein Dateiformat auswählen.","You have to choose at least one file format.","Vous devez choisir au moins un format de fichier","Escoger al menos un formato de archivo","Você deve escolher pelo menos um formato de arquivo"],choosesector:["Art des Sektors","Choose the sector type","Choisir le type de secteur","Escoger el tipo de sector","Escolha o tipo de setor"],circle:["Kreis","Circle","Cercle","Círculo","Círculo"],circle2points:["Kreis (Mittelpunkt - Punkt)","Circle (2P)","Cercle (2P)","Círculo (2 puntos)","Círculo (2P)"],circlesector_selection:["Markiere: Punkt - Mittelpunkt - Punkt","Mark: Point - Midpoint- Point","Marquer les trois points qui définissent le secteur circulaire.","Marcar tres puntos para definir sector circular","Marque os três pontos para definir o setor circular."],circle_sector:["Kreissektor","Circle sector","Secteur circulaire","Sector circular","Setor circular"],clear:["Lösche Schriftzug","Delete Stroke","","",""],clear_reassure:["Wirklich alle Objekte löschen?","Do you really want to delete all objects on the board?","Voulez-vous vraiment supprimer tous les objets ?","¿Realmente desea eliminar todos los objetos del plano? ","Você deseja realmente apagar todos os objetos?"],clear_traces:["Spuren löschen","Clear traces","Effacer traces","Borrar trazas","Limpar traços"],clicktoconnect:["Verbindung herstellen mit","Connect with","Connecter avec","Conectar con","Conectar com"],clone:["Klonen","Clone","Cloner","Clonar","Clonar"],colors:["Farben","Colors","Couleurs","Colores","Cores"],confirmoverwrite:["Datei existiert bereits, überschreiben?","File already exists. Overwrite?","Le fichier existe déjà, écraser ?","Archivo existente, ¿grabar otra vez?","O arquivo já existe. Sobrescrever?"],confirmreset:["Bist du sicher? Es werden alle Einstellungen und Konstruktionen gelöscht!","Are you sure? All settings and constructions will be deleted!","Êtes-vous sûr ? Tous les paramètres et les constructions seront effacés.","¿Está seguro? Todas las configuraciones y objetos serán eliminados","Você tem certeza? Todas as configurações e construção serão apagadas!"],conic:["Kegelschnitt","Conic","Conique","Cónica","Cônica"],connecting:["Verbinde mit Cloud-Speicher.","Connecting to storage provider","Connexion au service de stockage en ligne","Conectando con el proveedor de almacenamiento","Conectando-se com o servidor"],construct_mode:["Konstruktionsmodus aktivieren","Activate Construct-Mode","Activer le mode construction","Activar modo construcción","Ativar Modo-de-Construção"],"continue":["Weiter","Continue","Continuer","Terminar autenticación","Terminar autenticação."],control_boardprop:["Eigensch.","Prop.","Prop.","Propiedades","Prop."],control_construct:["Konstr.","Constr.","Constr.","Construir","Construir"],control_drag:["Ziehen","Drag","Draguer","Arrastrar","Arrastar"],control_redo:["Vor","Redo","Refaire","Rehacer","Refazer"],control_tools:["Mehr","More","Plus","Más","Mais"],control_undo:["Zurück","Undo","Défaire","Deshacer","Desfazer"],coords:["Koordinaten","Coordinates","Coordonnées","Coordenadas","Coordenadas"],copy_instruct:["Klicke auf das Objekt, das kopiert werden soll.","Click on the object you want to copy.","Cliquer sur un objet à copier.","Clic en el objeto a copiar","Clique no objeto que você deseja copiar."],copy_objects:["Objekt kopieren","Copy objects","Copier les objets","Copiar objetos","Copiar objetos"],corners:["Eckenanzahl (>=3 und <=35)","Number of corners (>2 and <36)","Nombre de sommets (>=3 et <=35)","Número de vértices (mayot que 2 y menor que 36)","Número de vértices (> 2 e < 36)"],corner_amount:["Eckenzahl: mindestens 3, höchstens 35","The number of corners should be >= 3 and <= 35","Le nombre de sommets doit être >=3 et <=35","El número de vértices debería ser mayor o igual a 3 y menor o igual a 35","O número de vértices deve ser >= 3 e <= 35"],cursor:["Fadenkreuz","Crosshair","Réticule (pointeur croix)","Cruz","Cruz"],curve:["Kurve","Curve","Courbe","Curva","Curva"],del:["Löschen","Delete","Effacer","Eliminar","Apagar"],delete_all:["Alles löschen","Delete All","","",""],delete_reassure:["Diese Konstruktion wirklich löschen?","Do you really want to delete this construction?","Voulez-vous vraiment supprimer cette construction ?","¿Realmente desea eliminar esta construcción?","Você deseja realmente apagar esta construção?"],del_instruct:["Klicke auf das Objekt, das gelöscht werden soll.","Click on the object you want to delete.","Cliquer sur l&#39objet à supprimer","Clic en el objeto a eliminar","Clique no objeto que você deseja apagar."],del_objects:["Objekte löschen","Delete objects","Supprimer les objets","Eliminar objetos",""],drag_file:["Ziehe eine GEONExT- oder sketchometry-Konstruktion in dieses Feld um sie Ihrer Galerie hinzuzufügen.","Drop a GEONExT or sketchometry file here to import it.","Lâcher ici un fichier GEONEXT ou sketchometry pour l&#39importer dans votre galerie.","Dejar aquí un archivo GEONExT o Sketchometry para importarlo","Arraste um arquivo GEONExT ou Sketchometry aqui para importá-lo."],drag_mode:["Zugmodus aktivieren","Activate Drag-Mode","Activer le mode draguer","Activar modo arrastrar","Ativar Modo-de-Arraste"],drawGlider:["Platziere Gleiter auf","Place glider on:","Placer un glisseur","Colocar punto sobre:","Colocar marca em:"],element_opacity:["Fülltransparenz","Fill opacity","Opacité","Transparencia","Transparência"],element_size:["Größe","Size","Taille","Tamaño","Tamanho"],emptyfolder:["Leerer Ordner","Empty folder","Dossier vide","Carpeta vacía","Arquivo vazio"],english:["Englisch","English","Anglais","Inglés","Inglês"],exp:["Export","Export","Exporter","Exportar","Exportar"],expo:["Exportieren in die Cloud","Export to the cloud","Exporter vers le stockage en ligne","Exportar a la nube","Exportar para a nuvem"],fill_settings:["Fülloptionen","Fill settings","Remplissage","Completar los ajustes","Definir configurações"],finishauth:["Beende Authentifizierung","Finish authentication.","Finir l&#39authentification","Terminar autenticación","Terminar autenticação."],fixed_glider:["Fixer Gleiter","Fixed glider","Glisseur fixe","Deslizador fijo","Marca fixa"],fixed_point:["Fixer Punkt","Fixed point","Point fixe","Punto fijo","Ponto fixo"],free:["Frei","Free","Libre","Libre","Livre"],freeGlider:["Gleiter → Freier Punkt ...","Glider → Free point ...","Glisseur → point libre","Punto en objeto → Punto libre...","Marca → Ponto livre ..."],freePoint:["Freier Punkt","Free point","Point libre","Punto libre","Ponto livre"],function_plot:["Funktionsgraph","Function plot","Graphe d&#39une fonction","Graficar función","Gráfico de função"],gallery:["Galerie","Gallery","Galerie","Galería","Galeria"],german:["Deutsch","German","Allemand","Alemán","Alemão"],glider:["Gleiter","Glider","Glisseur","Punto en objeto","Marca"],glider_instruct:["Objekt an gewünschten Ort ziehen.","Release your finger / the mouse button on the object, where you want to place the glider.","Relâcher le doigt/la souris sur l&#39objet où sera placé le glisseur.","Toque con su dedo (presione el botón del mouse) sobre el lugar del objeto onde quiere colocar la marca","Pressione o seu dedo / botão do mouse sobre o lugar do objeto onde você quer colocar a marca"],graphlist:["Funktions-Liste","Function list","","",""],grid_snap_to_grid:["Einrast. Gitter","Snap grid","Capture grille","Fijar a la cuadrícula","Capturar malha"],grid_snap_to_point:["Einrast. Pkt.","Snap points","Capture points","Fijar puntos","Capturar pontos"],grid_visible:["Zeige Gitter","Show grid","Voir grille","Exhibir cuadrícula","Exibir malha"],help:["Hilfe","Help","Aide","Ayuda","Ajuda"],hide:["Versteck.","Hide","Cacher","Ocultar","Esconder"],hide_instruct:["Klicke auf das Objekt, das angezeigt / versteckt werden soll.","Click on the object you want to (un-)hide.","Cliquer sur l&#39objet à cacher/montrer.","Clic en objeto a (des)ocultar","Clique no objeto que você quer esconder / exibir."],hide_objects:["Objekte verstecken","Hide objects","Cacher des objets","Objetos ocultos","Esconder objetos"],hwr:["Handschrift-Erkennung","Hand-Writing-Recognition","","",""],identifier:["Bezeichner","Identifier","Identifier","Identificar","Identificar"],img:["Bild","Image","Image","Imagen","Imagem"],imp:["Import","Import","Importer","Importar","Importar"],impo:["Importieren aus der Cloud","Import from the cloud","Importer depuis le stockage en ligne","Importar desde la nube","Importar da nuvem"],intersect:["Schnittpunkt","Intersection point","Point intersection","Intersección punto","Interseção pontos"],label_settings:["Texteigenschaften","Label settings","Paramètres des étiquettes","Ajustes de la etiqueta","Configurações de rótulos"],label_visible:["Zeige Text","Show label","Montrer létiquette","Exhibir rótulos","Exibir rótulo"],language:["Sprache","Language","Langage","Lenguaje","Idioma"],left:["Links","Left","Gauche","Izquierda","Esquerda"],leftrightmode:["Links- / Rechtshändermodus","Left/Right hand mode","Mode main gauche/droite","Modo mano izquierda (derecha)","Modo mão esquerda/direita"],len:["Länge","Length","Longueur","Largo","Comprimento"],length_measure:["Längenmessung","Measure length","Mesurer une longueur","Medir longitud","Medida de comprimento"],line:["Gerade","Line","Droite","Recta","Reta"],line_button:["Streckenenden","Line endings","Segment extrémités","Marcación de rectas","Marcação de retas"],line_segment:["Strecke","Segment","Segment","Segmento","Segmento"],loggedinas:["Eingeloggt als","Logged in as","Connecté en tant que","Inició sesión como ","Registrado como"],login:["Beginne Authentifizierung (öffnet neues Fenster).","Start authentication process (opens new window).","Début du processus d&#39authentification (ouvre une nouvelle fenêtre).","Comenzar proceso de autenticación (abrirá una nueva ventana)","Iniciar processo de autenticação (uma nova janela será aberta)"],logout:["Logout","Logout","Déconnecté","Cerrar sesión","Sair"],magnify:["Lupe","Magnifier","Loupe","Lupa","Lente de aumento"],mark_glider_object:["Markiere den Ort für den Gleiter.","Mark the object on which you want to place the glider.","Marquer lobjet sur lequel place un glisseur.","Marcar el objeto al que pertenecerá el punto","Marque o objeto no qual você deseja colocar a marca."],measure:["Messung","Measure","Mesurer","Medir","Medir"],measure_angle:["Markiere einen angezeigten Winkel oder drei Punkte zum Messen des Winkels.","Select either an angle object or three points to measure the corresponding angle value.","Sélectionner soit un angle, soit trois points pour obtenir la mesure de cet angle.","Seleccionar tres puntos para obtener la correspondiente medida angular","Selecione ou um ângulo ou três pontos para medir o ângulo correspondente."],measure_dist:["Markiere zwei Punkte oder ein Geradenstück zum Messen des Abstands oder der Länge.","Select either 2 points for measuring the distance between them or a line segment to measure its length.","Sélectionner soit 2 points pour obtenir leur distance, soit un segment pour obtenir sa longueur.","Seleccionar dos puntos para medir la distancia entre ellos ó el segmento que los une para medir su longitud","Selecione dois pontos para medir a distância entre eles ou segmento de reta para medir o seu comprimento."],measure_instruct:["Wählen Sie das/die zu messende/n Objekt/e aus ...","Choose the object(s) to be measured ...","","",""],measure_instruction:["Markiere einen Winkel-, Kreissektor oder ein Geradenstück, um dessen Länge zu messen.","Mark an angle, arc or segment to measure its length.","Marquer un angle, un arc ou un segment pour le mesurer.","",""],measure_sector:["Markiere einen Kreissektor, um dessen Bogenlänge zu messen.","Select a circle sector to measure the length of its arc.","Sélectionner un secteur circulaire pour mesurer la longueur de son arc. ","Seleccionar un sector circular para medir la longitud de su arco","Selecione um setor circular para medir o comprimento de seu arco."],measure_slider:["Wähle einen Schieberegler, um dessen Wert zu verwenden.","Select a slider to measure its value.","Sélectionner un curseur pour mesurer sa valeur.","Seleccionar un deslizador para obtener su valor","Selecione um controle deslizante para obter o seu valor."],midpoint:["Mittelpunkt","Midpoint","Milieu","Punto medio","Ponto médio"],minus:["Verringern","Decrease","Diminuer","Decrementa","Diminuir"],mir1_instruct:["Markiere eine Spiegelachse.","Click on the object which should act as mirror.","Cliquer sur l&#39objet qui sera axe de la symétrie (réflexion).","Clic en el objeto que será eleje de reflexión","Clique no objeto que será o centro da reflexão."],mir2_instruct:["Markiere das Objekt, das gespiegelt werden soll.","Click on the object you want to mirror.","Cliquer sur l&#39objet dont le symétrique est à construire.","Clic en el objeto que desea reflejar","Clique no objeto que você deseja refletir."],mirror_objects:["Objekte spiegeln","Mirror objects","Objets symétriques","Objeto reflejado","Refletir objetos"],move_down:["Nach unten bewegen","Move down","Vers le bas","Mover hacia abajo","Mover para baixo"],move_left:["Nach links bewegen","Move left","Vers la gauche","Mover a la izquierda","Mover para a esquerda"],move_right:["Nach rechts bewegen","Move right","Vers à droite","Mover a la derecha","Mover para a direito"],move_up:["Nach oben bewegen","Move up","Vers le haut","Mover hacia arriba","Mover para cima"],nav:["Zeige Zoom-Steuerung / Navigation","Show Zoom / Navigation controls","Montrer navigation","Exhibir navegación","Exibir navegação"],navtoolprop:["Zeichenfläche- / Objekt-Eigenschaften","Board / Object Properties","Propriété zone dessin / objets","Propiedades del plano ó de un objeto","Propriedades da Janela de Visualização / Objeto"],neu:["Neu","New","Nouveau","Nuevo","Novo"],newConst:["Neue Konstruktion anlegen","Create new construction","Créer une nouvelle construction","Crear una nueva construcción","Criar uma nova contrução"],newfoldername:["Name des neuen Ordners","Name of the new folder","Nom du nouveau dossier","Nombre de la nueva carpeta","Dê um nome para o novo diretório"],nextmark:["Nächste Marke","Next mark","Marque suivante","Siguiente marca","Próxima marca"],none:["Keiner","None","Aucun","Ninguno",""],normal:["Senkrechte","Perpendicular","Perpendiculaire","Perpendicular","Perpendicular"],of:["von","of","de","de","de"],ok_return:["Ok + Return","Ok + Return","","",""],parallel:["Parallele","Parallel","Parallèle","Paralelo(a)","Paralelo"],paste_ablation_instruct:["Ziehe das Objekt zum Abtragen an den gewünschten Ort.","Release your finger / the mouse button, to paste the copy.","Relâcher le doigt ou le bouton souris pour coller la copie.","Levante su dedo (suelte el botón del mouse) para pegar","Levante o seu dedo / botão do mouse para colar."],paste_instruct:["Markiere den gewünschten Ort für die Kopie.","Click on the board to paste the copy.","Cliquer sur la zone de dessin pour coller la copie.","Clic en el plano para pegar la copia","Clique na janela de visualização para colar."],perpendicularBisector:["Mittelsenkrechte","Perpendicular Bisector","Médiatrice","Mediatriz","Mediatriz"],plus:["Erhöhen","Increase","Augmenter","Incrementa","Aumentar"],point_coord:["X- / Y-Koordinaten","X / Y coordinates","Coordonnées x/y","Coordenadas X/Y","Coordenadas X / Y"],point_face:["Symbol","Face","Rendu","Cara","Tipo"],point_style:["Punktform","Point style","Style de point","Estilo de punto","Tipo do ponto"],poly:["Polygon","Polygon","Polygone","Polígono","Polígono"],polygon_selection:["Markiere nacheinander alle Eckpunkte und zum Abschluss wieder den Anfangspunkt.","Select the points which should span the polygon. Finalize the selection by clicking another time on the first point.","Sélectionner les points qui forment le polygone. Finir la sélection en cliquant à nouveau sur le 1er point.","Seleccione los vértices que conformarán ","Selecione os pontos que gerarão o polígono. Finalize a seleção clicando uma outra vez no primeiro ponto."],precision:["Dezimalstellen","Decimal places","Décimales","Decimales",""],prevmark:["Vorherige Marke","Previous mark","Marque précédente","Marca anterior","Marca anterior"],prop_instruct:["Klicke auf das Objekt, das bearbeitet werden soll.","Click on the object you want to modify.","Cliquer sur l&#39objet à modifier.","Clic en el objeto que desea modificar","Clique no objeto que você deseja modificar."],quadrilateral:["Viereck","Quadrilateral","Quadrilatère","Cuadrilátero","Quadrilátero"],radius:["Radius","Radius","Rayon","Radio","Raio"],ray:["Halbgerade","Ray","Demi-droite","Rayo","Semirreta"],recognize:["Starte Erkennung","Start Recognition","","",""],reflect:["Spiegelung","Reflection","Réflexion","Reflexión","Reflexão"],reflectedPoint:["Gespiegelter Punkt","Reflected Point","","",""],regular:["Regelmäßiges","Regular","Régulier","Regular","Regular"],reg_polygon_selection:["Markiere zwei Punkte zum Festlegen einer Polygonseite.","Select two board points, which will act as anchors<br>for the regular polygon being created.","Sélectionner 2 points qui serviront d&#39ancres pour créer un polygone régulier","Seleccione dos puntos que serán los vértices iniciales del polígono regular","Selecione dois pontos que servirão como vértices para o polígono regular."],remove:["Löschen","Delete","Effacer","Eliminar","Apagar"],reset:["Zurücksetzen","Reset","Réinitialiser","Reiniciar","Reiniciar"],right:["Rechts","Right","Droite","Derecha","Direita"],right_angle:["Zeige 90° Punkt","Show 90° dot","Montre 90° point","Exhibir 90° punto","Exibir 90° ponto"],ruler:["Lineal","Ruler","Règle","La regla",""],ruler_selection:["Markiere eine Stelle auf der Zeichenfläche, um den Anfangspunkt des Lineals zu platzieren.","Mark a position on the board to place the starting point of the ruler.","Cliquer à 2 endroits de la zone de dessin pour placer les points de début et de fin de la règle.","",""],sect:["Sektor","Sector","Secteur","Sector","Setor"],sectordot:["Punkt","Dot","Point","Punto",""],sector_measure:["Bogenlänge messen","Measure arc","Mesurer un arc","Medir arco","Medir arco"],sector_related_measure:["Bogenlänge","Arc length","Longueur de larc","Longitud de arco","Comprimento de arco"],selectIntersection:["Markiere Schnittpunkt","Select an intersection:","Sélectionner une intersection:","Seleccionar una intersección","Selecionar uma interseção:"],select_transform:["Transformation auswählen","Select a transformation","Sélectionner une transformation","Seleccionar una transformación","Selecionar uma transformação:"],settings:["Optionen","Settings","Paramètres","Ajustes","Configurações"],shift:["Shift","Shift","","",""],show_tooltips:["Zeige Tooltips","Show tooltips","Montrer les infobulles","Mostrar sugerencias","Exibir dicas"],slide:["Regler","Slider","Curseur","Deslizdor","Controle deslizante"],slidelist:["Slider-Liste","Slider list","","",""],slider_initialization:["Regler-Initialisierung","Slider initialization:","Initiale du curseur","Definir valores inicial y final del deslizador","Definir as extremidades e o valor inicial do controle deslizante."],slider_placement:["Markiere zur Platzierung des Reglers eine Stelle auf der Zeichenfläche.","Click on one place on the board to place the slider.","Cliquer à un endroit de la zone de dessin pour placer le curseur.","Clic en dos lugares del plano para ubicar eldeslizador","Clique em dois lugares para colocar o controle deslizante."],slider_value:["Wert des Schiebereglers","Slider value","Valeur du curseur","Valor del deslizador","Valor do controle deslizante"],slopetriangle:["Steigungsdreieck","Slopetriangle","","",""],snap_to_grid:["Einrasten auf Gitter","Snap to grid","Capturer à la grille","Fijar cuadrícula","Ajustar à malha"],snap_to_point:["Einrasten auf Punkt","Snap to point","Capturer au point","Fijar punto","Ajustar ao ponto"],sound:["Audio","Sound","Son","Sonido","Som"],square:["Quadrat","Square","Carré","Cuadrado",""],startEnd:["Start- / Endpunkt","Start / end point","","",""],status_fix:["Fixieren","Fix","Fixer","Fijar","Fixar"],stickyLabel:["Angeheftetes Label","Sticky Label","","",""],store_matrix:["Matrix speichern","Store matrix","Enregistrer la matrice","Matriz de almacenmiento","Matriz"],stroke_settings:["Stricheigenschaften","Stroke settings","Paramètres des traits","Ajustes de trazo","Configurações"],stroke_width:["Strichstärke","Stroke width","Epaisseur","Ajustes de ancho","Espessura"],tangent:["Tangente","Tangent","Tangente","Tangente","Tangente"],text_element:["Text","Text","Texte","Texto","Texto"],text_placement:["Markiere eine Stelle auf der Zeichenfläche <br>zum Platzieren des Textes.","Click on the board to place your text.","Cliquer sur la zone de dessin pour place le texte","Clic en el plano para colocar su texto","Clique na janela de visualização para colocar o seu texto."],text_size:["Textgröße","Label size","Taille étiquette","Tamaño del rótulo","Tamanho do rótulo"],ticks:["Ticks","Ticks","Point dintervalle","Marcas","Marcas"],to:["zu","to","vers","para","para"],togglemark:["Setze / Entferne Marke","(Un-)Set mark","(Dé)Faire une marque","Fijar(soltar) marcas","Definir / remover marca"],toolbarposition:["Toolbar Position","Toolbar position","Position de la barre d&#39outils","Posición de la barra de herramientas","Posição da barra de ferramentas"],tools:["Werkzeug-Menü","Tools menu","Menu des outils","Menú herramientas","Menu de ferramentas"],tools_function:["Plot","Plot","Tracer","Graficar","Gráfico"],tools_regpolygon:["Reg. Pol.","Reg. pol.","Pol. rég.","Pol. reg.","Pol. Reg."],top:["Oben","Top","Haut","Arriba","Em cima"],trace:["Spur","Trace","Trace","Traza","Traço"],transform_apply:["Markiere den Punkt, der transformiert werden soll.","Click on a point on which the transformation should be applied","Cliquer sur le point à transformer","Clic en objeto donde la transformación será aplicada","Clique no ponto que será transformado"],transform_objects:["Objekte transformieren","Transform objects","Transformer des objets","Transformar objetos","Transformar objetos"],triangle:["Dreieck","Triangle","Triangle","Triángulo","Triângulo"],turtle:["Turtle","Turtle","Tortue","Tortuga","Tartaruga"],unknown:["Unbekannt","Unknown","Inconnu","Desconocido",""],unsupported_file_format:["Dateiformat wird nicht unterstützt!","Unsupported file format","Format de fichier non supporté","formato de archivo no soportado","Formato de arquivo não suportado"],untitled:["Unbenannt","Untitled","Sans titre","Sin título","Sem título"],upload:["Hochladen","Upload","Téléverser","Subir","Transferir"],uploadsuccess:["Export erfolgreich","Upload successful.","Téléversé avec succès.","Subida exitosa","Transferência realizada com êxito"],valueRange:["Wertebereich","Value range","","",""],vect:["Vektor","Vector","Vecteur","Vector","Vetor"],vibration:["Vibration","Vibration","Vibration","Vibración","Vibração"],volume:["Lautstärke","Volume","Volume","Volumen","Volume"],zoomLevel:["Zoom-Stufe","Zoom level","","",""],zoom_100:["Standard-Zoom","Default Zoom","Zoom par défaut","Vista estándar","Zoom Padrão"],zoom_in:["Zoom In","Zoom In","Agrandir","Acercar","Ampliar"],zoom_out:["Zoom Out","Zoom Out","Réduire","Alejar","Reduzir"]};
+GUI.Settings={definition:[{id:"language",label:"language",type:"list",values:GUI.Lang.Map[1],value:GUI.Lang.Map[1][1],action:function(e){GUI.setLanguage(e);GUI.Gallery.setCaptions()},enabled:true},{id:"layouttop",label:"toolbarposition",type:"list",values:["top","bottom"],value:"top",action:function(e){GUI.switchToolbarPos(e)},enabled:true},{id:"leftright",label:"leftrightmode",type:"list",values:["left","right"],value:"right",action:function(e){GUI.switchHandling(e)},enabled:true},{id:"rightangle",label:"angle_button_rightangle",type:"list",values:["sectordot","square","none"],value:"sectordot",action:function(e){if(e=="none")e="sector";JXG.Options.angle.orthotype=e},enabled:true},{id:"magnify",label:"magnify",type:"bool",value:false,action:function(e){if(JXG.Options.device=="pc"){if(e){$("#magnifier").removeClass("not-displayed")}else{$("#magnifier").addClass("not-displayed")}}},enabled:true},{id:"sound",label:"sound",type:"bool",value:true,enabled:false},{id:"volume",label:"volume",type:"volume",value:1,enabled:true},{id:"precision",label:"precision",type:"list",values:["0","2","4","8","16"],value:"2",action:function(e){JXG.Options.trunclen=parseInt(e)},enabled:true},{id:"vibrate",label:"vibration",type:"bool",value:false,enabled:true},{id:"cursor",label:"cursor",type:"bool",value:false,enabled:true},{id:"captions",label:"buttoncaptions",type:"bool",value:true,action:function(e){if(e){$(".sui-button-box* > .buttonLabel").removeClass("not-displayed");$("#toolbar").removeClass("tbHeight-small");$("#toolbar").addClass("tbHeight-big");GUI.switchToolbarPos(GUI.Settings.get("layouttop"))}else{$(".sui-button-box* > .buttonLabel").addClass("not-displayed");$("#toolbar").removeClass("tbHeight-big");$("#toolbar").addClass("tbHeight-small");GUI.switchToolbarPos(GUI.Settings.get("layouttop"))}GUI.Gallery.setCaptions()},enabled:false},{id:"reset",label:"reset",type:"action",action:function(){GUI.confirm(GUI.Lang.std.confirmreset,false,function(){if(JXG.Options.device=="msie"){for(var e in localStorage)localStorage.removeItem(e)}else localStorage.clear();window.location.reload()})},enabled:true}],setaction:function(){},setlist:function(e,t){var o;for(o=0;o<this.definition[e].values.length;o++){if(this.definition[e].values[o]===t){this.definition[e].value=t}}},setbool:function(e,t){this.definition[e].value=!!t},setvolume:function(e,t){this.definition[e].value=t},get:function(e){var t,o;for(t=0;t<this.definition.length;t++){if(this.definition[t].id===e){o=this.definition[t].value}}return o},set:function(e,t){var o;for(o=0;o<this.definition.length;o++){if(this.definition[o].id===e){this["set"+this.definition[o].type](o,t);if(JXG.exists(this.definition[o].action)){this.definition[o].action(this.definition[o].value)}}}this.save()},load:function(){var e=GUI.Storage.getItem(GUI.appId+":meta:settings"),t,o;if(JXG.exists(e)){t=JSON.parse(e);for(o=0;o<this.definition.length;o++){if(JXG.exists(t[this.definition[o].id])){this.definition[o].value=t[this.definition[o].id];if(this.definition[o].action){this.definition[o].action(this.definition[o].value)}}}}},save:function(){var e=GUI.Storage.getItem(GUI.appId+":meta:settings"),t,o;if(JXG.exists(e)){t=JSON.parse(e)}else{t={}}for(o=0;o<this.definition.length;o++){t[this.definition[o].id]=this.definition[o].value}GUI.Storage.setItem(GUI.appId+":meta:settings",JSON.stringify(t))}};JXG.extend(GUI,{deselectToolButton:function(e){$("#"+e).removeClass("button-selected");$("#"+e+"-box").removeClass("button-selected");GUI.removeToolEvents(true);GUI.delight()},deselectAllToolButtonsAndRemoveActions:function(){GUI.deselectToolButton("tools-text");GUI.deselectToolButton("tools-ruler");GUI.deselectToolButton("tools-regpolygon");GUI.deselectToolButton("tools-circlesector");GUI.deselectToolButton("tools-anglesector");GUI.deselectToolButton("tools-slider");GUI.removeActionEvent(true)},selectToolButton:function(e){if($("#"+e).hasClass("button-selected")){GUI.deselectToolButton(e);return false}GUI.deselectAllToolButtonsAndRemoveActions();$("#"+e).addClass("button-selected");$("#"+e+"-box").addClass("button-selected");return true},ruler:function(){GUI.showStatusPanel(GUI.Lang.std.ruler_selection,0,function(){GUI.deselectAllToolButtonsAndRemoveActions();GUI.showPanel(false,0)});GUI.selection=[];GUI.addToolEvent(GUI.down_event,GUI.addRulerEvt)},addRulerEvt:function(e){var t=function(){if(GUI.selection.length==1){JXG.Draw.drawRuler(GUI.selection[0],GUI.Lang.std.ruler);GUI.deselectToolButton("tools-ruler")}};GUI.select(e,"place",false,null,t)},text:function(){GUI.showStatusPanel(GUI.Lang.std.text_placement,0,function(){GUI.deselectAllToolButtonsAndRemoveActions();GUI.showPanel(false,0)});GUI.addToolEvent(GUI.down_event,function(e){var t=JXG.Draw.drawText(GUI.getCoords(e));GUI.deselectToolButton("tools-text");$("#control-boardprop").trigger(GUI.tap_event);GUI.contextEdit(t);$("#textInput").trigger(GUI.click_event)},0,true)},polygon:function(){var e=GUI.Lang.std.reg_polygon_selection+"<br>";e+='<label for="polygonCorners">'+GUI.Lang.std.corners+":</label> ";e+='<input id="polygonCorners" name="polygonCorners" type="text" size="2" value="';e+=JXG.Options.lastRegPolCorners+'" readonly="readonly" />';GUI.showStatusPanel(e,0,function(){GUI.deselectAllToolButtonsAndRemoveActions();GUI.showPanel(false,0)});$("#polygonCorners").unbind();$("#polygonCorners").bind(GUI.click_event,function(){GUI.Kbd.showKeyboardPanel(this.id,JXG.Options.lastRegPolCorners,this.id,true)});GUI.selection=[];GUI.addToolEvent(GUI.down_event,GUI.addRegPolygonEvt)},addRegPolygonEvt:function(e){if(GUI.getId("polygonCorners").value<3||GUI.getId("polygonCorners").value>33){GUI.alert(GUI.Lang.std.corner_amount);return}var t=function(){if(GUI.selection.length==2){JXG.Options.lastRegPolCorners=GUI.getId("polygonCorners").value;JXG.Draw.drawRegularPolygon(GUI.selection);GUI.deselectToolButton("tools-regpolygon");if(GUI.dialog["pol"]!=null)GUI.dialog["pol"].removeDialog()}};GUI.select(e,"point",false,null,t)},sector:function(e){var t,o;if(e=="circle"){if(!GUI.selectToolButton("tools-circlesector"))return;t=GUI.Lang.std.circlesector_selection;o=GUI.addCircleSectorEvt}else{if(!GUI.selectToolButton("tools-anglesector"))return;t=GUI.Lang.std.anglesector_selection;o=GUI.addAngleSectorEvt}GUI.showStatusPanel(t,0,function(){GUI.deselectAllToolButtonsAndRemoveActions();GUI.showPanel(false,0)});GUI.selection=[];GUI.addToolEvent(GUI.down_event,o,e)},addAngleSectorEvt:function(e){var t=function(){if(GUI.selection.length==3){JXG.Draw.drawAngleSector([GUI.selection[0].id,GUI.selection[1].id,GUI.selection[2].id]);GUI.deselectToolButton("tools-anglesector")}};GUI.select(e,"point",false,null,t)},addCircleSectorEvt:function(e){var t=function(){if(GUI.selection.length==3){JXG.Draw.drawCircleSector([GUI.selection[1].id,GUI.selection[0].id,GUI.selection[2].id]);GUI.deselectToolButton("tools-circlesector")}};GUI.select(e,"point",false,null,t)},slider:function(){var e="";e+='<label for="sliderStart">Minimalwert:</label> <input id="sliderStart" name="sliderStart" size="2" type="text" value="';e+=JXG.Options.lastSliderStart+'" readonly="readonly" />';e+=' <label for="sliderEnd">Maximalwert:</label> <input id="sliderEnd" name="sliderEnd" size="2" type="text" value="';e+=JXG.Options.lastSliderEnd+'" readonly="readonly" />';e+=' <label for="sliderIni">Startwert:</label> <input id="sliderIni" name="sliderIni" size="2" type="text" value="';e+=JXG.Options.lastSliderIni+'" readonly="readonly" />';GUI.showStatusPanel(e,0,function(){GUI.deselectAllToolButtonsAndRemoveActions();GUI.showPanel(false,0)});$("#sliderStart").unbind();$("#sliderStart").bind(GUI.click_event,function(){GUI.Kbd.showKeyboardPanel(this.id,JXG.Options.lastSliderStart,this.id,true)});$("#sliderEnd").unbind();$("#sliderEnd").bind(GUI.click_event,function(){GUI.Kbd.showKeyboardPanel(this.id,JXG.Options.lastSliderEnd,this.id,true)});$("#sliderIni").unbind();$("#sliderIni").bind(GUI.click_event,function(){GUI.Kbd.showKeyboardPanel(this.id,JXG.Options.lastSliderIni,this.id,true)});GUI.selection=[];GUI.addToolEvent(GUI.down_event,GUI.addSliderEvt)},addSliderEvt:function(e){GUI.selection.push(GUI.getCoords(e));if(GUI.selection.length==1){JXG.Options.lastSliderStart=$("input#sliderStart").attr("value");JXG.Options.lastSliderEnd=$("input#sliderEnd").attr("value");JXG.Options.lastSliderIni=$("input#sliderIni").attr("value");JXG.Draw.drawSlider(GUI.selection);GUI.deselectToolButton("tools-slider");GUI.hideStatusPanel()}}});JXG.extend(GUI,{actionTimer:function(e){if(GUI.ctx_timer!==0){clearTimeout(GUI.ctx_timer);GUI.ctx_timer=0}if(GUI.ctx_down_coords==null)return;if(JXG.Draw.findHittedObjs(GUI.ctx_down_coords.scrCoords[1],GUI.ctx_down_coords.scrCoords[2],GUI.board,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_CIRCLE,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_CURVE,JXG.OBJECT_CLASS_AREA,JXG.OBJECT_CLASS_OTHER],[JXG.OBJECT_TYPE_CAS,JXG.OBJECT_TYPE_INTERSECTION,JXG.OBJECT_TYPE_TEXT]).length==0)return;GUI.action="ablation";GUI.addToolEvent(GUI.move_event,function(){});GUI.addAblateEvt(e,GUI.ctx_curr_coords)},hideAllActions:function(){if($("#actions-mirror").hasClass("button-selected"))$("#actions-mirror").trigger(GUI.click_event);if($("#control-actions").hasClass("button-selected"))GUI.activateActionControls()},Plot:{plot:function(e,t){var o,r;r="function(x) { return "+GUI.Kbd.getVal()+"; }";o=GUI.plotColors[GUI.plotColor++];if(GUI.plotColor>=GUI.plotColors.length)GUI.plotColor=0;GUI.recordStep({type:JXG.GENTYPE_PLOT,dest_id:GUI.id(),args:{plot_type:"plot",a:e,b:t,isPolar:false,isUpdate:false,func:r,color:o}},true,false)},checkAndPlot:function(){var e,t,o,r,s;e=parseInt(GUI.getId("ival-a").value);t=parseInt(GUI.getId("ival-b").value);s=GUI.Kbd.getVal().sanitize().replace(/ /g,"");for(o=0;o<s.length;o++){if(s[o]=="x"){if(o>0&&s[o-1]!="("&&(s[o-1]==parseInt(s[o-1])||s[o-1]=="x")){r=s;s=s.slice(0,o);r=r.slice(o);s+="*"+r}}if(s[o]=="x"&&o<s.length-1&&s[o+1]!=")"&&s[o+1]!="%"&&s[o+1]!="+"&&s[o+1]!="-"&&s[o+1]!="*"&&s[o+1]!="/"&&(s[o+1]!="p"||o-1>=0&&s[o-1]!="e")&&s[o+1]!="^"){r=s;s=s.slice(0,o+1);r=r.slice(o+1);s+="*"+r}if(s[o]==")"&&o<s.length-1&&s[o+1]!=")"&&s[o+1]!="%"&&s[o+1]!="+"&&s[o+1]!="-"&&s[o+1]!="*"&&s[o+1]!="/"&&s[o+1]!="^"){r=s;s=s.slice(0,o+1);r=r.slice(o+1);s+="*"+r}}GUI.Kbd.setVal(s);try{GUI.board.jc.snippet(s,true);GUI.Plot.plot(e,t);GUI.lastFxInput=s;GUI.Kbd.setVal("");if(GUI.Kbd.activeListId!=""){var i="#"+GUI.Kbd.activeListId;$(i).trigger(GUI.click_event);$(i).trigger(GUI.click_event)}GUI.removeActionEvent(true);GUI.showPanel(false,0)}catch(n){console.log(n);console.log("Erroneous term/expression")}},calculate:function(){var cl=GUI.getId("plot-calc-result"),fx=false,res;try{fx=GUI.Kbd.getVal();res=eval(fx);if(typeof res!="undefined")cl.innerHTML=res;else cl.innerHTML="0"}catch(err){if(fx&&fx.indexOf("x")!=-1){cl.value=""}}}},plotAction:function(){var e,t,o,r,s="";e=GUI.board.getBoundingBox();t=parseInt(Math.floor(e[0]));o=parseInt(Math.ceil(e[2]));s+='x &#8712; [ <input id="ival-a" type="text" size="4" readonly="readonly" value="'+t+'" />, ';s+='<input id="ival-b" type="text" size="4" readonly="readonly" value="'+o+'" /> ] &#8213; ';s+='<label for="fx-input">f(x) = </label><input id="fx-input" name="fx-input" type="text" size="19" readonly="readonly" />';s+=' &#8213; <label>Result:</label> <label id="plot-calc-result" name="plot-calc-result" ></label>';GUI.deactivatePropToolAction();GUI.action="plot";r=GUI.axisVisible;if(!r)GUI.toggleAxis();GUI.showStatusPanel(s,0,function(){GUI.lastFxInput=GUI.Kbd.getVal();$("#fx-input").unbind();$("#ival-a").unbind();$("#ival-b").unbind();if(GUI.axisVisible!=r)GUI.toggleAxis();GUI.deselectAllToolButtonsAndRemoveActions();GUI.showPanel(false,0)});$("#fx-input").bind(GUI.click_event,function(e){GUI.Kbd.showKeyboardPanel(this.id,"",this.id,false,GUI.Plot.calculate,function(){GUI.Plot.checkAndPlot();if(GUI.axisVisible!=r)GUI.toggleAxis()},true)});$("#ival-a").bind(GUI.click_event,function(){GUI.Kbd.showKeyboardPanel(this.id,t,this.id,true)});$("#ival-b").bind(GUI.click_event,function(){GUI.Kbd.showKeyboardPanel(this.id,o,this.id,true)});if(GUI.Kbd.activeListId!=""&&GUI.Kbd.activeListId!="key-hwr"){var i="#"+GUI.Kbd.activeListId;$(i).trigger(GUI.click_event);$(i).trigger(GUI.click_event)}GUI.Plot.calculate();GUI.addActionEvent(GUI.down_event,function(){})},hideAction:function(){GUI.deactivatePropToolAction();GUI.action="hide";GUI.showHiddenObjects();GUI.showStatusPanel(GUI.Lang.std.hide_instruct,0,function(){GUI.deselectAllToolButtonsAndRemoveActions();GUI.showPanel(false,0)});GUI.addActionEvent(GUI.down_event,function(e){GUI.addHideEvt(GUI.getScreenCoordsXY(e))})},delAction:function(){GUI.deactivatePropToolAction();GUI.action="del";GUI.showHiddenObjects();GUI.showStatusPanel(GUI.Lang.std.del_instruct,0,function(){GUI.deselectAllToolButtonsAndRemoveActions();GUI.showPanel(false,0)});GUI.addActionEvent(GUI.down_event,function(e){GUI.addDelEvt(GUI.getScreenCoordsXY(e))})},measureAction:function(){GUI.deactivatePropToolAction();GUI.action="measure";GUI.showHiddenObjects();GUI.showStatusPanel(GUI.Lang.std.measure_instruct,0,function(){GUI.deselectAllToolButtonsAndRemoveActions();GUI.showPanel(false,0)});GUI.selection=[];GUI.addActionEvent(GUI.down_event,function(e){GUI.addMeasureEvt(e,true)})},ablateAction:function(){GUI.deactivatePropToolAction();if(GUI.action!="standard")GUI[GUI.action+"Action"]();GUI.action="ablation";GUI.showStatusPanel(GUI.Lang.std.ablation_instruct,0,function(){GUI.deselectAllToolButtonsAndRemoveActions();GUI.showPanel(false,0)});GUI.addActionEvent(GUI.down_event,function(e){GUI.addAblateEvt(e)},false,false)},transfAction:function(){GUI.deactivatePropToolAction();if(GUI.action!="standard")GUI[GUI.action+"Action"]();GUI.action="transf";var e=$("#transform-select"),t=$("#transform-input");if(GUI.countElements(GUI.transformation)==0){e.addClass("not-displayed");t.removeClass("sui-spacer")}else{e.removeClass("not-displayed");t.addClass("sui-spacer")}$("#caption-transform").removeClass("not-displayed");GUI.addActionEvent(GUI.down_event,function(){},false,false)},fixAblation:function(e,t){if(typeof t!="undefined")GUI.lastCopyPos=t;else GUI.lastCopyPos=GUI.getCoords(e);GUI.placeShadowCopy(GUI.selection,GUI.lastCopyPos);GUI.showStatusPanel(GUI.Lang.std.paste_ablation_instruct,0,function(){GUI.deselectAllToolButtonsAndRemoveActions();GUI.showPanel(false,0)});GUI.addToolEvent(GUI.up_event,function(e,t){GUI.pasteAblation(e,t);if($("#control-actions").hasClass("button-selected"))GUI.ablateAction()},GUI.selection,true)},pasteAblation:function(e,t){var o,r,s=[],i,n,a=true;var l=GUI.shadowCopyStep,d=GUI.placeShadowCopy(t,GUI.lastCopyPos);GUI.showObjectsBlured(false);GUI.pasteAblationDehighlight();if(l.type>50)n=GUI.generateJCode(l,GUI.board);else n=JXG.SketchReader.generateJCode(l,GUI.board,GUI.step_log);GUI.parse(n[2],false);if(GUI.shadowCopyStep.type>50)n=GUI.generateJCode(GUI.shadowCopyStep,GUI.board);else n=JXG.SketchReader.generateJCode(GUI.shadowCopyStep,GUI.board,GUI.step_log);GUI.parse(n[2],false);GUI.shadowCopyStep="";i=new JXG.Coords(JXG.COORDS_BY_USER,[GUI.board.objects[l.src_ids[0]].coords.usrCoords[1]-d[0],GUI.board.objects[l.src_ids[0]].coords.usrCoords[2]-d[1]],GUI.board);r=JXG.Draw.findHittedObjs(i.scrCoords[1],i.scrCoords[2],GUI.board,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_CIRCLE,JXG.OBJECT_CLASS_LINE],[]);l.args.x=d[0];l.args.y=d[1];if(r.length>0){l.args.migrate=-1;for(o=0;o<r.length;o++){if(r[o].elementClass==JXG.OBJECT_CLASS_POINT){if(r[o].type!=JXG.OBJECT_TYPE_INTERSECTION||r[o].type!=JXG.OBJECT_TYPE_GLIDER)s.push(r[o]);r[o]=r[r.length-1];r.length--;if(o>0)o--}}if(r.length==0&&s.length==1)l.args.migrate=s[0].id;else{if(s.length>=1){if(s.length==1&&$("#ctxObjects").hasClass("not-displayed"))l.args.migrate=s[0].id;else{GUI.createSelectDialogCtx(s,function(e){JXG.Draw.recordStepMeta({type:JXG.GENTYPE_MIGRATE,src_ids:[l.dest_sub_ids[0]],dest_sub_ids:[],dest_id:e},true);GUI.removeActionEvent(true);GUI.selection=[];GUI.delight();GUI.removeToolEvents(true)},GUI.ctxPosProps,true);GUI.selection=[]}}else if(r.length>0){var c,u=JXG.Draw.drawPoint(GUI.board,[i],r,l.dest_sub_ids[0]);l.args.migrate=u.dest_id;c={type:JXG.GENTYPE_COMBINED,args:{steps:[JXG.deepCopy(u),JXG.deepCopy(l)]}};l=c}}}else l.args.migrate=0;if(l.args.migrate==-1){GUI.ctx_curr_coords=null;a=false}GUI.recordStep(l,true,false);GUI.removeToolEvent(GUI.move_event);GUI.removeActionEvent(a);GUI.resetBoard(GUI.board.BOARD_MODE_NONE)},createSelectDialogCtx:function(e,t,o,r,s){var i=GUI.createSelectHTML(e,"block");if(s)GUI.addToolEvent(GUI.down_event,console.log);GUI.showPanel(false,0);GUI.showPanelHTML(i,o,r);GUI.registerSelectHandlers(e,function(e){t(e)})},createSelectDialogKbd:function(e,t,o){var r;if(typeof o=="undefined")o="inline";r=GUI.createSelectHTML(e,o);$("#kb-dyn-panel").html(r);GUI.registerSelectHandlers(e,function(e){t(e)});$("#kb-char-panel").addClass("not-displayed");$("#kb-dyn-panel").removeClass("not-displayed")},createSelectHTML:function(e,t){var o=0,r,s="proplight",i="",n;if(t)s+=" "+t;for(r in e){if(e.hasOwnProperty(r)){i+='<a href="#" tabindex="'+o+'" id="sel_'+e[r].id+'" class="'+s+'">';i+=GUI.resolveObjectType(e[r]);if(e[r].visProp.withlabel&&e[r].label.visProp.visible){i+=" "+e[r].name}else{if(e[r].name)n=e[r].name;else n=e[r].id;i+=" "+n}i+="</a>";o++}}return i},touchDialogHandler:function(e){var t;for(t=0;t<GUI.select_obj.length;t++){if(GUI.isTouchInElementsBounds(e,"sel_"+GUI.select_obj[t])){if(GUI.select_obj[t]!=GUI.int_click){if(GUI.int_click!=-1){$("#sel_"+GUI.int_click).removeClass("proplight_active");GUI.delight(GUI.int_click)}GUI.int_click=GUI.select_obj[t];$("#sel_"+GUI.int_click).addClass("proplight_active");GUI.highlight(GUI.int_click,false)}break}else{$("#sel_"+GUI.select_obj[t]).removeClass("proplight_active")}}if(e&&e.preventDefault)e.preventDefault();else window.event.returnValue=false},registerSelectHandlers:function(e,t){var o,r;GUI.int_click=-1;GUI.select_obj=[];for(o=0;o<e.length;o++)GUI.select_obj.push(e[o].id);if(JXG.Options.device=="tablet"||JXG.Options.device=="msie"&&GUI.isRealMSTouchDevice()){$("#ctxPanel").bind(GUI.down_event,GUI.touchDialogHandler);$("#kb-dyn-panel").bind(GUI.down_event,GUI.touchDialogHandler);$("#ctxPanel").bind(GUI.move_event,GUI.touchDialogHandler);$("#kb-dyn-panel").bind(GUI.move_event,GUI.touchDialogHandler);$("#ctxPanel").bind(GUI.up_event,function(){GUI.contextUnbindHandlers();t(GUI.int_click)});$("#kb-dyn-panel").bind(GUI.up_event,function(){GUI.contextUnbindHandlers();t(GUI.int_click)})}else{for(o=0;o<GUI.select_obj.length;o++){r=$("#sel_"+GUI.select_obj[o]);r.bind(GUI.out_event,function(){if(GUI.int_click!=-1){$("#sel_"+GUI.int_click).removeClass("proplight_active");GUI.delight(GUI.int_click);GUI.int_click=-1}});r.bind(GUI.over_event,function(e){GUI.int_click=GUI.select_obj[$("#"+e.currentTarget.id).attr("tabindex")];$("#sel_"+GUI.int_click).addClass("proplight_active");GUI.highlight(GUI.int_click,false)});r.bind(GUI.click_event,function(e){var o=GUI.select_obj[$("#"+e.currentTarget.id).attr("tabindex")];for(var r=0;r<GUI.select_obj.length;r++)$("#sel_"+GUI.select_obj[r]).unbind();$("#sel_"+o).removeClass("proplight_active");t(o)})}}},addHideEvt:function(e){GUI.showPanel(false,0);GUI.selection=[];GUI.select("","actionObject",false,{scrCoords:[1,e[0],e[1]]});if(GUI.selection.length==1)GUI.hideObjId(GUI.selection[0].id,false);else if(GUI.selection.length>=2){GUI.createSelectDialogCtx(GUI.selection,function(e){GUI.hideObjId(e);GUI.delight();GUI.showPanel(false,0)},GUI.ctxPosHide)}GUI.selection=[]},addMeasureEvt:function(e,t){var o,r,s,i=[];if(GUI.select(e,"angleOrPoints",false,null)){r=GUI.selection[0].getParents();s=GUI.selection[0].id+".getName() + "+"' = ' "+"+ trunc(deg("+GUI.board.objects[r[0]].id+", "+GUI.board.objects[r[1]].id+", "+GUI.board.objects[r[2]].id+"), trunclen) + '&deg;'";i=[GUI.selection[0].id,GUI.board.objects[r[0]].id,GUI.board.objects[r[1]].id,GUI.board.objects[r[2]].id]}else if(GUI.select(e,"sector",false,null)){r=GUI.selection[0].getParents();s="'|&#x2312;| "+GUI.Lang.std.of+" ' + "+GUI.selection[0].name+".getName() + ' = ' + trunc(dist("+GUI.board.objects[r[1]].id+", "+GUI.board.objects[r[0]].id+") * rad("+GUI.board.objects[r[1]].id+", "+GUI.board.objects[r[0]].id+", "+GUI.board.objects[r[2]].id+"), trunclen)";i=[GUI.selection[0].id,GUI.board.objects[r[0]].id,GUI.board.objects[r[1]].id,GUI.board.objects[r[2]].id]}else if(GUI.select(e,"line",false,null)){s="'|' + "+GUI.selection[0].point1.name+".getName() + "+GUI.selection[0].point2.name+".getName()"+" + '| = ' + trunc(dist("+GUI.selection[0].point1.id+", "+GUI.selection[0].point2.name+"), trunclen)";i=[GUI.selection[0].id,GUI.selection[0].point1.id,GUI.selection[0].point2.id]}else if(GUI.select(e,"polygon",false,null)){if(GUI.selection[0].name!="")o=GUI.selection[0].name;else o=GUI.selection[0].id;s="'A("+o+") = ' + trunc("+GUI.selection[0].id+".Area(), trunclen) + ' cm^2'";i=[GUI.selection[0].id];r=GUI.selection[0].borders;for(o=0;o<r.length;o++)i.push(r[o].id)}else if(GUI.selection.length==3){s="'&#x2220;' + "+GUI.selection[0].name+".getName() + "+GUI.selection[1].name+".getName() + "+GUI.selection[2].name+".getName() + "+"' = ' + trunc(deg("+GUI.selection[0].id+", "+GUI.selection[1].id+", "+GUI.selection[2].id+"), trunclen) + '&deg;'";i=[GUI.selection[0].id,GUI.selection[1].id,GUI.selection[2].id]}else return;if(t){JXG.Draw.drawText(GUI.getCoords(e),"function() { return "+s+"; }",i);GUI.delight()}else{$("#textInput").val(s);GUI.ctx_set_text($("#id").val(),i,false);GUI.removeMeasureEvt()}GUI.selection=[]},removeMeasureEvt:function(){$("[class*=measure]").removeClass("button-selected");$("#measure-box").removeClass("button-selected");GUI.deselectAllToolButtonsAndRemoveActions();$("#control-boardprop").trigger(GUI.tap_event);GUI.contextEdit($("#id").val())},addDelEvt:function(e){GUI.showPanel(false,0);GUI.selection=[];GUI.select("","actionObject",true,{scrCoords:[1,e[0],e[1]]});if(GUI.selection.length==1)GUI.removeObjId(GUI.selection[0].id);else if(GUI.selection.length>=2){GUI.createSelectDialogCtx(GUI.selection,function(e){GUI.removeObjId(e);GUI.delight();GUI.showPanel(false,0)},GUI.ctxPosDelete)}GUI.selection=[];if(GUI.getLastConstructedObject()==0){GUI.removeActionEvent(true);$("#control-actions").removeClass("button-selected")}},addAblateEvt:function(e,t){GUI.selection=[];GUI.select(e,"ablatePoint",false,t);if(GUI.selection.length>0){var o=GUI.selection[0];GUI.selection=[];if(o.type==JXG.OBJECT_TYPE_GLIDER){o.visProp.snaptogrid=JXG.Options.elements.snapToGrid;GUI.ctx_set_type(o.id,JXG.OBJECT_TYPE_POINT);GUI.ctx_down_coords=null;GUI.removeActionEvent(true);GUI.showStatusPanel(GUI.Lang.std.freeGlider,1500);if(JXG.Options.device=="msie"){GUI.board.pointerDownListener(e,GUI.board.objects[o.id])}else if(JXG.Options.device=="tablet"){GUI.board.touchStartListener(e,GUI.board.objects[o.id])}else GUI.board.mouseDownListener(e,GUI.board.objects[o.id])}else if(o.type==JXG.OBJECT_TYPE_POINT){o.visProp.snaptogrid=false;GUI.ctx_set_type(o.id,JXG.OBJECT_TYPE_GLIDER);GUI.ctx_down_coords=null}}else{GUI.select(e,"circleOrLine",false,t);if(GUI.selection.length>0){o=GUI.selection[0];if(o.elementClass==JXG.OBJECT_CLASS_CIRCLE){if(o.point2!=null)GUI.selection=[o.midpoint,o.point2];else GUI.selection=[o.midpoint];GUI.selection.push(o.id)}else if(o.elementClass==JXG.OBJECT_CLASS_LINE){if(o.point1.visProp.visible&&o.point2.visProp.visible){GUI.selection=[o.point1,o.point2];GUI.selection.push(o.id)}else{var r,s,i=[];if(o.point1.visProp.visible)i.push(o.point1);if(o.point2.visProp.visible)i.push(o.point2);for(s in o.descendants){r=o.descendants[s];if(r.elementClass==JXG.OBJECT_CLASS_POINT&&r.visProp.visible)i.push(r)}if(i.length>=2){GUI.selection=[i[0],i[1]];GUI.selection.push(o.id)}else GUI.selection=[]}}else GUI.selection=[];if(GUI.selection.length===0){GUI.delight();GUI.removeActionEvent(true);GUI.board.downObjects=[o];GUI.board.mode=GUI.board.BOARD_MODE_DRAG;o.highlight(true)}else{GUI.fixAblation(e,t)}}}},addGlideInterEvt:function(e,t){var o,r,s,i=[],n={};GUI.removeToolEvent(GUI.up_event);s=JXG.Draw.findHittedObjs(GUI.board.objects[t].coords.scrCoords[1],GUI.board.objects[t].coords.scrCoords[2],GUI.board,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_CIRCLE,JXG.OBJECT_CLASS_CURVE],[JXG.OBJECT_TYPE_POINT]);for(o=0;o<s.length;o++){if(!GUI.collectionContains(GUI.board.objects[t].descendants,s[o])&&s[o].id!=t){i.push(s[o])}}s=i;$("#ctxObjects").addClass("not-displayed");$("#ctxObjectsExtra").addClass("not-displayed");if(s.length===0){GUI.removeGlideInterEvt(t);return}if(s.length>1){GUI.removeToolEvent(GUI.move_event);r=JXG.Draw.drawPoint(GUI.board,[GUI.board.objects[t].coords],s,t,true);if(r!=-1){if(GUI.board.objects[r].type==JXG.OBJECT_TYPE_GLIDER){n={type:JXG.GENTYPE_MIGRATE,args:{migrateToGlider:true,usrCoords:JXG.deepCopy(GUI.ctx_curr_coords.usrCoords),orig_name:GUI.board.objects[t].name,fillColor:JXG.Options.glider.fillColor,strokeColor:JXG.Options.glider.strokeColor},src_ids:[t],dest_sub_ids:[],dest_id:r};JXG.Draw.recordStepMeta(n,true)}else if(GUI.board.objects[r].elementClass==JXG.OBJECT_CLASS_POINT){}GUI.removeActionEvent(true)}}else{GUI.selection.push(s[0]);GUI.removeGlideInterEvt(t)}GUI.deleteDraftcurves()},removeGlideInterEvt:function(e){if(GUI.selection.length!==0){var t=GUI.selection[0];GUI.removeActionEvent(true);if(!GUI.collectionContains(GUI.board.objects[e].descendants,t)&&e!=t.id){GUI.ctx_set_type(e,JXG.OBJECT_TYPE_GLIDER,t.id);if(GUI.contextShowsProps()!=0){GUI.addToolEvent(GUI.down_event,GUI.callOnClick,GUI.contextMenu);GUI.contextEdit(e)}}}else{GUI.removeActionEvent(true);GUI.resetBoard()}},removeActionEvent:function(e){var t;GUI.removeToolEvents(e);$("#control-tools-box").removeClass("hidden");$("#caption-actions").addClass("not-displayed");$("#caption-transform").addClass("not-displayed");$('[id^="control-actions-"]').removeClass("button-selected");GUI.mirrorCenterId=0;if(GUI.showHidden)GUI.showHiddenObjects();GUI.delight();if(GUI.shadowCopyStep!==""){if(GUI.shadowCopyStep.type>50)t=GUI.generateJCode(GUI.shadowCopyStep,GUI.board);else t=JXG.SketchReader.generateJCode(GUI.shadowCopyStep,GUI.board,GUI.step_log);GUI.parse(t[2],false);GUI.shadowCopyStep=""}GUI.selection=[];$("#control-actions").css("background-position","-221px -62px");if(e)GUI.action="standard"}});GUI.ContextSave={color:{}};JXG.extend(GUI,{contextPanelColor:function(e,t,o){var r=$("#color-field");if(e.length>7)e=JXG.rgba2rgbo(e)[0];if(!$("#color-tab-"+o).hasClass("button-disabled")){r.css("color",GUI.getBestSwContrast(e));r.css("background-color",e);if(o=="fill")r.val(t.toFixed(0))}},contextPanelReposition:function(){var e=$("#toolbar").outerHeight();$("#ctxPanel").css("bottom",e+"px");$("#ctxPanel").css("top","auto")},contextUnbindHandlers:function(){$("#ctxProps").find("*").unbind();$("#ctxObjectsExtra").children().unbind();$("#ctxObjects").children().unbind();$("#ctxPanel").unbind();$("#kb-dyn-panel").unbind("*");$("#kb-dyn-panel").unbind()},contextBindHandlers:function(e){var t,o,r,s,i,n;n=GUI.getId("id").value;GUI.contextUnbindHandlers();if(e.type==JXG.OBJECT_TYPE_CURVE){$("#plot-fx-input").bind(GUI.click_event,function(){GUI.Kbd.showKeyboardPanel(this.id,e.Y.toString().cleanTerm(),this.id,false,function(){},function(){GUI.ctx_set_plot(n,true)})});$("#plot-fx-input").val(e.Y.toString().cleanTerm())}$("#textInput").bind(GUI.click_event,function(){if(e.type==JXG.OBJECT_TYPE_TEXT){GUI.Kbd.showKeyboardPanel(this.id,GUI.ContextSave.text,this.id,false,function(){r=GUI.Kbd.getVal();if(GUI.ctx_set_text(n,[],true))GUI.ContextSave.text=r})}else{GUI.Kbd.showKeyboardPanel(this.id,GUI.ContextSave.labelName,this.id,false,function(){r=GUI.Kbd.getVal();GUI.ctx_set_label(n,[],true);GUI.ContextSave.labelName=r})}});$("#circle-radius-field").bind(GUI.click_event,function(){GUI.Kbd.showKeyboardPanel(this.id,GUI.ContextSave.radius,this.id,false,function(){r=GUI.Kbd.getVal();GUI.ctx_set_radius(n,true);GUI.ContextSave.radius=r})});$("#angle-radius-field").bind(GUI.click_event,function(){GUI.Kbd.showKeyboardPanel(this.id,GUI.ContextSave.angleRadius,this.id,false,function(){r=GUI.Kbd.getVal();GUI.ctx_set_angleradius(n,true);GUI.ContextSave.angleRadius=r})});if($("#point-coord-x-field").disabled!="disabled"){$("#point-coord-x-field").bind(GUI.click_event,function(){GUI.Kbd.showKeyboardPanel(this.id,GUI.ContextSave.Xjc,this.id,false,function(){r=GUI.Kbd.getVal();GUI.ctx_set_xcoord(n,true);GUI.delight();GUI.highlight(n);GUI.ContextSave.Xjc=r})})}if($("#point-coord-y-field").disabled!="disabled"){$("#point-coord-y-field").bind(GUI.click_event,function(){GUI.Kbd.showKeyboardPanel(this.id,GUI.ContextSave.Yjc,this.id,false,function(){r=GUI.Kbd.getVal();GUI.ctx_set_ycoord(n,true);GUI.delight();GUI.highlight(n);GUI.ContextSave.Yjc=r})})}if(e.elType=="slider"){$("#sliderpoint1-coord-x-field").bind(GUI.click_event,function(){GUI.Kbd.showKeyboardPanel(this.id,GUI.ContextSave.p1x,this.id,false,function(){r=GUI.Kbd.getVal();GUI.ctx_set_point1(n,1,true);GUI.delight();GUI.highlight(n);GUI.ContextSave.p1x=r})});$("#sliderpoint1-coord-y-field").bind(GUI.click_event,function(){GUI.Kbd.showKeyboardPanel(this.id,GUI.ContextSave.p1y,this.id,false,function(){r=GUI.Kbd.getVal();GUI.ctx_set_point1(n,2,true);GUI.delight();GUI.highlight(n);GUI.ContextSave.p1y=r})});$("#sliderpoint2-coord-x-field").bind(GUI.click_event,function(){GUI.Kbd.showKeyboardPanel(this.id,GUI.ContextSave.p2x,this.id,false,function(){r=GUI.Kbd.getVal();GUI.ctx_set_point2(n,1,true);GUI.delight();GUI.highlight(n);GUI.ContextSave.p2x=r})});$("#sliderpoint2-coord-y-field").bind(GUI.click_event,function(){GUI.Kbd.showKeyboardPanel(this.id,GUI.ContextSave.p2y,this.id,false,function(){r=GUI.Kbd.getVal();GUI.ctx_set_point2(n,2,true);GUI.delight();GUI.highlight(n);GUI.ContextSave.p2y=r})});$("#slider-interval-a-field").bind("keyup",function(){r=$(this).val();GUI.ctx_set_interval(n,true,true);GUI.ContextSave.start=r});$("#slider-interval-b-field").bind("keyup",function(){r=$(this).val();GUI.ctx_set_interval(n,false,true);GUI.ContextSave.end=r})}$("#color-field").bind("keyup",function(){r=$(this).val();if(!$("#color-tab-stroke").hasClass("button-disabled")){GUI.ctx_set_strokeWidth(n);GUI.ContextSave.strokeWidth=r}else if(!$("#color-tab-fill").hasClass("button-disabled")){GUI.ctx_set_fillOpacity(n);GUI.ContextSave.fillOpacity=r/100}else{GUI.ctx_set_labelSize(n+"Label")}});$("#point-size-field").bind("keyup",function(){r=$(this).val();GUI.ctx_set_size(n);GUI.ContextSave.size=r});$("#image-size-field").bind("keyup",function(){r=$(this).val();GUI.ctx_set_scale(n);GUI.ContextSave.size=r});if(e.type==JXG.OBJECT_TYPE_TEXT){$("#measure-box").bind(GUI.click_event,function(){GUI.ctx_measure()})}$("#label-visible").bind(GUI.click_event,function(){if(e.type==JXG.OBJECT_TYPE_TEXT){GUI.ctx_set_visibility(n)}else{if(GUI.board.objects[n].visProp.visible===false)return;GUI.ctx_set_withLabel(n)}});$("#label-sticky").bind(GUI.click_event,function(){GUI.ctx_set_labelsticky(n)});$('[id^="color-tab"]').bind(GUI.click_event,function(){var e="";$('[id^="color-tab"]').addClass("button-disabled");$('[id^="color-tab"]').removeClass("button-selected");$(this).removeClass("button-disabled");$(this).addClass("button-selected");if($(this).attr("id").indexOf("fill")!=-1){$("#color-field-label").css("background-position","-362px -404px");t=JXG.rgba2rgbo(GUI.ContextSave.color["fill"]);r=100*GUI.ContextSave.fillOpacity;e="fill"}else{if($(this).attr("id").indexOf("label")!=-1){$("#color-field-label").css("background-position","-442px -404px");t=JXG.rgba2rgbo(GUI.ContextSave.color["labelstroke"]);r=GUI.ContextSave.labelSize;e="label"}else if($(this).attr("id").indexOf("stroke")!=-1){$("#color-field-label").css("background-position","-280px -482px");t=JXG.rgba2rgbo(GUI.ContextSave.color["stroke"]);r=GUI.ContextSave.strokeWidth;e="stroke"}}if(e!=="")GUI.contextPanelColor(JXG.hex2rgb(t[0]),t[1],e);o=GUI.getId("color-field");
+$("#"+o.id).trigger(GUI.click_event);if(!r.toFixed)return;if(GUI.Kbd.input==o)GUI.Kbd.setVal(r.toFixed(0),true);else o.value=r.toFixed(0)});$("#color-tab-stroke").trigger(GUI.click_event);$('[class*="color-palette-c"]').bind(GUI.click_event,function(){if($(this).attr("id")=="color-palette-none")s="transparent";else{s=$(this).css("background-color");if(s.length>7)s=JXG.rgba2rgbo(s)[0]}$("#color-field").css("background-color",s);GUI.ctx_set_color(n)});$('[id^="status-"]').bind(GUI.click_event,function(){if($(this).attr("id").indexOf("box")==-1)return;if($(this).attr("id").indexOf("fix")!=-1){if(e.elementClass!=JXG.OBJECT_CLASS_POINT&&e.type!=JXG.OBJECT_TYPE_CURVE&&e.type!=JXG.OBJECT_TYPE_ANGLE&&e.type!=JXG.OBJECT_TYPE_SECTOR||e.type==JXG.OBJECT_TYPE_POINT||e.type==JXG.OBJECT_TYPE_GLIDER)GUI.ctx_set_fixed(n)}else if($(this).attr("id").indexOf("trace")!=-1){if(e.type!=JXG.OBJECT_TYPE_CURVE&&e.type!=JXG.OBJECT_TYPE_TEXT)GUI.ctx_set_trace(n)}});var a=function(e,t,r){o=GUI.getId(t);if(GUI.Kbd.input==o)i=GUI.Kbd.getVal();else i=o.value;i=parseInt(i);if(e)i=i+GUI.incrementValue;else i++;if(GUI.Kbd.input==o)GUI.Kbd.setVal(i.toFixed(0),true);else o.value=i.toFixed(0);r(n)};var l=function(e,t,r){o=GUI.getId(t);if(GUI.Kbd.input==o)i=GUI.Kbd.getVal();else i=o.value;i=parseInt(i);if(e)i=i-GUI.incrementValue;else i--;if(GUI.Kbd.input==o)GUI.Kbd.setVal(i.toFixed(0),true);else o.value=i.toFixed(0);r(n)};$("#color-field-plus").on(GUI.down_event,function(){r="color-field";GUI.Kbd.close();GUI.incrementValue=10;a(false,r,function(){if(!$("#color-tab-stroke").hasClass("button-disabled")){if(e.type==JXG.OBJECT_TYPE_TEXT)GUI.ctx_set_labelSize(n+"Label");else GUI.ctx_set_strokeWidth(n)}else if(!$("#color-tab-fill").hasClass("button-disabled")){GUI.ctx_set_fillOpacity(n)}else{GUI.ctx_set_labelSize(n+"Label")}});GUI.intervalTimer=window.setInterval(function(){a(true,r,function(){if(!$("#color-tab-stroke").hasClass("button-disabled")){if(e.type==JXG.OBJECT_TYPE_TEXT)GUI.ctx_set_labelSize(n+"Label");else GUI.ctx_set_strokeWidth(n)}else if(!$("#color-tab-fill").hasClass("button-disabled")){GUI.ctx_set_fillOpacity(n)}else{GUI.ctx_set_labelSize(n+"Label")}})},500)});$("#color-field-plus").on(GUI.up_event,function(){window.clearInterval(GUI.intervalTimer)});$("#color-field-minus").on(GUI.down_event,function(){r="color-field";GUI.Kbd.close();GUI.incrementValue=10;l(false,r,function(){if(!$("#color-tab-stroke").hasClass("button-disabled")){if(e.type==JXG.OBJECT_TYPE_TEXT)GUI.ctx_set_labelSize(n+"Label");else GUI.ctx_set_strokeWidth(n)}else if(!$("#color-tab-fill").hasClass("button-disabled")){GUI.ctx_set_fillOpacity(n)}else{GUI.ctx_set_labelSize(n+"Label")}});GUI.intervalTimer=window.setInterval(function(){l(true,r,function(){if(!$("#color-tab-stroke").hasClass("button-disabled")){if(e.type==JXG.OBJECT_TYPE_TEXT)GUI.ctx_set_labelSize(n+"Label");else GUI.ctx_set_strokeWidth(n)}else if(!$("#color-tab-fill").hasClass("button-disabled")){GUI.ctx_set_fillOpacity(n)}else{GUI.ctx_set_labelSize(n+"Label")}})},500)});$("#color-field-minus").on(GUI.up_event,function(){window.clearInterval(GUI.intervalTimer)});$("#point-size-minus").on(GUI.down_event,function(){r="point-size-field";GUI.Kbd.close();GUI.incrementValue=10;l(false,r,GUI.ctx_set_size);GUI.intervalTimer=window.setInterval(function(){l(true,r,GUI.ctx_set_size)},500)});$("#point-size-minus").on(GUI.up_event,function(){window.clearInterval(GUI.intervalTimer)});$("#point-size-plus").on(GUI.down_event,function(){r="point-size-field";GUI.Kbd.close();GUI.incrementValue=10;a(false,r,GUI.ctx_set_size);GUI.intervalTimer=window.setInterval(function(){a(true,r,GUI.ctx_set_size)},500)});$("#point-size-plus").on(GUI.up_event,function(){window.clearInterval(GUI.intervalTimer)});$("#image-size-minus").on(GUI.down_event,function(){r="image-size-field";GUI.Kbd.close();GUI.incrementValue=10;l(false,r,GUI.ctx_set_scale);GUI.intervalTimer=window.setInterval(function(){l(true,r,GUI.ctx_set_scale)},500)});$("#image-size-minus").on(GUI.up_event,function(){window.clearInterval(GUI.intervalTimer)});$("#image-size-plus").on(GUI.down_event,function(){r="image-size-field";GUI.Kbd.close();GUI.incrementValue=10;a(false,r,GUI.ctx_set_scale);GUI.intervalTimer=window.setInterval(function(){a(true,r,GUI.ctx_set_scale)},500)});$("#image-size-plus").on(GUI.up_event,function(){window.clearInterval(GUI.intervalTimer)});$("#point-style-button-circle").bind(GUI.click_event,function(){$("#point-style-button-circle").addClass("button-selected");$("#point-style-button-square").removeClass("button-selected");$("#point-style-button-cross").removeClass("button-selected");$("#point-style-button-plus").removeClass("button-selected");GUI.ctx_set_face(n)});$("#point-style-button-square").bind(GUI.click_event,function(){$("#point-style-button-circle").removeClass("button-selected");$("#point-style-button-square").addClass("button-selected");$("#point-style-button-cross").removeClass("button-selected");$("#point-style-button-plus").removeClass("button-selected");GUI.ctx_set_face(n)});$("#point-style-button-cross").bind(GUI.click_event,function(){$("#point-style-button-circle").removeClass("button-selected");$("#point-style-button-square").removeClass("button-selected");$("#point-style-button-cross").addClass("button-selected");$("#point-style-button-plus").removeClass("button-selected");GUI.ctx_set_face(n)});$("#point-style-button-plus").bind(GUI.click_event,function(){$("#point-style-button-circle").removeClass("button-selected");$("#point-style-button-square").removeClass("button-selected");$("#point-style-button-cross").removeClass("button-selected");$("#point-style-button-plus").addClass("button-selected");GUI.ctx_set_face(n)});if(e.elementClass==JXG.OBJECT_CLASS_LINE){if(e.point1)if(GUI.showHidden&&e.point1.guiVisProp&&e.point1.guiVisProp.visible||!GUI.showHidden&&e.point1.getAttribute("visible")){$("#line-button-first").bind(GUI.click_event,function(){if($("#line-button-first").hasClass("button-selected"))$("#line-button-first").removeClass("button-selected");else $("#line-button-first").addClass("button-selected");GUI.ctx_set_straightfirst(n)});$("#line-button-arrow-first").bind(GUI.click_event,function(){if($("#line-button-arrow-first").hasClass("button-selected"))$("#line-button-arrow-first").removeClass("button-selected");else $("#line-button-arrow-first").addClass("button-selected");GUI.ctx_set_arrowfirst(n)})}if(e.point2)if(GUI.showHidden&&e.point2.guiVisProp&&e.point2.guiVisProp.visible||!GUI.showHidden&&e.point2.getAttribute("visible")){$("#line-button-last").bind(GUI.click_event,function(){if($("#line-button-last").hasClass("button-selected"))$("#line-button-last").removeClass("button-selected");else $("#line-button-last").addClass("button-selected");GUI.ctx_set_straightlast(n)});$("#line-button-arrow-last").bind(GUI.click_event,function(){if($("#line-button-arrow-last").hasClass("button-selected"))$("#line-button-arrow-last").removeClass("button-selected");else $("#line-button-arrow-last").addClass("button-selected");GUI.ctx_set_arrowlast(n)})}if(e.point1&&e.point2){$("#line-related-measure-box").bind(GUI.click_event,function(){GUI.ctx_measureDistance(n)})}}else if(e.type==JXG.OBJECT_TYPE_ANGLE){$("#angle-related-measure-box").bind(GUI.click_event,function(){GUI.ctx_measureAngle(n)});$("#angle-button-rightangle-box").bind(GUI.click_event,function(){GUI.ctx_set_dotvisibility(n)})}else if(e.type==JXG.OBJECT_TYPE_SECTOR){$("#sector-related-measure-box").bind(GUI.click_event,function(){GUI.ctx_measureSector(n)})}},contextEdit:function(e){var t,o,r,s,i;GUI.deleteDraftcurves();if(e===0){GUI.showPanelHTML("sketchometry.com",GUI.ctxPosProps,false);return}if(GUI.board.objects[e].id.toString().search(/Label$/)!=-1)e=GUI.board.objects[e].id.replace(/Label/,"");$("#id").val(e);if(GUI.Settings.get("layouttop")=="Bottom")GUI.contextPanelReposition();i=GUI.board.objects[e];GUI.highlight(e);GUI.ContextSave.type=i.type;GUI.ContextSave.size=i.getAttribute("size");GUI.ContextSave.face=i.getAttribute("face");GUI.ContextSave.withLabel=i.getAttribute("withLabel");GUI.ContextSave.fillOpacity=i.getAttribute("fillOpacity");GUI.ContextSave.radius=GUI.ContextSave.Xjc=GUI.ContextSave.Yjc=0;if(i.slideObject)GUI.ContextSave.slideObjectId=i.slideObject.id;if(GUI.showHidden){if(i.elementClass==JXG.OBJECT_CLASS_CIRCLE)GUI.ContextSave.ccvisible=i.midpoint.guiVisProp.visible;if(!i.guiVisProp)i.guiVisProp={visible:i.getAttribute("visible")};GUI.ContextSave.visible=i.guiVisProp.visible;if(!i.guiVisProp)i.guiVisProp={strokewidth:i.getAttribute("strokewidth")};GUI.ContextSave.strokewidth=i.guiVisProp.strokewidth}else{if(i.elementClass==JXG.OBJECT_CLASS_CIRCLE)GUI.ContextSave.ccvisible=i.midpoint.getAttribute("visible");GUI.ContextSave.visible=i.getAttribute("visible")}if(i.elementClass!=JXG.OBJECT_CLASS_LINE&&i.elementClass!=JXG.OBJECT_CLASS_OTHER)$("#fillObjects").removeClass("not-displayed");else $("#fillObjects").addClass("not-displayed");if(GUI.ContextSave.withLabel){$("#labeledObjects").removeClass("not-displayed");$("#label-sticky").removeAttr("disabled")}else{$("#labeledObjects").addClass("not-displayed");$("#label-sticky").attr("disabled","disabled")}if(i.type==JXG.OBJECT_TYPE_POINT||i.type==JXG.OBJECT_TYPE_GLIDER)$("#point-glider").removeClass("not-displayed");else $("#point-glider").addClass("not-displayed");if(i.elementClass==JXG.OBJECT_CLASS_POINT){$("#property-point").removeClass("not-displayed")}else $("#property-point").addClass("not-displayed");if(i.type==JXG.OBJECT_TYPE_POINT||i.type==JXG.OBJECT_TYPE_GLIDER||i.elementClass!=JXG.OBJECT_CLASS_POINT&&i.type!=JXG.OBJECT_TYPE_CURVE&&i.type!=JXG.OBJECT_TYPE_ANGLE&&i.type!=JXG.OBJECT_TYPE_SECTOR){$("#status-fix-box").removeClass("button-disabled")}else{$("#status-fix-box").addClass("button-disabled")}if(i.type!=JXG.OBJECT_TYPE_CURVE&&i.type!=JXG.OBJECT_TYPE_TEXT){$("#status-trace-box").removeClass("button-disabled")}else{$("#status-trace-box").addClass("button-disabled")}if(i.elementClass==JXG.OBJECT_CLASS_LINE){$("#property-line").removeClass("not-displayed");if(i.point1.getAttribute("visible")&&i.point2.getAttribute("visible"))$("#line-related").removeClass("not-displayed");else $("#line-related").addClass("not-displayed")}else $("#property-line").addClass("not-displayed");if(i.elementClass==JXG.OBJECT_CLASS_CIRCLE){$("#property-circle").removeClass("not-displayed")}else $("#property-circle").addClass("not-displayed");if(i.type==JXG.OBJECT_TYPE_ANGLE||i.type==JXG.OBJECT_TYPE_SECTOR){$("#property-angle").removeClass("not-displayed");$("#angle-related").removeClass("not-displayed");if(i.type==JXG.OBJECT_TYPE_SECTOR){$("#sector-related-measure-box").removeClass("not-displayed");$("#measure-specific").removeClass("not-displayed");$("#angle-related-measure-box").addClass("not-displayed");$("#line-related-measure-box").addClass("not-displayed");$("#angle-specific").addClass("not-displayed")}else{$("#angle-related-measure-box").removeClass("not-displayed");$("#measure-specific").removeClass("not-displayed");$("#sector-related-measure-box").addClass("not-displayed");$("#line-related-measure-box").addClass("not-displayed");$("#angle-specific").removeClass("not-displayed");GUI.ContextSave.angleRadius=i.getAttribute("radius")}}else{$("#property-angle").addClass("not-displayed")}if(i.type!=JXG.OBJECT_TYPE_ANGLE)$("#angle-specfic").addClass("not-displayed");if(i.type==JXG.OBJECT_TYPE_TEXT){if(i.X&&typeof i.X.origin=="function"){GUI.ContextSave.Xjc=i.X.toString().sanitize()}else{GUI.ContextSave.Xjc=i.coords.usrCoords[1].toFixed(JXG.Options.trunclen).trimTrailZeroes()}if(i.Y&&typeof i.Y.origin=="function"){GUI.ContextSave.Yjc=i.Y.toString().sanitize()}else{GUI.ContextSave.Yjc=i.coords.usrCoords[2].toFixed(JXG.Options.trunclen).trimTrailZeroes()}}else if(i.elementClass==JXG.OBJECT_CLASS_POINT){if(i.XEval&&typeof i.XEval.origin=="function"){GUI.ContextSave.Xjc=i.XEval.toString().sanitize()}else{GUI.ContextSave.Xjc=i.coords.usrCoords[1].toFixed(JXG.Options.trunclen).trimTrailZeroes()}if(i.YEval&&typeof i.YEval.origin=="function"){GUI.ContextSave.Yjc=i.YEval.toString().sanitize()}else{GUI.ContextSave.Yjc=i.coords.usrCoords[2].toFixed(JXG.Options.trunclen).trimTrailZeroes()}}else if(i.type==JXG.OBJECT_TYPE_CIRCLE){if(JXG.exists(i.point2)){GUI.ContextSave.point2={usrCoords:i.point2.coords.usrCoords};$("#circle-radius").addClass("not-displayed")}else{$("#circle-radius").removeClass("not-displayed");if(i.updateRadius&&i.updateRadius.toString().sanitize()!="function () { return term; }"){GUI.ContextSave.radius=i.updateRadius.toString().sanitize();GUI.getId("circle-radius-field").disabled="disabled"}else{GUI.ContextSave.radius=i.radius;GUI.getId("circle-radius-field").disabled=""}}}GUI.ContextSave.radius=GUI.ContextSave.radius.toString().cleanTerm();GUI.ContextSave.Xjc=GUI.ContextSave.Xjc.toString().cleanTerm();GUI.ContextSave.Yjc=GUI.ContextSave.Yjc.toString().cleanTerm();$("#point-coord-x-field").val(GUI.ContextSave.Xjc);$("#point-coord-y-field").val(GUI.ContextSave.Yjc);$("#point-size-field").val(GUI.ContextSave.size);if(GUI.ContextSave.radius==parseFloat(GUI.ContextSave.radius))$("#circle-radius-field").val(parseFloat(GUI.ContextSave.radius).toFixed(JXG.Options.trunclen).trimTrailZeroes());else $("#circle-radius-field").val(GUI.ContextSave.radius);$("#point-style-button-circle").removeClass("button-selected");$("#point-style-button-square").removeClass("button-selected");$("#point-style-button-cross").removeClass("button-selected");$("#point-style-button-plus").removeClass("button-selected");if(i.elementClass==JXG.OBJECT_CLASS_POINT){var n=JXG.normalizePointFace(GUI.ContextSave.face);if(n=="o")$("#point-style-button-circle").addClass("button-selected");else if(n=="[]")$("#point-style-button-square").addClass("button-selected");else if(n=="x")$("#point-style-button-cross").addClass("button-selected");else if(n=="+")$("#point-style-button-plus").addClass("button-selected");else alert("no such face!");if(i.type==JXG.OBJECT_TYPE_INTERSECTION||i.elType=="slider"){GUI.getId("point-coord-x-field").disabled="disabled";$("#point-coord-x-field").addClass("button-disabled");GUI.getId("point-coord-y-field").disabled="disabled";$("#point-coord-y-field").addClass("button-disabled")}else{GUI.getId("point-coord-x-field").disabled="";$("#point-coord-x-field").removeClass("button-disabled");GUI.getId("point-coord-y-field").disabled="";$("#point-coord-y-field").removeClass("button-disabled")}}if(i.type==JXG.OBJECT_TYPE_POINT)$("#point-glider-button-free").addClass("button-selected");if(i.type==JXG.OBJECT_TYPE_GLIDER)$("#point-glider-button-glider").addClass("button-selected");if(GUI.ContextSave.visible){if(i.type==JXG.OBJECT_TYPE_TEXT){$("#textInput").removeClass("button-disabled");$("#label-visible").addClass("button-selected")}}else{if(i.type==JXG.OBJECT_TYPE_TEXT){$("#textInput").addClass("button-disabled");$("#label-visible").removeClass("button-selected")}}if(GUI.ContextSave.withLabel){if(i.type!=JXG.OBJECT_TYPE_TEXT){$("#textInput").removeClass("button-disabled");$("#label-visible").addClass("button-selected")}}else{if(i.type!=JXG.OBJECT_TYPE_TEXT){$("#label-visible").removeClass("button-selected");$("#textInput").addClass("button-disabled")}}if(GUI.ContextSave.angleRadius==parseFloat(GUI.ContextSave.angleRadius))$("#angle-radius-field").val(parseFloat(GUI.ContextSave.angleRadius).toFixed(JXG.Options.trunclen));else $("#angle-radius-field").val(GUI.ContextSave.angleRadius);$("#line-related-measure-box").addClass("not-displayed");$("#angle-related-measure-box").addClass("not-displayed");$("#sector-related-measure-box").addClass("not-displayed");if(i.type==JXG.OBJECT_TYPE_IMAGE){$("#color-group").addClass("not-displayed");$("#property-image").removeClass("not-displayed");$("#image-size-field").val(GUI.ContextSave.scale=i.usrSize[0])}else{$("#color-group").removeClass("not-displayed");$("#property-image").addClass("not-displayed")}if(i.elType=="slider"){$("#property-slider").removeClass("not-displayed");$("#status-group").addClass("not-displayed");$("#point-coord").addClass("not-displayed");GUI.getId("slider-interval-a-field").value=GUI.ContextSave.start=i._smin;GUI.getId("slider-interval-b-field").value=GUI.ContextSave.end=i._smax;GUI.getId("sliderpoint1-coord-x-field").value=GUI.ContextSave.p1x=i.point1.coords.usrCoords[1];GUI.getId("sliderpoint1-coord-y-field").value=GUI.ContextSave.p1y=i.point1.coords.usrCoords[2];GUI.getId("sliderpoint2-coord-x-field").value=GUI.ContextSave.p2x=i.point2.coords.usrCoords[1];GUI.getId("sliderpoint2-coord-y-field").value=GUI.ContextSave.p2y=i.point2.coords.usrCoords[2]}else{$("#property-slider").addClass("not-displayed");$("#status-group").removeClass("not-displayed");$("#point-coord").removeClass("not-displayed")}if(i.type==JXG.OBJECT_TYPE_TEXT){$("#label-sticky-box").addClass("not-displayed");GUI.ContextSave.strokeWidth=parseInt($("#"+i.rendNode.id).css("font-size"));if(i.visProp.castext&&i.htmlStr!=i.visProp.castext)GUI.ContextSave.text=i.visProp.castext.toString().sanitize();else GUI.ContextSave.text=i.htmlStr;GUI.ContextSave.text=GUI.ContextSave.text.toString().cleanTerm();$("#textInput").val(GUI.ContextSave.text);$("#measure-box").removeClass("not-displayed");$("#measure-specific").removeClass("not-displayed")}else{$("#label-sticky-box").removeClass("not-displayed");GUI.ContextSave.strokeWidth=i.getAttribute("strokeWidth");GUI.ContextSave.labelName=i.name;$("#textInput").val(GUI.ContextSave.labelName);$("#measure-box").addClass("not-displayed");$("#measure-specific").addClass("not-displayed");$("#angle-related-measure-box").addClass("not-displayed");$("#sector-related-measure-box").addClass("not-displayed");$("#line-related-measure-box").addClass("not-displayed")}$("#color-field").val(GUI.ContextSave.strokeWidth);if(i.getAttribute("fixed")){$("#status-fix").addClass("button-selected");$("#status-fix-box").addClass("button-selected")}else{$("#status-fix").removeClass("button-selected");$("#status-fix-box").removeClass("button-selected")}if(i.getAttribute("trace")){$("#status-trace").addClass("button-selected");$("#status-trace-box").addClass("button-selected")}else{$("#status-trace").removeClass("button-selected");$("#status-trace-box").removeClass("button-selected")}if(i.label&&i.label.rendNode){GUI.ContextSave.labelSize=parseInt($("#"+i.label.rendNode.id).css("font-size"));GUI.ContextSave.color["labelstroke"]=JXG.rgbo2rgba(i.label.getAttribute("strokeColor"),i.label.getAttribute("strokeOpacity")).toLowerCase()}else{GUI.ContextSave.labelSize=12;GUI.ContextSave.color["labelstroke"]=GUI.board.options.text.strokeColor}if(GUI.ContextSave.color["labelstroke"]=="none")GUI.ContextSave.color["labelstroke"]="transparent";else{t=JXG.rgba2rgbo(GUI.ContextSave.color["labelstroke"]);o=GUI.bestColorDivIndex(t[0]);r=$('[class*="color-palette"]').eq(o).css("background-color");GUI.ContextSave.color["labelstroke"]=JXG.rgbo2rgba(t[0]=JXG.rgb2hex(r),t[1])}GUI.ContextSave.color["fill"]=JXG.rgbo2rgba(i.getAttribute("fillColor"),GUI.ContextSave.fillOpacity);if(GUI.ContextSave.color["fill"]=="none")GUI.ContextSave.color["fill"]="transparent";else{t=JXG.rgba2rgbo(GUI.ContextSave.color["fill"]);o=GUI.bestColorDivIndex(t[0]);r=$('[class*="color-palette"]').eq(o).css("background-color");GUI.ContextSave.color["fill"]=JXG.rgbo2rgba(JXG.rgb2hex(r),t[1])}GUI.ContextSave.color["highlightstroke"]=JXG.rgbo2rgba(i.getAttribute("highlightstrokeColor"),i.getAttribute("highlightstrokeOpacity")).toLowerCase();if(GUI.ContextSave.color["highlightstroke"]=="none")GUI.ContextSave.color["highlightstroke"]="transparent";else{t=JXG.rgba2rgbo(GUI.ContextSave.color["highlightstroke"]);o=GUI.bestColorDivIndex(t[0]);r=$('[class*="color-palette"]').eq(o).css("background-color");GUI.ContextSave.color["highlightstroke"]=JXG.rgbo2rgba(JXG.rgb2hex(r),t[1])}GUI.ContextSave.color["highlightfill"]=JXG.rgbo2rgba(i.getAttribute("highlightfillColor"),i.getAttribute("highlightfillOpacity")).toLowerCase();if(GUI.ContextSave.color["highlightfill"]=="none")GUI.ContextSave.color["highlightfill"]="transparent";else{t=JXG.rgba2rgbo(GUI.ContextSave.color["highlightfill"]);o=GUI.bestColorDivIndex(t[0]);r=$('[class*="color-palette"]').eq(o).css("background-color");GUI.ContextSave.color["highlightfill"]=JXG.rgbo2rgba(JXG.rgb2hex(r),t[1])}GUI.ContextSave.color["stroke"]=JXG.rgbo2rgba(i.getAttribute("strokeColor"),i.getAttribute("strokeOpacity")).toLowerCase();if(GUI.ContextSave.color["stroke"]=="none")GUI.ContextSave.color["stroke"]="transparent";else{t=JXG.rgba2rgbo(GUI.ContextSave.color["stroke"]);o=GUI.bestColorDivIndex(t[0]);r=$('[class*="color-palette"]').eq(o).css("background-color");GUI.ContextSave.color["stroke"]=JXG.rgbo2rgba(JXG.rgb2hex(r),t[1])}if(i.elementClass==JXG.OBJECT_CLASS_LINE){$("#line-related-measure-box").removeClass("not-displayed");if(GUI.ContextSave.straightfirst=i.getAttribute("straightfirst"))$("#line-button-first").addClass("button-selected");else $("#line-button-first").removeClass("button-selected");if(GUI.ContextSave.straightlast=i.getAttribute("straightlast"))$("#line-button-last").addClass("button-selected");else $("#line-button-last").removeClass("button-selected");if(GUI.ContextSave.arrowfirst=i.getAttribute("firstarrow"))$("#line-button-arrow-first").addClass("button-selected");else $("#line-button-arrow-first").removeClass("button-selected");if(GUI.ContextSave.arrowlast=i.getAttribute("lastarrow"))$("#line-button-arrow-last").addClass("button-selected");else $("#line-button-arrow-last").removeClass("button-selected");if(i.point1.visProp.priv){$("#line-button-first").addClass("button-disabled");$("#line-button-arrow-first").addClass("button-disabled")}else{$("#line-button-first").removeClass("button-disabled");$("#line-button-arrow-first").removeClass("button-disabled")}if(i.point2.visProp.priv){$("#line-button-last").addClass("button-disabled");$("#line-button-arrow-last").addClass("button-disabled")}else{$("#line-button-last").removeClass("button-disabled");$("#line-button-arrow-last").removeClass("button-disabled")}if(i.point1.visProp.priv||i.point2.visProp.priv)$("#measure-specific").addClass("not-displayed");else $("#measure-specific").removeClass("not-displayed")}if(i.type==JXG.OBJECT_TYPE_CURVE)$("#plot-specific").removeClass("not-displayed");else $("#plot-specific").addClass("not-displayed");GUI.addTooltips();GUI.contextBindHandlers(i);GUI.showPropertyPanel("props",false);GUI.Kbd.close()},contextShowsProps:function(){if($("#control-boardprop").hasClass("button-selected")){if($("#id")&&typeof $("#id").val()!="undefined")return $("#id").val();return-1}else return 0},contextUpdate:function(){if(GUI.ctx_curr_coords!=null&&$("#control-boardprop").hasClass("button-selected")&&!$("#ctxObjects").hasClass("not-displayed")){GUI.contextMenu(GUI.ctx_curr_coords)}},showPanelHTML:function(e,t,o){if(typeof o=="undefined")o=false;GUI.contextUnbindHandlers();if(o){$("#ctxObjectsExtra").html(e+"<br>")}else{$("#ctxObjects").html(e)}GUI.showPropertyPanel("objects",o);GUI.showPanel(true,t);if(t==GUI.ctxPosProps){$("#control-boardprop").addClass("button-selected");$("#control-boardprop-box").addClass("button-selected")}return true},contextMenu:function(e){var t,o,r=[];GUI.showPanel(false,0);o=JXG.Draw.findHittedObjs(e.scrCoords[1],e.scrCoords[2],GUI.board,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_CIRCLE,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_CURVE,JXG.OBJECT_CLASS_AREA,JXG.OBJECT_CLASS_OTHER],[],false,0);for(t=0;t<o.length;t++)if(o[t].elementClass==JXG.OBJECT_CLASS_POINT||o[t].type==JXG.OBJECT_TYPE_ANGLE||o[t].type==JXG.OBJECT_TYPE_SECTOR)r.push(o[t]);if(r.length>0)o=r;if(o.length!==0){if(o.length==1){GUI.contextEdit(o[0].id)}else{r=[];for(t=0;t<o.length;t++)if(GUI.isStandardObj(o[t]))r.push(o[t]);if(r.length>0){if(r.length==1){GUI.contextEdit(o[0].id)}else{GUI.delight();GUI.createSelectDialogCtx(r,function(e){GUI.contextEdit(e)},GUI.ctxPosProps,false)}}}}else{GUI.delight();GUI.showPropertyPanel("board",false)}GUI.showPanel(true,GUI.ctxPosProps);$("#control-boardprop").addClass("button-selected");$("#control-boardprop-box").addClass("button-selected");return false}});GUI.Dialog=function(e,t,o,r,s,i,n){var a,l,d,c,u=false,G=document.createElement("div");if(GUI.dialog[e]!=null)GUI.dialog[e].removeDialog();for(var f in GUI.dialog)if(GUI.dialog.hasOwnProperty(f))if(GUI.dialog[f]!=null)GUI.dialog[f].removeDialog();this.id=e;G.setAttribute("id",e);G.setAttribute("class","dialog");G.setAttribute("data-role","none");a='<div id="dlg-header" class="center">';a+=' <div id="dlg-header-left" class="fleft"></div>';a+=' <div id="dlg-header-right" class="fright"></div>';a+=' <div id="dlg-header-middle" class="nobr"><nobr>'+o+"</nobr></div>";a+="</div>";a+='<div id="dlg-content">';if(typeof t!="undefined")a+=t;a+="</div>";G.innerHTML=a;document.body.appendChild(G);GUI.dialog[e]=this;JXG.addEvent(document,GUI.move_event,function(t){if(GUI.dialog[e]==null)JXG.removeEvent(document,GUI.move_event,arguments.callee,GUI);else GUI.dialog[e].move(t)},GUI);JXG.addEvent(document,GUI.up_event,function(t){if(GUI.dialog[e]==null)JXG.removeEvent(document,GUI.up_event,arguments.callee,GUI);else GUI.dialog[e].up()},GUI);l=$("#"+e+" div#dlg-header-right");l.bind(GUI.click_event,function(){if(GUI.dialog[e]==null)l.unbind(GUI.down_event,arguments.callee);else GUI.dialog[e].removeDialog()});l=$("#"+e+" div#dlg-header-middle");l.bind(GUI.down_event,function(t){if(GUI.dialog[e]==null)l.unbind(GUI.down_event,arguments.callee);else GUI.dialog[e].down(t)});$("#"+e).css("min-width",90+parseInt(l.css("width"))+"px");this.fitContent();d=c="";if(typeof r!="undefined"){if(r.scrCoords){r=r.scrCoords;r.splice(0,1)}if(r[0]!==0||r[1]!==0){if(r[0]!==0)c+="left:"+(r[0]+35)+"px; ";if(r[1]!==0)c+="top:"+r[1]+"px; "}else u=true;if(typeof s!="undefined"){if(s[0]!==0)d+="width:"+s[0]+"px; ";if(s[1]!==0)d+="height:"+s[1]+"px; ";if(typeof i!="undefined"){this.callback_param=i;this.callback=n}}}else u=true;if(d!=="")G.setAttribute("style",d);if(u){if(typeof GUI.dialogLastPos[e]!="undefined"&&typeof GUI.dialogLastPos[e][1]!="undefined")c="left:"+GUI.dialogLastPos[e][0]+"px; top:"+GUI.dialogLastPos[e][1]+"px;";else{var I,p;I=window.innerWidth-$("#"+e).outerWidth();I=parseInt(I/2);p=window.innerHeight-$("#"+e).outerHeight();p=parseInt(p/2);c="left:"+I+"px; top:"+p+"px;"}}d+=c;if(d!=="")G.setAttribute("style",d)};JXG.extend(GUI.Dialog.prototype,{id:null,callback_param:null,callback:null,down_state:false,offsetX:0,offsetY:0,fitContent:function(){var e=parseInt(window.screen.height);if($("#gallery").css("display")!="none")e=parseInt(document.body.offsetHeight);$("#"+this.id+" #dialog_content").css("max-height",e-(parseInt($("#"+this.id).css("top"))+$("#dlg-header").outerHeight())-60+"px")},removeDialog:function(e){if(this.id==null)return;var t=$("#"+this.id);GUI.dialogLastPos[this.id]=new Array(parseInt(t.css("left")),parseInt(t.css("top")));if((typeof e=="undefined"||e===false)&&GUI.dialog[this.id].callback_param!=null)GUI.dialog[this.id].callback(GUI.dialog[this.id].callback_param);$("#"+this.id).find("*").unbind();if(this.id=="confirm")$("#gui").unbind();if(this.id!=null){document.body.removeChild(GUI.getId(this.id));GUI.dialog[this.id]=null;this.id=null}$("#modalWindow").addClass("not-displayed")},down:function(e){if(this.id==null)return;var t=$("#"+this.id),o=GUI.getCoords(e);GUI.dialog[this.id].down_state=true;GUI.dialog[this.id].offsetX=parseInt(t.css("left"))-o.scrCoords[1];GUI.dialog[this.id].offsetY=parseInt(t.css("top"))-o.scrCoords[2];if(e&&e.preventDefault){e.preventDefault()}else{window.event.returnValue=false}},up:function(){if(this.id==null)return;GUI.dialog[this.id].down_state=false;GUI.dialog[this.id].offsetX=0;GUI.dialog[this.id].offsetY=0},move:function(e){if(this.id==null)return;var t=$("#"+this.id);if(this.down_state){var o,r,s,i,n=GUI.getCoords(e);o=n.scrCoords[1];r=n.scrCoords[2];if(JXG.Options.device=="pc"){o+=this.offsetX;r+=this.offsetY}if(o<0)o=0;if(r<0)r=0;if($("#gallery").css("display")=="none"){s=parseInt(GUI.board.canvasWidth);i=parseInt(GUI.board.canvasHeight)}else{s=parseInt(document.body.offsetWidth);i=parseInt(document.body.offsetHeight)}if(o>s)o=s;if(r>i-90)r=i-90;t.css("left",o);t.css("top",r);GUI.dialogLastPos[this.id]=new Array(o,r);this.fitContent()}}});JXG.extend(GUI,{confirm:function(e,t,o){var r="",s='<div class="center">'+e+"</div>";if(t)s+=' &nbsp; <input id="confirmInput" size="30">';s+='<div class="tspacer center"><button id="confirmOk">Ok</button>';if(typeof o!="undefined")s+=' &nbsp; <button id="confirmCancel">Cancel</button>';s+="</div>";$("#confirm #confirmInput").unbind();$("#confirm #confirmOk").unbind();$("#confirm #confirmCancel").unbind();$("#modalWindow").removeClass("not-displayed");new GUI.Dialog("confirm",s,r,[0,0],[280,0],0,function(e){});$("#confirm #confirmOk").addClass("button-selected");$("#confirm #confirmCancel").addClass("button-selected");$("#confirm #confirmCancel").bind(GUI.click_event,function(e){GUI.dialog["confirm"].removeDialog();e.preventDefault()});$("#confirm #confirmOk").bind(GUI.click_event,function(e){if(typeof o=="function")o();GUI.dialog["confirm"].removeDialog();e.preventDefault()});$("#gui").unbind();$("#gui").bind("keyup",function(e){var t;e=e||window.event;t=e.keyCode||e.code;if(t==13){if(typeof o=="function")o()}GUI.dialog["confirm"].removeDialog();e.preventDefault()})},alert:function(e){GUI.confirm(e,false)}});JXG.extend(GUI,{select:function(e,t,o,r,s){var i,n,a,l;if(typeof o=="undefined")o=false;if(typeof r!="undefined"&&r!=null)n=r;else n=GUI.getCoords(e);switch(t){case"place":GUI.selection.push(n.usrCoords.slice(1));if(s)s();break;case"point":i=JXG.Draw.findHittedObjs(n.scrCoords[1],n.scrCoords[2],GUI.board,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_POINT],[]);if(i.length==1){GUI.Audio.play("plastic");GUI.selection.push(i[0]);GUI.highlight(i[0].id,false);if(s)s()}else if(i.length>1){GUI.createSelectDialogCtx(i,function(e){GUI.selection.push(GUI.board.objects[e]);GUI.showPanel(false,0);if(s)s();GUI.removeToolEvents(true)},GUI.ctxPosProps)}break;case"line":i=JXG.Draw.findHittedObjs(n.scrCoords[1],n.scrCoords[2],GUI.board,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_POINT],[]);for(a=0;a<i.length;a++){if((i[a].type==JXG.OBJECT_TYPE_LINE||i[a].type==JXG.OBJECT_TYPE_AXIS)&&i[a].point1.visProp.priv==false&&i[a].point2.visProp.priv==false){GUI.selection=[i[a]];GUI.highlight(i[a].id,false);return true}}break;case"polygon":i=JXG.Draw.findHittedObjs(n.scrCoords[1],n.scrCoords[2],GUI.board,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_AREA],[]);for(a=0;a<i.length;a++){if(i[a].type==JXG.OBJECT_TYPE_POLYGON){GUI.selection=[i[a]];GUI.highlight(i[a].id,false);return true}}break;case"sector":i=JXG.Draw.findHittedObjs(n.scrCoords[1],n.scrCoords[2],GUI.board,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_CURVE],[]);for(a=0;a<i.length;a++){if(i[a].type==JXG.OBJECT_TYPE_SECTOR){GUI.selection=[i[a]];GUI.highlight(i[a].id,false);return true}}break;case"slider":i=JXG.Draw.findHittedObjs(n.scrCoords[1],n.scrCoords[2],GUI.board,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_POINT],[]);for(a=0;a<i.length;a++){if(i[a].type==JXG.OBJECT_TYPE_GLIDER){for(l in i[a].childElements){if(i[a].childElements.hasOwnProperty(l)){if(i[a].childElements[l].elType=="segment"){GUI.selection.push(i[a]);GUI.highlight(i[a].id,false);return true}}}}}break;case"ablatePoint":i=JXG.Draw.findHittedObjs(n.scrCoords[1],n.scrCoords[2],GUI.board,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_POINT],[JXG.OBJECT_TYPE_CAS,JXG.OBJECT_TYPE_INTERSECTION]);if(i.length==1){GUI.Audio.play("plastic");GUI.selection.push(i[0]);GUI.highlight(i[0].id,false)}else if(i.length>1){GUI.alert("select dialog needed")}break;case"actionObject":i=JXG.Draw.findHittedObjs(n.scrCoords[1],n.scrCoords[2],GUI.board,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_CURVE,JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_CIRCLE,JXG.OBJECT_CLASS_OTHER,JXG.OBJECT_CLASS_AREA],[JXG.OBJECT_TYPE_ARROW,JXG.OBJECT_TYPE_AXIS,JXG.OBJECT_TYPE_AXISPOINT,JXG.OBJECT_TYPE_TICKS,JXG.OBJECT_TYPE_GRID]);
+if(i.length>0){if(i.length>1)o=true;for(a=0;a<i.length;a++){if(!i[a].visProp.islabel&&!i[a].visProp.priv){GUI.selection.push(i[a]);if(!o)GUI.highlight(i[a].id,true)}}}break;case"circleOrLine":i=JXG.Draw.findHittedObjs(n.scrCoords[1],n.scrCoords[2],GUI.board,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_CIRCLE],[]);for(a=0;a<i.length;a++){if(i[a].type==JXG.OBJECT_TYPE_LINE){GUI.selection.push(i[a]);GUI.highlight(i[a].id,true);return false}if(i[a].type==JXG.OBJECT_TYPE_CIRCLE){GUI.selection.push(i[a]);GUI.highlight(i[a].id,true);return true}}break;case"angleOrPoints":i=JXG.Draw.findHittedObjs(n.scrCoords[1],n.scrCoords[2],GUI.board,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_CURVE],[]);for(a=0;a<i.length;a++){if(i[a].type==JXG.OBJECT_TYPE_ANGLE){GUI.selection=[i[a]];GUI.highlight(i[a].id,true);return true}if(i[a].elementClass==JXG.OBJECT_CLASS_POINT){GUI.selection.push(i[a]);GUI.highlight(i[a].id,false);return false}}break;default:console.log("select call error!")}return false},generateHighlightCode:function(e){var t,o,r,s=GUI.id();r=GUI.board.objects[e];if(r.elementClass==JXG.OBJECT_CLASS_POINT){t=function(){GUI.board.create("point",[r.coords.usrCoords[1],r.coords.usrCoords[2]],{fillOpacity:GUI.opacityHidden,layer:1,id:s,name:"",priv:true,snaptogrid:false,withLabel:false,strokewidth:0,strokeColor:GUI.highlightColor,size:GUI.highlightSize})}}else if(r.elementClass==JXG.OBJECT_CLASS_CIRCLE){t=function(){GUI.board.create("circle",[r.midpoint.id,r],{strokeOpacity:GUI.opacityHidden,fillOpacity:GUI.opacityHidden,id:s,name:"",priv:true,withLabel:false,strokeWidth:GUI.highlightSize,strokeColor:GUI.highlightColor})}}else if(r.elementClass==JXG.OBJECT_CLASS_LINE){t=function(){GUI.board.create("line",[r.point1,r.point2.id],{strokeOpacity:GUI.opacityHidden,id:s,name:"",priv:true,withLabel:false,strokeWidth:GUI.highlightSize,strokeColor:GUI.highlightColor,straightFirst:r.visProp.straightfirst,straightLast:r.visProp.straightlast})}}else if(r.elementClass==JXG.OBJECT_CLASS_CURVE){t=function(){GUI.board.create("curve",JXG.coordsArrayToMatrix(r.points,true),{strokeOpacity:GUI.opacityHidden,id:s,name:"",priv:true,withLabel:false,strokeWidth:GUI.highlightSize,strokeColor:GUI.highlightColor})}}else{t=function(){}}o=function(){GUI.board.removeObject(s)};t();return o},highlight:function(e,t,o){var r,s=GUI.board.objects[e];if(s.visProp.priv===true)return;if(s.type==JXG.OBJECT_TYPE_POLYGON){for(r=0;r<s.borders.length;r++)GUI.highlight(s.borders[r].id,t,o)}else{for(r=0;r<GUI.highlightedObjs.length;r++)if(GUI.highlightedObjs[r].id===e)return;if(typeof t=="undefined"||t==true)GUI.delight();if(typeof o=="undefined")o=0;GUI.highlightedObjs.push({id:e,code:GUI.generateHighlightCode(e),cid:o})}},delight:function(e,t){var o,r,s=true;if(typeof e!="undefined"&&e!=0){var i=GUI.board.objects[e];if(i.type==JXG.OBJECT_TYPE_POLYGON){for(o=0;o<i.borders.length;o++)GUI.delight(i.borders[o].id,t)}else{for(r in GUI.highlightedObjs){if(GUI.highlightedObjs.hasOwnProperty(r)&&GUI.highlightedObjs[r].id==e){GUI.highlightedObjs[r].code();GUI.highlightedObjs[r]=GUI.highlightedObjs[GUI.highlightedObjs.length-1];GUI.highlightedObjs.length-=1;break}}}}else{s=false;if(typeof t=="undefined")t=-1;for(r in GUI.highlightedObjs){if(GUI.highlightedObjs.hasOwnProperty(r)&&(t==-1||GUI.highlightedObjs[r].cid==t)){s=true;GUI.highlightedObjs[r].code()}}GUI.highlightedObjs=[]}if(s){GUI.board.dehighlightAll();GUI.board.update()}},iss_highlight:function(e,t,o){GUI.board.create("intersection",[e,t,o],{id:"ISS",name:""});GUI.highlight(e,false);GUI.highlight(t,false);GUI.highlight("ISS",false)},iss_delight:function(){GUI.delight();if(GUI.board.objects["ISS"])GUI.board.removeObject(GUI.board.objects["ISS"])},highlightAndCollectPointsOnCurve:function(e,t,o){var r,s,i=o.options.precision.hasPoint,n;o.options.precision.hasPoint=t;for(var a in o.objects){if(o.objects.hasOwnProperty(a)){r=o.objects[a];n=false;if(r.elementClass==JXG.OBJECT_CLASS_POINT&&r.visProp.priv===false&&r.visProp.visible===true){if(e.lastLength<=0&&e.GUIpoints.length>0){s=e.GUIpoints[0].scrCoords;n=r.hasPoint(s[1],s[2])}if(!n){n=e.hasPoint(r.coords.scrCoords[1],r.coords.scrCoords[2],Math.max(0,e.lastLength))}if(n){if(!r.catchIdx||r.catchIdx==-1){r.catchIdx=e.GUIpoints.length-1}if(!JXG.exists(e.lastPointId)||e.lastPointId!=r.id){e.hittedPoints.push(r);GUI.Audio.play("bubble");GUI.Audio.vibrate(100);e.lastPointId=r.id}}}}}o.options.precision.hasPoint=i;e.hittedPoints=JXG.uniqueArray(e.hittedPoints).sort(function(e,t){return e.catchIdx>=t.catchIdx});e.lastLength=e.GUIpoints.length-1;for(var l=0;l<e.hittedPoints.length;l++)GUI.highlight(e.hittedPoints[l].id,false,e.uuid)},magnify:function(e){var t,o,r,s,i,n=GUI.board.renderer.svgRoot;n.setAttribute("xmlns","http://www.w3.org/2000/svg");n.setAttribute("width",GUI.board.canvasWidth);n.setAttribute("height",GUI.board.canvasHeight);r=(new XMLSerializer).serializeToString(n);o=GUI.getId("magnifier").getContext("2d");t=new Image(100,100);t.onload=function(){o.clearRect(0,0,300,300);s=GUI.board.getMousePosition(e);o.drawImage(t,Math.max(s[0]-50,0),Math.max(s[1]-50,0),100,100,0,0,300,150)};if($.browser.mozilla){i=JXG.Util.Base64.encode(r);t.src="data:image/svg+xml;base64,"+i}else{t.src="data:image/svg+xml,"+r}},getFuncDeps:function(e){var t,o;var r=[];for(o in{XEval:1,YEval:1,X:1,Y:1}){if(e.hasOwnProperty(o)&&e[o].origin){for(t in e[o].origin.deps){if(e[o].origin.deps.hasOwnProperty(t)){r.push(t)}}}}return JXG.uniqueArray(r)},getAllFuncDependencies:function(e){var t,o,r,s,i,n;while(1){r=JXG.uniqueArray(e);for(t in GUI.board.objects){s=[];if(GUI.board.objects.hasOwnProperty(t)){i=GUI.getFuncDeps(GUI.board.objects[t]);for(o=0;o<e.length;o++){if(GUI.collectionContains(i,e[o]))s.push(GUI.board.objects[t].id)}}for(o=0;o<s.length;o++)e.unshift(s[o])}e=JXG.uniqueArray(e);if(r.length==e.length)break}n=JXG.uniqueArray(e);return n},getAllDependencies:function(e){var t,o=[];if(JXG.keys(e.descendants,true).length===0)return o;for(t in e.descendants){if(e.descendants.hasOwnProperty(t)){o=o.concat(GUI.getAllDependencies(e.descendants[t]));if(e.descendants[t].id.search(/Label/)==-1)o.push(e.descendants[t].id)}}return JXG.uniqueArray(o)},getAllAncestors:function(e){var t=[];if(e&&e.ancestors){for(var o in e.ancestors)if(e.ancestors.hasOwnProperty(o))t=t.concat(GUI.getAllAncestors(e.ancestors[o]));t.push(e)}return JXG.uniqueArray(t)},getSelectionConstructSteps:function(){var e,t,o,r,s,i=[];while(1){r=JXG.uniqueArray(GUI.selection);for(t=0;t<r.length;t++){for(e=0;e<=GUI.unredo;e++){if(JXG.isInArray(GUI.step_del_exclude,e))continue;if(GUI.step_log[e].type==JXG.GENTYPE_DELETE){for(o=0;o<GUI.step_log[e].dest_sub_ids.length;o++)JXG.removeElementFromArray(GUI.selection,GUI.step_log[e].dest_sub_ids[o])}else if(GUI.step_log[e].dest_id==r[t]||GUI.collectionContains(GUI.step_log[e].src_ids,r[t])||GUI.collectionContains(GUI.step_log[e].dest_sub_ids,r[t])){if(GUI.step_log[e].type==JXG.GENTYPE_CTX_TYPE_G&&GUI.step_log[e].src_ids[1]==r[t]||GUI.step_log[e].type==JXG.GENTYPE_CTX_TYPE_P&&GUI.step_log[e].src_ids[1]==r[t]||GUI.step_log[e].type==JXG.GENTYPE_GLIDER&&GUI.step_log[e].src_ids[0]==r[t]){if(GUI.step_log[e].type==JXG.GENTYPE_GLIDER)s=GUI.step_log[e].dest_id;else s=GUI.step_log[e].src_ids[0];if(!GUI.board.objects[s].slideObject)continue}if(GUI.step_log[e].dest_sub_ids&&GUI.step_log[e].dest_sub_ids.length>0){for(o=0;o<GUI.step_log[e].dest_sub_ids.length;o++)if(GUI.step_log[e].dest_sub_ids[o]!==""&&GUI.step_log[e].dest_sub_ids[o]!==0)GUI.selection.push(GUI.step_log[e].dest_sub_ids[o])}if(GUI.step_log[e].dest_id!==0&&GUI.step_log[e].dest_id!=="")GUI.selection.push(GUI.step_log[e].dest_id);i.push(e)}}}GUI.selection=JXG.uniqueArray(GUI.selection);if(r.length==GUI.selection.length)break}return JXG.uniqueArray(i).sort(function(e,t){return e-t})},hideObjId:function(e){var t,o=GUI.board.objects[e];o.visProp.visible=o.guiVisProp.visible;if(o.type==JXG.OBJECT_TYPE_POLYGON){for(t=0;t<o.vertices.length-1;t++)GUI.hideObjId(o.vertices[t].id);for(t=0;t<o.borders.length;t++)GUI.hideObjId(o.borders[t].id)}GUI.ctx_set_visibility(o.id);if(o.visProp.visible){o.guiVisProp.visible=true;if(o.guiVisProp.fillOpacity)o.setAttribute({fillOpacity:o.guiVisProp.fillOpacity});if(o.guiVisProp.strokeOpacity)o.setAttribute({strokeOpacity:o.guiVisProp.strokeOpacity});if(o.guiVisProp.strokewidth)o.setAttribute({strokewidth:o.guiVisProp.strokewidth})}else{o.guiVisProp.visible=false;o.guiVisProp.strokewidth=o.getAttribute("strokewidth");o.guiVisProp.strokeOpacity=o.getAttribute("strokeOpacity");o.guiVisProp.fillOpacity=o.getAttribute("fillOpacity");if(o.guiVisProp.strokewidth==0)o.setAttribute({strokewidth:GUI.strokeHidden});o.setAttribute({strokeOpacity:GUI.opacityHidden});o.setAttribute({fillOpacity:GUI.opacityHidden});o.setAttribute({visible:true})}},removeObjId:function(e){var t,o=[];if(GUI.board.objects[e].type==JXG.OBJECT_TYPE_POLYGON)for(t in GUI.board.objects[e].borders)if(GUI.board.objects[e].borders.hasOwnProperty(t))o.push(GUI.board.objects[e].borders[t]);o.push(GUI.board.objects[e]);GUI.remove(o)},remove:function(e){var t,o,r,s=[],i=[];for(t in e){if(e.hasOwnProperty(t)){s.push(e[t].id)}}console.log("- Deletion -");GUI.selection=GUI.getAllFuncDependencies(s);r=GUI.getSelectionConstructSteps(false).sort(function(e,t){return e>t});console.log("Involved steps: "+r);for(o=0;o<r.length;o++){if(GUI.step_log[r[o]].dest_sub_ids)i=i.concat(GUI.step_log[r[o]].dest_sub_ids);if(GUI.step_log[r[o]].dest_id)i.push(GUI.step_log[r[o]].dest_id)}GUI.recordStep({type:JXG.GENTYPE_DELETE,args:{steps:JXG.deepCopy(r)},src_ids:[],dest_sub_ids:i,dest_id:0},true,false)},genPasteParams:function(e,t){var o,r=[],s=[];if(GUI.action=="copy"){var i,n,a,l=[],d=[];a=GUI.getSelectionConstructSteps();for(i in e){if(e.hasOwnProperty(i)){if(e[i]!=""){if(t)n={orig:e[i]};else n={orig:e[i],copy:GUI.id()};r.push(n)}}}for(o=0;o<r.length;o++)if(GUI.board.objects[r[o].orig].type==JXG.OBJECT_TYPE_POINT)l.push(r[o]);if(t)return{id_map:r,free_points:l};else{for(o=0;o<a.length;o++){s=s.concat(GUI.step_log[a[o]].src_ids);d=d.concat(GUI.step_log[a[o]].dest_sub_ids);if(GUI.step_log[a[o]].dest_id!==0)d.push(GUI.step_log[a[o]].dest_id)}for(o=0;o<l.length;o++)d.push(l[o].copy);s=JXG.uniqueArray(s);d=JXG.uniqueArray(d);return{steps:a,id_map:r,free_points:l,src_ids:s,dest_sub_ids:d}}}else if(GUI.action=="ablation"){var c;if(e.length==2){c=[e[1]]}else if(e.length==3){c=[e[0].id,e[1].id]}else console.log("such an ablation is not implemented!");for(o=0;o<e.length-1;o++)s.push(e[o].id);if(t){r.push({orig:s[0]});return{id_map:r,free_points:[]}}else{r.push({orig:s[0],copy:GUI.id()});return{id_map:r,free_points:[],src_ids:s,dest_sub_ids:[r[0].copy,GUI.id()],fids:c}}}else return{}},makeShadowCopy:function(e,t,o){var r,s;if(GUI.action=="standard")return"";s=GUI.genPasteParams(e,false);if(GUI.action=="copy"){GUI.shadowCopyStep=JXG.SketchReader.replaceStepDestIds({type:JXG.GENTYPE_COPY,src_ids:JXG.deepCopy(s.src_ids),dest_sub_ids:JXG.deepCopy(s.dest_sub_ids),dest_id:0,args:{steps:JXG.deepCopy(s.steps),map:JXG.deepCopy(s.id_map),free_points:JXG.deepCopy(s.free_points),x:t,y:o,dep_copy:false}},s.id_map)}else if(GUI.action=="ablation"){GUI.shadowCopyStep={type:JXG.GENTYPE_ABLATION,args:{x:t,y:o,fids:s.fids,migrate:0},src_ids:JXG.deepCopy(s.src_ids),dest_sub_ids:JXG.deepCopy(s.dest_sub_ids),dest_id:0}}if(GUI.shadowCopyStep.type>50)r=GUI.generateJCode(GUI.shadowCopyStep,GUI.board);else r=JXG.SketchReader.generateJCode(GUI.shadowCopyStep,GUI.board,GUI.step_log);GUI.parse(r[0],false);GUI.board.prepareUpdate().updateRenderer();GUI.addToolEvent(GUI.move_event,GUI.moveShadowCopy,s,true);return r[2]},placeShadowCopy:function(e,t){var o,r,s=null,i=0,n=0,a;a=GUI.genPasteParams(e,true);r=GUI.board.create("point",[t.usrCoords[1],t.usrCoords[2]]);if(a.free_points.length===0){for(o=0;o<a.id_map.length;o++){if(GUI.board.objects[a.id_map[o].orig].elementClass==JXG.OBJECT_CLASS_POINT){s=GUI.board.objects[a.id_map[o].orig];break}}}else s=GUI.board.objects[a.free_points[0].orig];if(s!=null){i=s.coords.usrCoords[1]-r.coords.usrCoords[1];n=s.coords.usrCoords[2]-r.coords.usrCoords[2]}GUI.board.removeObject(r);if(GUI.action=="copy"||GUI.action=="ablation")GUI.showObjectsBlured(true);GUI.makeShadowCopy(e,i,n);return new Array(i,n)},moveShadowCopy:function(e,t){var o,r,s=null,i,n,a,l,d;r=GUI.getCoords(e);if(GUI.Settings.get("cursor"))GUI.board.renderer.updateTouchpoint(0,r.scrCoords.slice(1));if(t.free_points.length===0){for(o=0;o<t.id_map.length;o++){if(GUI.board.objects[t.id_map[o].orig].elementClass==JXG.OBJECT_CLASS_POINT){s=GUI.board.objects[t.id_map[o].orig];break}}if(s==null)return}else s=GUI.board.objects[t.free_points[0].orig];i=r.usrCoords[1]-s.coords.usrCoords[1];n=r.usrCoords[2]-s.coords.usrCoords[2];d=new JXG.Coords(JXG.COORDS_BY_USER,[i,n],GUI.board);i=d.usrCoords[1];n=d.usrCoords[2];for(o=0;o<t.id_map.length;o++){if(GUI.board.objects[t.id_map[o].orig].elementClass==JXG.OBJECT_CLASS_POINT){GUI.board.objects[t.id_map[o].copy].moveTo([GUI.board.objects[t.id_map[o].orig].X()+i,GUI.board.objects[t.id_map[o].orig].Y()+n])}}for(o=0;o<t.free_points.length;o++){a=parseFloat(GUI.board.objects[t.free_points[o].orig].coords.usrCoords[1]+i);l=parseFloat(GUI.board.objects[t.free_points[o].orig].coords.usrCoords[2]+n);GUI.board.objects[t.free_points[o].copy].moveTo([a,l])}GUI.ctx_curr_coords=GUI.lastCopyPos=r;if(e.preventDefault){e.preventDefault()}else{window.event.returnValue=false}if(GUI.action=="ablation")GUI.pasteAblationHighlight(e)},movePoint:function(e,t){var o=GUI.getCoords(e);GUI.board.objects[t].moveTo([o.usrCoords[1],o.usrCoords[2]]);if(GUI.Settings.get("cursor")){GUI.board.renderer.updateTouchpoint(0,o.scrCoords.slice(1))}},pasteAblationHighlight:function(e){var t,o,r,s=GUI.getScreenCoordsXY(e);GUI.pasteAblationDehighlight(e);GUI.board.suspendUpdate();for(o in GUI.board.objects){if(GUI.board.objects.hasOwnProperty(o)){t=GUI.board.objects[o];if(t.elementClass===JXG.OBJECT_CLASS_POINT&&!t.visProp.priv&&t.visProp.visible&&!t.highlighted&&t.id!==GUI.shadowCopyStep.dest_sub_ids[0]&&t.hasPoint(s[0],s[1])){t.highlighted=true;r=GUI.board.create("point",[t.X(),t.Y()],{size:GUI.highlightSize,strokeWidth:0,withLabel:false,name:"",fillOpacity:GUI.opacityHidden});r.highlighted=t;GUI.highlightedObjsAblate[r.id]=r;GUI.Audio.play("click")}}}GUI.board.unsuspendUpdate()},pasteAblationDehighlight:function(e){var t,o,r=[0,0];if(e)r=GUI.getCoords(e);GUI.board.suspendUpdate();for(t in GUI.highlightedObjsAblate){if(GUI.highlightedObjsAblate.hasOwnProperty(t)){if(!e||GUI.highlightedObjsAblate[t]&&GUI.highlightedObjsAblate[t].hasPoint&&!GUI.highlightedObjsAblate[t].hasPoint(r[0],r[1])){o=GUI.highlightedObjsAblate[t].highlighted;o.highlighted=false;GUI.board.removeObject(GUI.highlightedObjsAblate[t]);delete GUI.highlightedObjsAblate[t]}}}GUI.board.unsuspendUpdate()}});JXG.extend(GUI,{addBoardHandlers:function(){if(JXG.Options.device=="msie")GUI.board.addPointerEventHandlers();else if(JXG.Options.device=="pc")GUI.board.addMouseEventHandlers();else GUI.board.addTouchEventHandlers();GUI.board.on(GUI.up_event,GUI.objectMoveHook,GUI.board);console.log("board handlers added")},removeBoardHandlers:function(){if(JXG.Options.device=="msie")GUI.board.removePointerEventHandlers();else if(JXG.Options.device=="pc")GUI.board.removeMouseEventHandlers();else GUI.board.removeTouchEventHandlers();GUI.board.off(GUI.up_event,GUI.objectMoveHook);console.log("board handlers removed")},addNavHandlers:function(){if(!GUI.navHandlersRegistered){if(JXG.Options.device=="msie"){console.log("my_msienav_srt")}else if(JXG.Options.device=="pc"){JXG.addEvent(GUI.board.containerObj,GUI.down_event,GUI.mms,GUI.board);JXG.addEvent(GUI.board.containerObj,GUI.move_event,GUI.mom,GUI.board);JXG.addEvent(GUI.board.containerObj,"mousewheel",GUI.mwl,GUI.board);JXG.addEvent(GUI.board.containerObj,"DOMMouseScroll",GUI.mwl,GUI.board)}else{JXG.addEvent(GUI.board.containerObj,GUI.down_event,GUI.tms,GUI.board);JXG.addEvent(GUI.board.containerObj,GUI.move_event,GUI.tom,GUI.board);JXG.addEvent(GUI.board.containerObj,"gesturestart",GUI.gsl,GUI.board);JXG.addEvent(GUI.board.containerObj,"gesturechange",GUI.gcl,GUI.board)}JXG.addEvent(document,GUI.up_event,GUI.ome,GUI.board);GUI.navHandlersRegistered=true}console.log("nav handlers added")},removeNavHandlers:function(){if(GUI.navHandlersRegistered){JXG.removeEvent(document,GUI.up_event,GUI.ome,GUI.board);if(JXG.Options.device=="msie"){console.log("my_msienav_end")}else if(JXG.Options.device=="pc"){JXG.removeEvent(GUI.board.containerObj,"DOMMouseScroll",GUI.mwl,GUI.board);JXG.removeEvent(GUI.board.containerObj,"mousewheel",GUI.mwl,GUI.board);JXG.removeEvent(GUI.board.containerObj,GUI.move_event,GUI.mom,GUI.board);JXG.removeEvent(GUI.board.containerObj,GUI.down_event,GUI.mms,GUI.board)}else{JXG.removeEvent(GUI.board.containerObj,"gesturechange",GUI.gcl,GUI.board);JXG.removeEvent(GUI.board.containerObj,"gesturestart",GUI.gsl,GUI.board);JXG.removeEvent(GUI.board.containerObj,GUI.move_event,GUI.tom,GUI.board);JXG.removeEvent(GUI.board.containerObj,GUI.down_event,GUI.tms,GUI.board)}GUI.navHandlersRegistered=false}console.log("nav handlers removed")},addConstructHooks:function(){GUI.board.on(GUI.down_event,GUI.downHandler,GUI);GUI.board.on(GUI.move_event,GUI.moveHandler,GUI);GUI.board.on(GUI.up_event,GUI.upHandler,GUI);console.log("const hooks added")},removeConstructHooks:function(){GUI.board.off(GUI.down_event,GUI.downHandler,GUI);GUI.board.off(GUI.move_event,GUI.moveHandler,GUI);GUI.board.off(GUI.up_event,GUI.upHandler,GUI);console.log("const hooks removed")},addConstructEvents:function(){JXG.addEvent(GUI.board.containerObj,GUI.down_event,GUI.downHandler,GUI);JXG.addEvent(GUI.board.containerObj,GUI.move_event,GUI.moveHandler,GUI);JXG.addEvent(document,GUI.up_event,GUI.upHandler,GUI);console.log("const events added")},removeConstructEvents:function(){JXG.removeEvent(document,GUI.up_event,GUI.upHandler,GUI);JXG.removeEvent(GUI.board.containerObj,GUI.move_event,GUI.moveHandler,GUI);JXG.removeEvent(GUI.board.containerObj,GUI.down_event,GUI.downHandler,GUI);console.log("const events removed")},magMove:function(e){if(GUI.Settings.get("magnify"))GUI.magnify(e)},ome:function(e){GUI.board.originMoveEnd(e)},mms:function(e){if(GUI.board.mouseOriginMoveStart)GUI.board.mouseOriginMoveStart(e)},mom:function(e){if(GUI.board.mouseOriginMove)GUI.board.mouseOriginMove(e)},mwl:function(e){if(GUI.board.mouseWheelListener)GUI.board.mouseWheelListener(e)},tms:function(e){if(GUI.board.touchOriginMoveStart)GUI.board.touchOriginMoveStart(e)},tom:function(e){if(GUI.board.touchOriginMove)GUI.board.touchOriginMove(e)},gsl:function(e){if(GUI.board.gestureStartListener)GUI.board.gestureStartListener(e)},gcl:function(e){if(GUI.board.gestureChangeListener)GUI.board.gestureChangeListener(e)},addActionEvent:function(e,t){GUI.addToolEvent(e,t);$("#caption-actions").addClass("not-displayed");$("#control-actions").removeClass("hidden")},addToolEvent:function(e,t,o,r){if(GUI.mode!=null){GUI.modeBeforeToolSwitch=GUI.mode;GUI.switchMode(null,true);$("#control-actions").addClass("hidden")}GUI.disableConstDragMode();if(GUI.collectionContains(GUI.toolType,e))GUI.removeToolEvent(e);if(typeof r=="undefined")r=false;if(!r)GUI.addNavHandlers();GUI.toolType.push(e);GUI.toolFunc[e]=function(e){t(e,o)};JXG.addEvent(GUI.board.containerObj,e,GUI.toolFunc[e],GUI);console.log("added tool evt for: "+e)},removeToolEvent:function(e){JXG.removeEvent(GUI.board.containerObj,e,GUI.toolFunc[e],GUI);JXG.removeElementFromArray(GUI.toolType,e);delete GUI.toolFunc[e];console.log("removed tool evt for type: "+e);if(GUI.toolType.length==0){GUI.hideStatusPanel();GUI.removeNavHandlers()}},removeToolEvents:function(e){$('[id*="-related-"]').removeClass("button-selected");for(var t=0;t<GUI.toolType.length;t++)GUI.removeToolEvent(GUI.toolType[t]);GUI.toolType=[];GUI.toolFunc={};if(e){if(GUI.modeBeforeToolSwitch!=null){GUI.switchMode(GUI.modeBeforeToolSwitch,true);GUI.modeBeforeToolSwitch=null;$("#control-actions").removeClass("hidden")}GUI.enableConstDragMode();GUI.showPanel(false,0)}GUI.delight()},checkRecognition:function(e){var t,o=[],r=50,s=false,i=e.hittedPoints.length;if(i>3&&e.recognized!="line"&&e.recognized!="midpoint"){e.recognized="polygon"}else{for(t=0;t<i;t++)if(e.hittedPoints[t].catchIdx<r){s=true;break}if(!s)o=["midpoint","reflection"];e.recognized=GUI.nd_recognizer.Recognize(new Array(e.GUIpoints),false,false,true,true,o).Name;if(i>0&&e.recognized=="line"){var n,a=false,l=false;n=JXG.Draw.findPointNextTo(e.GUIpoints[0],[e.hittedPoints[0]],GUI.rayFactor*JXG.Options.sensitive_area);if(n!=null)a=true;n=JXG.Draw.findPointNextTo(e.GUIpoints[e.GUIpoints.length-1],[e.hittedPoints[e.hittedPoints.length-1]],GUI.rayFactor*JXG.Options.sensitive_area);if(n!=null)l=true;if(a&&l)e.recognized="segment";else if(a||l)e.recognized="ray"}else if(e.recognized=="circle2points"&&i==3){e.recognized="sector"}else if(e.recognized=="bisector"&&i==2){}else if(e.recognized=="tangent"&&i==2)e.recognized="midpoint"}},drawSector:function(e){var t=GUI.Lang.std.choosesector,o="";o+='<a class="highlight" id="circleSector">'+GUI.Lang.std.circle_sector+"</a>";o+='<a class="highlight" id="angleSector">'+GUI.Lang.std.angle_sector+"</a>";new GUI.Dialog("sect",o,t);$("#dlg-header-left").css("background-position","-679px -165px");$("#circleSector").bind(GUI.click_event,function(){JXG.Draw.drawCircleSector([e[0].id,e[1].id,e[2].id]);GUI.dialog["sect"].removeDialog()});$("#angleSector").bind(GUI.click_event,function(){JXG.Draw.drawAngleSector([e[1].id,e[0].id,e[2].id]);GUI.dialog["sect"].removeDialog()})},analyzeNdollarResult:function(e,t){var o,r;if(GUI.action!="standard")return;o=GUI.draftcurve[e];r=o.GUIpoints;if(r.length<=8){if(!t){JXG.Draw.drawPoint(GUI.board,r);GUI.deleteDraftcurve(e)}return}if(t)GUI.highlightAndCollectPointsOnCurve(o,JXG.Options.sensitive_area,GUI.board);if((GUI.Options.finderEnabled===false||$("#finder"+o.uuid).hasClass("not-displayed"))&&r.length>0&&GUI.board.mode!=GUI.board.BOARD_MODE_DRAG){if(o.recognized!="polygon")GUI.checkRecognition(o);if(!t||t&&o.oldrecognized!==o.recognized){if(o.recognized!="blank"){if(o.recognized=="line"||o.recognized=="ray"||o.recognized=="segment"){if(t);else JXG.Draw.drawLine(r,o.hittedPoints)}else if(o.recognized=="polygon"){if(t);else JXG.Draw.drawQuadrilateral(GUI.board,r,o.hittedPoints)}else if(o.recognized=="circle"){if(t);else JXG.Draw.drawCircle(r,o.hittedPoints)}else if(o.recognized=="normal"){if(t);else JXG.Draw.drawNormal(GUI.board,r,o.hittedPoints)}else if(o.recognized=="parallel"){if(t);else JXG.Draw.drawParallel(GUI.board,r)}else if(o.recognized=="midpoint"){if(t);else JXG.Draw.drawMidPoint(o.hittedPoints)}else if(o.recognized=="bisector"){if(t);else JXG.Draw.drawBisector(GUI.board,r,o.hittedPoints)}else if(o.recognized=="tangent"){if(t);else JXG.Draw.drawTangent(GUI.board,r)}else if(o.recognized=="circle2points"){if(t);else JXG.Draw.drawCircle2Points(GUI.board,r,o.hittedPoints)}else if(o.recognized=="triangle"){if(t);else JXG.Draw.drawTriangle(GUI.board,r,o.hittedPoints)}else if(o.recognized=="quadrilateral"){if(t);else JXG.Draw.drawQuadrilateral(GUI.board,r,o.hittedPoints)}else if(o.recognized=="perpendicularBisector"){if(t);else JXG.Draw.drawBisector(GUI.board,r,o.hittedPoints)}else if(o.recognized=="reflection"){if(t);else JXG.Draw.drawReflection(GUI.board,r,o.hittedPoints)}else{if(t);else GUI.drawSector(o.hittedPoints)}if(t){$("#recognition_"+o.oldrecognized).addClass("not-displayed");$("#recognition_"+o.recognized).removeClass("not-displayed");if(o.oldrecognized!=="blank"){$("#status-box").removeClass("not-displayed")}o.oldrecognized=o.recognized}else GUI.updateNdollarStr(r)}else{$("#status-box").addClass("not-displayed");$("#recognition_"+o.oldrecognized).addClass("not-displayed")}}}if(!t)GUI.deleteDraftcurve(e)},createDraftcurve:function(e){var t,o,r,s=false;for(r=0;r<GUI.draftcurve.length;r++){if(!GUI.draftcurve[r].visProp.visible){t=GUI.draftcurve[r];s=true;break}}if(!s){t=GUI.board.create("curve",[[],[]],{curveType:"plot",strokeWidth:.75*JXG.Options.sensitive_area,opacity:.65,priv:true,id:"draft_"+GUI.draftcurve.length});t.highlight=function(){};t.noHighlight=function(){};GUI.draftcurve.push(t);t.updateDataArray=function(){for(var e=this.dataX.length;e<this.GUIpoints.length;e++){this.dataX[e]=this.GUIpoints[e].usrCoords[1];this.dataY[e]=this.GUIpoints[e].usrCoords[2]}}}t.GUIpoints=[];t.GUIpoints.push(e);t.hittedPoints=[];t.hittedLines=[];t.lastLength=0;t.uuid=JXG.Util.genUUID();t.name="DRAFTCURVE"+t.uuid;t.dontapply=false;t.finder_object=null;if(GUI.Options.finderEnabled)t.finder_timer=window.setTimeout(function(){GUI.finderTimer(t)},GUI.finder_time_limit);t.recognized="";t.setAttribute({strokeColor:"grey",visible:true});if(GUI.Options.finderEnabled){o=document.createElement("div");o.setAttribute("id","finder"+t.uuid);o.setAttribute("class","info not-displayed");GUI.getId("mainWindow").appendChild(o)}return r},deleteDraftcurve:function(e){var t,o,r;if(typeof e=="number")t=GUI.draftcurve[e];else t=e;if(t.dataX.length===0||!t.visProp.visible){return}if(GUI.Options.finderEnabled){if(t.finder_timer!==0){window.clearTimeout(t.finder_timer);t.finder_timer=0}GUI.removeFinderObject(t);o=GUI.getId("finder"+t.uuid);if(o!=null)GUI.getId("mainWindow").removeChild(o)}$("#status-box").addClass("not-displayed");$("#toolbar").removeClass("not-displayed");$('[id^="recognition_"]').addClass("not-displayed");t.setProperty({visible:false});t.GUIpoints=[];t.dataX=[];t.dataY=[];t.recognized="";for(r=0;r<t.hittedPoints.length;r++)t.hittedPoints[r].catchIdx=-1;GUI.delight(0,t.uuid)},deleteDraftcurves:function(){for(var e=0;e<GUI.draftcurve.length;e++)GUI.deleteDraftcurve(e);if(GUI.board.mode!==GUI.board.BOARD_MODE_MOVE_ORIGIN){GUI.board.update()}},affectedDraftcurve:function(e,t){var o,r,s,i,n,a,l=0,d=-1;if(GUI.draftcurve.length===0)return-1;for(o=0;o<GUI.draftcurve.length;o++){i=GUI.draftcurve[o];if(!i.visProp.visible)continue;n=i.GUIpoints;r=e.scrCoords[1]-n[n.length-1].scrCoords[1];s=e.scrCoords[2]-n[n.length-1].scrCoords[2];a=r*r+s*s;if(d==-1||a<l){l=a;d=o}}if(t&&GUI.multiConstructEnabled&&l>JXG.Options.sensitive_area*100)return-1;return d},mapCoordsToDraftcurve:function(e,t){var o;if(typeof t=="undefined")o=GUI.affectedDraftcurve(e,false);else o=t;if(o<0)return-1;GUI.draftcurve[o].GUIpoints.push(e);GUI.draftcurve[o].prepareUpdate().update().updateRenderer();GUI.analyzeNdollarResult(o,true);return o},isConstructive:function(e,t){if(t===false&&GUI.board.mode==GUI.board.BOARD_MODE_DRAG)return false;if(e.which&&e.which===2||e.button&&e.button===2){GUI.activateBoardControls();GUI.contextMenu(GUI.getMouseCoords(e));return false}if(e.shiftKey||GUI.board.mode==GUI.board.BOARD_MODE_MOVE_ORIGIN||GUI.board.mode==GUI.board.BOARD_MODE_ZOOM){GUI.deleteDraftcurves();return false}if(GUI.multiConstructEnabled==false&&e[JXG.touchProperty]&&e[JXG.touchProperty].length>=2){GUI.deleteDraftcurves();return false}return true},visibleDraftcurveExists:function(){for(var e=0;e<GUI.draftcurve.length;e++)if(GUI.draftcurve[e].visProp.visible)return true;return false},downHandler:function(e){GUI.ctx_down_coords=GUI.ctx_curr_coords=GUI.getCoords(e);if(GUI.Settings.get("cursor")){if(JXG.Options.device=="tablet"||JXG.Options.device=="msie")GUI.board.renderer.showTouchpoint(0);GUI.board.renderer.updateTouchpoint(0,GUI.ctx_curr_coords.scrCoords.slice(1))}if(JXG.Options.device=="tablet"||JXG.Options.device=="msie"){if(GUI.Settings.get("magnify"))$("#magnifier").removeClass("not-displayed")}if(e[JXG.touchProperty]&&e[JXG.touchProperty].length>=2){if(GUI.ctx_timer!==0){clearTimeout(GUI.ctx_timer);GUI.ctx_timer=0}}else{if(e[JXG.touchProperty]||e.which&&e.which===1||e.button&&e.button===1)GUI.ctx_timer=window.setTimeout(function(){GUI.actionTimer(e)},GUI.context_time_limit)}if(GUI.isConstructive(e,false)){if(e[JXG.touchProperty]){var t,o,r,s=[];for(t=0;t<e[JXG.touchProperty].length;t++){r=GUI.getTouchCoords(e,t);if((o=GUI.affectedDraftcurve(r,e.changedTouches.length>0))==-1){o=GUI.createDraftcurve(r)}s.push(GUI.draftcurve[o])}GUI.draftcurve=s.slice(0)}else{GUI.createDraftcurve(GUI.getMouseCoords(e));GUI.mouseDown=true}if(e&&e.preventDefault)e.preventDefault();else window.event.returnValue=false}},moveHandler:function(e){GUI.ctx_curr_coords=GUI.getCoords(e);if(GUI.Settings.get("cursor"))GUI.board.renderer.updateTouchpoint(0,GUI.ctx_curr_coords.scrCoords.slice(1));if(e[JXG.touchProperty]&&e[JXG.touchProperty].length>=2){if(GUI.ctx_timer!==0){clearTimeout(GUI.ctx_timer);GUI.ctx_timer=0}}if(GUI.ctx_down_coords&&GUI.ctx_curr_coords&&GUI.ctx_curr_coords.scrCoords&&GUI.ctx_down_coords.scrCoords&&GUI.ctx_curr_coords.distance(JXG.COORDS_BY_SCREEN,GUI.ctx_down_coords)>10){if(GUI.ctx_timer!==0){clearTimeout(GUI.ctx_timer);GUI.ctx_timer=0}}if(GUI.isConstructive(e,false)){if(e[JXG.touchProperty]){var t,o;for(t=0;t<e[JXG.touchProperty].length;t++){o=GUI.mapCoordsToDraftcurve(GUI.getTouchCoords(e,t));if(o<0)return;GUI.draftcurve[o].dontapply=false;if(GUI.Options.finderEnabled){GUI.removeFinderObject(GUI.draftcurve[o]);GUI.checkFinderShootOff(o)}}}else if(GUI.mouseDown){o=GUI.mapCoordsToDraftcurve(GUI.getMouseCoords(e));if(o<0)return;GUI.draftcurve[o].dontapply=false;if(GUI.Options.finderEnabled){GUI.removeFinderObject(GUI.draftcurve[o]);GUI.checkFinderShootOff(o)}}for(t=0;t<GUI.draftcurve.length;t++){if(GUI.draftcurve[t].recognized!==""){break}}if(e&&e.preventDefault)e.preventDefault();else window.event.returnValue=false}},upHandler:function(e){GUI.mouseDown=false;if(GUI.ctx_timer!==0){clearTimeout(GUI.ctx_timer);GUI.ctx_timer=0}if(JXG.Options.device=="tablet"||JXG.Options.device=="msie"){if(GUI.Settings.get("cursor")){GUI.board.renderer.hideTouchpoint(0)}if(GUI.Settings.get("magnify")){$("#magnifier").addClass("not-displayed")}}if(GUI.isConstructive(e,true)){if(GUI.mode=="CD"&&GUI.visibleDraftcurveExists()==false){if(GUI.ctx_down_coords&&GUI.ctx_curr_coords&&GUI.ctx_curr_coords.scrCoords&&GUI.ctx_down_coords.scrCoords&&GUI.ctx_curr_coords.distance(JXG.COORDS_BY_SCREEN,GUI.ctx_down_coords)<10){GUI.createDraftcurve(GUI.ctx_curr_coords)}}GUI.ctx_down_coords=GUI.ctx_curr_coords=null;if(GUI.visibleDraftcurveExists()){if(e[JXG.touchProperty]){var t,o,r;var s=[],i=[];for(t=0;t<GUI.draftcurve.length;t++)s.push(false);for(t=0;t<e[JXG.touchProperty].length;t++){r=GUI.getTouchCoords(e,t);o=GUI.affectedDraftcurve(r,false);i.push(GUI.draftcurve[o]);s[o]=true}for(t=0;t<s.length;t++)if(!s[t]&&!GUI.draftcurve[t].dontapply&&(GUI.Options.finderEnabled===false||$("#finder"+GUI.draftcurve[t].uuid).hasClass("not-displayed"))){if(GUI.Options.finderEnabled){if(GUI.draftcurve[t].finder_timer!==0){window.clearTimeout(GUI.draftcurve[t].finder_timer);GUI.draftcurve[t].finder_timer=0}}GUI.analyzeNdollarResult(t,false)}GUI.draftcurve=i.slice(0)}else{if(!GUI.draftcurve[0].dontapply&&(GUI.Options.finderEnabled===false||$("#finder"+GUI.draftcurve[0].uuid).hasClass("not-displayed"))){if(GUI.Options.finderEnabled){if(GUI.draftcurve[0].finder_timer!==0){window.clearTimeout(GUI.draftcurve[0].finder_timer);GUI.draftcurve[0].finder_timer=0}}GUI.analyzeNdollarResult(0,false)}GUI.draftcurve=[]}}if(GUI.visibleDraftcurveExists()==false){if(GUI.constModeSwitch&&GUI.modeBeforeConstSwitch!=null){GUI.switchMode(GUI.modeBeforeConstSwitch,false);GUI.modeBeforeConstSwitch=null}$("#control-actions").removeClass("hidden")}}},objectMoveHook:function(){if(GUI.board.mouse==null&&typeof GUI.board.touches==null)return;if(JXG.Options.device=="pc"&&GUI.board.mouse&&GUI.board.mouse.targets){GUI.logObjectMove(GUI.board.mouse.obj,GUI.board.mouse.targets[0].Xstart,GUI.board.mouse.targets[0].Ystart,GUI.board.mouse.targets[0].Zstart)}else if((JXG.Options.device=="tablet"||JXG.Options.device=="msie")&&GUI.board.touches){for(var e in GUI.board.touches){if(GUI.board.touches.hasOwnProperty(e))if(GUI.board.touches[e].obj&&GUI.board.touches[e].targets[0])GUI.logObjectMove(GUI.board.touches[e].obj,GUI.board.touches[e].targets[0].Xstart,GUI.board.touches[e].targets[0].Ystart,GUI.board.touches[e].targets[0].Zstart)
+}}},logObjectMove:function(e,t,o,r){var s,i,n,a,l;var d={};d.src_ids=[];d.dest_sub_ids=[];d.dest_id=0;d.type=JXG.GENTYPE_MOVEMENT;d.args={obj_type:e.type,coords:[]};if(e.type==JXG.OBJECT_TYPE_CAS||e.type==JXG.OBJECT_TYPE_INTERSECTION||e.type==JXG.OBJECT_TYPE_AXIS)return;else if(e.type==JXG.OBJECT_TYPE_LINE){if(e.point1.coords.usrCoords[1]==t[0]&&e.point1.coords.usrCoords[2]==o[0]&&e.point1.coords.usrCoords[0]==r[0]&&e.point2.coords.usrCoords[1]==t[1]&&e.point2.coords.usrCoords[2]==o[1]&&e.point2.coords.usrCoords[0]==r[1])return;d.src_ids.push(e.point1.id);d.src_ids.push(e.point2.id);d.args.coords.push({usrCoords:JXG.deepCopy(e.point1.coords.usrCoords)});d.args.coords.push({usrCoords:JXG.deepCopy(e.point2.coords.usrCoords)});d.args.xstart=t;d.args.ystart=o;d.args.zstart=r}else if(e.type==JXG.OBJECT_TYPE_CIRCLE){i=e.midpoint.coords.usrCoords[1]-t[0];n=e.midpoint.coords.usrCoords[2]-o[0];if(e.midpoint.coords.usrCoords[1]==t[0]&&e.midpoint.coords.usrCoords[2]==o[0]&&e.point2==null)return;d.src_ids.push(e.midpoint.id);d.args.coords.push({usrCoords:JXG.deepCopy(e.midpoint.coords.usrCoords)});d.args.xstart=t[0];d.args.ystart=o[0];if(d.args.has_point2=e.point2!=null){a=e.point2.coords.usrCoords[1]-i;l=e.point2.coords.usrCoords[2]-n;if(e.midpoint.coords.usrCoords[1]==t[0]&&e.midpoint.coords.usrCoords[2]==o[0]&&e.point2.coords.usrCoords[1]==a&&e.point2.coords.usrCoords[2]==l)return;d.src_ids.push(e.point2.id);d.args.coords.push({usrCoords:JXG.deepCopy(e.point2.coords.usrCoords)});d.args.old_p2x=a;d.args.old_p2y=l}}else if(e.type==JXG.OBJECT_TYPE_POLYGON){var c=false;for(s=0;s<e.vertices.length-1;s++){if(e.vertices[s].coords.usrCoords[1]!=t[s]||e.vertices[s].coords.usrCoords[2]!=o[s])c=true;d.src_ids.push(e.vertices[s].id);d.args.coords.push({usrCoords:JXG.deepCopy(e.vertices[s].coords.usrCoords)})}if(!c)return;d.args.xstart=t;d.args.ystart=o;d.args.zstart=r}else{if(!e.coords)return;if(e.coords.usrCoords[1]==t[0]&&e.coords.usrCoords[2]==o[0])return;d.src_ids.push(e.id);d.args.coords.push({usrCoords:JXG.deepCopy(e.coords.usrCoords)});d.args.xstart=t[0];d.args.ystart=o[0]}GUI.recordStep(d,false,false)},keyHandler:function(e){var t;if(e.target.nodeName.toLowerCase()==="input"||e.target.nodeName.toLowerCase()==="textarea"){return}t=e.key||e.keyCode;switch(t){case 37:GUI.board.clickLeftArrow();break;case 39:GUI.board.clickRightArrow();break;case 38:GUI.board.clickDownArrow();break;case 40:GUI.board.clickUpArrow();break;case 90:if(e.ctrlKey){GUI.undo()}break;case 89:if(e.ctrlKey){GUI.redo()}break}},timerHandler:function(){if(GUI.intervalTimer){clearInterval(GUI.intervalTimer);GUI.intervalTimer=0}}});JXG.Finder={gatherElements:function(e){var t,o,r=[],s=[],i=[];for(t in e.objects){if(e.objects.hasOwnProperty(t)){o=e.objects[t];if(o.visProp.visible===false){continue}if(JXG.isPoint(o)){r.push(o)}else if(o.elementClass===JXG.OBJECT_CLASS_LINE){s.push(o)}else if(o.elementClass===JXG.OBJECT_CLASS_CIRCLE){i.push(o)}}}return{points:r,lines:s,circles:i}},isMidpoint:function(e,t,o){var r=[(t.coords.usrCoords[1]+o.coords.usrCoords[1])/2,(t.coords.usrCoords[2]+o.coords.usrCoords[2])/2];if(JXG.Math.Geometry.distance(r,e.coords.usrCoords.slice(1))/t.Dist(o)<.07){return new JXG.Finder.Fact("midpoint",e,[t,o])}return null},isReflection:function(e,t,o){var r=JXG.Math.Geometry.reflection(o,t,e.board);if(JXG.Math.Geometry.distance(r.usrCoords.slice(1),e.coords.usrCoords.slice(1))<1){return new JXG.Finder.Fact("reflection",e,[t,o])}return null},isParallel:function(e,t){var o=e.getSlope(),r=t.getSlope();if(Math.abs(o-r)<.07||Math.abs(o)>1e10&&Math.abs(r)>1e10){return new JXG.Finder.Fact("parallel",e,[t])}return null},isNormal:function(e,t){var o=JXG.Math.Geometry.meetLineLine(e.stdform,t.stdform,0,e.board),r=JXG.Math.Geometry.rad(e.point1,o.usrCoords.slice(1),t.point1);if(Math.abs(Math.abs(r-Math.PI)-Math.PI/2)<.25){return new JXG.Finder.Fact("normal",e,[t])}return null},isBisector:function(e,t,o){var r=JXG.Math.Geometry.meetLineLine(t.stdform,o.stdform,0,e.board),s=JXG.Math.Geometry.meetLineLine(e.stdform,t.stdform,0,e.board),i=t.point1.coords.distance(JXG.COORDS_BY_USER,r)<.2?"point2":"point1",n=o.point1.coords.distance(JXG.COORDS_BY_USER,r)<.2?"point2":"point1",a=JXG.Math.Geometry.rad(t[i],r.usrCoords.slice(1),e.point1),l=JXG.Math.Geometry.rad(e.point1,r.usrCoords.slice(1),o[n]);if(r.distance(JXG.COORDS_BY_USER,s)<.5&&(Math.abs(a-l)<.2||Math.abs(Math.abs(a-l)-Math.PI)<.2)){return new JXG.Finder.Fact("bisector",e,[t,o])}return null},check:function(e){var t=e.board,o=this.gatherElements(t),r=JXG.isPoint(e),s=e.elementClass===JXG.OBJECT_CLASS_LINE,i,n,a,l=[];for(i=0;i<o.points.length;i++){if(o.points[i].id===e.id){continue}for(n=i;n<o.points.length;n++){if(o.points[n].id===e.id||o.points[i].id===o.points[n].id){continue}if(r){a=this.isMidpoint(e,o.points[i],o.points[n]);if(a&&a.what){l.push(a)}}}for(n=0;n<o.lines.length;n++){if(o.lines[n].id===e.id){continue}if(r){a=this.isReflection(e,o.points[i],o.lines[n]);if(a&&a.what){l.push(a)}a=this.isMirrorpoint(e,o.points[i],o.lines[n]);if(a&&a.what){l.push(a)}}}}for(i=0;i<o.lines.length;i++){if(o.lines[i].id===e.id){continue}if(s){a=this.isParallel(e,o.lines[i]);if(a&&a.what){l.push(a)}a=this.isNormal(e,o.lines[i]);if(a&&a.what){l.push(a)}}for(n=i;n<o.lines.length;n++){if(o.lines[n].id===e.id||o.lines[i].id===o.lines[n].id){continue}if(s){a=this.isBisector(e,o.lines[i],o.lines[n]);if(a&&a.what){l.push(a)}}}}return l}};JXG.Finder.Fact=function(e,t,o){var r;this.what=e;this.element=t;this.parents=o;this.parentnames=[];for(r=0;r<o.length;r++){this.parentnames.push(o[r].name)}};JXG.extend(GUI,{finderConstruct:function(e,t,o){o.updateDataArray=function(){};var r,s,i;GUI.highlightAndCollectPointsOnCurve(o,JXG.Options.sensitive_area,GUI.board);i=o.hittedPoints;switch(e.what){case"line":JXG.Draw.drawLine(t,i);break;case"normal":s=GUI.id();if(i.length>0)r=[e.parents[0].id,i[0].id];else r=[e.parents[0].id];GUI.recordStep({type:JXG.GENTYPE_NORMAL,src_ids:JXG.deepCopy(r),args:{create_point:!(i.length>0),usrCoords:JXG.deepCopy(t[0].usrCoords)},dest_sub_ids:[s],dest_id:GUI.id()},true,false);break;case"parallel":s=GUI.id();if(i.length>0)r=[e.parents[0].id,i[0].id];else r=[e.parents[0].id];GUI.recordStep({type:JXG.GENTYPE_PARALLEL,src_ids:JXG.deepCopy(r),args:{create_point:!(i.length>0),usrCoords:JXG.deepCopy(t[0].usrCoords)},dest_sub_ids:[GUI.id(),s],dest_id:GUI.id()},true,false);break;case"bisector":GUI.recordStep({type:JXG.GENTYPE_BISECTORLINES,src_ids:[e.parents[0].id,e.parents[1].id],dest_sub_ids:[GUI.id(),GUI.id(),GUI.id(),GUI.id(),GUI.id(),GUI.id()],dest_id:0},true,false);break;case"reflection":GUI.recordStep({type:JXG.GENTYPE_REFLECTION,src_ids:[e.parents[0].id,e.parents[1].id],args:{fillColor:"#ffffff"},dest_sub_ids:[],dest_id:GUI.id()},true);break;case"point":JXG.Draw.drawPoint(t);break;case"midpoint":JXG.Draw.drawMidPoint(e.parents);break;default:}GUI.deleteDraftcurve(o);GUI.contextUpdate()},finderTimer:function(e){if(GUI.board.mode==GUI.board.BOARD_MODE_DRAG)return;var t,o,r=[],s=$("#finder"+e.uuid),i,n,a,l=0,d=function(t,o,r){var i=JXG.Util.genUUID();s.append('<a href="#" class="finder_link" id="'+i+'">'+r+"</a>");l++;$("#"+i).bind(GUI.click_event,function(){GUI.finderConstruct(t,o,e);GUI.delight()})};s.html("");e.dontapply=true;n=e.GUIpoints.length-1;if(e.GUIpoints.length<3){e.finder_object=GUI.board.create("point",e.GUIpoints[0].usrCoords,{withLabel:false,name:"",visible:false});r=JXG.Finder.check(e.finder_object);d({what:"point"},e.GUIpoints,GUI.Lang.std.point);for(t=0;t<r.length;t++){d(r[t],e.GUIpoints,GUI.Lang.std[r[t].what]+" "+GUI.Lang.std.of+" "+r[t].parentnames.join(", "))}}else{o=GUI.nd_recognizer.Recognize(new Array(e.GUIpoints),false,false,false,true);if(o.Name==="line"){e.finder_object=GUI.board.create("line",[e.GUIpoints[0].usrCoords.slice(1),e.GUIpoints[n].usrCoords.slice(1)],{withLabel:false,name:"",visible:false});r=JXG.Finder.check(e.finder_object);d({what:"line"},e.GUIpoints,GUI.Lang.std.line);for(t=0;t<r.length;t++){d(r[t],e.GUIpoints,GUI.Lang.std[r[t].what]+" "+GUI.Lang.std.to+" "+r[t].parentnames.join(", "))}}}if(l===0){e.dontapply=false;s.addClass("not-displayed");s.find("*").unbind()}else{d({what:"cancel"},e.GUIpoints,GUI.Lang.std.cancel);s.css("top",e.GUIpoints[n].scrCoords[2]-parseInt(s.css("height"))-20+"px");if(GUI.Settings.get("leftright")=="Left"){s.css("left",e.GUIpoints[n].scrCoords[1]-parseInt(s.css("width"))-20+"px")}else{s.css("left",e.GUIpoints[n].scrCoords[1]+20+"px")}s.removeClass("not-displayed");for(i=0;i<GUI.draftcurve.length;i++)if(GUI.draftcurve[i]===e)break;GUI.contextUpdate()}},checkFinderShootOff:function(e){if(GUI.draftcurve[e].GUIpoints[GUI.draftcurve[e].GUIpoints.length-1].distance(JXG.COORDS_BY_SCREEN,GUI.draftcurve[e].GUIpoints[GUI.draftcurve[e].GUIpoints.length-2])>JXG.Options.sensitive_area/3){if(GUI.draftcurve[e].finder_timer!==0){window.clearTimeout(GUI.draftcurve[e].finder_timer);GUI.draftcurve[e].finder_timer=0}GUI.draftcurve[e].finder_timer=window.setTimeout(function(){GUI.finderTimer(GUI.draftcurve[e])},GUI.finder_time_limit);$("#finder"+GUI.draftcurve[e].uuid).addClass("not-displayed");$("#finder"+GUI.draftcurve[e].uuid).find("*").unbind();return false}else return true},removeFinderObject:function(e){if(e.finder_object!=null){for(var t in e.finder_object.ancestors){if(e.finder_object.ancestors.hasOwnProperty(t)){GUI.board.removeObject(e.finder_object.ancestors[t])}}GUI.board.removeObject(e.finder_object)}}});JXG.extend(GUI,{getId:function(e){return document.getElementById(e)},countElements:function(e){var t=0;for(var o in e)if(e.hasOwnProperty(o))++t;return t},collectionContains:function(e,t){if(JXG.isArray(e)){return JXG.isInArray(e,t)}if(JXG.isObject(e)){return JXG.isInObject(e,t)}return e===t},getMouseCoords:function(e){var t,o=JXG.getPosition(e),r,s;if(GUI.board){t=GUI.board.getCoordsTopLeftCorner();r=o[0]-t[0];s=o[1]-t[1];return new JXG.Coords(JXG.COORDS_BY_SCREEN,[r,s],GUI.board)}else{return new JXG.Coords(JXG.COORDS_BY_SCREEN,[o[0],o[1]],GUI.board)}},getTouchCoords:function(e,t){var o,r=JXG.getPosition(e,t),s,i;if(GUI.board){o=GUI.board.getCoordsTopLeftCorner();s=r[0]-o[0];i=r[1]-o[1];return new JXG.Coords(JXG.COORDS_BY_SCREEN,[s,i],GUI.board)}else{return new JXG.Coords(JXG.COORDS_BY_SCREEN,[r[0],r[1]],GUI.board)}},getCoords:function(e){if(e[JXG.touchProperty])return GUI.getTouchCoords(e,-1);else return GUI.getMouseCoords(e)},getScreenCoordsXY:function(e){var t;if(e[JXG.touchProperty])t=GUI.getTouchCoords(e,-1);else t=GUI.getMouseCoords(e);return[t.scrCoords[1],t.scrCoords[2]]},getLastConstructedObject:function(){var e,t;for(e=GUI.id_cnt-1;e>0;e--){t="GUI"+e;if(GUI.board.objects[t]&&GUI.board.objects[t].visProp.visible&&!GUI.board.objects[t].visProp.priv)break}if(e===0)t=0;return t},isStandardObj:function(e){return e.visProp.priv===false&&e.type!=JXG.OBJECT_TYPE_TICKS&&e.name.search(/DRAFTCURVE.+/)==-1&&e.id.toString().search(/ticks.+/)==-1&&e.id.toString().search(/infobox$/)==-1},callOnClick:function(e,t){t(GUI.getCoords(e))},cutHex:function(e){return e.charAt(0)=="#"?e.substring(1,7):e},hexToR:function(e){return parseInt(GUI.cutHex(e).substring(0,2),16)},hexToG:function(e){return parseInt(GUI.cutHex(e).substring(2,4),16)},hexToB:function(e){return parseInt(GUI.cutHex(e).substring(4,6),16)},brightness:function(e,t,o){return.98*e+.87*t+.76*o},colorDistance:function(e,t){var o,r,s,i,n,a;o=GUI.hexToR(e);s=GUI.hexToG(e);n=GUI.hexToB(e);r=GUI.hexToR(t);i=GUI.hexToG(t);a=GUI.hexToB(t);return Math.abs(o-r)+Math.abs(s-i)+Math.abs(n-a)},bestColorDivIndex:function(e){var t=+Infinity,o=0,r={dist:t,idx:o};$('[class*="color-palette"]').each(function(t){if($(this).attr("id")=="color-palette-none")return;var o,s=$(this).css("background-color"),i=s.split(",");i[0]=parseInt(i[0].slice(4));i[1]=parseInt(i[1]);i[2]=parseInt(i[2]);o=GUI.colorDistance(JXG.rgb2hex(i[0],i[1],i[2]),e);if(o<r.dist){r.dist=o;r.idx=t}});return r.idx},getBestSwContrast:function(e){var t,o,r,s;t=e.split(",");o=parseInt(t[0].slice(4));r=parseInt(t[1]);s=parseInt(t[2]);return GUI.brightness(o,r,s)>200?"#000000":"#ffffff"},insertStrokes:function(e){var t,o,r;var s=[],i=[];e.length=0;for(t=0;t<ND.strokes.length;t++){s=[];for(o=0;o<ND.strokes[t].nbr;o++){i=[];for(r=0;r<ND.strokes[t].data[o].length;r++)i.push(new Point(ND.strokes[t].data[o][r][0],ND.strokes[t].data[o][r][1]));s.push(i)}e.push(new Multistroke(ND.strokes[t].name,false,s))}},detectDefaultLanguage:function(){if(localStorage&&localStorage.getItem("jsxgui:meta:settings")==null){var e,t;if(window.navigator.userLanguage)t=window.navigator.userLanguage;else if(window.navigator.language)t=window.navigator.language;t=t.replace(/-.*/,"");for(e=0;e<GUI.Lang.Map[0].length;e++)if(GUI.Lang.Map[0][e]==t)break;if(e<GUI.Lang.Map[0].length)GUI.Settings.set("language",GUI.Lang.Map[1][e])}},setLanguage:function(e){if(GUI.Lang){GUI.Lang.std=JXG.deepCopy(GUI.Lang.strings);if(e=="Deutsch")GUI.langId=GUI.Lang.de;else if(e=="English")GUI.langId=GUI.Lang.en;else if(e=="Français")GUI.langId=GUI.Lang.fr;else if(e=="Español")GUI.langId=GUI.Lang.es;else if(e=="Português")GUI.langId=GUI.Lang.pt;for(var t in GUI.Lang.std){if(GUI.Lang.strings[t][GUI.langId]!="")GUI.Lang.std[t]=GUI.Lang.strings[t][GUI.langId];else GUI.Lang.std[t]=GUI.Lang.strings[t][GUI.Lang.en]}}},resolveObjectType:function(e){switch(e.type){case JXG.OBJECT_TYPE_ARROW:return GUI.Lang.std.arrow;case JXG.OBJECT_TYPE_AXIS:return GUI.Lang.std.axis;case JXG.OBJECT_TYPE_AXISPOINT:return GUI.Lang.std.axispoint;case JXG.OBJECT_TYPE_TICKS:return GUI.Lang.std.ticks;case JXG.OBJECT_TYPE_CIRCLE:return GUI.Lang.std.circle;case JXG.OBJECT_TYPE_CONIC:return GUI.Lang.std.conic;case JXG.OBJECT_TYPE_CURVE:return GUI.Lang.std.curve;case JXG.OBJECT_TYPE_GLIDER:if(e.elType=="slider")return GUI.Lang.std.slide;else if(e.getAttribute("fixed"))return GUI.Lang.std.fixed_glider;else return GUI.Lang.std.glider;case JXG.OBJECT_TYPE_IMAGE:return GUI.Lang.std.img;case JXG.OBJECT_TYPE_LINE:return GUI.Lang.std.line;case JXG.OBJECT_TYPE_POINT:if(e.elType=="reflection"){return GUI.Lang.std.reflectedPoint}else if(e.getAttribute("fixed"))return GUI.Lang.std.fixed_point;else return GUI.Lang.std.freePoint;case JXG.OBJECT_TYPE_SLIDER:return GUI.Lang.std.slide;case JXG.OBJECT_TYPE_CAS:return GUI.Lang.std.cas;case JXG.OBJECT_TYPE_POLYGON:return GUI.Lang.std.poly;case JXG.OBJECT_TYPE_SECTOR:return GUI.Lang.std.sect;case JXG.OBJECT_TYPE_TEXT:return GUI.Lang.std.text_element;case JXG.OBJECT_TYPE_ANGLE:return GUI.Lang.std.angle_element;case JXG.OBJECT_TYPE_INTERSECTION:return GUI.Lang.std.intersect;case JXG.OBJECT_TYPE_TURTLE:return GUI.Lang.std.turtle;case JXG.OBJECT_TYPE_VECTOR:return GUI.Lang.std.vect;default:return GUI.Lang.std.unknown}},unpack:function(e,t){var o=new JXG.Util.Unzip(JXG.Util.Base64.decodeAsArray(e)).unzip();if(typeof t=="undefined")t=0;if(JXG.exists(o[0]))return JXG.Util.UTF8.decode(o[t][0]);else return""},greenLog:function(e){if(JXG.Options.device=="pc"&&navigator.userAgent.search("Apple")==-1)console.log("%c[L] "+e,"color:green;");else console.log("[L] "+e)},parse:function(e,t){if(JXG.Options.device=="pc"&&navigator.userAgent.search("Apple")==-1){try{GUI.board.jc.parse(e);if(t)console.log("%c[E+L] "+e,"color:#3820a7;")}catch(o){console.log("Exception: "+o);console.log("%c[ERR] Error parsing: "+e,"color:red;");return false}}else{try{GUI.board.jc.parse(e);if(t)console.log("[E+L] "+e)}catch(o){console.log("Exception: "+o);console.log("[ERR] Error parsing: "+e);return false}}return true},executeJCode:function(e,t,o){var r=GUI.parse(e[0],t);if(!o){if(JXG.isArray(e[1])){for(var s=0;s<e[1].length;s++)e[1][s]()}else if(JXG.isFunction(e[1])){e[1]()}}return r},revertJCode:function(e,t){var o=GUI.parse(e[2],t);if(JXG.isArray(e[3])){for(var r=0;r<e[3].length;r++)e[3][r]()}else if(JXG.isFunction(e[3])){e[3]()}return o},isTouchInElementsBounds:function(e,t){var o,r,s,i;if(JXG.Options.device=="pc"){alert("isTouchInElementsBounds does not support PCs!");return false}o=e.originalEvent.changedTouches[0]||e.changedTouches[0];s=$("#"+t).outerHeight();i=$("#"+t).outerWidth();r=$("#"+t).offset();if(!r)r={left:0,top:0};return o.pageX>r.left&&o.pageX<r.left+i&&o.pageY>r.top&&o.pageY<r.top+s},isRealMSTouchDevice:function(){return"createTouch"in document},clearStrokes:function(){JXGHWR.points.length=0;JXGHWR.pointsRaw.length=0;JXGHWR.strokeID=0;JXGHWR.strokes.length=0;JXGHWR.g.clearRect(0,0,JXGHWR.canvas.width,JXGHWR.canvas.height);JXGHWR.needsClear=false},recognizeHwr:function(){var e=JXGHWR.recognize();GUI.Kbd.insertString(e.str);JXGHWR.needsClear=true}});var GUI=GUI||{};GUI.Kbd={caretChar:"¦",handle:0,input:0,focus:0,activeListId:"",position:0,preText:"",pastText:"",shiftStatus:false,visible:false,inputCallback:0,closeCallback:0,extractPrePastText:function(){GUI.Kbd.position=GUI.Kbd.input.value.indexOf(GUI.Kbd.caretChar);GUI.Kbd.preText=GUI.Kbd.input.value.substring(0,GUI.Kbd.position);GUI.Kbd.pastText=GUI.Kbd.input.value.substring(GUI.Kbd.position+1,GUI.Kbd.input.value.length)},startBlinker:function(e){if(GUI.Kbd.handle!=0)GUI.Kbd.stopBlinker();GUI.Kbd.input=e;GUI.Kbd.visible=true;GUI.Kbd.extractPrePastText();return GUI.Kbd.handle=window.setInterval(function(){if(GUI.Kbd.visible)GUI.Kbd.input.value=GUI.Kbd.preText+GUI.Kbd.pastText;else GUI.Kbd.input.value=GUI.Kbd.preText+GUI.Kbd.caretChar+GUI.Kbd.pastText;GUI.Kbd.visible=!GUI.Kbd.visible},600)},stopBlinker:function(e){if(GUI.Kbd.handle){window.clearInterval(GUI.Kbd.handle);GUI.Kbd.handle=0}if(!GUI.Kbd.visible){var t=GUI.Kbd.caretChar;if(e){GUI.Kbd.visible=false;t=""}else GUI.Kbd.visible=true;GUI.Kbd.input.value=GUI.Kbd.preText+t+GUI.Kbd.pastText}else if(e){GUI.Kbd.visible=false;GUI.Kbd.input.value=GUI.Kbd.preText+GUI.Kbd.pastText}},setVal:function(e,t){GUI.Kbd.stopBlinker();GUI.Kbd.input.value=e+GUI.Kbd.caretChar;GUI.Kbd.position=e.length;$("#kb-textbox").html(GUI.Kbd.input.value);if(!t&&typeof GUI.Kbd.inputCallback=="function")GUI.Kbd.inputCallback();GUI.Kbd.startBlinker(GUI.Kbd.input)},getVal:function(){if(GUI.Kbd.input)return GUI.Kbd.input.value.replace(GUI.Kbd.caretChar,"");else return""},shift:function(){var e,t=$('[id^="keyc"]');GUI.Kbd.shiftStatus=!GUI.Kbd.shiftStatus;if(GUI.Kbd.shiftStatus){for(e=0;e<t.length;e++)$("#"+t[e].id).html($("#"+t[e].id).html().toUpperCase());$("#key-shift").addClass("button-selected")}else{for(e=0;e<t.length;e++)$("#"+t[e].id).html($("#"+t[e].id).html().toLowerCase());$("#key-shift").removeClass("button-selected")}},shiftCase:function(e){if(GUI.Kbd.shiftStatus)return e.toUpperCase();return e},insertString:function(e){GUI.Kbd.stopBlinker();GUI.Kbd.input.value=GUI.Kbd.preText+e+GUI.Kbd.caretChar+GUI.Kbd.pastText;$("#kb-textbox").html(GUI.Kbd.input.value);if(typeof GUI.Kbd.inputCallback=="function")GUI.Kbd.inputCallback();GUI.Kbd.startBlinker(GUI.Kbd.input)},backwardDel:function(){GUI.Kbd.stopBlinker();GUI.Kbd.input.value=GUI.Kbd.preText.substring(0,GUI.Kbd.preText.length-1)+GUI.Kbd.caretChar+GUI.Kbd.pastText;GUI.Kbd.startBlinker(GUI.Kbd.input)},forwardDel:function(){GUI.Kbd.stopBlinker();GUI.Kbd.input.value=GUI.Kbd.preText+GUI.Kbd.caretChar+GUI.Kbd.pastText.substring(1,GUI.Kbd.pastText.length);GUI.Kbd.startBlinker(GUI.Kbd.input)},left:function(){GUI.Kbd.stopBlinker();GUI.Kbd.input.value=GUI.Kbd.preText.substring(0,GUI.Kbd.preText.length-1)+GUI.Kbd.caretChar+GUI.Kbd.preText.substring(GUI.Kbd.preText.length-1,GUI.Kbd.preText.length)+GUI.Kbd.pastText;$("#kb-textbox").html(GUI.Kbd.input.value);GUI.Kbd.startBlinker(GUI.Kbd.input)},right:function(){GUI.Kbd.stopBlinker();GUI.Kbd.input.value=GUI.Kbd.preText+GUI.Kbd.pastText.substring(0,1)+GUI.Kbd.caretChar+GUI.Kbd.pastText.substring(1,GUI.Kbd.pastText.length);$("#kb-textbox").html(GUI.Kbd.input.value);GUI.Kbd.startBlinker(GUI.Kbd.input)},deleteLast:function(e){if(e){GUI.Kbd.stopBlinker();GUI.Kbd.input.value="";GUI.Kbd.startBlinker(GUI.Kbd.input)}else GUI.Kbd.backwardDel();$("#kb-textbox").html(GUI.Kbd.input.value);if(typeof GUI.Kbd.inputCallback=="function")GUI.Kbd.inputCallback()},close:function(){if(!$("#keyboardPanel").hasClass("not-displayed")){if(typeof GUI.Kbd.closeCallback=="function")GUI.Kbd.closeCallback();if(GUI.Kbd.omitKbdClose)return;GUI.Kbd.stopBlinker(true);$("#keyboardPanel").addClass("not-displayed")}if(!GUI.Kbd.omitKbdClose)document.activeElement.blur()},sliderPanel:function(){var e,t,o,r,s;t=$("#key-slide");if(GUI.Kbd.activeListId!=""){if(GUI.Kbd.activeListId==t.attr("id")){GUI.Kbd.activeListId="";t.removeClass("button-selected");$("#kb-dyn-panel").addClass("not-displayed");$("#kb-char-panel").removeClass("not-displayed");GUI.contextUnbindHandlers();return}else{console.log("close "+GUI.Kbd.activeListId);$("#"+GUI.Kbd.activeListId).trigger(GUI.click_event)}}r=GUI.board.objects;o=[];for(e in r)if(r[e].elType=="slider"&&r[e].visProp.priv==false)o.push(r[e]);if(!o.length)return;GUI.Kbd.activeListId=t.attr("id");t.addClass("button-selected");GUI.createSelectDialogKbd(o,function(e){if(GUI.board.objects[e].name)s=GUI.board.objects[e].name;else s=e;GUI.Kbd.insertString(s);GUI.delight();GUI.Kbd.sliderPanel();GUI.Kbd.sliderPanel()},"")},curvePanel:function(){var e,t,o,r;o=$("#key-curve");if(GUI.Kbd.activeListId!=""){if(GUI.Kbd.activeListId==o.attr("id")){GUI.Kbd.activeListId="";o.removeClass("button-selected");$("#kb-dyn-panel").addClass("not-displayed");$("#kb-char-panel").removeClass("not-displayed");GUI.contextUnbindHandlers();return}else $("#"+GUI.Kbd.activeListId).trigger(GUI.click_event)}r=GUI.board.objects;e=[];for(t in r)if(r[t].elementClass==4&&r[t].visProp.priv==false)e.push(r[t]);if(!e.length)return;GUI.Kbd.activeListId=o.attr("id");o.addClass("button-selected");GUI.createSelectDialogKbd(e,function(e){GUI.Kbd.insertString(GUI.board.objects[e].Y.toString().cleanTerm());GUI.delight();GUI.Kbd.curvePanel();GUI.Kbd.curvePanel()},"")},hwrInit:function(){var e;JXGHWR.canvas.width=parseInt($("#"+JXGHWR.canvas.id).outerWidth());JXGHWR.canvas.height=parseInt($("#"+JXGHWR.canvas.id).css("height"));e=$("#"+JXGHWR.canvas.id).offset();JXGHWR.offsetX=e.left;JXGHWR.offsetY=e.top;JXGHWR.g=JXGHWR.canvas.getContext("2d");JXGHWR.g.lineWidth=3;JXGHWR.g.font="14px Arial"},hwrPanel:function(){var e=$("#key-hwr");if(GUI.Kbd.activeListId!=""){if(GUI.Kbd.activeListId==e.attr("id")){GUI.Kbd.activeListId="";e.removeClass("button-selected");$("#kb-hwr-panel").addClass("not-displayed");$("#kb-btns").removeClass("not-displayed");return}else $("#"+GUI.Kbd.activeListId).trigger(GUI.click_event)}GUI.Kbd.activeListId=e.attr("id");e.addClass("button-selected");$("#kb-hwr-panel").removeClass("not-displayed");$("#kb-btns").addClass("not-displayed");GUI.Kbd.hwrInit()},setCaretAtTouchClick:function(e){var t=GUI.Kbd.getSelectionStart(e);while(GUI.Kbd.position>0)GUI.Kbd.left();while(t>0){GUI.Kbd.right();t--}return true},getSelectionStart:function(e){if(e.createTextRange){var t=document.selection.createRange().duplicate();t.moveEnd("character",e.value.length);if(t.text=="")return e.value.length;return e.value.lastIndexOf(t.text)}else return e.selectionStart},showKeyboardPanel:function(e,t,o,r,s,i,n){var a=GUI.getId(e);if(typeof n=="undefined")n=false;GUI.Kbd.omitKbdClose=n;$("#"+e).unbind("focus");$("#"+e).bind("focus",function(){this.blur();$("#hiddenInput").focus()});if(e!=o){$("#"+o).unbind();$("#"+o).bind(GUI.click_event,function(e){$("#hiddenInput").focus();e.stopPropagation();e.preventDefault()})}$("#keyboardPanel").unbind();$("#keyboardPanel").bind(GUI.click_event,function(){$("#hiddenInput").focus()});$("#hiddenInput").val(t);GUI.Kbd.stopBlinker();if(GUI.Kbd.input!=0)GUI.Kbd.input.value=GUI.Kbd.input.value.replace(GUI.Kbd.caretChar,"");a.value=t+GUI.Kbd.caretChar;GUI.Kbd.startBlinker(a);GUI.Kbd.inputCallback=s;GUI.Kbd.closeCallback=i;GUI.Kbd.focus=GUI.getId(o);$("#kb-textbox").html(GUI.Kbd.input.value);$("#kb-textbox").unbind(GUI.click_event);$("#kb-textbox").bind(GUI.click_event,function(){GUI.Kbd.setCaretAtTouchClick(this)});$("#hiddenInput").unbind();$("#hiddenInput").bind("keydown",function(e){var t;e=e||window.event;t=e.keyCode||e.code;switch(t){case 13:GUI.Kbd.close();return;case 35:while(GUI.Kbd.position<GUI.Kbd.input.value.length-1)GUI.Kbd.right();return;case 36:while(GUI.Kbd.position>0)GUI.Kbd.left();return;case 37:GUI.Kbd.left();return;case 39:GUI.Kbd.right();return;case 8:GUI.Kbd.backwardDel();GUI.Kbd.stopBlinker();$("#kb-textbox").html(GUI.Kbd.input.value);if(typeof GUI.Kbd.inputCallback=="function")GUI.Kbd.inputCallback();GUI.Kbd.startBlinker(GUI.Kbd.input);return;case 46:GUI.Kbd.forwardDel();GUI.Kbd.stopBlinker();$("#kb-textbox").html(GUI.Kbd.input.value);if(typeof GUI.Kbd.inputCallback=="function")GUI.Kbd.inputCallback();GUI.Kbd.startBlinker(GUI.Kbd.input);return;case 222:GUI.Kbd.stopBlinker();GUI.Kbd.input.value=GUI.Kbd.input.value.replace(GUI.Kbd.caretChar,String.fromCharCode(39)+GUI.Kbd.caretChar);$("#kb-textbox").html(GUI.Kbd.input.value);if(typeof GUI.Kbd.inputCallback=="function")GUI.Kbd.inputCallback();GUI.Kbd.startBlinker(GUI.Kbd.input);return}});$("#hiddenInput").bind("keypress",function(e){var t;e=e||window.event;t=e.keyCode||e.code;switch(t){case 8:return;case 13:return;case 35:return;case 36:return;case 37:return;case 39:return}if(JXG.isMozilla())t=e.charCode;GUI.Kbd.stopBlinker();GUI.Kbd.input.value=GUI.Kbd.input.value.replace(GUI.Kbd.caretChar,String.fromCharCode(t)+GUI.Kbd.caretChar);$("#kb-textbox").html(GUI.Kbd.input.value);if(typeof GUI.Kbd.inputCallback=="function")GUI.Kbd.inputCallback();GUI.Kbd.startBlinker(GUI.Kbd.input);e.preventDefault()});$("#hiddenInput").bind("webkitspeechchange",GUI.Kbd.speechParse);if(r){$("#kb-char-panel").addClass("not-displayed");$("#kb-function-panel").addClass("not-displayed");$(".kb-jc-panel").addClass("not-displayed")}else{$("#kb-char-panel").removeClass("not-displayed");$("#kb-function-panel").removeClass("not-displayed");$(".kb-jc-panel").removeClass("not-displayed")}$("#keyboardPanel").removeClass("not-displayed");window.setTimeout(function(){GUI.getId("hiddenInput").focus()},1)},hideKeyboardPanel:function(){$("#hiddenInput").unbind();$("#keyboardPanel").unbind();if(GUI.Kbd.input){GUI.Kbd.extractPrePastText();GUI.Kbd.stopBlinker();$("#"+GUI.Kbd.input.id).val($("#"+GUI.Kbd.input.id).val().replace(GUI.Kbd.caretChar,""));$("#"+GUI.Kbd.input.id).unbind();$("#"+GUI.Kbd.focus.id).unbind();GUI.Kbd.input=0;GUI.Kbd.focus=0;GUI.Kbd.inputCallback=0;GUI.Kbd.closeCallback=0}$("#keyboardPanel").addClass("not-displayed")},texts:{durch:"",zum:"",mal:"*",geteilt:"/",dividiert:"/",plus:"+",und:"+",minus:"-",hoch:"^",quadrat:"^2",sinus:"sin",cosinus:"cos",tangens:"tan",betrag:"abs",wurzel:"sqrt",klammer:"",auf:"(",zu:")",x:"x"},levDist:function(e,t){if(!e.length)return t.length;if(!t.length)return e.length;return Math.min(this.levDist(e.substr(1),t)+1,this.levDist(t.substr(1),e)+1,this.levDist(e.substr(1),t.substr(1))+(e[0]!==t[0]?1:0))},speechParse:function(){var e=GUI.Kbd.getVal(),t=e.split(" "),o,r,s,i,n,a=t.length,l="",d,c;for(o=0;o<a;o++){d=t[o].toLowerCase();if(d.match(/[0-9]+/)!=null){l+=d;continue}i=1e6;for(r in this.texts){n=this.levDist(d,r)/d.length;if(n<i){i=n;s=this.texts[r];console.log(d,r,n,s)}if(i==0){break}}if(i<.25){c=s}else{c=d}l+=c}GUI.Kbd.setVal(l)}};JXG.extend(GUI,{ctx_measure:function(){if($("#measure-box").hasClass("button-selected")){GUI.removeMeasureEvt();return}GUI.removeToolEvents(false);$("[class*=measure]").addClass("button-selected");$("#measure-box").addClass("button-selected");GUI.showStatusPanel(GUI.Lang.std.measure_instruction,0,function(){GUI.deselectAllToolButtonsAndRemoveActions();GUI.showPanel(false,0)});GUI.selection=[];GUI.addToolEvent(GUI.down_event,function(e){GUI.addMeasureEvt(e,false)})},ctx_measureAngle:function(e){var t,o,r=0,s=0,i=GUI.board.objects[e],n=i.point1,a=i.point2,l=i.point3,d=a.coords.usrCoords,c=n.coords.usrCoords,u=l.coords.usrCoords,G=[(d[1]+u[1])*.5-c[1],(d[2]+u[2])*.5-c[2]],f=Math.sqrt(G[0]*G[0]+G[1]*G[1]);o="function () { return "+i.id+".getName() + ' = ' + trunc(deg("+a.id+", "+n.id+", "+l.id+"), trunclen) + '°'; }";if(Math.abs(f)>JXG.Math.eps){r=-G[0]/f*30/GUI.board.unitX;s=-G[1]/f*30/GUI.board.unitY}t={type:JXG.GENTYPE_TEXT,src_ids:[i.id,n.id,a.id,l.id],dest_sub_ids:[],dest_id:GUI.id(),args:{x:r,y:s,str:o,anchor:n.id+".getName()"}};GUI.recordStep(t,true,false)},ctx_measureDistance:function(e){var t,o,r,s,i=GUI.board.objects[e];o="function () { return '|' + "+i.point1.name+".getName() + "+i.point2.name+".getName() + '| = ' + trunc(dist("+i.point1.id+", "+i.point2.id+"), trunclen); }";r=(i.point1.coords.usrCoords[1]+i.point2.coords.usrCoords[1])/2;s=(i.point1.coords.usrCoords[2]+i.point2.coords.usrCoords[2])/2-i.point1.Dist(i.point2)/5;t={type:JXG.GENTYPE_TEXT,src_ids:[i.id,i.point1.id,i.point2.id],dest_sub_ids:[],dest_id:GUI.id(),args:{x:r,y:s,str:o}};GUI.recordStep(t,true,false)},ctx_measureSector:function(e){var t,o,r,s,i=GUI.board.objects[e];o="function () { return '|&#x2312;| "+GUI.Lang.std.of+" ' + "+i.name+".getName() + '= ' + trunc(dist("+i.point2.id+", "+i.point1.id+") * rad("+i.point2.id+", "+i.point1.id+", "+i.point3.id+"), trunclen); }";r=(i.point1.coords.usrCoords[1]+i.point2.coords.usrCoords[1])/2;s=(i.point1.coords.usrCoords[2]+i.point2.coords.usrCoords[2])/2-i.point1.Dist(i.point2)/5;t={type:JXG.GENTYPE_TEXT,src_ids:[i.id,i.point1.id,i.point2.id,i.point3.id],dest_sub_ids:[],dest_id:GUI.id(),args:{x:r,y:s,str:o}};GUI.recordStep(t,true,false)},ctx_set_boardimg:function(e,t,o){var r={type:JXG.GENTYPE_BOARDIMG,src_ids:[],dest_sub_ids:[],dest_id:GUI.id(),args:{s:e,anchor:t,scale:o}};GUI.recordStep(r,true,false)},ctx_set_type:function(e,t,o){var r,s,i;if(typeof t=="undefined"){if($("#point-glider-button-free").hasClass("button-selected"))t=JXG.OBJECT_TYPE_POINT;else t=JXG.OBJECT_TYPE_GLIDER;if(t==GUI.ContextSave.type)return}r=GUI.ContextSave.color["fill"];s=GUI.ContextSave.color["stroke"];if(t==JXG.OBJECT_TYPE_GLIDER){if(typeof o=="undefined"){if(GUI.getId("slideObject"))o=GUI.getId("slideObject").value;else o=""}if(o===""){var n,a=JXG.Draw.findHittedObjs(GUI.board.objects[e].coords.scrCoords[1],GUI.board.objects[e].coords.scrCoords[2],GUI.board,JXG.Options.sensitive_area,[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_CIRCLE,JXG.OBJECT_CLASS_CURVE],[]),l=[];for(n=0;n<a.length;n++)if(!GUI.collectionContains(GUI.board.objects[e].descendants,a[n])&&a[n].id!=e)l.push(a[n]);a=l;if(a.length==1)o=a[0].id}if(!r)r=JXG.Options.point.fillColor;if(!s)s=JXG.Options.point.strokeColor;if(o!==""){var d,c,u,G,f;if(GUI.board.objects[e].elementClass==JXG.OBJECT_CLASS_POINT&&GUI.board.objects[o].elementClass==JXG.OBJECT_CLASS_POINT){return}i={type:JXG.GENTYPE_CTX_TYPE_G,src_ids:[e,o],dest_sub_ids:[],dest_id:0,args:{fill:r,stroke:s,Xjc:GUI.board.objects[e].coords.usrCoords[1],Yjc:GUI.board.objects[e].coords.usrCoords[2]}};if(JXG.Options.device=="tablet"||JXG.Options.device=="msie"){d=GUI.board.touches[0].targets[0].Xstart[0];c=GUI.board.touches[0].targets[0].Ystart[0];u=JXG.deepCopy(GUI.board.touches[0].obj.coords.usrCoords)}else{d=GUI.board.mouse.targets[0].Xstart[0];c=GUI.board.mouse.targets[0].Ystart[0];u=JXG.deepCopy(GUI.board.mouse.obj.coords.usrCoords)}G={type:JXG.GENTYPE_MOVEMENT,src_ids:i.src_ids,dest_sub_ids:[],dest_id:0,args:{obj_type:JXG.OBJECT_TYPE_POINT,xstart:d,ystart:c,coords:[{usrCoords:u}]}};f={type:JXG.GENTYPE_COMBINED,src_ids:i.src_ids,dest_sub_ids:[],dest_id:0,args:{steps:[G,i]}};GUI.recordStep(f,true,false);GUI.board.update();GUI.removeGlideInterEvt()}else{GUI.removeToolEvents(false);if(GUI.action=="ablation")GUI.showStatusPanel(GUI.Lang.std.glider_instruct);else GUI.showStatusPanel(GUI.Lang.std.mark_glider_object);GUI.addToolEvent(GUI.move_event,GUI.movePoint,e,true);GUI.addToolEvent(GUI.up_event,GUI.addGlideInterEvt,e,false)}}else{var I=GUI.ContextSave.slideObjectId;if(!r)r=JXG.Options.glider.fillColor;if(!s)s=JXG.Options.glider.strokeColor;if(!I)I=GUI.board.objects[e].slideObject.id;i={type:JXG.GENTYPE_CTX_TYPE_P,src_ids:[e,I],dest_sub_ids:[],dest_id:0,args:{fill:r,stroke:s,Xjc:GUI.board.objects[e].coords.usrCoords[1],Yjc:GUI.board.objects[e].coords.usrCoords[2]}};
+GUI.recordStep(i,true,false)}},ctx_set_fixed:function(e){var t=GUI.board.objects[e].getAttribute("fixed"),o;o={type:JXG.GENTYPE_CTX_FIXED,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:!t}};GUI.recordStep(o,true,false)},ctx_set_trace:function(e){var t=GUI.board.objects[e].getAttribute("trace"),o;o={type:JXG.GENTYPE_CTX_TRACE,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:!t}};GUI.recordStep(o,true,false)},ctx_set_labelsticky:function(e){var t=GUI.board.objects[e].label.getAttribute("fixed"),o;o={type:JXG.GENTYPE_CTX_LABELSTICKY,src_ids:[GUI.board.objects[e].label.id],dest_sub_ids:[],dest_id:0,args:{s:!t}};GUI.recordStep(o,true,false)},ctx_set_withLabel:function(e){var t=GUI.board.objects[e].getAttribute("withLabel"),o;o={type:JXG.GENTYPE_CTX_WITHLABEL,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:!t}};GUI.recordStep(o,true,false);if(t)$("#label-sticky").attr("disabled","disabled");else $("#label-sticky").removeAttr("disabled")},ctx_set_visibility:function(e){var t=GUI.board.objects[e].getAttribute("visible"),o;o={type:JXG.GENTYPE_CTX_VISIBILITY,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:!t}};GUI.recordStep(o,true,false)},ctx_set_dotvisibility:function(e){var t=GUI.board.objects,o,r;if(GUI.showHidden)o=t[t[e].dot.id].guiVisProp.visible;else o=t[t[e].dot.id].getAttribute("visible");r={type:JXG.GENTYPE_CTX_DOTVISIBILITY,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:!o}};GUI.recordStep(r,true,false)},ctx_set_field:function(e,t){var o,r,s,i,n,a;if(t==1){t=JXG.GENTYPE_CTX_STROKEWIDTH;r="color-field";s=GUI.ContextSave.strokeWidth}else if(t==2){t=JXG.GENTYPE_CTX_FILLOPACITY;r="color-field";s=GUI.ContextSave.fillOpacity}else if(t==3){t=JXG.GENTYPE_CTX_LABELSIZE;r="color-field";s=GUI.ContextSave.labelSize}else if(t==4){t=JXG.GENTYPE_CTX_SIZE;r="point-size-field";s=GUI.ContextSave.size}else return;i=GUI.getId(r).value;o=false;n=parseInt(i);if(i!=n)o=true;i=n;if(i<1){o=true;i=100}if(i>100||isNaN(i)){o=true;i=1}if(o)GUI.getId(r).value=i.toFixed(0);a={type:t,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:i,old:s}};GUI.recordStep(a,true,false)},ctx_set_strokeWidth:function(e){return GUI.ctx_set_field(e,1)},ctx_set_fillOpacity:function(e){return GUI.ctx_set_field(e,2)},ctx_set_labelSize:function(e){return GUI.ctx_set_field(e,3)},ctx_set_size:function(e){return GUI.ctx_set_field(e,4)},ctx_set_text:function(e,t,o){var r,s;r=$("#textInput").val().sanitize().replace(GUI.Kbd.caretChar,"");s={type:JXG.GENTYPE_CTX_TEXT,src_ids:[e].concat(t),dest_sub_ids:[],dest_id:0,args:{s:r,old:GUI.ContextSave.text}};return GUI.recordStep(s,true,false,o)},ctx_set_label:function(e,t,o){var r,s;r=GUI.getId("textInput").value.sanitize().replace(/\\/g,"").replace(/'/g,"\\'").replace(GUI.Kbd.caretChar,"");s={type:JXG.GENTYPE_CTX_LABEL,src_ids:[e].concat(t),dest_sub_ids:[],dest_id:0,args:{s:r,old:GUI.ContextSave.labelName}};return GUI.recordStep(s,true,false,o)},ctx_set_interval:function(e,t,o){var r,s,i,n,a;s=parseInt(GUI.getId("slider-interval-a-field").value);i=parseInt(GUI.getId("slider-interval-b-field").value);if(t){r=s;n=GUI.ContextSave.start}else{r=i;n=GUI.ContextSave.end}if(typeof s!="number"||typeof i!="number"||isNaN(s)||isNaN(i)||s>=i)return;a={type:JXG.GENTYPE_CTX_INTVAL,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:r,old:n,which:t}};GUI.recordStep(a,true,false,o)},ctx_set_point1:function(e,t,o){var r,s,i,n,a;if(t==1){s="sliderpoint1-coord-x-field";i=GUI.ContextSave.p1x}else if(t==2){s="sliderpoint1-coord-y-field";i=GUI.ContextSave.p1y}else return;r=GUI.getId(s);if(GUI.Kbd.input==r)n=GUI.Kbd.getVal();else n=r.value;r=GUI.board.objects[e].point1.coords.usrCoords[3-t];a={type:JXG.GENTYPE_CTX_POINT1,src_ids:[GUI.board.objects[e].point1.id],dest_sub_ids:[],dest_id:0,args:{s:n.sanitize(),old:i,which:t,other:r}};GUI.recordStep(a,true,false,o)},ctx_set_point2:function(e,t,o){var r,s,i,n,a;if(t==1){s="sliderpoint2-coord-x-field";i=GUI.ContextSave.p2x}else if(t==2){s="sliderpoint2-coord-y-field";i=GUI.ContextSave.p2y}else return;r=GUI.getId(s);if(GUI.Kbd.input==r)n=GUI.Kbd.getVal();else n=r.value;r=GUI.board.objects[e].point2.coords.usrCoords[3-t];a={type:JXG.GENTYPE_CTX_POINT2,src_ids:[GUI.board.objects[e].point2.id],dest_sub_ids:[],dest_id:0,args:{s:n.sanitize(),old:i,which:t,other:r}};GUI.recordStep(a,true,false,o)},ctx_set_coord:function(e,t,o){var r,s,i,n,a;if(t==1){s="point-coord-x-field";i=GUI.ContextSave.Xjc}else if(t==2){s="point-coord-y-field";i=GUI.ContextSave.Yjc}else return;r=GUI.getId(s);if(GUI.Kbd.input==r)n=GUI.Kbd.getVal();else n=r.value;a={type:JXG.GENTYPE_CTX_COORDS,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:n.sanitize(),old:i,which:t}};GUI.recordStep(a,true,false,o)},ctx_set_xcoord:function(e,t){return GUI.ctx_set_coord(e,1,t)},ctx_set_ycoord:function(e,t){return GUI.ctx_set_coord(e,2,t)},ctx_set_radius:function(e,t){var o,r,s;o=GUI.getId("circle-radius-field");if(GUI.Kbd.input==o)r=GUI.Kbd.getVal();else r=o.value;if(r==""||isNaN(r)||r==null)return;s={type:JXG.GENTYPE_CTX_RADIUS,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:r,old:GUI.ContextSave.radius}};GUI.recordStep(s,true,false,t)},ctx_set_angleradius:function(e,t){var o,r,s;o=GUI.getId("angle-radius-field");if(GUI.Kbd.input==o)r=GUI.Kbd.getVal();else r=o.value;if(r==""||isNaN(r)||r==null)return;s={type:JXG.GENTYPE_CTX_ANGLERADIUS,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:r,old:GUI.ContextSave.angleRadius}};GUI.recordStep(s,true,false,t)},ctx_set_face:function(e){var t,o;if($("#point-style-button-circle").hasClass("button-selected"))t="circle";else if($("#point-style-button-square").hasClass("button-selected"))t="square";else if($("#point-style-button-cross").hasClass("button-selected"))t="cross";else t="plus";o={type:JXG.GENTYPE_CTX_FACE,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:t,old:GUI.ContextSave.face}};GUI.recordStep(o,true,false)},ctx_set_straightfirst:function(e){var t=$("#line-button-first").hasClass("button-selected"),o;o={type:JXG.GENTYPE_CTX_STRAIGHT,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:t,which:"first"}};GUI.recordStep(o,true,false)},ctx_set_straightlast:function(e){var t=$("#line-button-last").hasClass("button-selected"),o;o={type:JXG.GENTYPE_CTX_STRAIGHT,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:t,which:"last"}};GUI.recordStep(o,true,false)},ctx_set_arrowfirst:function(e){var t=$("#line-button-arrow-first").hasClass("button-selected"),o;o={type:JXG.GENTYPE_CTX_ARROW,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:t,which:"first"}};GUI.recordStep(o,true,false)},ctx_set_arrowlast:function(e){var t=$("#line-button-arrow-last").hasClass("button-selected"),o;o={type:JXG.GENTYPE_CTX_ARROW,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:t,which:"last"}};GUI.recordStep(o,true,false)},ctx_set_color:function(e){var t,o,r,s,i;if(!$("#color-tab-label").hasClass("button-disabled")){t="labelstroke"}else if(!$("#color-tab-stroke").hasClass("button-disabled")){t="stroke"}else if(!$("#color-tab-fill").hasClass("button-disabled"))t="fill";else return;i=$("#color-field");if(i.css("background-color")!=="transparent"&&i.css("background-color")!=="rgba(0, 0, 0, 0)"){if(t=="fill")r=i.val()/100;else r=1;o=JXG.rgbo2rgba(JXG.rgb2hex(i.css("background-color")),r)}else o="transparent";s={type:JXG.GENTYPE_CTX_COLOR,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:o,old:GUI.ContextSave.color[t],which:t,hasLabel:GUI.board.objects[e].label}};GUI.recordStep(s,true,false)},ctx_set_plot:function(e){var t={type:JXG.GENTYPE_CTX_PLOT,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:"function(x) { return "+GUI.Kbd.getVal()+"; }",old:GUI.board.objects[e].Y.toString()}};GUI.recordStep(t,true,false)},ctx_set_scale:function(e){var t,o="image-size-field";if(GUI.Kbd.input==GUI.getId(o))t=GUI.Kbd.getVal();else t=GUI.getId(o).value;GUI.recordStep({type:JXG.GENTYPE_CTX_SCALE,src_ids:[e],dest_sub_ids:[],dest_id:0,args:{s:t,old:GUI.ContextSave.scale}},true,false)},ctx_visible:function(e){return!$("div#ctxPanel").hasClass("not-displayed")&&$("input#id").attr("value")==e},ctx_input_toggle:function(e,t,o){o=JXG.def(o,"button-selected");$(e)[t+"Class"](o);$(e+"-box")[t+"Class"](o)},generateJCode:function(e,t){var o,r,s,i,n,a,l,d,c,u,G,f,I="",p="",g="",U="";s=t.objects;var b=function(e){return function(){if(GUI.ctx_visible(e)){$("#point-glider-button-glider").addClass("button-selected");$("#point-glider-button-free").removeClass("button-selected");$("#point-coord").addClass("not-displayed");t.update()}}};var h=function(e){return function(){if(GUI.ctx_visible(e)){$("#point-glider-button-free").addClass("button-selected");$("#point-glider-button-glider").removeClass("button-selected");$("#point-coord").removeClass("not-displayed")}}};switch(e.type){case JXG.GENTYPE_CTX_TYPE_G:I=e.src_ids[0]+".glide("+e.src_ids[1]+"); ";if(s[e.src_ids[1]].elementClass==JXG.OBJECT_CLASS_POINT)I+=e.src_ids[0]+".visible = false; ";else{I+=e.src_ids[0]+".fillColor = '"+JXG.Options.glider.fillColor+"'; ";I+=e.src_ids[0]+".strokeColor = '"+JXG.Options.point.strokeColor+"'; "}p=e.src_ids[0]+".free(); ";if(s[e.src_ids[1]].elementClass==JXG.OBJECT_CLASS_POINT)p+=e.src_ids[0]+".visible = true; ";else{if(e.args.fill&&e.args.stroke){p+=e.src_ids[0]+".fillColor = '"+e.args.fill+"'; ";p+=e.src_ids[0]+".strokeColor = '"+e.args.stroke+"'; "}}p+=e.src_ids[0]+".move(["+e.args.Xjc+", "+e.args.Yjc+"], 0); ";g=b(e.src_ids[0]);U=h(e.src_ids[0]);break;case JXG.GENTYPE_CTX_TYPE_P:I=e.src_ids[0]+".free(); "+e.src_ids[0]+".fillColor = '";I+=JXG.Options.point.fillColor+"'; ";I+=e.src_ids[0]+".strokeColor = '"+JXG.Options.point.strokeColor+"'; ";p=e.src_ids[0]+".fillColor = '"+e.args.fill+"'; ";p+=e.src_ids[0]+".strokeColor = '"+e.args.stroke+"'; ";p+=e.src_ids[0]+".glide("+e.src_ids[1]+"); ";g=h(e.src_ids[0]);U=b(e.src_ids[0]);break;case JXG.GENTYPE_CTX_WITHLABEL:var v=function(e,t){return function(){if(GUI.ctx_visible(t)){$("#textInput").removeClass("button-disabled");$("#label-visible").addClass("button-selected");$("#color-tab-label").removeClass("not-displayed");GUI.ContextSave.withLabel=e}}};var _=function(e,t){return function(){if(GUI.ctx_visible(t)){$("#textInput").addClass("button-disabled");$("#label-visible").removeClass("button-selected");$("#color-tab-label").addClass("not-displayed");$("#color-tab-stroke").trigger(GUI.click_event);GUI.ContextSave.withLabel=e}}};if(typeof e.args.s=="undefined")e.args.s=e.args.l;if(e.args.s){I=e.src_ids[0]+".withLabel = true; ";p=e.src_ids[0]+".withLabel = false; ";g=v(true,e.src_ids[0]);U=_(false,e.src_ids[0])}else{I=e.src_ids[0]+".withLabel = false; ";p=e.src_ids[0]+".withLabel = true; ";g=_(false,e.src_ids[0]);U=v(true,e.src_ids[0])}break;case JXG.GENTYPE_CTX_VISIBILITY:if(typeof e.args.s=="undefined")e.args.s=e.args.v;I+=e.src_ids[0]+".visible = "+e.args.s+"; ";p+=e.src_ids[0]+".visible = "+!e.args.s+"; ";var m=function(e,t,o){return function(){if(GUI.ctx_visible(t)){var r,s="add",i="remove";if(!e){r=i;i=s;s=r}GUI.ctx_input_toggle("#textInput",i,"button-disabled");if(o.type==JXG.OBJECT_TYPE_TEXT)GUI.ctx_input_toggle("#label-visible",s);GUI.ContextSave.visible=e}if(!o)o=GUI.board.objects[t]}};r=s[e.src_ids[0]];if(e.args.s){g=m(true,e.src_ids[0],r);U=m(false,e.src_ids[0],r)}else{g=m(false,e.src_ids[0],r);U=m(true,e.src_ids[0],r)}break;case JXG.GENTYPE_CTX_DOTVISIBILITY:if(typeof e.args.s=="undefined")e.args.s=e.args.v;I=e.src_ids[0]+".orthotype = "+(e.args.s?"'sectordot'":"'sector'")+"; ";p=e.src_ids[0]+".orthotype = "+(e.args.s?"'sector'":"'sectordot'")+"; ";var C=function(e,t){return function(){if(GUI.ctx_visible(t)){GUI.ctx_input_toggle("#angle-button-rightangle",e)}}};if(e.args.s){g=C("add",e.src_ids[0]);U=C("remove",e.src_ids[0])}else{g=C("remove",e.src_ids[0]);U=C("add",e.src_ids[0])}break;case JXG.GENTYPE_CTX_MPVISIBILITY:if(e.args.s=="undefined")e.args.s=e.args.v;I=e.src_ids[1]+".visible = "+e.args.s+"; ";p=e.src_ids[1]+".visible = "+!e.args.s+"; ";var y=function(e,t,o,r){return function(){if(GUI.ctx_visible(o)){GUI.ctx_input_toggle("#line-related-midpoint",t)}r.guiVisProp=r.guiVisProp||{};r.guiVisProp.visible=e}};r=s[e.src_ids[1]];if(e.args.s){g=y(true,"add",e.src_ids[0],r);U=y(false,"remove",e.src_ids[0],r)}else{g=y(false,"remove",e.src_ids[0],r);U=y(true,"add",e.src_ids[0],r)}break;case JXG.GENTYPE_CTX_FIXED:if(typeof e.args.s=="undefined")e.args.s=e.args.f;I=e.src_ids[0]+".fixed = "+e.args.s+"; ";p=e.src_ids[0]+".fixed = "+!e.args.s+"; ";var x=function(e,t){return function(){if(GUI.ctx_visible(t)){GUI.ctx_input_toggle("#status-fix",e);$("#point-coord")[e+"Class"]("not-displayed")}}};if(e.args.s){g=x("add",e.src_ids[0]);U=x("remove",e.src_ids[0])}else{g=x("remove",e.src_ids[0]);U=x("add",e.src_ids[0])}break;case JXG.GENTYPE_CTX_TRACE:if(typeof e.args.s=="undefined")e.args.s=e.args.t;I=e.src_ids[0]+".trace = "+e.args.s+"; ";p=e.src_ids[0]+".trace = "+!e.args.s+"; ";var E=function(e,t){return function(){if(GUI.ctx_visible(t)){GUI.ctx_input_toggle("#status-trace",e)}}};if(e.args.s){g=E("add",e.src_ids[0]);U=E("remove",e.src_ids[0])}else{g=E("remove",e.src_ids[0]);U=E("add",e.src_ids[0])}break;case JXG.GENTYPE_CTX_TEXT:if(typeof e.args.s=="undefined")e.args.s=e.args.t;if(e.args.s.search(/'/)==-1)I=e.src_ids[0]+".setText('"+e.args.s+"'); ";else{try{GUI.board.jc.snippet(e.args.s,true);I=e.src_ids[0]+".setText(function () { return "+e.args.s+"; }); "}catch(S){break}}if(e.args.old.search(/'/)==-1&&e.args.old.search(/function/)==-1)p=e.src_ids[0]+".setText('"+e.args.old+"'); ";else p=e.src_ids[0]+".setText(function () { return "+e.args.old+"; }); ";var J=function(e,t){return function(){if(GUI.ctx_visible(t)){$("#textInput").val(e);GUI.ContextSave.text=e}}};g=J(e.args.s,e.src_ids[0]);U=J(e.args.old,e.src_ids[0]);break;case JXG.GENTYPE_CTX_LABEL:if(typeof e.args.s=="undefined")e.args.s=e.args.l;I=e.src_ids[0]+".name = '"+e.args.s+"'; ";I+=e.src_ids[0]+".label.setText('"+e.args.s+"'); ";e.args.old=e.args.old.sanitize().replace(/\\/g,"").replace(/'/g,"\\'");p=e.src_ids[0]+".name = '"+e.args.old+"'; ";p+=e.src_ids[0]+".label.setText('"+e.args.old+"'); ";var T=function(e,t){return function(){if(GUI.ctx_visible(t)){$("#textInput").attr("value",e);GUI.ContextSave.labelName=e}}};g=T(e.args.s,e.src_ids[0]);U=T(e.args.old,e.src_ids[0]);break;case JXG.GENTYPE_CTX_LABELSTICKY:if(typeof e.args.s=="undefined")e.args.s=e.args.f;I=e.src_ids[0]+".fixed = "+e.args.s+"; ";p=e.src_ids[0]+".fixed = "+!e.args.s+"; ";var w=function(e,t){return function(){if(GUI.ctx_visible(t)){if(e)$("#label-sticky").attr("checked","checked");else $("#label-sticky").removeAttr("checked")}}};if(e.args.s){g=w(true,e.src_ids[0]);U=w(false,e.src_ids[0])}else{g=w(false,e.src_ids[0]);U=w(true,e.src_ids[0])}break;case JXG.GENTYPE_CTX_STROKEWIDTH:if(e.args.s=="undefined")e.args.s=e.args.w;I=e.src_ids[0]+".strokeWidth = "+e.args.s+"; ";p=e.src_ids[0]+".strokeWidth = "+e.args.old+"; ";r=s[e.src_ids[0]];if(r.type==JXG.OBJECT_TYPE_POLYGON){for(o in r.borders){if(r.borders.hasOwnProperty(o)){I=r.borders[o].id+".strokeWidth = "+e.args.s+"; "+I;p=p+r.borders[o].id+".strokeWidth = "+e.args.old+"; "}}}var k=function(e,t){return function(){if(GUI.ctx_visible(t)){if(!$("#color-tab-stroke").hasClass("button-disabled"))$("#color-field").val(e);GUI.ContextSave.strokeWidth=e}}};g=k(e.args.s,e.src_ids[0]);U=k(e.args.old,e.src_ids[0]);break;case JXG.GENTYPE_CTX_LABELSIZE:I=e.src_ids[0]+".fontSize = "+e.args.s+"; ";p=e.src_ids[0]+".fontSize = "+e.args.old+"; ";var X=function(e,t){return function(){if(GUI.ctx_visible(t)){if(!$("#color-tab-label").hasClass("button-disabled"))$("#color-field").val(e);GUI.ContextSave.labelSize=e}}};g=X(e.args.s,e.src_ids[0].replace(/Label/,""));U=X(e.args.old,e.src_ids[0].replace(/Label/,""));break;case JXG.GENTYPE_CTX_SIZE:I=e.src_ids[0]+".size = "+e.args.s+"; ";p=e.src_ids[0]+".size = "+e.args.old+"; ";var O=function(e,t){return function(){if(GUI.ctx_visible(t)){$("#point-size-field").val(e);GUI.ContextSave.size=e}}};g=O(e.args.s,e.src_ids[0]);U=O(e.args.old,e.src_ids[0]);break;case JXG.GENTYPE_CTX_SCALE:I=e.src_ids[0]+".scale = "+e.args.s+"; ";p=e.src_ids[0]+".scale = "+e.args.old+"; ";var P=function(e,t){return function(){if(GUI.ctx_visible(t)){$("#image-size-field").val(e);GUI.ContextSave.scale=e}}};g=P(e.args.s,e.src_ids[0]);U=P(e.args.old,e.src_ids[0]);break;case JXG.GENTYPE_CTX_INTVAL:if(e.args.which){I=e.src_ids[0]+".smin = "+e.args.s+"; ";p=e.src_ids[0]+".smin = "+e.args.old+"; "}else{I=e.src_ids[0]+".smax = "+e.args.s+"; ";p=e.src_ids[0]+".smax = "+e.args.old+"; "}var L=function(t,o){return function(){if(GUI.ctx_visible(o)){if(e.args.which){$("#slider-interval-a-field").val(t);GUI.ContextSave.start=t}else{$("#slider-interval-b-field").val(t);GUI.ContextSave.end=t}}}};g=L(e.args.s,e.src_ids[0]);U=L(e.args.old,e.src_ids[0]);break;case JXG.GENTYPE_CTX_FILLOPACITY:if(typeof e.args.s=="undefined")e.args.s=e.args.o;I=e.src_ids[0]+".fillOpacity = "+e.args.s/100+"; ";p=e.src_ids[0]+".fillOpacity = "+e.args.old+"; ";var A=function(e,t,o){return function(){if(GUI.ctx_visible(t)){if(e>1)e/=100;if(!$("#color-tab-fill").hasClass("button-disabled"))$("#color-field").val(e*100);GUI.ContextSave.fillOpacity=e;GUI.ContextSave.color["fill"]=JXG.rgbo2rgba(o.getAttribute("fillColor"),e)}}};r=s[e.src_ids[0]];g=A(e.args.s,e.src_ids[0],r);U=A(e.args.old,e.src_ids[0],r);break;case JXG.GENTYPE_CTX_FACE:if(typeof e.args.s=="undefined")e.args.s=e.args.f;I=e.src_ids[0]+".face = '"+e.args.s+"'; ";p=e.src_ids[0]+".face = '"+e.args.old+"'; ";var j=function(e,t){return function(){if(GUI.ctx_visible(t)){$("#point-style-button-circle").removeClass("button-selected");$("#point-style-button-square").removeClass("button-selected");$("#point-style-button-cross").removeClass("button-selected");$("#point-style-button-plus").removeClass("button-selected");$("#point-style-button-"+e).addClass("button-selected");GUI.ContextSave.face=e}}};g=j(e.args.s,e.src_ids[0]);U=j(e.args.old,e.src_ids[0]);break;case JXG.GENTYPE_CTX_STRAIGHT:I=p=e.src_ids[0]+".straight"+e.args.which+" = ";I+=e.args.s+"; ";p+=!e.args.s+"; ";var R=function(t,o){return function(){if(GUI.ctx_visible(o)){i=$("#line-button-"+e.args.which);if(t)i.addClass("button-selected");else i.removeClass("button-selected")}}};g=R(e.args.s,e.src_ids[0]);U=R(!e.args.s,e.src_ids[0]);break;case JXG.GENTYPE_CTX_ARROW:if(typeof e.args.s=="undefined")e.args.s=e.args.a;I=p=e.src_ids[0]+"."+e.args.which+"arrow = ";I+=e.args.s+"; ";p+=!e.args.s+"; ";var B=function(t,o){return function(){if(GUI.ctx_visible(o)){i=$("#line-button-arrow-"+e.args.which);if(t)i.addClass("button-selected");else i.removeClass("button-selected")}}};g=B(e.args.s,e.src_ids[0]);U=B(!e.args.s,e.src_ids[0]);break;case JXG.GENTYPE_CTX_ANGLERADIUS:if(typeof e.args.s=="undefined")e.args.s=e.args.r;I=e.src_ids[0]+".radius = "+e.args.s+"; ";p=e.src_ids[0]+".radius = "+e.args.old+"; ";var D=function(e,t){return function(){if(GUI.ctx_visible(t)){$("#angle-radius-field").val(e);GUI.ContextSave.angleRadius=e}}};g=D(e.args.s,e.src_ids[0]);U=D(e.args.old,e.src_ids[0]);break;case JXG.GENTYPE_CTX_RADIUS:if(typeof e.args.s=="undefined")e.args.s=e.args.r;I=e.src_ids[0]+".setRadius(function () { return "+e.args.s+"; }); ";p=e.src_ids[0]+".setRadius(function () { return "+e.args.old+"; }); ";var N=function(e,t){return function(){if(GUI.ctx_visible(t)){$("#circle-radius-field").val(e);GUI.ContextSave.radius=e}}};g=N(e.args.s,e.src_ids[0]);U=N(e.args.old,e.src_ids[0]);break;case JXG.GENTYPE_CTX_COORDS:if(typeof e.args.s=="undefined"){if(typeof e.args.y=="undefined")e.args.s=e.args.x;else e.args.s=e.args.y}if(e.args.which==1){l=e.args.s;d=e.args.old;a="X"}else{l=e.args.s;d=e.args.old;a="Y"}I=e.src_ids[0]+"."+a+" = function() { return "+l+"; }; ";if(parseFloat(l)==l)I+=e.src_ids[0]+".free(); ";p=e.src_ids[0]+"."+a+" = function() { return "+d+"; }; ";if(d.toString().search("function")==-1)p+=e.src_ids[0]+".free(); ";var K=function(e,t,o){return function(){if(GUI.ctx_visible(o)){$("#point-coord-"+e.toLowerCase()+"-field").val(t);GUI.ContextSave[e+"jc"]=t}}};g=K(a,l,e.src_ids[0]);U=K(a,d,e.src_ids[0]);break;case JXG.GENTYPE_CTX_POINT1:if(typeof e.args.s=="undefined"){if(typeof e.args.y=="undefined")e.args.s=e.args.x;else e.args.s=e.args.y}if(e.args.which==1){l=c=e.args.s;d=G=e.args.old;a="X";u=f=e.args.other}else{l=u=e.args.s;d=f=e.args.old;a="Y";c=G=e.args.other}I=e.src_ids[0]+".moveTo(["+c+", "+u+"]); $board.fullUpdate(); ";p=e.src_ids[0]+".moveTo(["+G+", "+f+"]); $board.fullUpdate(); ";var M=function(e,t,o){return function(){if(GUI.ctx_visible(o)){$("#sliderpoint1-coord-"+e.toLowerCase()+"-field").val(t);GUI.ContextSave["p1"+e.toLowerCase()]=t}}};g=M(a,l,e.src_ids[0]);U=M(a,d,e.src_ids[0]);break;case JXG.GENTYPE_CTX_POINT2:if(typeof e.args.s=="undefined"){if(typeof e.args.y=="undefined")e.args.s=e.args.x;else e.args.s=e.args.y}if(e.args.which==1){l=c=e.args.s;d=G=e.args.old;a="X";u=f=e.args.other}else{l=u=e.args.s;d=f=e.args.old;a="Y";c=G=e.args.other}I=e.src_ids[0]+".moveTo(["+c+", "+u+"]); $board.fullUpdate(); ";p=e.src_ids[0]+".moveTo(["+G+", "+f+"]); $board.fullUpdate(); ";var Y=function(e,t,o){return function(){if(GUI.ctx_visible(o)){$("#sliderpoint2-coord-"+e.toLowerCase()+"-field").val(t);GUI.ContextSave["p2"+e.toLowerCase()]=t}}};g=Y(a,l,e.src_ids[0]);U=Y(a,d,e.src_ids[0]);break;case JXG.GENTYPE_CTX_COLOR:if(typeof e.args.which=="undefined")e.args.which=e.args.element;if(e.args.which.substr(0,5)=="label")n=".label.";else n=".";if(typeof e.args.s=="undefined")e.args.s=e.args.c;I=e.src_ids[0]+n+e.args.which.replace("label","")+"Color = '";I+=e.args.s+"'; ";p=e.src_ids[0]+n+e.args.which.replace("label","")+"Color = '";p+=e.args.old+"'; ";r=s[e.src_ids[0]];if(e.args.which=="stroke"&&r.type==JXG.OBJECT_TYPE_POLYGON){for(o in r.borders){if(r.borders.hasOwnProperty(o)){I=r.borders[o].id+n+e.args.which.replace("label","")+"Color = '"+e.args.s+"'; "+I;p=p+r.borders[o].id+n+e.args.which.replace("label","");p+="Color ='"+e.args.old+"'; "}}}if(e.args.which.substr(0,9)=="highlight"&&e.args.hasLabel){I+=e.src_ids[0]+".label."+e.args.which+"Color = '"+e.args.s+"'; ";p=e.src_ids[0]+".label."+e.args.which+"Color = '"+e.args.old+"'; "}var z=function(t,o){return function(){var r=JXG.rgba2rgbo(t),s={labelstroke:"label",stroke:"stroke",fill:"fill"};if(GUI.ctx_visible(o)){i=$("#color-field");if(!$("#color-tab-"+s[e.args.which]).hasClass("button-disabled")){i.css("background-color",r[0]);i.css("color",GUI.getBestSwContrast(JXG.hex2rgb(r[0])))}GUI.ContextSave.color[e.args.which]=t}}};g=z(e.args.s,e.src_ids[0]);U=z(e.args.old,e.src_ids[0]);break;case JXG.GENTYPE_CTX_PLOT:I=e.src_ids[0]+".generateTerm('x', 'x', '"+e.args.s.cleanTerm()+"'); $board.update();";p=e.src_ids[0]+".generateTerm('x', 'x', '"+e.args.old.cleanTerm()+"'); $board.update();";break;default:return[]}return[I,g,p,U]}});GUI.tpl=function(){var e={};return{load:function(t){e[t]=e[t]||this.trim(document.getElementById(t).innerHTML);return e[t]},trim:function(e){e=e.replace(/^\s+/,"");e=e.replace(/\s+$/,"");return e},render:function(e,t){var o,r;o=this.load(e)||"Template not found";r=/%L-(.*?)%/;while(r.test(o)){o=o.replace(r,GUI.Lang.std[RegExp.$1]||"#!$"+RegExp.$1+"#!$")}r=/%(.*?)%/;while(r.test(o)){o=o.replace(r,typeof t[RegExp.$1]!=="undefined"&&t[RegExp.$1]!==null?t[RegExp.$1]:"#!$"+RegExp.$1+"#!$")}r=/#!\$/g;o=o.replace(r,"%");return o}}}();var Flow=function(e,t){var o=this;this.id=e;this.hid="#"+e;this.speed=100;this.root=$(this.hid);this.itemlist=$(this.hid+" .itemlist");this.width=parseInt(this.root.css("width"));this.height=t.previewHeight||502;this.previewWidth=t.previewWidth||502;this.itemSpace=t.itemSpace||50;this.itemPreview=(this.width-this.previewWidth-2*this.itemSpace)/2;this.scrollWidth=this.itemSpace+this.previewWidth;this.items=[];this.eventHandlers={};this.currentItem=0;this.handleKbd=false;this.eventCapture=t.eventCapture||e;if(!JXG.isArray(this.eventCapture)){this.eventCapture=[this.eventCapture]}$.each($(this.hid+" .itemlist .item"),function(e,t){t.id=null;o.items.push(t)});this.initMarkers();this.addEventListener()};Flow.prototype.initMarkers=function(){this.spacerStart=$(document.createElement("div"));this.spacerStart.css("width",this.itemPreview+"px");this.spacerStart.css("height",this.height+"px");this.spacerStart.addClass("carousel-marker yzBackgroundColorM");this.spacerStart.attr("id",this.id+"startmarker");this.itemlist.prepend(this.spacerStart);this.spacerEnd=$(document.createElement("div"));this.spacerEnd.css("width",this.itemPreview+this.itemSpace+"px");this.spacerEnd.css("height",this.height+"px");this.spacerEnd.addClass("carousel-marker yzBackgroundColorM");this.spacerEnd.attr("id",this.id+"endmarker");this.itemlist.append(this.spacerEnd)};Flow.prototype.indexById=function(e){var t;for(t=0;t<this.items.length;t++){if(this.items[t].id===e){return t}}return-1};Flow.prototype.append=function(e,t){var o=$(e);o.id=t;this.items.push(o);o.insertBefore(this.hid+"endmarker");this.update()};Flow.prototype.prepend=function(e,t){var o=$(e);o.id=t;this.items.splice(0,0,o);o.insertAfter(this.hid+"startmarker");this.update()};Flow.prototype.insertBefore=function(e,t,o){var r,s=this.indexById(e);if(s>-1){r=$(t);r.id=o;r.insertBefore(this.items[s]);this.items.splice(s,0,r)}else{this.prepend(t,o)}this.update()};Flow.prototype.insertAfter=function(e,t,o){var r,s=this.indexById(e);if(s>-1){r=$(t);r.id=o;r.insertAfter(this.items[s]);this.items.splice(s+1,0,r)}else{this.append(t,o)}this.update()};Flow.prototype.remove=function(e){var t=this.indexById(e);if(t>-1){this.items[t].remove();this.items.splice(t,1)}};Flow.prototype.update=function(){this.itemlist.css("width",(this.previewWidth+this.itemSpace)*this.items.length+this.itemSpace+2*this.itemPreview+"px")};Flow.prototype.on=function(e,t){if(!this.eventHandlers[e]){this.eventHandlers[e]=[]}this.eventHandlers[e].push(t)};Flow.prototype.triggerEventHandlers=function(e){var t;if(!this.eventHandlers[e]){return}if(!this.items[this.currentItem])return;for(t=0;t<this.eventHandlers[e].length;t++){this.eventHandlers[e][t](this.items[this.currentItem].id)}};Flow.prototype.doScroll=function(e){this.root.animate({scrollLeft:this.currentItem*this.scrollWidth},e);this.triggerEventHandlers("scroll")};Flow.prototype.moveTo=function(e,t){if(e>=0&&e<this.items.length){this.currentItem=e;this.doScroll(t)}};Flow.prototype.moveToId=function(e,t){var o=this.indexById(e);if(o>-1){this.currentItem=o;this.doScroll(t)}};Flow.prototype.moveRight=function(e){if(this.currentItem<this.items.length-1){this.currentItem+=1;this.doScroll(e)}};Flow.prototype.moveLeft=function(e){if(this.currentItem>0){this.currentItem-=1;this.doScroll(e)}};Flow.prototype.addEventListener=function(){var e=this,t,o,r,s=false,i,n,a=document.getElementById("gallery");if(!this.down){this.down=function(t){t.preventDefault();t.stopPropagation();e.triggerEventHandlers("down");if(t.targetTouches){o=[t.targetTouches[0].screenX,t.targetTouches[0].screenY]}else{o=[t.clientX,t.clientY]}r=e.root.scrollLeft();s=true;return false};this.up=function(r){if(!JXG.exists(o)){return}r.preventDefault();r.stopPropagation();if(t>0){e.moveLeft(e.speed)}else if(t<0){e.moveRight(e.speed)}else{o=o[0];if(o<(e.width-e.previewWidth)/2+e.itemSpace){e.moveLeft(e.speed)}else if(o>(e.width+e.previewWidth)/2+3*e.itemSpace){e.moveRight(e.speed)}else{e.triggerEventHandlers("click")}}o=null;t=0;s=false};this.move=function(i){var n,a;if(s){if(i.targetTouches){a=i.targetTouches[0].screenX-o[0]}else{a=i.clientX-o[0]}t=a>0?1:-1;t=Math.abs(a)<20?0:t;n=a/e.width;e.root.scrollLeft(r-n*e.scrollWidth)}};this.keyup=function(t){var o;o=t.key||t.keyCode;switch(o){case 37:e.moveLeft(e.speed);break;case 39:e.moveRight(e.speed);break;case 38:e.triggerEventHandlers("edit");break;case 40:GUI.Gallery.newConstruction(t);break;case 35:e.moveTo(e.items.length-1);break;case 36:e.moveTo(0);break;case 13:case 14:break;case 79:e.triggerEventHandlers("click");break;default:}}}$(document).on("keyup",this.keyup);this.handleKbd=true;$(a).on("mouseup",this.up);$(a).on("mousemove",this.move);JXG.addEvent(a,"touchend",this.up,this);JXG.addEvent(a,"touchmove",this.move,this);for(n=0;n<this.eventCapture.length;n++){i=document.getElementById(this.eventCapture[n]);$(i).on("mousedown",this.down);JXG.addEvent(i,"touchstart",this.down,this)}};Flow.prototype.removeEventListener=function(){var e,t,o=document.getElementById("gallery");$(o).off("mouseup");$(o).off("mousemove");JXG.removeEvent(o,"touchend",this.up,this);JXG.removeEvent(o,"touchmove",this.move,this);for(t=0;t<this.eventCapture.length;t++){e=document.getElementById(this.eventCapture[t]);JXG.removeEvent(e,"touchstart",this.down,this);$(e).off("mousedown")}$(document).off("keyup")};Flow.prototype.suspendKeyboardListener=function(){$(document).off("keyup");this.handleKbd=false};Flow.prototype.resumeKeyboardListener=function(){if(!this.handleKbd){$(document).on("keyup",this.keyup);this.handleKbd=true}};Flow.prototype.cleanup=function(){this.removeEventListener();this.itemlist.html("")};Flow.prototype.resize=function(e,t){this.height=t;this.width=parseInt(this.root.css("width"));this.scrollWidth=this.itemSpace+this.previewWidth;this.itemPreview=(this.width-this.previewWidth-2*this.itemSpace)/2;this.spacerStart.css("width",this.itemPreview+"px");this.spacerStart.css("height",this.height+"px");this.spacerEnd.css("width",this.itemPreview+this.itemSpace+"px");this.spacerEnd.css("height",this.height+"px");this.update()};GUI.scroll=function(e){"use strict";var t=JXG.Util.genUUID(),o=$("#gallery"),r=$(e),s,i,n,a,l,d,c,u,G=false,f,I,p,g,U,b,h;o.append('<div id="'+t+'" class="scrollbar"></div>');if($.browser.mozilla||$.browser.opera){r.css("overflow-y","hidden")}r.css("-ms-overflow-style","none");d=$("#"+t);s=function(){i=r.offset();a=i.top;n=r.height();l=n/r.prop("scrollHeight");c=n*(1-l);h=0;d.css("top",a);d.css("left",i.left+r.width()+2);d.css("height",n*l)};s();U=function(e){h=r.scrollTop()*l;d.css("top",a+h)};r.on("scroll",U);g=function(e){var t=e.detail?e.detail*-10:e.wheelDelta/4;h=Math.max(0,Math.min(h-t,c));r.scrollTop(h/l);d.css("top",a+h)};if($.browser.opera){JXG.addEvent(r[0],"mousewheel",g,r[0])}JXG.addEvent(r[0],"DOMMouseScroll",g,r[0]);I=function(e){u=e.touches?e.touches[0].pageY:e.pageY;b=h;G=true;$(document).on("mousemove",f);$(document).on("mouseup",p);return false};d.on("mousedown",I);f=function(e){var t=e.touches?e.touches[0].pageY:e.pageY,o=e.touches?1:-1;if(G){h=Math.max(0,Math.min(b+(t+o*u),c));d.css("top",a+h);r.scrollTop(h/l)}return false};p=function(e){G=false;$(document).off("mouseup",p);$(document).off("mousemove",f);return false};return{hide:function(){d.hide()},show:function(){d.show()},resize:function(){s()},free:function(){r.off("mousedown",I);r.off("scroll",U);if($.browser.opera){JXG.removeEvent(r[0],"mousewheel",g,r[0])}JXG.removeEvent(r[0],"DOMMouseScroll",g,r[0]);d.remove()}}};GUI.Gallery={flow:null,files:[],currentItem:0,currentSort:"name",useImages:true,padding:8,previewHeight:270,previewWidth:360,editHeight:38,buttonWidth:64,toolbarSpacing:32,boxPrefix:"item-preview-",itemPrefix:"item-",editPrefix:"item-edit-name-",itemButtonHandlers:[],waitAnimShow:false,waitAnimHide:false,indexByKey:function(e){var t;for(t=0;t<this.files.length;t++){if(this.files[t].fullid===e||this.files[t].id===e){return t}}return-1},selectionChanged:function(e){var t,o;this.currentItem=this.indexByKey(e);GUI.Storage.setItem(GUI.appId+":meta:current",this.currentItem);while(t=this.itemButtonHandlers.pop()){$("#item-export-"+t+"-group").off();$("#item-clone-"+t+"-group").off();$("#item-delete-"+t+"-group").off()}$("#item-export-"+e+"-group").on("click",GUI.Gallery.exportClick);$("#item-clone-"+e+"-group").on("click",GUI.Gallery.cloneClick);$("#item-delete-"+e+"-group").on("click",GUI.Gallery.deleteClick);this.itemButtonHandlers.push(e);$(".item").removeClass("bg-selected");$("#item-"+e).addClass("bg-selected");$(".item-edit").removeClass("bg-selected");$("#item-edit-name-"+e).addClass("bg-selected");$(".item-export").removeClass("item-button-selected");$("#item-export-"+e).addClass("item-button-selected");$(".item-clone").removeClass("item-button-selected");$("#item-clone-"+e).addClass("item-button-selected");$(".item-delete").removeClass("item-button-selected");
+$("#item-delete-"+e).addClass("item-button-selected");$(".item-edit").removeClass("item-edit-selected");$("#item-edit-name-"+e).addClass("item-edit-selected");$(".item-edit").attr("disabled","disabled");$("#item-edit-name-"+e).removeAttr("disabled");$(".item-caption").removeClass("item-caption-selected");$("#item-export-"+e+"-caption").addClass("item-caption-selected");$("#item-clone-"+e+"-caption").addClass("item-caption-selected");$("#item-delete-"+e+"-caption").addClass("item-caption-selected")},attachEditEvents:function(e){e=this.files[e].id;$("#item-edit-name-"+e).on("focus",this.editFocus);$("#item-edit-name-"+e).on("blur",this.editBlur);$("#item-edit-name-"+e).on("keyup",this.editKeyUp);GUI.Gallery.setCaptions()},editFocus:function(){GUI.Gallery.flow.suspendKeyboardListener()},editBlur:function(){GUI.Gallery.rename();GUI.Gallery.flow.resumeKeyboardListener()},editKeyUp:function(e){var t=e.key||e.keyCode,o=GUI.Gallery.files[GUI.Gallery.currentItem],r=$("#item-edit-name-"+o.id);switch(t){case 13:case 14:GUI.Gallery.rename();r.blur();break;case 27:r.val(GUI.Gallery.files[GUI.Gallery.currentItem].data.name);r.blur();break}},addBoard:function(e){var t,o,r;r=this;try{t=this.files[e].data;if(GUI.Gallery.useImages&&t.image&&t.image.length>0&&JXG.exists(t.code)){$("#"+this.boxPrefix+this.files[e].id).html('<canvas id="'+this.boxPrefix+this.files[e].id+'-canvas" width="'+this.previewWidth+'" height="'+this.previewHeight+'"><'+"/canvas>");this.files[e].canvas=true;o=new Image;o.onload=function(){var t,s;t=document.getElementById(r.boxPrefix+r.files[e].id+"-canvas");s=t.getContext("2d");s.drawImage(o,0,0)};o.src=t.image}else{if(t.content.length>0){this.files[e].board=this.createBoard(this.boxPrefix+this.files[e].id,t);t.image=this.files[e].board.renderer.canvasRoot.toDataURL();GUI.Storage.setItem(this.files[e].fullid,JSON.stringify(t));$("#"+this.boxPrefix+this.files[e].id+"-wait").remove()}}}catch(s){JXG.debug("gallery: "+s+s.stack)}this.files[e].done=true},createBoard:function(e,t){var o,r,s,i,n,a,l,d,c,u;l=JXG.Options.renderer;d=JXG.Options.text.visible;c=JXG.Options.point.withLabel;t.code="";n=JSON.parse(GUI.unpack(t.content));i=n.pop();JXG.Options.renderer="canvas";JXG.Options.text.visible=false;JXG.Options.point.withLabel=false;o=JXG.JSXGraph.initBoard(e,{axis:false,boundingbox:i.boundingBox,showNavigation:false,showCopyright:false,keepaspectratio:true});o.suspendUpdate();if(typeof i.unredo==="undefined"){s=n.length-1}else{s=i.unredo}for(r=0;r<=s;r++){if(n[r].type>50)a=GUI.generateJCode(n[r],o);else a=JXG.SketchReader.generateJCode(n[r],o,n);if(JXG.isArray(a)&&a.length>0){try{t.code+=a[0]+"\n";o.jc.parse(a[0])}catch(G){JXG.debug("Error parsing: '"+a[0]+"'; "+G)}}}if(i.axisVisible){o.objects.GUIx.setAttribute({visible:true});o.objects.GUIx.defaultTicks.setAttribute({drawLabels:false});o.objects.GUIy.setAttribute({visible:true});o.objects.GUIy.defaultTicks.setAttribute({drawLabels:false})}else{o.objects.GUIx.defaultTicks.setAttribute({majorHeight:0,minorHeight:0,visible:false,drawZero:false,drawLabels:false});o.objects.GUIy.defaultTicks.setAttribute({majorHeight:0,minorHeight:0,visible:false,drawZero:false,drawLabels:false})}JXG.Options.renderer=l;if(JXG.exists(d)){JXG.Options.text.visible=d}else{delete JXG.Options.text.visible}JXG.Options.point.withLabel=c;o.removeEventHandlers();o.unsuspendUpdate();o.fullUpdate();o.suspendUpdate();return o},updateFilelist:function(){var e,t,o=this;if(GUI.Gallery.files.length===0&&GUI.Gallery.flow.items.length>0&&GUI.Gallery.flow.items[0].id==="INITIALADDHINT"){GUI.Gallery.flow.remove("INITIALADDHINT")}for(e in GUI.Storage){if((!GUI.Storage.hasOwnProperty||GUI.Storage.hasOwnProperty(e))&&e.indexOf(GUI.appId+":file:")>-1&&this.indexByKey(e)===-1){t=JSON.parse(GUI.Storage.getItem(e));this.files.push({fullid:e,id:e.substr(GUI.appId.length+6),data:t,done:false,idx:t.index})}}if(this.files.length<=0){return}else{if($("#gallery-tooltip-start").length!==0){$("#gallery-tooltip-start").remove()}}if(this.currentItem>-1&&this.files[this.currentItem].done){if(this.files[this.currentItem].board){JXG.JSXGraph.freeBoard(this.files[this.currentItem].board);this.files[this.currentItem].board=false}else if(this.files[this.currentItem].canvas){$("#"+this.boxPrefix+this.files[this.currentItem].id+"-canvas").remove();this.files[this.currentItem].canvas=false}this.files[this.currentItem].data=JSON.parse(GUI.Storage.getItem(this.files[this.currentItem].fullid));$("#"+this.boxPrefix+this.files[this.currentItem].id).html('<img id="'+this.boxPrefix+this.files[this.currentItem].id+'-wait" src="pics/wait-animation-big.gif" class="gallery-wait-animation-big" />');window.setTimeout(function(){o.addBoard(o.currentItem)},500)}this.sort(this.files,"idx")},load:function(e,t){var o,r=true;if(JXG.exists(e)&&JXG.exists(t)){if(e>=0&&!this.files[e].done){this.flow.insertBefore(this.files[e+1].id,GUI.tpl.render("gallery-item-template",{id:this.files[e].id,name:this.files[e].data.name}),this.files[e].id);this.addBoard(e);this.flow.moveRight(0);this.attachEditEvents(e)}if(t<this.files.length&&!this.files[t].done){this.flow.insertAfter(this.files[t-1].id,GUI.tpl.render("gallery-item-template",{id:this.files[t].id,name:this.files[t].data.name}),this.files[t].id);this.addBoard(t);this.attachEditEvents(t)}}else if(JXG.exists(e)){if(!this.files[e].done){this.flow.append(GUI.tpl.render("gallery-item-template",{id:this.files[e].id,name:this.files[e].data.name}),this.files[e].id);this.addBoard(e);this.attachEditEvents(e)}this.flow.moveToId(this.files[e].id,0);t=e}else{r=false;this.resize();o=parseInt(GUI.Storage.getItem(GUI.appId+":meta:current"),10);if(o>-1&&o<this.files.length){this.load(o)}else if(this.files.length>0){this.load(0)}}if(r&&(e>=0||t<this.files.length)&&GUI.activePage==="gallery"){window.setTimeout(function(){GUI.Gallery.load(e-1,t+1)},10)}},resize:function(){var e=$("#gallerycontent").outerWidth()-$("#gallerycontent").width(),t=$("#gallerycontent").outerHeight()-$("#gallerycontent").height(),o=parseInt($("#gallery-css-indicator").width(),10),r,s,i,n;s=window.innerWidth-e;i=window.innerHeight-t;if(o===50){this.padding=4;this.previewHeight=162;this.previewWidth=216;this.editHeight=16;this.buttonWidth=40}else{this.padding=8;this.previewHeight=270;this.previewWidth=360;this.editHeight=38;this.buttonWidth=64}$("#gallery").height(i);this.toolbarSpacing=parseInt($("#toolbar-container").css("margin-top"),10);this.headerHeight=(i-this.previewHeight-this.editHeight-13*this.padding)/2;r=this.headerHeight*5.3125;if(r>s){this.headerHeight*=s/r}$("#gallery-header").css("height",this.headerHeight);$("#gallery-header-watermark").css("margin-top",.15*this.headerHeight);n=s/2-this.previewWidth/2-2*this.padding;$("#carousel-eventcapture-left").css("width",n);$("#carousel-eventcapture-right").css("width",n);if($("#gallery-tooltip-start").length!==0){$("#gallery-tooltip-start").css("top",this.headerHeight+this.previewHeight+6*this.padding+this.editHeight+this.toolbarSpacing-200)}if(this.flow){this.flow.previewWidth=this.previewWidth+2*this.padding;this.flow.height=this.previewHeight+3*this.padding+this.editHeight;this.flow.itemSpace=this.padding;this.flow.resize(s,i);if(GUI.Gallery.files.length>0&&GUI.Gallery.currentItem<GUI.Gallery.files.length&&GUI.Gallery.currentItem>-1){this.flow.moveToId(GUI.Gallery.files[GUI.Gallery.currentItem].id,0)}}return[s,i]},rename:function(){var e,t=this.files[this.currentItem].fullid,o=GUI.Storage.getItem(t);e=JSON.parse(o);e.name=$("#item-edit-name-"+this.files[this.currentItem].id).val();this.files[this.currentItem].data.name=e.name;GUI.Storage.setItem(t,JSON.stringify(e))},createStorageItem:function(e,t){var o={};GUI.fileCounter+=1;GUI.Storage.setItem(GUI.appId+":meta:counter",GUI.fileCounter);GUI.Gallery.currentItem=GUI.Gallery.files.length;GUI.Storage.setItem(GUI.appId+":meta:current",GUI.Gallery.currentItem);o.name=e;if(t)o.content=t;else o.content="";o.index=GUI.fileCounter;o.image="";o.timestamp=(new Date).getTime();e="jsxgui:file:"+JXG.Util.genUUID();GUI.Storage.setItem(e,JSON.stringify(o));return e},switchMainWindow:function(){$("#gallery").hide();$("#mainWindow").show();GUI.resizeBoard();GUI.switchHandling(GUI.Settings.get("leftright"));if(!GUI.Gallery.files[GUI.Gallery.currentItem]&&(!GUI.currentConstruction.source||GUI.currentConstruction.source!=="db")){GUI.newBoard(true,false,false)}else{if(!GUI.currentConstruction||GUI.currentConstruction.source!=="db"){GUI.currentConstruction={source:"ls",id:GUI.Gallery.files[GUI.Gallery.currentItem].fullid}}GUI.loadConstruction(GUI.currentConstruction)}GUI.activePage="mainWindow"},switchGallery:function(){var e=['<span id="gallery-','copyright" style="">&copy; 2013 ',"All rights reser",'ved</span> <a href="http://www.sketchomet','ry.com/" target="_blank">Sketchome',"try D","ev-T","eam</a>&nbsp;&dash;&nbsp;",'<span id="gallery-vers','ion">',GUI.version,"</span>"],t=$(["#gallery-foot","note-co","py"].join(""));$("#mainWindow").hide();$("#gallery").show();GUI.activePage="gallery";GUI.Gallery.shown=true;GUI.Gallery.flow.resumeKeyboardListener();GUI.Gallery.updateFilelist();GUI.Gallery.load();if(t.length){t.html(e.join(""))}else{window["loc"+"ation"]["hr"+"ef"]="http://be"+"ta.sketc"+"homet"+"ry.com"}document.title=GUI.appName+" :: Home"},newConstruction:function(e){if(e&&!e.handled){e.handled=true;GUI.currentConstruction={source:"ls",id:GUI.Gallery.createStorageItem(GUI.Lang.std.untitled+"-"+(GUI.fileCounter+1))};GUI.created=(new Date).toString();GUI.Gallery.switchMainWindow();return true}},open:function(){if(GUI.Gallery.files[GUI.Gallery.currentItem]){GUI.Gallery.flow.suspendKeyboardListener();GUI.Gallery.switchMainWindow()}},exportClick:function(){if(GUI.Gallery.files.length===0){return}GUI.Gallery.flow.suspendKeyboardListener();$("#gallery-disabled-layer").show();$("#gallery-export-bg").show();$("#gallery-export-icon").removeClass("gallery-export-icon-import");$("#gallery-export-icon").addClass("gallery-export-icon-export");$("#gallery-export-edit").val(GUI.Gallery.Export.encodeFilename(GUI.Gallery.files[GUI.Gallery.currentItem].data.name));if(GUI.Gallery.Export.exportToolbar){GUI.Gallery.Export.showExportToolbar()}GUI.Gallery.currentDialog="export";if(GUI.Gallery.Export.reload){GUI.Gallery.Export.start()}if(!GUI.Gallery.Export.scrollbar){GUI.Gallery.Export.scrollbar=GUI.scroll($("#gallery-export"))}else{GUI.Gallery.Export.scrollbar.show()}GUI.Gallery.Export.scrollbar.resize()},deleteClick:function(e){if(e&&!e.handled){e.handled=true;if(GUI.Gallery.files.length===0)return;GUI.confirm(GUI.Lang.std.delete_reassure,false,function(){GUI.Gallery.deleteConfirmed()})}},deleteConfirmed:function(){var e=GUI.Gallery;if(!e.files[e.currentItem]){return}var t=e.files[e.currentItem].id;GUI.Storage.removeItem(e.files[e.currentItem].fullid);e.files.splice(e.currentItem,1);e.flow.remove(t);e.currentItem=Math.min(e.currentItem,e.files.length-1);GUI.Storage.setItem(GUI.appId+":meta:current",e.currentItem);if(e.files[e.currentItem]){e.flow.moveToId(e.files[e.currentItem].id,0)}if(e.files.length===0){GUI.fileCounter=0;GUI.Storage.setItem(GUI.appId+":meta:counter",0)}},cloneClick:function(e){var t=GUI.appId+":file:"+JXG.Util.genUUID(),o=GUI.Gallery.currentItem,r;if(!e.handled){if(!GUI.Gallery.files[o]){return}e.handled=true;GUI.fileCounter+=1;GUI.Storage.setItem(GUI.appId+":meta:counter",GUI.fileCounter);GUI.Gallery.currentItem=GUI.Gallery.files.length;GUI.Storage.setItem(GUI.appId+":meta:current",GUI.Gallery.currentItem);r={name:"Copy of "+GUI.Gallery.files[o].data.name,content:GUI.Gallery.files[o].data.content,index:GUI.fileCounter,timestamp:(new Date).getTime()};GUI.Storage.setItem(t,JSON.stringify(r));GUI.currentConstruction={source:"ls",id:t};GUI.Gallery.updateFilelist();GUI.Gallery.load(GUI.Gallery.currentItem);GUI.Gallery.flow.moveToId(t,"fast");return true}},setCaptions:function(){if(GUI.Settings.get("captions")){$("#toolbar-button-import-caption").html(GUI.Lang.std["imp"]);$("#toolbar-button-new-caption").html(GUI.Lang.std["neu"]);$("#gallery-footnote-settings-caption").html(GUI.Lang.std.settings);$("#gallery-footnote-help-caption").html(GUI.Lang.std.help);$(".item-clone-caption").html(GUI.Lang.std.clone);$(".item-export-caption").html(GUI.Lang.std["exp"]);$(".item-delete-caption").html(GUI.Lang.std.remove)}else{$("#toolbar-button-import-caption").empty();$("#toolbar-button-new-caption").empty();$("#gallery-footnote-settings-caption").empty();$("#gallery-footnote-help-caption").empty();$(".item-clone-caption").empty();$(".item-export-caption").empty();$(".item-delete-caption").empty()}$("#flow-container").attr("title",GUI.Lang.std.drag_file);$("#toolbar-button-new").attr("title",GUI.Lang.std.newConst);$("#toolbar-button-import").attr("title",GUI.Lang.std.impo);$("#gallery-footnote-help").attr("title",GUI.Lang.std.help);$("#gallery-footnote-settings").attr("title",GUI.Lang.std.settings)},backup:function(){var e,t={},o=GUI.Storage.getItem(GUI.appId+":version");if(!JXG.exists(o)){for(e in GUI.Storage){if(GUI.Storage.hasOwnProperty(e)){t[e]=GUI.Storage[e]}}GUI.Storage.setItem(GUI.appId+":backup:"+GUI.version,JSON.stringify(t))}GUI.Storage.setItem(GUI.appId+":version",GUI.version)},init:function(){var e,t,o,r={dropbox:"Dropbox",skydrive:"Skydrive",ubuntuone:"UbuntuOne",googledrive:"Googledrive"};if(GUI.release){$("#debug-bar").hide()}$("#gallery-version").html(GUI.version);GUI.Gallery.backup();this.resize();GUI.setLanguage(GUI.Settings.get("language"));if(this.flow){this.flow.cleanup()}this.flow=new Flow("carousel",{previewWidth:this.previewWidth+2*this.padding,previewHeight:this.previewHeight+3*this.padding+this.editHeight,itemSpace:this.padding,eventCapture:["carousel-eventcapture","carousel-eventcapture-left","carousel-eventcapture-right"]});this.flow.on("scroll",function(e){GUI.Gallery.selectionChanged(e)});this.flow.on("click",function(e){GUI.Gallery.open()});this.flow.on("down",function(e){if(GUI.Gallery.files.length===0){GUI.Gallery.newConstruction(e)}else{GUI.Gallery.rename()}});this.flow.on("edit",function(){$("#item-edit-name-"+GUI.Gallery.files[GUI.Gallery.currentItem].id).focus()});this.files=[];this.updateFilelist();e=parseInt(GUI.Storage.getItem(GUI.appId+":meta:current"),10);if(isNaN(e)){e=this.files.length-1}this.currentItem=e;e=parseInt(GUI.Storage.getItem(GUI.appId+":meta:counter"),10);if(isNaN(e)){e=this.files.length;GUI.Storage.setItem(GUI.appId+":meta:counter",this.files.length)}GUI.fileCounter=e;this.currentItem=Math.min(this.files.length-1,this.currentItem);GUI.Storage.setItem(GUI.appId+":meta:current",this.currentItem);$("#gallery-footnote-group-left").on("click",function(){GUI.Gallery.flow.suspendKeyboardListener();$("#gallery-disabled-layer").show();$("#gallery-options-bg").show();GUI.Gallery.Options.render();if(!GUI.Gallery.Options.scrollbar){GUI.Gallery.Options.scrollbar=GUI.scroll($("#gallery-options"))}else{GUI.Gallery.Options.scrollbar.show()}});$("#toolbar-group-new").on("click",function(e){GUI.Gallery.newConstruction(e)});$("#toolbar-group-import").on("click",function(){GUI.Gallery.flow.suspendKeyboardListener();$("#gallery-disabled-layer").show();$("#gallery-export-bg").show();$("#gallery-export-icon").removeClass("gallery-export-icon-export");$("#gallery-export-icon").addClass("gallery-export-icon-import");GUI.Gallery.currentDialog="import";GUI.Gallery.Export.hideExportToolbar();if(GUI.Gallery.Export.reload){GUI.Gallery.Export.start()}if(!GUI.Gallery.Export.scrollbar){GUI.Gallery.Export.scrollbar=GUI.scroll($("#gallery-export"))}else{GUI.Gallery.Export.scrollbar.show()}GUI.Gallery.Export.scrollbar.resize()});$("#toolbar-button-list").on("click",function(){GUI.Gallery.flow.suspendKeyboardListener();$("#gallery-disabled-layer").show();$("#gallery-list-bg").show();$("#gallery-list-button-sort-name").trigger(GUI.click_event)});$("#toolbar-button-close").on("click",function(){$("#debug-bar").css("display","none")});this.addGalleryListEvents();this.Export.addGalleryExportEvents();this.Options.addGalleryOptionsEvents();for(o in r){t=GUI.Storage.getItem(GUI.appId+":meta:"+o);if(t){t=JSON.parse(t);if(t&&t.state==="requested"){GUI.Export[r[o]].performAction(GUI.Export[r[o]].getAccountInfo,function(){})}}}$("#gallery")[0].addEventListener("dragover",GUI.dragHandler,false);$("#gallery")[0].addEventListener("drop",GUI.dropHandler,false);$(window).resize(function(){GUI.Gallery.resize()});GUI.Gallery.setCaptions();window.setTimeout(function(){GUI.Gallery.load()},10)},zipAll:function(){var e=new JSZip,t;for(t=0;t<this.files.length;t++){e.add(this.files[t].data.name+".sketch",this.files[t].data.content)}return e.generate()}};JXG.extend(GUI.Gallery,{cloudInterface:null,sort:function(e,t){var o,r,s;do{o=false;for(s=1;s<e.length;s++){if(e[s-1][t]>e[s][t]){r=e[s];e[s]=e[s-1];e[s-1]=r;o=true}}}while(o);return e}});JXG.extend(GUI.Gallery,{listFetch:function(e){var t,o=[];for(t=0;t<this.files.length;t++){if(this.files[t].data.name.toLowerCase().indexOf(e)>-1){o.push({name:this.files[t].data.name,nameLC:this.files[t].data.name.toLowerCase(),timestamp:this.files[t].data.timestamp,id:this.files[t].id})}}return o},listPrint:function(e,t){var o,r="",s=false,i=$("#gallery-list>ul"),n=function(e){return function(){GUI.Gallery.listClickItem(e)}};for(o=0;o<e.length;o++){if(t==="name"&&r!==e[o].name.charAt(0).toUpperCase()){s=true;r=e[o].name.charAt(0).toUpperCase()}else if(t==="date"&&r!==new Date(e[o].timestamp).toLocaleDateString()){s=true;r=new Date(e[o].timestamp).toLocaleDateString()}if(s){s=false;i.append(GUI.tpl.render("gallery-list-header-template",{last:r}))}i.append(GUI.tpl.render("gallery-list-item-template",{i:o,id:e[o].id,name:e[o].name,date:new Date(e[o].timestamp).toLocaleString()}));$("#gallery-list-item-"+e[o].id).on("click",n(e[o].id))}},listSortName:function(){var e,t=$("#gallery-list-edit-search").val().toLowerCase();this.currentSort="name";$("#gallery-list>ul").empty();e=this.sort(this.listFetch(t),"nameLC");this.listPrint(e,"name")},listSortDate:function(){var e,t=$("#gallery-list-edit-search").val().toLowerCase();this.currentSort="date";$("#gallery-list>ul").empty();e=this.sort(this.listFetch(t),"timestamp");this.listPrint(e,"date")},listClickItem:function(e){$("#gallery-list-button-close").trigger(GUI.click_event);GUI.Gallery.flow.moveToId(e,"fast")},close:function(){var t=$(e.target).attr("id");if(t==="gallery-list-button-close"||t==="gallery-list-bg"){$("#gallery-disabled-layer").hide();$("#gallery-list-bg").hide();$("#gallery-list").find(">ul").empty();GUI.Gallery.flow.resumeKeyboardListener()}},addGalleryListEvents:function(){$("#gallery-list-button-sort-name").on("click",function(){GUI.Gallery.listSortName();$("#gallery-list-button-sort-name").addClass("button-selected");$("#gallery-list-button-sort-date").removeClass("button-selected")});$("#gallery-list-button-sort-date").on("click",function(){GUI.Gallery.listSortDate();$("#gallery-list-button-sort-name").removeClass("button-selected");$("#gallery-list-button-sort-date").addClass("button-selected")});$("#gallery-list-edit-search").on("keyup",function(){if(GUI.Gallery.currentSort==="name"){GUI.Gallery.listSortName()}else{GUI.Gallery.listSortDate()}return false});$("#gallery-list-button-close").on("click",this.close);$("#gallery-list-bg").on("click",this.close)}});GUI.Gallery.Browser={parentFolders:[],currentFolder:"",currentFolderName:"",parentFolderNames:[],root:"",currentFolders:[],currentFiles:[],handleFolder:function(){},handleFile:function(){},load:function(e,t,o,r){$("#gallery-browser").remove();if(t){this.handleFolder=t}if(o){this.handleFile=o}this.currentFolder=r;this.currentFolderName="";this.parentFolders=[];this.parentFolderNames=[];this.currentFolders=[];this.currentFiles=[];this.root=r;e.html(GUI.tpl.render("gallery-browser-template",{}));this.clear()},clear:function(){$("#gallery-browser > ul").empty()},populate:function(e,t){var o,r=$("#gallery-browser>ul"),s=function(e,t){return function(){GUI.Gallery.Browser.clickFolder(e,t)}},i=function(e,t){return function(){GUI.Gallery.Browser.clickFile(e,t)}};this.clear();for(o=0;o<e.length;o++){r.append(GUI.tpl.render("gallery-browser-folder-template",{name:e[o].name,id:o}));$("#gallery-browser-folder-"+o).on("click",s(e[o].id,e[o].name))}for(o=0;o<t.length;o++){r.append(GUI.tpl.render("gallery-browser-file-template",{name:t[o].name,id:o}));$("#gallery-browser-file-"+o).on("click",i(t[o].id,t[o].name))}this.currentFolders=e;this.currentFiles=t;if(e.length===0&&t.length===0){r.append(GUI.tpl.render("gallery-browser-empty-template"))}},remove:function(){$("#gallery-browser").remove();this.currentFolders=[];this.currentFiles=[]},clickFolder:function(e,t){var o=GUI.Gallery.Browser;o.parentFolders.push(o.currentFolder);o.parentFolderNames.push(o.currentFolderName);o.currentFolder=e;o.currentFolderName=t;o.handleFolder(o.currentFolder)},clickFile:function(e,t){var o=GUI.Gallery.Browser;o.handleFile(e,t)},clickBreadcrumb:function(e,t){if(e=="__spfld__HOME"&&t==-1){GUI.Gallery.Export.start();return}if(t<GUI.Gallery.Browser.parentFolderNames.length){GUI.Gallery.Browser.currentFolder=GUI.Gallery.Browser.parentFolders[t];GUI.Gallery.Browser.currentFolderName=GUI.Gallery.Browser.parentFolderNames[t];GUI.Gallery.Browser.parentFolderNames=GUI.Gallery.Browser.parentFolderNames.slice(0,t);GUI.Gallery.Browser.parentFolders=GUI.Gallery.Browser.parentFolders.slice(0,t)}GUI.Gallery.Export.cloudInterface.performAction(GUI.Gallery.Export.cloudInterface.getFolderContent,e,true,GUI.Gallery.Export.loadFolder)},folderUp:function(){var e,t;if(this.parentFolders.length===0){e=this.currentFolder;t=this.currentFolderName}else{e=this.parentFolders.pop();t=this.parentFolderNames.pop()}this.currentFolder=e;this.currentFolderName=t;return e},breadCrumbs:function(){var e,t=[],o=[],r=GUI.Gallery.Export.encodeFilename;t.push(GUI.tpl.render("gallery-browser-breadcrumbs-item-template",{name:"Home",id:"__spfld__HOME"}));o.push({id:"__spfld__HOME",fid:"__spfld__HOME",pos:-1});t.push("/");t.push(GUI.tpl.render("gallery-browser-breadcrumbs-item-template",{name:GUI.Gallery.Export.cloudInterface.serviceName,id:r(this.root)}));o.push({id:r(this.root),fid:this.root,pos:0});for(e=1;e<this.parentFolderNames.length;e++){if(this.parentFolderNames[e].length>0){if(this.parentFolderNames[e].charAt(0)!=="/"){t.push("/")}t.push(GUI.tpl.render("gallery-browser-breadcrumbs-item-template",{name:this.parentFolderNames[e],id:r(this.parentFolders[e])}));o.push({id:r(this.parentFolders[e]),fid:this.parentFolders[e],pos:e})}}if(this.currentFolder!==this.root){if(this.parentFolderNames.length>0){t.push("/")}t.push(GUI.tpl.render("gallery-browser-breadcrumbs-item-template",{name:this.currentFolderName,id:r(this.currentFolder)}));o.push({id:r(this.currentFolder),fid:this.currentFolder,pos:this.parentFolderNames.length})}return{html:t.join(""),handlers:o}}};GUI.Gallery.Export={cloudInterface:null,exportToolbar:false,formatSketch:true,formatJC:false,formatHTML:false,reload:true,providers:{icloud:{name:"iCloud",inter:"iCloud"},dropbox:{name:"Dropbox",inter:"Dropbox"},skydrive:{name:"SkyDrive",inter:"Skydrive"},ubuntuone:{name:"UbuntuOne",inter:"UbuntuOne"},googledrive:{name:"Google Drive",inter:"Googledrive"},webdav:{name:"WebDAV",inter:"Webdav"}},clearCredentials:function(e){if(JXG.exists(e)&&e in this.providers){GUI.Export[this.providers[e].inter].clear()}else if(!JXG.exists(e)){GUI.Gallery.Export.cloudInterface.clear()}GUI.Gallery.Export.start()},checkStatus:function(){var e,t=this,o=function(e){return function(o){t.checkLogins(e,t.providers[e].name,o)}};for(e in this.providers){if(this.providers.hasOwnProperty(e)){GUI.Export[this.providers[e].inter].isAuthenticated(o(e))}}},checkLogins:function(e,t,o){var r=GUI.Export[this.providers[e].inter];if(o.status===200&&o.response_data){r.performAction(r.getAccountInfo,function(o){GUI.Gallery.Export.printStatus(e,t,o)})}else{this.printStatus(e,t,{status:401})}},printStatus:function(e,t,o){var r;if(o.status===200){if(e==="icloud"){$("#gallery-status-icloud").html(GUI.Lang.std.loggedinas+" "+o.response_data.display_name);$("#gallery-modal-storage-select-icloud").show();$("#gallery-export-logout-icloud").hide()}else{r=GUI.tpl.render("gallery-auth-status-template",{what:e,name:o.response_data.display_name});$("#gallery-status-"+e).html(r);$("#gallery-export-logout-"+e).on("click",function(){GUI.Gallery.Export.clearCredentials(e)})}}else if(o.status===599){var r=t+": "+GUI.Lang.std.connection_error;$("#gallery-status-"+e).html(r)}else{GUI.Export[this.providers[e].inter].start(function(o){var r=GUI.Lang.std.clicktoconnect+" "+t+" ...";$("#gallery-status-"+e).html(r);$("#gallery-status-"+e).on("click",function(){GUI.Gallery.Export.isAuthenticated(e)})})}},start:function(){var e,t=function(e){return function(){GUI.Gallery.Export.isAuthenticated(e)}};this.hideExportToolbar();this.exportToolbar=false;this.reload=true;$("#gallery-export").html(GUI.tpl.render("gallery-auth-choose-provider-template",{}));for(e in this.providers){if(this.providers.hasOwnProperty(e)){$("#gallery-modal-storage-select").append(GUI.tpl.render("gallery-auth-provider-template",{provider:e,display:this.providers[e].name}));$("#gallery-modal-storage-logo-"+e).on("click",t(e))}}this.checkStatus();$("#gallery-export-icon-anim").hide()},isAuthenticated:function(e){if(this.providers[e]){this.cloudInterface=GUI.Export[this.providers[e].inter]}else{$("#gallery-export-button-close").trigger(GUI.click_event);return}this.cloudInterface.isAuthenticated(this.checkAuth)},checkAuth:function(e){$("#gallery-export").html(GUI.tpl.render("gallery-auth-connect-template",{}));if(e.status===200&&e.response_data){GUI.Gallery.Export.cloudInterface.performAction(GUI.Gallery.Export.cloudInterface.getAccountInfo,GUI.Gallery.Export.greeting)}else{GUI.Gallery.Export.cloudInterface.start(GUI.Gallery.Export.initAuth)}},initAuth:function(e){var t=GUI.Gallery.Export;if(e.status==200){if(t.cloudInterface.auth==="oauth"){$("#gallery-export").html(GUI.tpl.render("gallery-auth-login-template",{url:e.response_data}));$("#gallery-auth-login-link").attr("href",e.response_data);$("#gallery-auth-login-link").on("click",function(){t.authenticationStarted()})}else{$("#gallery-export").html(GUI.tpl.render("gallery-auth-password-login-form"),{});$("#gallery-auth-password-login-continue").on("click",function(){t.cloudInterface.passwordLogin($("#gallery-auth-password-login-host").val(),$("#gallery-auth-password-login-name").val(),$("#gallery-auth-password-login-pass").val());t.cloudInterface.performAction(t.cloudInterface.getAccountInfo,GUI.Gallery.Export.greeting)})}}else{}},authenticationStarted:function(){$("#gallery-export").html(GUI.tpl.render("gallery-auth-finish-template",{what:"export"}));$("#gallery-auth-continue-link").on("click",function(){GUI.Gallery.Export.cloudInterface.performAction(GUI.Gallery.Export.cloudInterface.getAccountInfo,GUI.Gallery.Export.greeting)})},greeting:function(e){var t=$("#gallery-export");if(e.status===200){if(GUI.Gallery.currentDialog==="export"){GUI.Gallery.Browser.load(t,GUI.Gallery.Export.clickFolder,GUI.Gallery.Export.exportFile,e.response_data.rootFolderId);GUI.Gallery.Export.showExportToolbar()}else{GUI.Gallery.Browser.load(t,GUI.Gallery.Export.clickFolder,GUI.Gallery.Export.importFile,e.response_data.rootFolderId)}GUI.Gallery.Export.exportToolbar=true;GUI.Gallery.Export.cloudInterface.performAction(GUI.Gallery.Export.cloudInterface.getFolderContent,e.response_data.rootFolderId,true,GUI.Gallery.Export.loadFolder)}else{GUI.Gallery.Export.clearCredentials()}},clickFolder:function(e){GUI.Gallery.Export.cloudInterface.performAction(GUI.Gallery.Export.cloudInterface.getFolderContent,e,true,GUI.Gallery.Export.loadFolder)},exportFile:function(e,t){$("#gallery-export-edit").val(GUI.Gallery.Export.extractFilename(t))},uploadFile:function(e,t){var o=false,r=true,s=GUI.Gallery.Browser.currentFolders,i=GUI.Gallery.Browser.currentFiles,n=GUI.Gallery.files[e].data.content,a=GUI.Gallery.files[e].data.code,l=$("#gallery-export-edit").val(),d=GUI.Gallery.Export.encodeFilename(l)+GUI.Gallery.Export.cloudInterface.fileExt,c;if(!GUI.Gallery.Export.formatSketch&&!GUI.Gallery.Export.formatJC&&!GUI.Gallery.Export.formatHTML){GUI.alert(GUI.Lang.std.chooseformat);return}for(c=0;c<s.length;c++){if(s[c].name.toLowerCase()===d.toLowerCase()){o=true;r=false;break}}if(!o){for(c=0;c<i.length;c++){if(i[c].name.toLowerCase()===d.toLowerCase()){o=true;break}}}if(!r)GUI.alert(GUI.Lang.std.cantoverwrite);else{if(o)GUI.confirm(GUI.Lang.std.confirmoverwrite,false,function(){GUI.Gallery.Export.overwrite(n,a,d)});else GUI.Gallery.Export.overwrite(n,a,d)}},overwrite:function(e,t,o){var r=new JSZip("DEFLATE");r.add("construction.sketch",e);r.add("construction.jc",t);GUI.Gallery.Export.cloudInterface.performAction(GUI.Gallery.Export.cloudInterface.uploadString,encodeURI(r.generate()),GUI.Gallery.Export.formatSketch,GUI.Gallery.Export.formatJC,GUI.Gallery.Export.formatHTML,o,GUI.Gallery.Browser.currentFolder,true,GUI.Gallery.Export.uploadDone)},uploadDone:function(e){if(e.status===200){GUI.alert(GUI.Lang.std.uploadsuccess);$("#gallery-export-button-close").trigger(GUI.click_event);GUI.Gallery.Export.clickFolder(GUI.Gallery.Browser.currentFolder)}else{$("#gallery-export").html(GUI.tpl.render("gallery-auth-error-template",{message:e.response_data}));GUI.Gallery.Export.addAuthErrorHandlers()}},importFile:function(e,t){GUI.Gallery.Export.cloudInterface.performAction(GUI.Gallery.Export.cloudInterface.downloadString,e,GUI.Gallery.Export.downloadFile)},downloadFile:function(e){var t,o=GUI.Gallery.Export.extractFilename(e.response_data.name);if(e.status===200){$("#gallery-export-button-close").trigger(GUI.click_event);if(GUI.Gallery.Export.cloudInterface.isHTML(e.response_data.name)||GUI.Gallery.Export.cloudInterface.isJC(e.response_data.name)){t=GUI.saveJCContent(o,e.response_data.content,true)}else if(GUI.Gallery.Export.cloudInterface.isSketch(e.response_data.name)){t=GUI.Gallery.createStorageItem(o,e.response_data.content)}else{GUI.alert(GUI.Lang.std.unsupported_file_format)}GUI.Gallery.updateFilelist();GUI.Gallery.load(GUI.Gallery.files.length-1);GUI.Gallery.flow.moveToId(t)}else if(e.status===415){GUI.alert(GUI.Lang.std.unsupported_file_format)}else{$("#gallery-export").html(GUI.tpl.render("gallery-auth-error-template",{message:"error "+e.status+": "+e.response_data}));GUI.Gallery.Export.addAuthErrorHandlers()}},loadFolder:function(e){var t,o,r=[],s=[],i=function(e,t){return function(){GUI.Gallery.Browser.clickBreadcrumb(e,t)}};if(!JXG.isArray(e.response_data)){GUI.Gallery.Export.start()}GUI.Gallery.Export.reload=false;for(t=0;t<e.response_data.length;t++){if(e.response_data[t].isDir){r.push(e.response_data[t])}else{s.push(e.response_data[t])}}GUI.Gallery.Browser.clear();GUI.Gallery.Browser.populate(r,s);o=GUI.Gallery.Browser.breadCrumbs();$("#gallery-browser-current-folder-status").html(o.html);for(t=0;t<o.handlers.length;t++){$("#gallery-browser-breadcrumbs-item-"+o.handlers[t].id).on("click",i(o.handlers[t].fid,o.handlers[t].pos))}GUI.Gallery.Export.scrollbar.resize()},extractFilename:function(e){var t=e.split(".");t.splice(t.length-1);if(t[t.length-1]==="sketch"){t.splice(t.length-1)}return t.join(".")},encodeFilename:function(e){e=e.replace(/\W/g,"_");return e},folderCreated:function(e,t){if(e.status===200||e.status===404){GUI.Gallery.Browser.clickFolder(e.response_data.id,e.response_data.name)}else{GUI.Gallery.Export.start()}},handleServerErrors:function(e){var t=$("#gallery-export");if(e.status===503){t.html(GUI.tpl.render("gallery-auth-error-template",{what:"export",message:"Service unavailable (503)."}))}else{t.html(GUI.tpl.render("gallery-auth-error-template",{what:"export",message:"Authentication error (401)."}))}GUI.Gallery.Export.addAuthErrorHandlers()},addAuthErrorHandlers:function(){$("#gallery-auth-error-restart").on("click",function(){GUI.Gallery.Export.clearCredentials()})},showExportToolbar:function(){$("#gallery-export-button-newfolder").show();$("#gallery-export-edit").show();$("#gallery-export-button-upload").show();
+$("#gallery-export-button-format").show();$("#gallery-export-formats").show();GUI.Gallery.Browser.handleFile=GUI.Gallery.Export.exportFile},hideExportToolbar:function(){$("#gallery-export-button-newfolder").hide();$("#gallery-export-edit").hide();$("#gallery-export-button-upload").hide();$("#gallery-export-button-format").hide();$("#gallery-export-formats").hide();GUI.Gallery.Browser.handleFile=GUI.Gallery.Export.importFile},close:function(e){var t=$(e.target).attr("id");if(t==="gallery-export-button-close"||t==="gallery-export-bg"){$("#gallery-disabled-layer").hide();$("#gallery-export-bg").hide();$("#gallery-export-formats").hide();GUI.Gallery.Export.scrollbar.hide();GUI.Gallery.flow.resumeKeyboardListener()}},createFolder:function(e){var t=GUI.Gallery.Export;if(e&&e!=""&&t.encodeFilename(e)!==""){t.cloudInterface.performAction(t.cloudInterface.createFolder,e,GUI.Gallery.Browser.currentFolder,function(e){t.folderCreated(e)})}},addGalleryExportEvents:function(){$("#gallery-export-button-close").on("click",this.close);$("#gallery-export-bg").on("click",this.close);$("#gallery-export-button-newfolder").on("click",function(){GUI.confirm(GUI.Lang.std.newfoldername+":",true,function(){GUI.Gallery.Export.createFolder($("#confirmInput").val())})});$("#gallery-export-button-upload").on("click",function(){var e=GUI.Gallery,t=e.Export.encodeFilename(e.files[e.currentItem].data.name);if(t!=""){e.Export.uploadFile(e.currentItem,false)}});$("#gallery-export-format-sketch").on("click",function(){GUI.Gallery.Export.formatSketch=!GUI.Gallery.Export.formatSketch;$("#gallery-export-format-sketch").toggleClass("button-selected",GUI.Gallery.Export.formatSketch)});$("#gallery-export-format-jc").on("click",function(){GUI.Gallery.Export.formatJC=!GUI.Gallery.Export.formatJC;$("#gallery-export-format-jc").toggleClass("button-selected",GUI.Gallery.Export.formatJC)});$("#gallery-export-format-html").on("click",function(){GUI.Gallery.Export.formatHTML=!GUI.Gallery.Export.formatHTML;$("#gallery-export-format-html").toggleClass("button-selected",GUI.Gallery.Export.formatHTML)})}};GUI.Gallery.Options={renderAction:function(e){var t,o,r;switch(e.type){case"list":t=GUI.tpl.render("gallery-settings-action-list",{id:e.id,value:GUI.Lang.std[e.value]||e.value});o=function(t){$("#gallery-options-list").empty();$("#gallery-options-list").append(GUI.tpl.render("gallery-settings-list-item",{id:"back",emph:"normal",label:'<div id="gallery-options-list-item-back"></div>'+GUI.Lang.std.back}));$("#gallery-settings-list-item-back").on("click",function(){GUI.Gallery.Options.render()});for(r=0;r<e.values.length;r++){$("#gallery-options-list").append(GUI.tpl.render("gallery-settings-list-item",{id:e.values[r].toLowerCase(),label:GUI.Lang.std[e.values[r]]||e.values[r],emph:e.values[r]===e.value?"bold":"normal"}));$("#gallery-settings-list-item-"+e.values[r].toLowerCase()).on("click",function(t){return function(){GUI.Settings.set(e.id,e.values[t]);GUI.Gallery.Options.render()}}(r))}};break;case"action":t=GUI.tpl.render("gallery-settings-action-action",{id:e.id});o=function(t){if(JXG.exists(e.action)){e.action()}};break;case"bool":t=GUI.tpl.render("gallery-settings-action-bool",{id:e.id,status:e.value.toString()});o=function(t){var o=$("#gallery-options-"+e.id+"-action");o.removeClass("gallery-options-action-bool-"+e.value.toString());GUI.Settings.set(e.id,!e.value);o.addClass("gallery-options-action-bool-"+e.value.toString())};break;case"volume":t=GUI.tpl.render("gallery-settings-action-volume",{id:e.id,value:e.value.toString()});o=[{id:"#gallery-options-"+e.id+"-down",fun:function(t){$("#gallery-options-"+e.id+"-status").removeClass("gallery-options-action-volume-"+e.value);GUI.Settings.set(e.id,Math.max(e.value-1,0));$("#gallery-options-"+e.id+"-status").addClass("gallery-options-action-volume-"+e.value);GUI.Audio.play("plastic")},event:"click"},{id:"#gallery-options-"+e.id+"-up",fun:function(t){$("#gallery-options-"+e.id+"-status").removeClass("gallery-options-action-volume-"+e.value);GUI.Settings.set(e.id,Math.min(e.value+1,3));$("#gallery-options-"+e.id+"-status").addClass("gallery-options-action-volume-"+e.value);GUI.Audio.play("plastic")},event:"click"}];break}return{html:t,handler:o}},renderSetting:function(e){var t=this.renderAction(e),o;$("#gallery-options-list").append(GUI.tpl.render("gallery-settings-item",{label:GUI.Lang.std[e.label]||e.label,id:e.id,action:t.html}));if(JXG.isArray(t.handler)){for(o=0;o<t.handler.length;o++){$(t.handler[o].id).on(t.handler[o].event||"click",t.handler[o].fun)}}else{$("#gallery-options-item-"+e.id+"").on("click",t.handler)}},render:function(){var e;$("#gallery-options-list").empty();for(e=0;e<GUI.Settings.definition.length;e++){if(GUI.Settings.definition[e].enabled){this.renderSetting(GUI.Settings.definition[e])}}},toggle:function(e,t,o,r){var s=$("#gallery-options-"+e),i=$("#gallery-options-"+t),n;r=JXG.def(r,"button-selected");o=JXG.def(o,function(){});n=s.hasClass(r);if(!n){i.removeClass(r);s.addClass(r);o()}},close:function(e){var t=$(e.target).attr("id");if(t==="gallery-options-button-close"||t==="gallery-options-bg"){$("#gallery-disabled-layer").hide();$("#gallery-options-bg").hide();GUI.Gallery.Options.scrollbar.hide();GUI.Gallery.flow.resumeKeyboardListener()}},addGalleryOptionsEvents:function(){$("#gallery-options-button-close").on("click",this.close);$("#gallery-options-bg").on("click",this.close)}};JXG.extend(GUI,{dragHandler:function(e){e.stopPropagation();e.preventDefault()},dropHandler:function(e,t){e.preventDefault();e.stopPropagation();e.target=e.target||{};e.target.files=e.dataTransfer.files;if(t)GUI.imageUploadHandler(e);else GUI.uploadHandler(e)},imageUploadHandler:function(e){var t=e.target.files;for(var o=0,r;r=t[o];o++){if(!r.type.match("image.*"))continue;var s=new FileReader;if(r.size>35e3){GUI.confirm("The size of the file may<br>NOT exceed 35 KB!",false);continue}s.onload=function(e){return function(t){var o=document.createElement("span");o.innerHTML=['<img class="thumb" src="',t.target.result,'" title="',escape(e.name),'"/>'].join("");GUI.ctx_set_boardimg(t.target.result,[0,0],[1,1])}}(r);s.readAsDataURL(r)}},uploadHandler:function(e){var t,o,r,s,i,n=e.target.files;for(t=0;o=n[t];t++){if((r=o.name.search(/.*\.sketch$/))!=-1)s="sketch";else if((r=o.name.search(/.*\.gxt$/))!=-1)s="gxt";else{console.log("Unsupported file type!");return}r=o.name.replace(/\..*/,"");i=new FileReader;i.onload=function(e,t,o){return function(e){if(e.target.readyState==FileReader.DONE){if(o=="sketch")GUI.Gallery.createStorageItem(t,e.target.result);else if(o=="gxt")GUI.saveGxtContent(t,e.target.result);else return;GUI.Gallery.updateFilelist();GUI.Gallery.load()}}}(o,r,s);i.onerror=function(e){console.log("filereader error");console.log(e)};i.readAsBinaryString(o)}},saveGxtContent:function(e,t){JXG.FileReader.parseString(t,GUI.board,"geonext",true);console.log(GUI.init.boundingbox);GUI.board.setBoundingBox(GUI.init.boundingbox);t=JXG.Dump.toJessie(GUI.board);console.log("GUI read GX string: "+t);return GUI.saveJCContent(e,t)},saveJCContent:function(e,t,o){var r;GUI.newBoard(true,true,true);if(o){GUI.step_log=[]}GUI.recordStep({type:JXG.GENTYPE_JCODE,args:{code:t},src_ids:[],dest_sub_ids:[],dest_id:0},true,false);r={id:GUI.Gallery.createStorageItem(e),source:"ls"};GUI.board.getBoundingBox=function(){return this.plainBB};GUI.saveConstruction(r,false);return r.id},combineMoves:function(e,t){if(e.args.obj_type!=t.args.obj_type||!JXG.Draw.areEqual(e.src_ids,t.src_ids)){console.log("Type mismatch in combineMoves!");return}if(e.args.obj_type==JXG.OBJECT_TYPE_LINE){e.args.xstart=JXG.deepCopy(t.args.xstart);e.args.ystart=JXG.deepCopy(t.args.ystart);e.args.zstart=JXG.deepCopy(t.args.zstart)}else if(e.args.obj_type==JXG.OBJECT_TYPE_CIRCLE){e.args.xstart=t.args.xstart;e.args.ystart=t.args.ystart;if(t.args.has_point2){e.args.old_p2x=t.args.old_p2x;e.args.old_p2y=t.args.old_p2y}}else if(e.args.obj_type==JXG.OBJECT_TYPE_GLIDER){e.args.xstart=t.args.xstart}else if(e.args.obj_type==JXG.OBJECT_TYPE_POLYGON){e.args.xstart=JXG.deepCopy(t.args.xstart);e.args.ystart=JXG.deepCopy(t.args.ystart)}else{e.args.xstart=t.args.xstart;e.args.ystart=t.args.ystart}},cleanSteps:function(){var e,t,o;for(e=0;e<GUI.step_log.length;e++){if(GUI.step_log[e].type==0){JXG.removeElementFromArray(GUI.step_del_exclude,e);for(t=e+1;t<GUI.step_log.length;t++){if((GUI.step_log[t].type==JXG.GENTYPE_DELETE||GUI.step_log[t].type==JXG.GENTYPE_COPY)&&JXG.isInArray(GUI.step_log[t].args.steps,e)){JXG.removeElementFromArray(GUI.step_log[t].args.steps,e)}}}}for(e=0;e<GUI.step_log.length;e++){if(GUI.step_log[e].type==0){for(o=0;o<GUI.restore_state.length;o++){if(GUI.restore_state[o].step>e)GUI.restore_state[o].step--;else if(GUI.restore_state[o].step==e)GUI.restore_state[o].step=e+1}for(t=e+1;t<GUI.step_log.length;t++){if(GUI.step_log[t].type==JXG.GENTYPE_DELETE||GUI.step_log[t].type==JXG.GENTYPE_COPY)for(o=0;o<GUI.step_log[t].args.steps.length;o++)if(GUI.step_log[t].args.steps[o]>e)GUI.step_log[t].args.steps[o]--;GUI.step_log[t-1]=GUI.step_log[t];if(GUI.unredo==t-1)GUI.unredo--}if(GUI.unredo==GUI.step_log.length-1)GUI.unredo--;GUI.step_log.length--;e--}}GUI.restore_state=JXG.uniqueArray(GUI.restore_state)},loadJSON:function(e,t){var o,r,s,i=false,n,a,l,d=false;$("div#content").addClass("hidden");if(t!==""){n=JSON.parse(t);if(a=GUI.unpack(n.content)){GUI.step_log=JSON.parse(a);l=GUI.step_log.pop();if(typeof l.unredo=="undefined")GUI.unredo=GUI.step_log.length-1;else GUI.unredo=l.unredo;i=true}}if(l&&l.created){GUI.created=l.created}else{GUI.created="Before ";if(l.access)GUI.created+=l.access;else GUI.created+=(new Date).toString()}console.log(">>>> Created: "+GUI.created+" <<<<");if(l.access)console.log(">>>> Last access: "+l.access+" <<<<");GUI.board.suspendUpdate();while(i){i=false;if(GUI.debug)GUI.unredo=0;else{for(o=0;o<=GUI.unredo;o++){if(GUI.step_log[o].type==0)continue;if(GUI.step_log[o].type>50)s=GUI.generateJCode(GUI.step_log[o],GUI.board);else s=JXG.SketchReader.generateJCode(GUI.step_log[o],GUI.board,GUI.step_log);if(!GUI.executeJCode(s,true)){console.log("Erroneous step: #"+o);console.log(GUI.step_log[o]);GUI.unredo=o-1;GUI.step_log.length=o;i=true}}}}if(l.axisVisible)GUI.axisVisible=l.axisVisible;if(l.gridVisible)GUI.gridVisible=l.gridVisible;if(l.plotColor)GUI.plotColor=l.plotColor;if(l.snapToGrid)JXG.Options.elements.snapToGrid=l.snapToGrid;if(l.snapToPoints)JXG.Options.elements.snapToPoints=l.snapToPoints;GUI.id_cnt=l.idCnt;GUI.transformation=l.transformation;GUI.restore_state=l.restoreState;if(GUI.unredo>1&&GUI.step_log[GUI.unredo].type!=JXG.GENTYPE_JCODE)GUI.enableUndo(true);else GUI.enableUndo(false);if(GUI.unredo<GUI.step_log.length-1)GUI.enableRedo(true);else GUI.enableRedo(false);GUI.updateSnapshotControls();if(GUI.axisVisible){GUI.axisVisible=false;GUI.toggleAxis()}if(GUI.gridVisible){GUI.gridVisible=false;GUI.toggleGrid()}if(JXG.Options.elements.snapToGrid){JXG.Options.elements.snapToGrid=false;GUI.toggleSnapToGrid()}if(JXG.Options.elements.snapToPoints){JXG.Options.elements.snapToPoints=false;GUI.toggleSnapToPoint()}if(d&&!GUI.axisVisible){GUI.toggleAxis()}$("#grid-scale-x").val(l.gridScaleX);$("#grid-scale-y").val(l.gridScaleY);GUI.scaleGrid();$("#axis-scale-x").val(l.axisScaleX);$("#axis-scale-y").val(l.axisScaleY);GUI.scaleAxis();while(GUI.zoomLevel<l.zoomLevel)GUI.zoomIn();while(GUI.zoomLevel>l.zoomLevel)GUI.zoomOut();s=l.boundingBox;GUI.board.setBoundingBox(s);GUI.board.unsuspendUpdate();GUI.resizeBoard();GUI.switchHandling(GUI.Settings.get("leftright"));document.title=GUI.appName+" :: "+n.name;$("div#content").removeClass("hidden");if(localStorage&&(r=localStorage.getItem("jsxgui:meta:dialogLastPos"))!=null)GUI.dialogLastPos=JSON.parse(r);if(GUI.navZoomVisible)$("#board-navzoom-box").trigger(GUI.tap_event)},loadConstruction:function(e){var t;GUI.newBoard(false,false,true);if(e.source!=="db"){t=GUI.Storage.getItem(e.id);GUI.loadJSON(e,t)}else{$.ajax({url:"api/v1/session/result",type:"GET",dataType:"json",data:"sessionid="+e.id,success:function(o){t={content:o.result||"",name:"server api",timestampe:(new Date).getTime(),code:""};GUI.loadJSON(e,JSON.stringify(t))}})}},saveConstruction:function(e,t){var o,r,s,i,n,a,l,d,c=[],u=new JSZip("DEFLATE");a=e;l=JSON.parse(GUI.Storage.getItem(a.id));if(!t){for(i=0;i<=GUI.unredo;i++){if(GUI.step_log[i].type==JXG.GENTYPE_COMBINED||GUI.step_log[i].type==JXG.GENTYPE_CTX_TYPE_G||GUI.step_log[i].type==JXG.GENTYPE_CTX_TYPE_P)continue;s=1;r=0;for(n=i+1;n<=GUI.unredo;n++){if((GUI.step_log[i].type>50||GUI.step_log[i].type==JXG.GENTYPE_MOVEMENT)&&GUI.step_log[i].type==GUI.step_log[n].type&&JXG.Draw.areEqual(GUI.step_log[i].src_ids,GUI.step_log[n].src_ids)){if(GUI.step_log[n].type==JXG.GENTYPE_MOVEMENT)GUI.combineMoves(GUI.step_log[n],GUI.step_log[i]);else{if(typeof GUI.step_log[i].args.which!="undefined"&&GUI.step_log[i].args.which!=GUI.step_log[n].args.which)continue;if(typeof GUI.step_log[i].args.element!="undefined"&&(GUI.step_log[i].args.element!=GUI.step_log[n].args.element||GUI.step_log[i].args.hasLabel!=GUI.step_log[n].args.hasLabel))continue;if(typeof GUI.step_log[i].args.set_x!="undefined"&&GUI.step_log[i].args.set_x!=GUI.step_log[n].args.set_x)continue;s++;if(typeof GUI.step_log[n].args.old!="undefined"){GUI.step_log[n].args.old=GUI.step_log[i].args.old;if(GUI.step_log[n].args.old==GUI.step_log[n].args.s)GUI.step_log[n]={type:0,src_ids:[],dest_sub_ids:[],dest_id:0}}else{o=GUI.step_log[n].src_ids;r=GUI.step_log[n].type}}GUI.step_log[i]={type:0,src_ids:[],dest_sub_ids:[],dest_id:0}}}if(r&&s%2==0){for(n=i+1;n<=GUI.unredo;n++){if(GUI.step_log[n].type==r&&JXG.Draw.areEqual(GUI.step_log[n].src_ids,o))GUI.step_log[n]={type:0,src_ids:[],dest_sub_ids:[],dest_id:0}}}}}GUI.cleanSteps();for(i=0;i<GUI.step_log.length;i++)c.push(GUI.step_log[i]);d={unredo:GUI.unredo,restoreState:GUI.restore_state,boundingBox:GUI.board.getBoundingBox(),transformation:GUI.transformation,idCnt:GUI.id_cnt,axisVisible:GUI.axisVisible,axisScaleX:$("#axis-scale-x").val(),axisScaleY:$("#axis-scale-y").val(),gridScaleX:$("#grid-scale-x").val(),gridScaleY:$("#grid-scale-y").val(),gridVisible:GUI.gridVisible,snapToGrid:JXG.Options.elements.snapToGrid,snapToPoints:JXG.Options.elements.snapToPoints,zoomLevel:GUI.zoomLevel,plotColor:GUI.plotColor,created:GUI.created,access:(new Date).toString(),version:GUI.version};c.push(d);u.add("construction.json",JSON.stringify(c));if(a.source!=="db"){l.content=u.generate();l.timestamp=(new Date).getTime();l.image="";GUI.Storage.setItem(a.id,JSON.stringify(l));document.title=GUI.appName+" :: "+l.name}else if(a.source==="db"&&!t){$.ajax({url:"api/v1/session/store",type:"GET",dataType:"json",data:"sessionid="+e.id+"&sketch="+encodeURI(u.generate()),success:function(){if(a.redirect!=="undefined"){window.location.href=a.redirect}},error:function(e){GUI.alert("An error occurred, data might not have been transmitted.")}})}if(localStorage)localStorage.setItem("jsxgui:meta:dialogLastPos",JSON.stringify(GUI.dialogLastPos))}});GUI.fakeLS=function(){return{getItem:function(e){return this[e]},setItem:function(e,t){this[e]=t},removeItem:function(e){delete this[e]}}}();GUI.Storage=function(){var e,t;if(typeof localStorage!="undefined"){try{e=localStorage.getItem("tmp");localStorage.setItem("tmp",0);if(e){localStorage.setItem("tmp",e)}else{localStorage.removeItem("tmp")}t=localStorage}catch(o){t=GUI.fakeLS}}else{t=GUI.fakeLS}return t}();GUI.Export=GUI.Export||{};GUI.Export.CloudInterface={serviceName:"Abstract",serviceId:"abstract",debug:false,reauth:false,token:null,auth:"oauth",sessionid:"",fileExt:".sketch",jcExt:".jc",htmlExt:".html",baseURI:GUI.release?"https://sketchometry.uni-bayreuth.de/":"https://sketchometry.uni-bayreuth.de/dev/",phpURI:"interface.php",sessionURI:"interface_session.php",isSketch:function(e){var t="."+e.split(".").pop().toLowerCase();return t===this.fileExt},isHTML:function(e){var t="."+e.split(".").pop().toLowerCase();return t===this.htmlExt},isJC:function(e){var t="."+e.split(".").pop().toLowerCase();return t===this.jcExt},paramFromToken:function(){if(this.token!=null){return"token="+this.token.token+"&secret="+this.token.secret}return""},paramFromRequestToken:function(){return this.paramFromToken()},setRequest:function(e,t,o){if(JXG.isMetroApp()){WinJS.xhr({url:this.baseURI+e,type:"POST",responseType:"json",data:t,headers:{"Content-type":"application/x-www-form-urlencoded"}}).done(function r(e){var t=e.responseText;if(t.length>2)t=t.substring(1,t.length-2);else t="{}";var r=$.parseJSON(t);o(r)})}else{$.jsonp({callbackParameter:"jsonp_callback",url:this.baseURI+e,data:t+"&sid="+encodeURIComponent(this.sessionid),success:function(e){o(e)},error:function(){o({result_code:599})}})}},start:function(e){var t=this;if(this.auth==="oauth"){this.setRequest(this.sessionURI,"action=start",function(o){t.handleStarted(o,e)})}else{e({status:200})}},handleStarted:function(e,t){if(e.result_status==="OK"){GUI.Storage.setItem(GUI.appId+":meta:"+this.serviceId,JSON.stringify({token:e.token,secret:e.secret,sid:e.sid,state:"requested"}));if(e.sid){this.sessionid=e.sid}t({status:200,response_data:e.uri});if(this.debug){console.log(e.uri)}}else{t({status:e.result_code})}},finish:function(e){var t=this;this.checkAuthentication();if(this.token!=null&&this.auth==="oauth"){this.setRequest(this.sessionURI,"action=getAccessToken&"+this.paramFromRequestToken(),function(o){t.handleFinished(o,e)})}else{e({status:200})}},handleFinished:function(e,t){if(e.result_status==="OK"){GUI.Storage.setItem(GUI.appId+":meta:"+this.serviceId,JSON.stringify({token:e.token,secret:e.secret,state:"authenticated"}));t({status:200})}else{t({status:e.result_code,response_data:e.error_message})}if(this.debug){console.log(e)}},checkAuthentication:function(){var e=GUI.Storage.getItem(GUI.appId+":meta:"+this.serviceId);this.token=null;if(e!=null){this.token=JSON.parse(e);this.sessionid=this.token.sid}},isAuthenticated:function(e){this.checkAuthentication();if(this.token==null){e({status:200,response_data:false})}else{if(this.token.state==="requested"){e({status:200,response_data:false})}else{e({status:200,response_data:true})}}},performAction:function(e){var t=Array.prototype.slice.call(arguments,1),o=t[t.length-1],r=this;if(typeof GUI==="object"&&GUI.Gallery){$("#gallery-export-icon-anim").show()}this.checkAuthentication();if(this.token==null){this.start(o)}else{if(this.token.state==="authenticated"){e.apply(this,t)}else{this.finish(function(s){if(s.status===200){r.checkAuthentication();e.apply(r,t)}else{o({status:s.status})}})}}},handleActionResponse:function(e,t,o){var r=this;if(GUI&&GUI.Gallery){$("#gallery-export-icon-anim").hide()}if(e.result_status==="OK"){t({status:200,response_data:e.result_data})}else{if(this.reauth&&(e.result_code===403||e.result_code===401)){if(this.debug){console.log("TOKEN EXPIRED - REAUTHENTICATE")}this.reauthenticate(o)}else{t({status:e.result_code,response_data:e.error_message})}}if(this.debug){console.log(e)}},reauthenticate:function(e){var t=this;this.setRequest(this.phpURI,"action=reauthenticate&token="+this.token.refresh_token,function(o){t.handleReauthenticated(o,e)})},uploadString:function(e,t,o,r,s,i,n,a){var l=this,d=Array.prototype.slice.call(arguments,0);d.unshift(this.uploadString);this.setRequest(this.phpURI,"action=uploadString&"+this.paramFromToken()+"&content="+e+"&sketch="+t+"&jc="+o+"&html="+r+"&fileName="+s+"&folderName="+i+"&overwrite="+n,function(e){l.handleActionResponse(e,a,d)})},downloadString:function(e,t){var o=Array.prototype.slice.call(arguments,0),r=this;o.unshift(this.downloadString);this.setRequest(this.phpURI,"action=downloadString&"+this.paramFromToken()+"&fileId="+e,function(e){r.handleActionResponse(e,t,o)})},getFolderContent:function(e,t,o){var r=Array.prototype.slice.call(arguments,0),s=this;r.unshift(this.getFolderContent);this.setRequest(this.phpURI,"action=getFolderContent&"+this.paramFromToken()+"&folderName="+encodeURIComponent(e)+"&recurse="+t,function(e){s.handleActionResponse(e,o,r)})},createFolder:function(e,t,o){var r=Array.prototype.slice.call(arguments,0),s=this;r.unshift(this.createFolder);this.setRequest(this.phpURI,"action=createFolder&"+this.paramFromToken()+"&folderName="+encodeURIComponent(e)+"&folderId="+t,function(e){s.handleActionResponse(e,o,r)})},getAccountInfo:function(e){var t=Array.prototype.slice.call(arguments,0),o=this;t.unshift(this.getAccountInfo);this.setRequest(this.phpURI,"action=getAccountInfo&"+this.paramFromToken(),function(r){o.handleActionResponse(r,e,t)})},passwordLogin:function(e,t,o){GUI.Storage.setItem(GUI.appId+":meta:"+this.serviceId,JSON.stringify({host:e,user:t,pass:o,state:"authenticated"}))},clear:function(){GUI.Storage.removeItem(GUI.appId+":meta:"+this.serviceId);this.token=null}};GUI.Export=GUI.Export||{};GUI.Export.Dropbox=JXG.deepCopy(GUI.Export.CloudInterface,{serviceName:"Dropbox",serviceId:"dropbox",baseURI:GUI.release?"https://sketchometry.uni-bayreuth.de/dropbox/":"https://sketchometry.uni-bayreuth.de/dev/dropbox/",phpURI:"dropbox.php",sessionURI:"dropbox.php"});GUI.Export=GUI.Export||{};GUI.Export.Skydrive=JXG.deepCopy(GUI.Export.CloudInterface,{serviceName:"SkyDrive",serviceId:"skydrive",reauth:true,fileExt:".sketch.txt",jcExt:".jc.txt",htmlExt:".html.txt",requestToken:null,baseURI:GUI.release?"https://sketchometry.uni-bayreuth.de/skydrive/":"https://sketchometry.uni-bayreuth.de/dev/skydrive/",phpURI:"skydrive.php",sessionURI:"skydrive_session.php",isSketch:function(e){var t="."+e.split(".").splice(-2,2).join(".").toLowerCase();return t===this.fileExt},isHTML:function(e){var t="."+e.split(".").splice(-2,2).join(".").toLowerCase();return t===this.htmlExt},isJC:function(e){var t="."+e.split(".").splice(-2,2).join(".").toLowerCase();return t===this.jcExt},paramFromToken:function(){return"token="+this.token.access_token},paramFromRequestToken:function(){return"requestToken="+this.token.requestToken},handleStarted:function(e,t){if(e.result_status==="OK"){GUI.Export.Skydrive.requestToken=e.requestToken;GUI.Storage.setItem(GUI.appId+":meta:"+this.serviceId,JSON.stringify({requestToken:e.requestToken,state:"requested",sid:e.sid}));this.sessionid=e.sid;t({status:200,response_data:e.uri})}else{t({status:403})}},handleFinished:function(e,t){var o=this;if(e.result_status==="OK"){e.WLData.state="authenticated";e.WLData.request_date=(new Date).getTime();e.WLData.expiry_date=e.WLData.request_date+parseInt(e.WLData.expires_in,10)*1e3;GUI.Storage.setItem(GUI.appId+":meta:"+this.serviceId,JSON.stringify(e.WLData));this.setRequest(this.sessionURI,"action=stop",function(e){if(o.debug){console.log(e)}});t({status:200})}else{t({status:e.result_code,response_data:e.error_message})}if(this.debug){console.log(e)}},handleReauthenticated:function(e,t){if(e.result_status==="OK"){e.WLData.state="authenticated";e.WLData.request_date=(new Date).getTime();e.WLData.expiry_date=e.WLData.request_date+parseInt(e.WLData.expires_in,10)*1e3;GUI.Storage.setItem(GUI.appId+":meta:"+this.serviceId,JSON.stringify(e.WLData));this.performAction.apply(this,t)}else{t[t.length-1]({status:401})}}});GUI.Export=GUI.Export||{};GUI.Export.UbuntuOne=JXG.deepCopy(GUI.Export.CloudInterface,{serviceName:"UbuntuOne",serviceId:"ubuntuone",token:null,baseURI:GUI.release?"https://sketchometry.uni-bayreuth.de/u1/":"https://sketchometry.uni-bayreuth.de/dev/u1/",phpURI:"ubuntuone.php",sessionURI:"ubuntuone_session.php"});GUI.Export=GUI.Export||{};GUI.Export.Googledrive=JXG.deepCopy(GUI.Export.CloudInterface,{serviceName:"Google Drive",serviceId:"googledrive",reauth:true,requestToken:null,baseURI:GUI.release?"https://sketchometry.uni-bayreuth.de/googledrive/":"https://sketchometry.uni-bayreuth.de/dev/googledrive/",phpURI:"googledrive.php",sessionURI:"googledrive_session.php",paramFromToken:function(){return"token="+this.token.access_token},paramFromRequestToken:function(){return"requestToken="+this.token.requestToken},handleStarted:function(e,t){if(e.result_status==="OK"){GUI.Export.Googledrive.requestToken=e.requestToken;GUI.Storage.setItem(GUI.appId+":meta:"+this.serviceId,JSON.stringify({requestToken:e.requestToken,state:"requested",sid:e.sid}));this.sessionid=e.sid;t({status:200,response_data:e.uri})}else{t({status:403})}},handleFinished:function(e,t){var o=this;if(e.result_status=="OK"){e.GDData.state="authenticated";e.GDData.request_date=(new Date).getTime();e.GDData.expiry_date=e.GDData.request_date+parseInt(e.GDData.expires_in,10)*1e3;GUI.Storage.setItem(GUI.appId+":meta:"+this.serviceId,JSON.stringify(e.GDData));this.setRequest(this.sessionURI,"action=stop",function(e){if(o.debug){console.log(e)}});t({status:200})}else{t({status:e.result_code,response_data:e.error_message})}if(this.debug){console.log(e)}},handleReauthenticated:function(e,t){if(e.result_status==="OK"){e.GDData.state="authenticated";e.GDData.request_date=(new Date).getTime();e.GDData.expiry_date=e.GDData.request_date+parseInt(e.GDData.expires_in,10)*1e3;GUI.Storage.setItem(GUI.appId+":meta:"+this.serviceID,JSON.stringify(e.GDData));this.performAction.apply(this,t)}else{t[t.length-1]({status:401})}}});GUI.Export=GUI.Export||{};GUI.Export.Webdav=JXG.deepCopy(GUI.Export.CloudInterface,{serviceName:"Webdav",serviceId:"webdav",auth:"password",baseURI:GUI.release?"https://sketchometry.uni-bayreuth.de/webdav/":"https://sketchometry.uni-bayreuth.de/dev/webdav/",phpURI:"webdav.php",sessionURI:"webdav.php",paramFromToken:function(){return"host="+encodeURIComponent(this.token.host)+"&user="+encodeURIComponent(this.token.user)+"&password="+encodeURIComponent(this.token.pass)},paramFromRequestToken:function(){return this.paramFromToken()}});GUI.Export=GUI.Export||{};GUI.Export.iCloud=JXG.deepCopy(GUI.Export.CloudInterface,{callbacks:[],serviceName:"iCloud",isAvailable:false,actions:{list:1,load:2,save:3,"delete":4,create:5},sendToAppleApp:function(e){var t,o,r;if(e.length==0)return;o=e[0];for(t=1;t<e.length;t++)o=o+":##sendToApp##"+e[t];r=document.createElement("IFRAME");r.setAttribute("src",o);document.documentElement.appendChild(r);r.parentNode.removeChild(r);r=null},requestAction:function(e,t,o,r,s){this.sendToAppleApp([e,t,o,r,s])},requestList:function(e){this.requestAction(GUI.Export.iCloud.actions.list,e)},listCallback:function(e){var t=GUI.Export.iCloud.actions.list;if(typeof this.callbacks[t]==="function")this.callbacks[t](e)},requestDownload:function(e,t){this.requestAction(GUI.Export.iCloud.actions.load,e,t)},downloadCallback:function(e){var t=GUI.Export.iCloud.actions.load;if(typeof this.callbacks[t]==="function"){this.callbacks[t](e)}},requestUpload:function(e,t,o){this.requestAction(GUI.Export.iCloud.actions.save,e,t,o)},uploadCallback:function(e){var t=GUI.Export.iCloud.actions.save;if(typeof this.callbacks[t]==="function"){this.callbacks[t](e)}},createCallback:function(e){var t=GUI.Export.iCloud.actions.create;if(typeof this.callbacks[t]==="function"){this.callbacks[t](e)}},requestDelete:function(e,t){this.requestAction(GUI.Export.iCloud.actions["delete"],e,t)},requestCreate:function(e){this.requestAction(GUI.Export.iCloud.actions.create,e)},createFolder:function(e,t,o){var r=GUI.Export.iCloud.actions.create;this.callbacks[r]=o;this.requestCreate(e)},downloadString:function(e,t){var o=GUI.Export.iCloud.actions.load;this.callbacks[o]=t;this.requestDownload(e,".")},getAccountInfo:function(e){var t=this.isAvailable?200:401;e({status:t,response_data:{display_name:"Apple User",rootFolderId:"/"}})},getFolderContent:function(e,t,o){var r=GUI.Export.iCloud.actions.list;this.callbacks[r]=o;if(typeof e=="undefined")e="/";if(e=="%id%"||e=="__spfld__HOME")e="/";this.requestList(e)},isAuthenticated:function(e){e({status:200,response_data:this.isAvailable})},performAction:function(e){var t=Array.prototype.slice.call(arguments,1);e.apply(this,t)},uploadString:function(e,t,o,r,s,i,n,a){var l,d=GUI.Export.iCloud.actions.save;this.callbacks[d]=a;if(t){l=GUI.unpack(e,0);this.requestUpload(s,l,n)}if(o){s=s+".jc";l=GUI.unpack(e,1);this.requestUpload(s,l,n)}},start:function(){}}); \ No newline at end of file
diff --git a/Sketchometry.activity/js/url.js b/Sketchometry.activity/js/url.js
new file mode 100644
index 0000000..e8fe67b
--- /dev/null
+++ b/Sketchometry.activity/js/url.js
@@ -0,0 +1,88 @@
+JXG.extend(GUI, {
+
+ parseURL: function(str) {
+
+ var url = {}, tmp, param, i;
+
+ tmp = str.split('?');
+ url.base = tmp[0];
+ url.data = tmp[1];
+ url.anchor = '';
+
+ if (url.base.indexOf('#') > -1) {
+ tmp = url.base.split('#');
+ url.base = tmp[0];
+ url.anchor = tmp[1];
+ } else if (url.data && url.data.indexOf('#') > -1) {
+ tmp = url.data.split('#');
+ url.data = tmp[0];
+ url.anchor = tmp[1];
+ }
+
+ url.param = {};
+
+ if (url.data) {
+ tmp = url.data.split('&');
+
+ for (i = 0; i < tmp.length; i++) {
+ param = tmp[i].split('=');
+ url.param[param[0]] = param[1];
+ }
+ }
+
+ return url;
+ }
+});
+
+/*global JXG:true, GUI:true, jQuery:true, init_jsx_gui:true, unescape: true, Piwik:true */
+
+$(document).ready(function () {
+ var url, name, gallery = true, id;
+
+ if (!JXG.supportsSVG()) {
+ $('#splash-hint > h3').html('We\'re sorry, but your browser is not supported.');
+ return;
+ }
+
+ init_jsx_gui('jxgbox');
+ GUI.Gallery.init();
+
+ // Parse the URL and read out the GET parameters
+ url = GUI.parseURL(window.location.href);
+
+ if (url.param.edit === 'true') {
+ gallery = false;
+
+ if (!url.param.source) {
+ url.param.source = 'ls';
+ }
+
+ if (url.param.source === 'ls' && !url.param.id) {
+ url.param.id = GUI.Gallery.files[GUI.Gallery.currentItem].fullid;
+ }
+
+ id = url.param.id;
+ }
+
+ if (url.param.source === 'url') {
+ name = url.param.name || GUI.Lang.std.untitled + '-' + (GUI.fileCounter + 1);
+ id = GUI.Gallery.createStorageItem(name, url.param.id);
+ }
+
+ $('#splash').hide();
+
+ // update file list, start loading the previews, etc...
+ GUI.Gallery.switchGallery();
+
+ if (!gallery) {
+ GUI.currentConstruction = {
+ source: url.param.source,
+ id: id,
+ redirect: unescape(url.param.redirect)
+ };
+ // this is required to actually show the axis. see comment 6 on ticket #225
+ //GUI.loadConstruction(name, GUI.Storage.getItem(name), axis);
+ //$.mobile.changePage($('#mainWindow'), {transition: GUI.transition});
+ GUI.Gallery.switchMainWindow();
+ }
+});
diff --git a/Sketchometry.activity/pics/cloud-logos.png b/Sketchometry.activity/pics/cloud-logos.png
new file mode 100644
index 0000000..601cfd2
--- /dev/null
+++ b/Sketchometry.activity/pics/cloud-logos.png
Binary files differ
diff --git a/Sketchometry.activity/pics/icon-close.png b/Sketchometry.activity/pics/icon-close.png
new file mode 100644
index 0000000..e63be6c
--- /dev/null
+++ b/Sketchometry.activity/pics/icon-close.png
Binary files differ
diff --git a/Sketchometry.activity/pics/icon-logo.png b/Sketchometry.activity/pics/icon-logo.png
new file mode 100644
index 0000000..5f0ef44
--- /dev/null
+++ b/Sketchometry.activity/pics/icon-logo.png
Binary files differ
diff --git a/Sketchometry.activity/pics/sketchometry.png b/Sketchometry.activity/pics/sketchometry.png
new file mode 100755
index 0000000..0dedf27
--- /dev/null
+++ b/Sketchometry.activity/pics/sketchometry.png
Binary files differ
diff --git a/Sketchometry.activity/pics/sui-exo-icon-map-black-32.png b/Sketchometry.activity/pics/sui-exo-icon-map-black-32.png
new file mode 100644
index 0000000..c18f5b6
--- /dev/null
+++ b/Sketchometry.activity/pics/sui-exo-icon-map-black-32.png
Binary files differ
diff --git a/Sketchometry.activity/pics/sui-exo-icon-map-black-40.png b/Sketchometry.activity/pics/sui-exo-icon-map-black-40.png
new file mode 100644
index 0000000..786226c
--- /dev/null
+++ b/Sketchometry.activity/pics/sui-exo-icon-map-black-40.png
Binary files differ
diff --git a/Sketchometry.activity/pics/sui-exo-icon-map-black-48.png b/Sketchometry.activity/pics/sui-exo-icon-map-black-48.png
new file mode 100644
index 0000000..446bae0
--- /dev/null
+++ b/Sketchometry.activity/pics/sui-exo-icon-map-black-48.png
Binary files differ
diff --git a/Sketchometry.activity/pics/sui-exo-icon-map-black-64.png b/Sketchometry.activity/pics/sui-exo-icon-map-black-64.png
new file mode 100644
index 0000000..e102c13
--- /dev/null
+++ b/Sketchometry.activity/pics/sui-exo-icon-map-black-64.png
Binary files differ
diff --git a/Sketchometry.activity/pics/sui-exo-icon-map-black-80.png b/Sketchometry.activity/pics/sui-exo-icon-map-black-80.png
new file mode 100644
index 0000000..46b1668
--- /dev/null
+++ b/Sketchometry.activity/pics/sui-exo-icon-map-black-80.png
Binary files differ
diff --git a/Sketchometry.activity/pics/sui-exo-icon-map-black-96.png b/Sketchometry.activity/pics/sui-exo-icon-map-black-96.png
new file mode 100644
index 0000000..0205a58
--- /dev/null
+++ b/Sketchometry.activity/pics/sui-exo-icon-map-black-96.png
Binary files differ
diff --git a/Sketchometry.activity/pics/sui-exo-icon-map-white-32.png b/Sketchometry.activity/pics/sui-exo-icon-map-white-32.png
new file mode 100644
index 0000000..2a404bd
--- /dev/null
+++ b/Sketchometry.activity/pics/sui-exo-icon-map-white-32.png
Binary files differ
diff --git a/Sketchometry.activity/pics/sui-exo-icon-map-white-40.png b/Sketchometry.activity/pics/sui-exo-icon-map-white-40.png
new file mode 100644
index 0000000..813b14d
--- /dev/null
+++ b/Sketchometry.activity/pics/sui-exo-icon-map-white-40.png
Binary files differ
diff --git a/Sketchometry.activity/pics/sui-exo-icon-map-white-48.png b/Sketchometry.activity/pics/sui-exo-icon-map-white-48.png
new file mode 100644
index 0000000..14f18d7
--- /dev/null
+++ b/Sketchometry.activity/pics/sui-exo-icon-map-white-48.png
Binary files differ
diff --git a/Sketchometry.activity/pics/sui-exo-icon-map-white-64.png b/Sketchometry.activity/pics/sui-exo-icon-map-white-64.png
new file mode 100644
index 0000000..e1cc864
--- /dev/null
+++ b/Sketchometry.activity/pics/sui-exo-icon-map-white-64.png
Binary files differ
diff --git a/Sketchometry.activity/pics/sui-exo-icon-map-white-80.png b/Sketchometry.activity/pics/sui-exo-icon-map-white-80.png
new file mode 100644
index 0000000..c5b8c4e
--- /dev/null
+++ b/Sketchometry.activity/pics/sui-exo-icon-map-white-80.png
Binary files differ
diff --git a/Sketchometry.activity/pics/sui-exo-icon-map-white-96.png b/Sketchometry.activity/pics/sui-exo-icon-map-white-96.png
new file mode 100644
index 0000000..9fdbdb3
--- /dev/null
+++ b/Sketchometry.activity/pics/sui-exo-icon-map-white-96.png
Binary files differ
diff --git a/Sketchometry.activity/pics/wait-animation-big.gif b/Sketchometry.activity/pics/wait-animation-big.gif
new file mode 100644
index 0000000..7eca290
--- /dev/null
+++ b/Sketchometry.activity/pics/wait-animation-big.gif
Binary files differ
diff --git a/Sketchometry.activity/pics/wait-animation.gif b/Sketchometry.activity/pics/wait-animation.gif
new file mode 100644
index 0000000..63cf4b6
--- /dev/null
+++ b/Sketchometry.activity/pics/wait-animation.gif
Binary files differ
diff --git a/Sketchometry.activity/setup.py b/Sketchometry.activity/setup.py
new file mode 100755
index 0000000..93d1d8f
--- /dev/null
+++ b/Sketchometry.activity/setup.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2012 Sketchometry
+#
+# This program is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General
+# Public License as published by the Free Software
+# Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will
+# be useful, but WITHOUT ANY WARRANTY; without even
+# the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE. See the GNU General Public
+# License for more details.
+#
+# You should have received a copy of the GNU General
+# Public License along with this program; if not, write
+# to the Free Software Foundation, Inc., 51 Franklin
+# St, Fifth Floor, Boston, MA 02110-1301 USA
+
+from sugar.activity import bundlebuilder
+
+bundlebuilder.start()
+