anchor.diff:      ]);
     }
   }
  +
  +int _countMissedTransitions(Map<String, List<int>> transitions) {
  +  const int _kTransitionBudget = 100000; // µs
  +  int count = 0;
  +  transitions.forEach((String demoName, List<int> durations) {
  +    int longestDuration = durations.reduce(math.max);
  +    if (longestDuration > _kTransitionBudget) {
  +      print('$demoName missed transition time budget ($longestDuration µs > $_kTransitionBudget µs)');
  +      count++;
  +    }
  +  });
  +  return count;
  +}
  
positive.code: 
      // Route paths contains slashes, which Firebase doesn't accept in keys, so we
      // remove them.
      Map<String, dynamic> original = JSON.decode(file(
              '${galleryDirectory.path}/build/transition_durations.timeline.json')
          .readAsStringSync());
      Map<String, dynamic> transitions = new Map<String, dynamic>.fromIterable(
          original.keys,
          key: (String key) => key.replaceAll('/', ''),
          value: (String key) => original[key]);
  
negative.code: import 'dart:async';
  import 'dart:convert';
  import 'dart:io';
  import 'dart:math' as math;
  
  import '../framework/adb.dart';
  import '../framework/framework.dart';
  