anchor.diff:    _route(window.location.hash);
   }
   
  +@observable
  +var activeDemo = null;
  +var activeCtrl = new Future.value(new Ctrl());
   void _route(String hash) {
     var k = (hash != null && hash.length < 2)? null : hash.substring(2);
     print("k :: ${k}");
  
positive.code:   return new Future.value(world);
  }
  
  @observable
  var activeDemo = null;
  const STYLE0 = '#e3e3f8';
  const STYLE1 = '#f7e4ed'; //tetrad
  const STYLE2 = '#f7f7e4';
  
negative.code:     addNewEntity(world, makeTireXY(new vec3(400.0, 50.0, 0.0), 70.0, 7, 0.1, 0.2).toList()..add(new proto.Drawable(defaultDraw)));
      addNewEntity(world, makeTireXY(new vec3(600.0, 50.0, 0.0), 70.0, 3, 1.0, 1.0).toList()..add(new proto.Drawable(defaultDraw)));
      return new Future.value(world);
    },
    'quadtree' : (world) {
      world.getSystem(System_Simulator).friction = 1.0;
      addNewEntity(world, [
        new Transform.w2d(50.0, 50.0, 0.0),
        new Emitter()
        ..genParticles = true
        ..counter = singleWave(500)
        ..initializers.add(particlesStartPosition(
          //constant(new vec3.zero())
            box(new vec3(500.0, 500.0, 0.0), new vec3(400.0, 400.0, 0.0))
          , true
        ))
        ..initializers.add(particlesStartPositionPrevious(box(new vec3.zero(), new vec3(3.0, 3.0, 0.0))))
        ..initializers.add(particlesAddComponents([
          (lg){
            var b = new ParticleInfo0s(lg);
            b.l.forEach((p){
              p.radius = 3.0;
            });
            return b;
          }
        ]))
        ..initializers.add(addComponents([
          () => new proto.Drawable(proto.particleInfo0s(3.0, fillStyle : STYLE0, strokeStyle : STYLE1)),
          () => new Constraints(),
          () => new Animatable()
            ..add(new Animation()
              ..onTick = (e, t, t0) {
                 var ps = e.getComponent(Particles.CT);
                 var cont = true;
                 for( var i = ps.l.length - 1; i > -1; --i) {
                   cont = true;
                   cont = cont && ps.l[i].position3d.y > 0;
                   cont = cont && ps.l[i].position3d.y < 1000;
                   cont = cont && ps.l[i].position3d.x > 0;
                   cont = cont && ps.l[i].position3d.x < 1000;
                   if (!cont) {
                     ps.l[i].position3d.setFrom(ps.l[i].position3dPrevious);
                   }
                 }
                 return true;//cont;
               }
               ..onEnd = (e, t, t0) {
                 e.deleteFromWorld();
               }
            )
        ])),
      ]);
      return new Future.value(world);
    }
  };
  
  