anchor.diff:    parser.addOption('port', abbr: 'p', help: 'remote VM port');
     parser.addOption('out', abbr: 'o', defaultsTo: 'stdout',
         help: 'output: may be file or stdout');
  +  parser.addOption('connect-timeout', abbr: 't',
  +      help: 'connect timeout in seconds');
     parser.addFlag('unpin-isolates', abbr: 'u', defaultsTo: false,
         help: 'unpin all isolates on exit');
     parser.addFlag('help', abbr: 'h', negatable: false,
  
positive.code:   final String host;
    final String port;
    final IOSink out;
    final bool unpin;
    Options(this.host, this.port, this.out, this.unpin);
  }
  
  Options parseArgs(List<String> arguments) {
  
negative.code: 
  void main(List<String> arguments) {
    var options = parseArgs(arguments);
    var watch = new Stopwatch()..start();
    new Timer.periodic(new Duration(milliseconds: 200), (timer) {
      connect(options.host, options.port).then((observatory) {
        timer.cancel();
        getAllCoverage(observatory)
            .then(JSON.encode)
            .then(options.out.write)
            .then((_) => options.out.close())
            .then((_) => options.unpin ? unpinIsolates(observatory) : null)
            .then((_) => observatory.close());
      }, onError: (_) {
        if ((options.timeout != null) && (watch.elapsed > options.timeout)) {
          var timeout = options.timeout.inSeconds;
          print('Failed to collect coverage within ${timeout}s');
          exit(1);
        }
      });
    });
  }
  
  