docs: function BuildLog(){
  	var my;
  	var nextSegmentId = 0;
  	var curVert = false;
  
  	function push(type, data){
  		my.list.push({
  			type: type,
  			data: data ? JSON.parse(JSON.stringify(data)) : void 0
  		});
  		return my;
  	}
  
  	my = {
  		list: [],
  		segmentId: function(){
  			return nextSegmentId++;
  		},
  		checkIntersection: function(seg1, seg2){
  			return push('check', { seg1: seg1, seg2: seg2 });
  		},
  		segmentChop: function(seg, end){
  			push('div_seg', { seg: seg, pt: end });
  			return push('chop', { seg: seg, pt: end });
  		},
  		statusRemove: function(seg){
  			return push('pop_seg', { seg: seg });
  		},
  		segmentUpdate: function(seg){
  			return push('seg_update', { seg: seg });
  		},
  		segmentNew: function(seg, primary){
  			return push('new_seg', { seg: seg, primary: primary });
  		},
  		segmentRemove: function(seg){
  			return push('rem_seg', { seg: seg });
  		},
  		tempStatus: function(seg, above, below){
  			return push('temp_status', { seg: seg, above: above, below: below });
  		},
  		rewind: function(seg){
  			return push('rewind', { seg: seg });
  		},
  		status: function(seg, above, below){
  			return push('status', { seg: seg, above: above, below: below });
  		},
  		vert: function(x){
  			if (x === curVert)
  				return my;
  			curVert = x;
  			return push('vert', { x: x });
  		},
  		log: function(data){
  			if (typeof data !== 'string')
  				data = JSON.stringify(data, false, '  ');
  			return push('log', { txt: data });
  		},
  		reset: function(){
  			return push('reset');
  		},
  		selected: function(segs){
  			return push('selected', { segs: segs });
  		},
  		chainStart: function(seg){
  			return push('chain_start', { seg: seg });
  		},
  		chainRemoveHead: function(index, pt){
  			return push('chain_rem_head', { index: index, pt: pt });
  		},
  		chainRemoveTail: function(index, pt){
  			return push('chain_rem_tail', { index: index, pt: pt });
  		},
  		chainNew: function(pt1, pt2){
  			return push('chain_new', { pt1: pt1, pt2: pt2 });
  		},
  		chainMatch: function(index){
  			return push('chain_match', { index: index });
  		},
  		chainClose: function(index){
  			return push('chain_close', { index: index });
  		},
  		chainAddHead: function(index, pt){
  			return push('chain_add_head', { index: index, pt: pt });
  		},
  		chainAddTail: function(index, pt){
  			return push('chain_add_tail', { index: index, pt: pt, });
  		},
  		chainConnect: function(index1, index2){
  			return push('chain_con', { index1: index1, index2: index2 });
  		},
  		chainReverse: function(index){
  			return push('chain_rev', { index: index });
  		},
  		chainJoin: function(index1, index2){
  			return push('chain_join', { index1: index1, index2: index2 });
  		},
  		done: function(){
  			return push('done');
  		}
  	};
  	return my;
  }