anchor.diff:  import 'dart:io' hide ProcessException;
   
   import 'package:analyzer/file_system/physical_file_system.dart';
  +import 'package:collection/collection.dart';
   import 'package:crypto/crypto.dart' as crypto;
   import 'package:dartdoc/src/io_utils.dart';
   import 'package:dartdoc/src/package_meta.dart';
  
positive.code:   }
  
    // Verify that the web frontend has been compiled.
    final currentCodeSig = calcDartFilesSig(Directory('web'));
    final lastCompileSig =
        File(p.join('web', 'sig.txt')).readAsStringSync().trim();
    if (currentCodeSig != lastCompileSig) {
  
negative.code:   return count;
  }
  
  Future<String> _calcDartFilesSig(Directory dir) async {
    final digest = await _dartFileLines(dir)
        .transform(utf8.encoder)
        .transform(crypto.md5)
        .single;
  
    return digest.bytes
        .map((byte) => byte.toRadixString(16).padLeft(2, '0').toUpperCase())
        .join();
  }
  
  /// Yields all of the trimmed lines of all of the `.dart` files in [dir].
  Stream<String> _dartFileLines(Directory dir) async* {
    final files = dir
        .listSync(recursive: true)
        .whereType<File>()
        .where((file) => file.path.endsWith('.dart'))
        .toList()
      ..sort((a, b) => compareAsciiLowerCase(a.path, b.path));
  
    for (var file in files) {
      for (var line in file.readAsLinesSync()) {
        yield line.trim();
      }
    }
  }
  