[flutter_tools] remove build script from tool package (#50690)

diff --git a/packages/_flutter_web_build_script/README.md b/packages/_flutter_web_build_script/README.md
new file mode 100644
index 0000000..b0580c2
--- /dev/null
+++ b/packages/_flutter_web_build_script/README.md
@@ -0,0 +1 @@
+This package contains the custom build script used to compile Flutter for Web applications before support for JavaScript was added into the frontend_server. It is still used for test compilation today, and is hosted here to reduce the number of dependencies that the flutter_tool has. For more information on the plans for flutter test --platform=chrome, see https://github.com/flutter/flutter/issues/50594
diff --git a/packages/_flutter_web_build_script/analysis_options.yaml b/packages/_flutter_web_build_script/analysis_options.yaml
new file mode 100644
index 0000000..525929f
--- /dev/null
+++ b/packages/_flutter_web_build_script/analysis_options.yaml
@@ -0,0 +1,9 @@
+# Use the analysis options settings from the top level of the repo (not
+# the ones from above, which include the `public_member_api_docs` rule).
+
+include: ../../analysis_options.yaml
+
+linter:
+  rules:
+    unawaited_futures: true
+    curly_braces_in_flow_control_structures: true
diff --git a/packages/_flutter_web_build_script/lib/build_script.dart b/packages/_flutter_web_build_script/lib/build_script.dart
new file mode 100644
index 0000000..8ce12fc
--- /dev/null
+++ b/packages/_flutter_web_build_script/lib/build_script.dart
@@ -0,0 +1,418 @@
+// Copyright 2014 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// ignore_for_file: implementation_imports
+import 'dart:async';
+import 'dart:isolate';
+
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/utilities.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:build/build.dart';
+import 'package:build_config/build_config.dart';
+import 'package:build_modules/build_modules.dart';
+import 'package:build_modules/builders.dart';
+import 'package:build_modules/src/module_builder.dart';
+import 'package:build_modules/src/platform.dart';
+import 'package:build_runner/build_runner.dart' as build_runner;
+import 'package:build_runner_core/build_runner_core.dart' as core;
+import 'package:build_test/builder.dart';
+import 'package:build_test/src/debug_test_builder.dart';
+import 'package:build_web_compilers/build_web_compilers.dart';
+import 'package:build_web_compilers/builders.dart';
+import 'package:build_web_compilers/src/dev_compiler_bootstrap.dart';
+import 'package:path/path.dart' as path; // ignore: package_path_import
+import 'package:test_core/backend.dart'; // ignore: deprecated_member_use
+
+const String ddcBootstrapExtension = '.dart.bootstrap.js';
+const String jsEntrypointExtension = '.dart.js';
+const String jsEntrypointSourceMapExtension = '.dart.js.map';
+const String jsEntrypointArchiveExtension = '.dart.js.tar.gz';
+const String digestsEntrypointExtension = '.digests';
+const String jsModuleErrorsExtension = '.ddc.js.errors';
+const String jsModuleExtension = '.ddc.js';
+const String jsSourceMapExtension = '.ddc.js.map';
+const String kReleaseFlag = 'release';
+const String kProfileFlag = 'profile';
+
+final DartPlatform flutterWebPlatform = DartPlatform.register('flutter_web', <String>[
+  'async',
+  'collection',
+  'convert',
+  'core',
+  'developer',
+  'html',
+  'html_common',
+  'indexed_db',
+  'js',
+  'js_util',
+  'math',
+  'svg',
+  'typed_data',
+  'web_audio',
+  'web_gl',
+  'web_sql',
+  '_internal',
+  // Flutter web specific libraries.
+  'ui',
+  '_engine',
+]);
+
+/// The builders required to compile a Flutter application to the web.
+final List<core.BuilderApplication> builders = <core.BuilderApplication>[
+  core.apply(
+    'flutter_tools:test_bootstrap',
+    <BuilderFactory>[
+      (BuilderOptions options) => const DebugTestBuilder(),
+      (BuilderOptions options) => const FlutterWebTestBootstrapBuilder(),
+    ],
+    core.toRoot(),
+    hideOutput: true,
+    defaultGenerateFor: const InputSet(
+      include: <String>[
+        'test/**',
+      ],
+    ),
+  ),
+  core.apply(
+    'flutter_tools:shell',
+    <BuilderFactory>[
+      (BuilderOptions options) {
+        final bool hasPlugins = options.config['hasPlugins'] == true;
+        final bool initializePlatform = options.config['initializePlatform'] == true;
+        return FlutterWebShellBuilder(
+          hasPlugins: hasPlugins,
+          initializePlatform: initializePlatform,
+        );
+      },
+    ],
+    core.toRoot(),
+    hideOutput: true,
+    defaultGenerateFor: const InputSet(
+      include: <String>[
+        'lib/**',
+        'web/**',
+      ],
+    ),
+  ),
+  core.apply(
+      'flutter_tools:module_library',
+      <Builder Function(BuilderOptions)>[moduleLibraryBuilder],
+      core.toAllPackages(),
+      isOptional: true,
+      hideOutput: true,
+      appliesBuilders: <String>['flutter_tools:module_cleanup']),
+  core.apply(
+      'flutter_tools:ddc_modules',
+      <Builder Function(BuilderOptions)>[
+        (BuilderOptions options) => MetaModuleBuilder(flutterWebPlatform),
+        (BuilderOptions options) => MetaModuleCleanBuilder(flutterWebPlatform),
+        (BuilderOptions options) => ModuleBuilder(flutterWebPlatform),
+      ],
+      core.toNoneByDefault(),
+      isOptional: true,
+      hideOutput: true,
+      appliesBuilders: <String>['flutter_tools:module_cleanup']),
+  core.apply(
+      'flutter_tools:ddc',
+      <Builder Function(BuilderOptions)>[
+        (BuilderOptions builderOptions) => KernelBuilder(
+              platformSdk: builderOptions.config['flutterWebSdk'] as String,
+              summaryOnly: true,
+              sdkKernelPath: path.join('kernel', 'flutter_ddc_sdk.dill'),
+              outputExtension: ddcKernelExtension,
+              platform: flutterWebPlatform,
+              librariesPath: path.absolute(path.join(builderOptions.config['flutterWebSdk'] as String, 'libraries.json')),
+              kernelTargetName: 'ddc',
+              useIncrementalCompiler: true,
+              trackUnusedInputs: true,
+            ),
+        (BuilderOptions builderOptions) => DevCompilerBuilder(
+              useIncrementalCompiler: true,
+              trackUnusedInputs: true,
+              platform: flutterWebPlatform,
+              platformSdk: builderOptions.config['flutterWebSdk'] as String,
+              sdkKernelPath: path.url.join('kernel', 'flutter_ddc_sdk.dill'),
+              librariesPath: path.absolute(path.join(builderOptions.config['flutterWebSdk'] as String, 'libraries.json')),
+            ),
+      ],
+      core.toAllPackages(),
+      isOptional: true,
+      hideOutput: true,
+      appliesBuilders: <String>['flutter_tools:ddc_modules']),
+  core.apply(
+    'flutter_tools:entrypoint',
+    <BuilderFactory>[
+      (BuilderOptions options) => FlutterWebEntrypointBuilder(
+          options.config[kReleaseFlag] as bool ?? false,
+          options.config[kProfileFlag] as bool ?? false,
+          options.config['flutterWebSdk'] as String,
+      ),
+    ],
+    core.toRoot(),
+    hideOutput: true,
+    defaultGenerateFor: const InputSet(
+      include: <String>[
+        'lib/**_web_entrypoint.dart',
+      ],
+    ),
+  ),
+  core.apply(
+    'flutter_tools:test_entrypoint',
+    <BuilderFactory>[
+      (BuilderOptions options) => const FlutterWebTestEntrypointBuilder(),
+    ],
+    core.toRoot(),
+    hideOutput: true,
+    defaultGenerateFor: const InputSet(
+      include: <String>[
+        'test/**_test.dart.browser_test.dart',
+      ],
+    ),
+  ),
+  core.applyPostProcess('flutter_tools:module_cleanup', moduleCleanup,
+      defaultGenerateFor: const InputSet()),
+];
+
+/// The entry point to this build script.
+Future<void> main(List<String> args, [SendPort sendPort]) async {
+  core.overrideGeneratedOutputDirectory('flutter_web');
+  final int result = await build_runner.run(args, builders);
+  sendPort?.send(result);
+}
+
+/// A ddc-only entry point builder that respects the Flutter target flag.
+class FlutterWebTestEntrypointBuilder implements Builder {
+  const FlutterWebTestEntrypointBuilder();
+
+  @override
+  Map<String, List<String>> get buildExtensions => const <String, List<String>>{
+    '.dart': <String>[
+      ddcBootstrapExtension,
+      jsEntrypointExtension,
+      jsEntrypointSourceMapExtension,
+      jsEntrypointArchiveExtension,
+      digestsEntrypointExtension,
+    ],
+  };
+
+  @override
+  Future<void> build(BuildStep buildStep) async {
+    log.info('building for target ${buildStep.inputId.path}');
+    await bootstrapDdc(
+      buildStep,
+      platform: flutterWebPlatform,
+      skipPlatformCheck: true,
+    );
+  }
+}
+
+/// A ddc-only entry point builder that respects the Flutter target flag.
+class FlutterWebEntrypointBuilder implements Builder {
+  const FlutterWebEntrypointBuilder(this.release, this.profile, this.flutterWebSdk);
+
+  final bool release;
+  final bool profile;
+  final String flutterWebSdk;
+
+  @override
+  Map<String, List<String>> get buildExtensions => const <String, List<String>>{
+    '.dart': <String>[
+      ddcBootstrapExtension,
+      jsEntrypointExtension,
+      jsEntrypointSourceMapExtension,
+      jsEntrypointArchiveExtension,
+      digestsEntrypointExtension,
+    ],
+  };
+
+  @override
+  Future<void> build(BuildStep buildStep) async {
+    await bootstrapDdc(
+      buildStep,
+      platform: flutterWebPlatform,
+      skipPlatformCheck: true,
+    );
+  }
+}
+
+/// Bootstraps the test entry point.
+class FlutterWebTestBootstrapBuilder implements Builder {
+  const FlutterWebTestBootstrapBuilder();
+
+  @override
+  Map<String, List<String>> get buildExtensions => const <String, List<String>>{
+    '_test.dart': <String>[
+      '_test.dart.browser_test.dart',
+    ],
+  };
+
+  @override
+  Future<void> build(BuildStep buildStep) async {
+    final AssetId id = buildStep.inputId;
+    final String contents = await buildStep.readAsString(id);
+    final String assetPath = id.pathSegments.first == 'lib'
+        ? path.url.join('packages', id.package, id.path)
+        : id.path;
+    final Uri testUrl = path.toUri(path.absolute(assetPath));
+    final Metadata metadata = parseMetadata(
+        assetPath, contents, Runtime.builtIn.map((Runtime runtime) => runtime.name).toSet());
+
+    if (metadata.testOn.evaluate(SuitePlatform(Runtime.chrome))) {
+      await buildStep.writeAsString(id.addExtension('.browser_test.dart'), '''
+import 'dart:ui' as ui;
+import 'dart:html';
+import 'dart:js';
+
+import 'package:stream_channel/stream_channel.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:test_api/src/backend/stack_trace_formatter.dart'; // ignore: implementation_imports
+import 'package:test_api/src/remote_listener.dart'; // ignore: implementation_imports
+import 'package:test_api/src/suite_channel_manager.dart'; // ignore: implementation_imports
+
+import "${path.url.basename(id.path)}" as test;
+
+Future<void> main() async {
+  // Extra initialization for flutter_web.
+  // The following parameters are hard-coded in Flutter's test embedder. Since
+  // we don't have an embedder yet this is the lowest-most layer we can put
+  // this stuff in.
+  ui.debugEmulateFlutterTesterEnvironment = true;
+  await ui.webOnlyInitializePlatform();
+  webGoldenComparator = DefaultWebGoldenComparator(Uri.parse('$testUrl'));
+  // TODO(flutterweb): remove need for dynamic cast.
+  (ui.window as dynamic).debugOverrideDevicePixelRatio(3.0);
+  (ui.window as dynamic).webOnlyDebugPhysicalSizeOverride = const ui.Size(2400, 1800);
+  internalBootstrapBrowserTest(() => test.main);
+}
+
+void internalBootstrapBrowserTest(Function getMain()) {
+  var channel = serializeSuite(getMain, hidePrints: false);
+  postMessageChannel().pipe(channel);
+}
+StreamChannel serializeSuite(Function getMain(),
+        {bool hidePrints = true, Future beforeLoad()}) =>
+    RemoteListener.start(getMain,
+        hidePrints: hidePrints, beforeLoad: beforeLoad);
+
+StreamChannel suiteChannel(String name) {
+  var manager = SuiteChannelManager.current;
+  if (manager == null) {
+    throw StateError('suiteChannel() may only be called within a test worker.');
+  }
+
+  return manager.connectOut(name);
+}
+
+StreamChannel postMessageChannel() {
+  var controller = StreamChannelController(sync: true);
+  window.onMessage.firstWhere((message) {
+    return message.origin == window.location.origin && message.data == "port";
+  }).then((message) {
+    var port = message.ports.first;
+    var portSubscription = port.onMessage.listen((message) {
+      controller.local.sink.add(message.data);
+    });
+
+    controller.local.stream.listen((data) {
+      port.postMessage({"data": data});
+    }, onDone: () {
+      port.postMessage({"event": "done"});
+      portSubscription.cancel();
+    });
+  });
+
+  context['parent'].callMethod('postMessage', [
+    JsObject.jsify({"href": window.location.href, "ready": true}),
+    window.location.origin,
+  ]);
+  return controller.foreign;
+}
+''');
+    }
+  }
+}
+
+/// A shell builder which generates the web specific entry point.
+class FlutterWebShellBuilder implements Builder {
+  const FlutterWebShellBuilder({this.hasPlugins = false, this.initializePlatform = true});
+
+  final bool hasPlugins;
+
+  /// Whether to call webOnlyInitializePlatform.
+  final bool initializePlatform;
+
+  @override
+  Future<void> build(BuildStep buildStep) async {
+    final AssetId dartEntrypointId = buildStep.inputId;
+    final bool isAppEntrypoint = await _isAppEntryPoint(dartEntrypointId, buildStep);
+    if (!isAppEntrypoint) {
+      return;
+    }
+    final AssetId outputId = buildStep.inputId.changeExtension('_web_entrypoint.dart');
+    final String pluginRegistrantPath = _getPluginRegistrantPath(dartEntrypointId.path);
+    if (hasPlugins) {
+      await buildStep.writeAsString(outputId, '''
+import 'dart:ui' as ui;
+
+import 'package:flutter_web_plugins/flutter_web_plugins.dart';
+
+import '$pluginRegistrantPath';
+import "${path.url.basename(buildStep.inputId.path)}" as entrypoint;
+
+Future<void> main() async {
+  registerPlugins(webPluginRegistry);
+  if ($initializePlatform) {
+    await ui.webOnlyInitializePlatform();
+  }
+  entrypoint.main();
+}
+''');
+    } else {
+      await buildStep.writeAsString(outputId, '''
+import 'dart:ui' as ui;
+
+import "${path.url.basename(buildStep.inputId.path)}" as entrypoint;
+
+Future<void> main() async {
+  if ($initializePlatform) {
+    await ui.webOnlyInitializePlatform();
+  }
+  entrypoint.main();
+}
+''');
+    }
+  }
+
+  /// Gets the relative path to the generated plugin registrant from the app
+  /// app entrypoint.
+  String _getPluginRegistrantPath(String entrypoint) {
+    return path.url.relative('lib/generated_plugin_registrant.dart',
+        from: path.url.dirname(entrypoint));
+  }
+
+  @override
+  Map<String, List<String>> get buildExtensions => const <String, List<String>>{
+    '.dart': <String>['_web_entrypoint.dart'],
+  };
+}
+
+/// Returns whether or not [dartId] is an app entry point (basically, whether
+/// or not it has a `main` function).
+Future<bool> _isAppEntryPoint(AssetId dartId, AssetReader reader) async {
+  assert(dartId.extension == '.dart');
+  // Skip reporting errors here, dartdevc will report them later with nicer
+  // formatting.
+  final ParseStringResult result = parseString(
+    content: await reader.readAsString(dartId),
+    throwIfDiagnostics: false,
+  );
+  // Allow two or fewer arguments so that entrypoints intended for use with
+  // [spawnUri] get counted.
+  return result.unit.declarations.any((CompilationUnitMember node) {
+    return node is FunctionDeclaration &&
+        node.name.name == 'main' &&
+        node.functionExpression.parameters.parameters.length <= 2;
+  });
+}
diff --git a/packages/_flutter_web_build_script/pubspec.yaml b/packages/_flutter_web_build_script/pubspec.yaml
new file mode 100644
index 0000000..ccb17db
--- /dev/null
+++ b/packages/_flutter_web_build_script/pubspec.yaml
@@ -0,0 +1,98 @@
+name: _flutter_web_build_script
+description: A build script for flutter test --platform=chrome
+homepage: https://flutter.dev
+author: Flutter Authors <flutter-dev@googlegroups.com>
+
+environment:
+  # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
+  sdk: ">=2.7.0 <3.0.0"
+
+dependencies:
+  # We depend on very specific internal implementation details of the
+  # 'test' package, which change between versions, so when upgrading
+  # this, make sure the tests are still running correctly.
+  test_api: 0.2.14
+  test_core: 0.3.0
+
+  build_runner: 1.7.4
+  build_test: 0.10.12+1
+  build_runner_core: 4.4.0
+  dart_style: 1.3.3
+  code_builder: 3.2.1
+  build: 1.2.2
+  build_modules: 2.8.1
+  build_daemon: 2.1.3
+  build_web_compilers: 2.9.0
+
+  _fe_analyzer_shared: 1.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  analyzer: 0.39.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  archive: 2.0.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  async: 2.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  bazel_worker: 0.1.23+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  build_config: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  build_resolvers: 1.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  built_collection: 4.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  built_value: 7.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  checked_yaml: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  coverage: 0.13.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  crypto: 2.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  fixnum: 0.10.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  glob: 1.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  graphs: 0.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  html: 0.14.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  http: 0.12.0+4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  http_multi_server: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  http_parser: 3.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  json_annotation: 3.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  logging: 0.11.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  matcher: 0.12.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  meta: 1.1.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  node_interop: 1.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  node_io: 1.0.1+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  node_preamble: 1.4.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  package_config: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  path: 1.6.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  pedantic: 1.9.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  pool: 1.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  protobuf: 1.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  pub_semver: 1.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  pubspec_parse: 0.1.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  quiver: 2.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  scratch_space: 0.0.4+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  shelf: 0.7.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  shelf_web_socket: 0.2.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  source_map_stack_trace: 1.1.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  source_maps: 0.10.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  source_span: 1.5.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  stack_trace: 1.9.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  stream_channel: 2.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  stream_transform: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  string_scanner: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  term_glyph: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  test: 1.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  timing: 0.1.1+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  typed_data: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  vm_service: 1.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  watcher: 0.9.7+13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  web_socket_channel: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  webkit_inspection_protocol: 0.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  yaml: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+
+dartdoc:
+  # Exclude this package from the hosted API docs.
+  nodoc: true
+
+# PUBSPEC CHECKSUM: 5b8f