anchor.diff:    var setup = [
                  [true, true, true, true, true, true, true, true, true, true],
                  [true, true, true, true, true, true, true, true, true, true],
  -               [true, true, true, true, true, true, true, true, true, true],
  -               [true, true, true, true, true, true, true, true, true, true],
  -               [true, true, true, true, true, true, true, true, true, true],
  -               [true, true, true, true, true, true, true, true, true, true],
  -               [true, true, true, true, true, true, true, true, true, true],
  -               [true, true, true, true, true, true, true, true, true, true],
  +               [true, true, true, true, false, true, true, true, true, true],
                  [true, true, true, true, true, true, true, true, true, true],
                  [true, true, true, true, true, true, true, true, true, true]
     ];
     
  -  computeSlotMachineProbability(5, 20, 0.5);
  -  
  -//  print(findSlotLineProbability(0.8, slotCount: 20, delta: 0.05));
  +  computeSlotMachineProbability(setup, 5, 10);
  +  
  +  print(findSlotLineProbability(setup, 0.8, delta: 0.05));
   }
   
   /// Computes probabilities of success and failure depending on setup.
  -void computeSlotMachineProbability(int slotLinesCount, int slotCount, 
  -                                   num slotLineProbability) {
  -  List<int> outcomes = _generatePossibleOutcomes(slotLinesCount, slotCount,
  -      slotLineProbability);
  +void computeSlotMachineProbability(List<List<bool>> setup, 
  +                                   int slotLinesCount, int slotCount) {
  +  List<int> outcomes = _generatePossibleOutcomes(setup);
     
     int count = outcomes.length;
     int criticalSuccesses = outcomes.where((o) => o == slotLinesCount).length;
  
positive.code:   return middle;
  }
  
  List<int> _generatePossibleOutcomes(int slotLinesCount, int slotCount, 
                                      num slotLineProbability) {
    // Compute first slot line's successes.
    int successes = (slotCount * slotLineProbability).round();
    List<int> thisLineOutcomes = new List(slotCount);
    Random rand = new Random();
    for (int i = 0; i < slotCount; i++) {
  //    thisLineOutcomes[i] = i < successes ? 1 : -1;
      thisLineOutcomes[i] = rand.nextDouble() < slotLineProbability ? 1 : -1;
    }
    
    if (slotLinesCount == 1) {
      return thisLineOutcomes;
    }
    
    List<int> wholeOutcomes = new List<int>();
    
    thisLineOutcomes.forEach((int outcome) {
      _generatePossibleOutcomes(slotLinesCount - 1, slotCount, 
          slotLineProbability).forEach((rightOutcome) {
        wholeOutcomes.add(outcome + rightOutcome);
      });
    });
  
negative.code:   
    print("Successes:           $successes\t(${successes / count})");
    print("Failures:            $failures\t(${failures / count})");
    print("Critical Successes:  $criticalSuccesses\t(${criticalSuccesses / count})");
    print("Critical Failures:   $criticalFailures\t(${criticalFailures / count})");
  }
  
  num findSlotLineProbability(List<List<bool>> initialSetup, 
                              num desiredWholeProbability, {num delta: 0.1, 
                              int maxTries: 100}) {
    if (desiredWholeProbability == 0) return 0;
    if (desiredWholeProbability == 1.0) return 1.0;
    num a = 0;
  