docs: function TermDataStage(term_info, term_accs){
  
      // Ready logging.
      var logger = new bbop.logger();
      logger.DEBUG = true;
      function ll(str){ logger.kvetch('JSM02: ' + str); }
      ll('');
      ll('TermDataStage start...');
  
      // The number of requests that we will make.
      var request_count = 0;
      var run_funs = [];
  
      // Now, cycle though all of the posible pairs of terms while setting
      // and unsetting the query filter on the manager.
      ll(' Gathering batch functions for term data...');
      // Different.
      var mixed_pairs = [];
      for(var v_i = 0; v_i < term_accs.length; v_i++){
  	for(var h_i = 0; h_i < v_i; h_i++){
  
  	    var v = term_accs[v_i];
  	    var h = term_accs[h_i];
  	    
  	    mixed_pairs.push([v, h]);
  	}
      }
  
      var filter_strs = _get_filters(filter_manager);
      console.log('pass filter state: ', filter_strs);
  
      us.each(mixed_pairs, function(pair){
  
  	var v = pair[0];
  	var h = pair[1];
  	ll(' Setup search for: ' + v + ' and ' + h);
  
  	// Code here will be ignored by JSHint, as we are defining
  	// functions in a loop, which apparently is usually
  	// naughty.
  	/* jshint ignore:start */
  	run_funs.push(function(){
  	    
  	    // Manager settings.
  	    var go = _new_manager();
  	    go.set_personality('bioentity');
  	    go.add_query_filter('document_category', 'bioentity');
  	    go.set_results_count(0); // we don't need any actual rows returned
  	    go.set_facet_limit(0); // don't need any actual facets returned
  	    //go.debug(false);
  	    
  	    // Stack on the filters from the filter box.
  	    us.each(filter_strs, function(fas){
  		go.add_query_filter_as_string(fas, []);
  	    });
  
  	    // Set the next query.
  	    go.add_query_filter(closure_type, v);
  	    go.add_query_filter(closure_type, h);
  	    
  	    return go.search();
  	});
  	/* jshint ignore:end */
  	
  	request_count++;
      });
  
      // Reflexive.
      us.each(term_accs, function(r){
  
  	ll(' Setup reflexive search for: ' + r);
  
  	// Code here will be ignored by JSHint, as we are defining
  	// functions in a loop, which apparently is usually naughty.
  	/* jshint ignore:start */
  	run_funs.push(function(){
  
  	    // Manager settings.
  	    var go = _new_manager();
  	    go.set_personality('bioentity');
  	    go.add_query_filter('document_category', 'bioentity');
  	    go.set_results_count(0); // we don't need any actual rows returned
  	    go.set_facet_limit(0); // don't need any actual facets returned
  	    //go.debug(false);
  	    
  	    // Stack on the filters from the filter box.
  	    us.each(filter_strs, function(fas){
  		go.add_query_filter_as_string(fas, []);
  	    });
  
      	    // Set the next query.
      	    go.add_query_filter(closure_type, r);
  	    
  	    return go.search();
  	});
  	/* jshint ignore:end */
  	
  	request_count++;
      });
  
      // Now that we know how many requests we will make, initialize the
      // progress bar.
      jQuery("#progress-text").empty();
      jQuery("#progress-text").append('<b><span id="progress-count">0</span> of '+
  				    request_count + '</b>');
      //jQuery("#progress-bar").empty();
      jQuery("#progress-bar").progressbar({ max: request_count });
      jQuery("#progress-widget").show();
  
      // Actually serially fetch the data.
      var seen_links = {};
      var max_count = 0;
      var requests_done = 0;
      // Fetch the data and grab the number we want.
      var accumulator_fun = function(resp){	
  
  	// Update the bar.
  	requests_done++;
  	jQuery('#progress-bar').progressbar({ value: requests_done });
  	jQuery("#progress-count").empty();
  	jQuery("#progress-count").append(requests_done);
  
  	// Count is easy.
  	var count = resp.total_documents();
  	if( count > max_count ){
  	    max_count = count;
  	}
  
  	// Now let's try and fiqure out which terms we were looking
  	// at...
  	var fqs = resp.query_filters();
  	//console.log(resp);
  	var fprops = fqs[closure_type];
  
  	var axes = [];
  	us.each(fprops, function(fval, fkey){
  	    axes.push(fkey);
  	});	
  	var axis1 = axes[0];
  	var axis2 = axes[1] || axis1; // the reflexive case
  
  	ll(' Data from: (' + axis1 + ', ' + axis2 + '); ' + count);
  
  	// Structure for the links we've seen, level 1.
  	if( typeof(seen_links[axis1]) === 'undefined' ){
  	    seen_links[axis1] = {}; }
  	if( typeof(seen_links[axis2]) === 'undefined' ){
  	    seen_links[axis2] = {}; }
  	// Mark the links we've seen, level 2.
  	if( typeof(seen_links[axis2][axis1]) === 'undefined' ){
  	    seen_links[axis2][axis1] = count; }
  	if( typeof(seen_links[axis1][axis2]) === 'undefined' ){
  	    seen_links[axis1][axis2] = count; }
      };
  
      // The final function is the data renderer.
      var final_fun = function(){
  	ll('Starting final in TermDataStage...');
  
  	// We're done, so hide the progress bar again and show the
  	// order selector.
  	jQuery('#progress-widget').hide();
  	jQuery("#order-selector").show();
  
  	// We want this to be fully defined at the end of the accumulator.
  	var data = {
      	    graph: seen_links,
      	    nodes: [],
      	    links: []
  	};
  
  	// Now we map out term information into the same format as the
  	// example.
  	us.each(term_accs, function(acc){
  	    var node = {
  		'id': acc,
  		'name': term_info[acc]['name'],
  		'source': term_info[acc]['source'],
  		'index': term_info[acc]['index']
  	    };
  	    data.nodes.push(node);
  	});
  
  	// Next, we put our link information into the same format as
  	// the example.
  	var already_done_links = {};
  	us.each(seen_links, function(sub_data, sub){
  	    us.each(sub_data, function(link_count, obj){
  
  		// Only add links that we haven't yet.
  		var li1 = sub + '_' + obj;
  		var li2 = obj + '_' + sub;
  		if( typeof(already_done_links[li1]) === 'undefined' ){
  		    
  		    // Add it to our done list. Either way
  		    // we'll catch it.
  		    already_done_links[li1] = true;
  		    already_done_links[li2] = true;
  		    
  		    // Push the new link data.
  		    var link = {
  			'source': term_info[sub]['index'],
  			'target': term_info[obj]['index'],
  			'value': link_count
  		    };
  		    data.links.push(link);
  		}
  	    });
  	});
  
  	ll(' Seen links: ' + bbop.dump(seen_links));
  	ll(' Data: ' + bbop.dump(data));
  	ll(' Max count: ' + max_count);
  	// //ll(h + ', ' + v + ': ' + count);
  	// ll('accumulate: ' + axis1 + ', ' + axis2 + ': ' + count);
  
  	ll('Completed TermDataStage!');
  	RenderStage(data, max_count);
  	//PlotStage(data, max_count);
      };
  
      // Create and run coordinating manager.
      var manager = _new_manager();
      manager.run_promise_functions(
  	run_funs,
  	accumulator_fun,
  	final_fun,
  	function(err){
  	    alert(err.toString());
  	});
  }