anchor.diff:        if (len <= kMinDistance) {
           Pole p = srcs[rng.nextInt(srcs.length)];
           _pos = p.Pos() + RandomVector(rng, 0.35);
  -        print("too close: ${len}");
  +        //print("too close: ${len}");
           return;
         }
         force += t / (len * len);
  
positive.code:       if (len > kMaxDistance) {
          Pole p = srcs[rng.nextInt(srcs.length)];
          _pos = p.Pos() + RandomVector(rng, 0.35);
          print("too far ${len}");
          return;
        }
        // the further the distance the weaker the force
  
negative.code:   IntroduceNewShaderVar(
        uSinks, new ShaderVarDesc(VarTypeVec3, "", arraySize: 5));
  
    final StatsFps fps =
        new StatsFps(HTML.document.getElementById("stats"), "blue", "gray");
  
    final Math.Random rng = new Math.Random(0);
  
    final HTML.CanvasElement canvas =
        HTML.document.querySelector('#webgl-canvas');
    final int width = canvas.clientWidth;
    final int height = canvas.clientHeight;
    canvas.width = width;
    canvas.height = height;
  
    final ChronosGL chronosGL = new ChronosGL(canvas);
    final OrbitCamera orbit = new OrbitCamera(15.0, 0.5, 0.5, canvas);
    final Perspective perspective = new Perspective(orbit, 0.1, 1000.0)
      ..AdjustAspect(width, height);
  
    final RenderProgram programJS = new RenderProgram(
        "GPU", chronosGL, pointSpritesVertexShader, particleFragmentShader);
    final RenderProgram programGPU = new RenderProgram(
        "GPU", chronosGL, particleVertexShader, particleFragmentShader);
    final int bindingIndex = programGPU.GetTransformBindingIndex(tPosition);
    print ("@@@@ ${bindingIndex}");
  
    final List<Pole> srcPoles =
        MakeRowOfPoles([2.0, 1.0, 0.0, -1.0, -2.0], 0.0, 2.0, 3.0);
    final List<Pole> dstPoles =
        MakeRowOfPoles([2.0, 1.0, 0.0, -1.0, -2.0], 0.0, -2.0, 3.0);
  
    List<Ion> ions = [new Ion(RandomVector(rng, kMaxDistance * 100.0))];
  